From 1a23649a9731bb8bcd8ab4f071f30b8c6f5e8267 Mon Sep 17 00:00:00 2001 From: martin Date: Thu, 15 Nov 2012 14:46:30 +0000 Subject: [PATCH] DBG: Inspect-Dialog, prevent crash, due to nested updates git-svn-id: trunk@39280 - --- debugger/inspectdlg.pas | 79 ++++++++++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 29 deletions(-) diff --git a/debugger/inspectdlg.pas b/debugger/inspectdlg.pas index ab568512b4..ad9489ea5b 100644 --- a/debugger/inspectdlg.pas +++ b/debugger/inspectdlg.pas @@ -72,6 +72,7 @@ type FDBGInfo: TDBGType; FGridData: TStringGrid; FGridMethods: TStringGrid; + FUpdateLock, FUpdateNeeded: Boolean; procedure Localize; procedure InspectClass; procedure InspectRecord; @@ -461,7 +462,6 @@ begin MethodsPage.TabVisible:=false; GridDataSetup; FGridData.Visible := False; - FreeAndNil(FDBGInfo); StatusBar1.SimpleText:=''; end; @@ -509,6 +509,7 @@ constructor TIDEInspectDlg.Create(AOwner: TComponent); begin inherited Create(AOwner); + //FDBGInfo := nil; //FDataGridHook := TPropertyEditorHook.Create; //FDataGrid := NewGrid('DataGrid', DataPage, FDataGridHook); // @@ -518,6 +519,8 @@ begin //FMethodsGridHook := TPropertyEditorHook.Create; //FMethodsGrid := NewGrid('MethodsGrid', MethodsPage, FMethodsGridHook); + FUpdateLock := False; + FUpdateNeeded := False; Localize; FGridData:=TStringGrid.Create(DataPage); @@ -554,37 +557,55 @@ procedure TIDEInspectDlg.UpdateData; var Opts: TDBGEvaluateFlags; begin - FreeAndNil(FDBGInfo); - if FExpression = '' - then exit; + if FUpdateLock then begin + FUpdateNeeded := True; + exit; + end; - InputHistories.HistoryLists.Add(ClassName, FExpression,rltCaseSensitive); - if EdInspect.Items.IndexOf(FExpression) = -1 - then EdInspect.Items.Insert(0, FExpression); - - Opts := [defFullTypeInfo]; - if menuClassType.Checked then - include(Opts, defClassAutoCast); - if not DebugBoss.Evaluate(FExpression, FHumanReadable, FDBGInfo, Opts) - or not assigned(FDBGInfo) then - begin + FUpdateLock := True; + FUpdateNeeded := False; + try FreeAndNil(FDBGInfo); - Clear; - StatusBar1.SimpleText:=FExpression + ' : unavailable'; - Exit; - end; - case FDBGInfo.Kind of - skClass: InspectClass(); - skRecord: InspectRecord(); - skVariant: InspectVariant(); - skEnum: InspectEnum; - skSet: InspectSet; - skProcedure: InspectSimple; - skFunction: InspectSimple; - skSimple: InspectSimple(); - skPointer: InspectPointer(); - // skDecomposable: ; + if FExpression = '' + then begin + Clear; + StatusBar1.SimpleText := ''; + exit; + end; + + InputHistories.HistoryLists.Add(ClassName, FExpression,rltCaseSensitive); + if EdInspect.Items.IndexOf(FExpression) = -1 + then EdInspect.Items.Insert(0, FExpression); + + Opts := [defFullTypeInfo]; + if menuClassType.Checked then + include(Opts, defClassAutoCast); + if not DebugBoss.Evaluate(FExpression, FHumanReadable, FDBGInfo, Opts) + or not assigned(FDBGInfo) then + begin + FreeAndNil(FDBGInfo); + Clear; + StatusBar1.SimpleText:=FExpression + ' : unavailable'; + Exit; + end; + case FDBGInfo.Kind of + skClass: InspectClass(); + skRecord: InspectRecord(); + skVariant: InspectVariant(); + skEnum: InspectEnum; + skSet: InspectSet; + skProcedure: InspectSimple; + skFunction: InspectSimple; + skSimple: InspectSimple(); + skPointer: InspectPointer(); + // skDecomposable: ; + end; + finally + FUpdateLock := False; end; + + if FUpdateNeeded then + UpdateData; end; { TOIDBGGrid }