From 924ce02d5020237ae593f74497f3a645a6a4e28c Mon Sep 17 00:00:00 2001 From: Martin Date: Sat, 28 Dec 2024 18:28:31 +0100 Subject: [PATCH] IDE, Debugger: fixed dangling object. When project was changed then FCurrentDebuggerPropertiesConfig was freed as part of the list, but the field was left dangling. --- ide/packages/idedebugger/idedebuggeropts.pas | 7 +++++++ ide/packages/idedebugger/projectdebuglink.pas | 4 +++- ide/packages/ideproject/project.pp | 4 ++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/ide/packages/idedebugger/idedebuggeropts.pas b/ide/packages/idedebugger/idedebuggeropts.pas index 3383505c26..a771808e88 100644 --- a/ide/packages/idedebugger/idedebuggeropts.pas +++ b/ide/packages/idedebugger/idedebuggeropts.pas @@ -69,6 +69,7 @@ type function GetOpt(Index: Integer): TDebuggerPropertiesConfig; public constructor Create; + procedure Clear; override; function EntryByName(AConfName, AConfClass: String): TDebuggerPropertiesConfig; function EntryByUid(AnUid: String): TDebuggerPropertiesConfig; @@ -568,6 +569,12 @@ begin end; +procedure TDebuggerPropertiesConfigListBase.Clear; +begin + inherited Clear; + FCurrentDebuggerPropertiesConfig := nil; +end; + function TDebuggerPropertiesConfigListBase.EntryByName(AConfName, AConfClass: String): TDebuggerPropertiesConfig; var diff --git a/ide/packages/idedebugger/projectdebuglink.pas b/ide/packages/idedebugger/projectdebuglink.pas index c9df052cc8..f56f99c52d 100644 --- a/ide/packages/idedebugger/projectdebuglink.pas +++ b/ide/packages/idedebugger/projectdebuglink.pas @@ -44,7 +44,7 @@ type FValueFormatterConfig: TIdeDbgValueFormatterSelectorList; function GetCurrentDebuggerBackend: String; procedure SetDebuggerBackend(AValue: String); - procedure SetProject(AValue: TProject); + procedure SetProject(AValue: TProject); override; procedure SetStoreDebuggerClassConfInSession(AValue: boolean); procedure SetStoreBackendConverterConfigInSession(AValue: boolean); procedure SetStoreDisplayFormatConfigsInSession(AValue: boolean); @@ -169,6 +169,8 @@ procedure TProjectDebugLink.SetProject(AValue: TProject); begin // A new project can have the same address as a previous freed project and this test //if FProject = AValue then Exit; // would prevent updating FProject.DebuggerLink. + if FProject <> AValue then + Clear; FProject := AValue; if Assigned(FProject) then FProject.DebuggerLink := Self; diff --git a/ide/packages/ideproject/project.pp b/ide/packages/ideproject/project.pp index b7f88d1275..21795e4405 100644 --- a/ide/packages/ideproject/project.pp +++ b/ide/packages/ideproject/project.pp @@ -726,6 +726,7 @@ type private protected procedure Clear; virtual; abstract; + procedure SetProject(AValue: TProject); virtual; abstract; procedure BeforeReadProject; virtual; abstract; procedure AfterReadProject; virtual; abstract; procedure LoadFromLPI(aXMLConfig: TRttiXMLConfig; Path: string); virtual; abstract; @@ -735,6 +736,7 @@ type public //constructor Create; //destructor Destroy; override; + property Project: TProject write SetProject; end; { TProject } @@ -2933,6 +2935,8 @@ begin FDefineTemplates.Active := False; ActiveBuildMode:=nil; Clear; + if Assigned(FDebuggerLink) then + FDebuggerLink.Project := nil; FreeThenNil(FIDEOptions); FreeAndNil(FBuildModesBackup); FreeAndNil(FBuildModes);