From 683d087e36e6a37a0c054751eef0fe65435cd5c0 Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 5 Aug 2022 12:33:02 +0200 Subject: [PATCH] Debugger: Fixes To TWatchResultData / introduced 2d0c2ea8bac20d1f0fa0d01bb4ac965ee86d3b71 --- .../lazdebuggerfp/fpdebuggerresultdata.pas | 16 +++++++++------- .../idedebugger/idedebuggerwatchresult.pas | 9 ++++++--- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/components/lazdebuggers/lazdebuggerfp/fpdebuggerresultdata.pas b/components/lazdebuggers/lazdebuggerfp/fpdebuggerresultdata.pas index 7d1b490517..d88ff9cc86 100644 --- a/components/lazdebuggers/lazdebuggerfp/fpdebuggerresultdata.pas +++ b/components/lazdebuggers/lazdebuggerfp/fpdebuggerresultdata.pas @@ -64,7 +64,8 @@ begin Result := ValConfig.Converter; if Result <> nil then Result.AddReference; - end; + end + else if (ValConvList <> nil) then begin ValConvList.Lock; try @@ -136,12 +137,16 @@ begin if FExtraDephtLevelItemConv = nil then FExtraDephtLevelItemConv := GetValConv(AnFpValue); CurConv := FExtraDephtLevelItemConv; + if CurConv <> nil then + CurConv.AddReference; end else if (RecurseCnt = 1) and (FLevelZeroKind = skArray) then begin if FLevelZeroArrayConv = nil then FLevelZeroArrayConv := GetValConv(AnFpValue); CurConv := FLevelZeroArrayConv; + if CurConv <> nil then + CurConv.AddReference; end else begin CurConv := GetValConv(AnFpValue); @@ -149,13 +154,13 @@ begin if (CurConv <> nil) then begin if (FMaxTotalConv <= 0) then - CurConv := nil + ReleaseRefAndNil(CurConv) else dec(FMaxTotalConv); if FInArray then begin if (FCurMaxArrayConv <= 0) then - CurConv := nil + ReleaseRefAndNil(CurConv) else dec(FCurMaxArrayConv); end; @@ -182,10 +187,7 @@ begin AnResData := AnResData.AddField('', dfvUnknown, []); end; finally - if (CurConv <> FExtraDephtLevelItemConv) and - (CurConv <> FLevelZeroArrayConv) - then - CurConv.ReleaseReference; + CurConv.ReleaseReference; NewFpVal.ReleaseReference; end; end; diff --git a/ide/packages/idedebugger/idedebuggerwatchresult.pas b/ide/packages/idedebugger/idedebuggerwatchresult.pas index b816ea8147..87531affe1 100644 --- a/ide/packages/idedebugger/idedebuggerwatchresult.pas +++ b/ide/packages/idedebugger/idedebuggerwatchresult.pas @@ -2297,12 +2297,14 @@ end; procedure TWatchResultTypeConverted.AfterAssign(ATypeOnly: Boolean); begin + inherited AfterAssign(ATypeOnly); if FHandler <> nil then FHandler.AddReference; end; procedure TWatchResultTypeConverted.DoFree; begin + inherited DoFree; if FHandler <> nil then FHandler.ReleaseReference; end; @@ -4556,7 +4558,7 @@ function TGenericWatchResultDataStructWithAnchestor.MaybeUpdateProto( ARecurse: boolean; ASkipStorage: boolean): boolean; var AStructProtoData: TGenericWatchResultDataStructWithAnchestor absolute AProtoData; - FieldStore: PNestedFieldsWatchResultStorage absolute AStorage; + FieldStore: PNestedFieldsAndAnchestorWatchResultStorage absolute AStorage; dummy: TOverrideTemplateData; begin Result := inherited MaybeUpdateProto(AProtoData, AnOverrideTemplate, AStorage, ARecurse, ASkipStorage); @@ -4569,7 +4571,7 @@ begin AStructProtoData.FType.FAnchestor := FType.FAnchestor.CreateCopy(True); - assert((AStorage=nil) or (AStorage^=nil) or (AStorage^ is TNestedFieldsWatchResultStorage), 'TGenericWatchResultDataStruct.MaybeUpdateProto: (AStorage=nil) or (AStorage^=nil) or (AStorage^ is TNestedFieldsWatchResultStorage)'); + assert((AStorage=nil) or (AStorage^=nil) or (AStorage^ is TNestedFieldsAndAnchestorWatchResultStorage), 'TGenericWatchResultDataStruct.MaybeUpdateProto: (AStorage=nil) or (AStorage^=nil) or (AStorage^ is TNestedFieldsWatchResultStorage)'); if (AStorage = nil) or (AStorage^ = nil) then begin if (ARecurse) then begin // or "if not ASkipStorage and " ?? @@ -4705,7 +4707,8 @@ constructor TWatchResultDataConverted.Create( AHandler: TLazDbgValueConverterIntf); begin FType.FHandler := AHandler; - AHandler.AddReference; + if AHandler <> nil then + AHandler.AddReference; end; { TGenericWatchResultDataProc }