Debugger: prevent re-entry of disassembler PrepareRanges

This commit is contained in:
Martin 2022-02-09 20:36:10 +01:00
parent 6993390bab
commit 556f8d064d

View File

@ -1225,6 +1225,8 @@ type
FEntryRanges: TDBGDisassemblerEntryMap; FEntryRanges: TDBGDisassemblerEntryMap;
FCurrentRange: TDBGDisassemblerEntryRange; FCurrentRange: TDBGDisassemblerEntryRange;
FPreparingBefore, FPreparingAfter: Integer;
FPreparingAddr: TDbgPtr;
procedure EntryRangesOnDelete(Sender: TObject); procedure EntryRangesOnDelete(Sender: TObject);
procedure EntryRangesOnMerge(MergeReceiver, MergeGiver: TDBGDisassemblerEntryRange); procedure EntryRangesOnMerge(MergeReceiver, MergeGiver: TDBGDisassemblerEntryRange);
function FindRange(AnAddr: TDbgPtr; ALinesBefore, ALinesAfter: Integer): Boolean; function FindRange(AnAddr: TDbgPtr; ALinesBefore, ALinesAfter: Integer): Boolean;
@ -5242,16 +5244,42 @@ begin
if (ALinesBefore < 0) or (ALinesAfter < 0) if (ALinesBefore < 0) or (ALinesAfter < 0)
then raise Exception.Create('invalid PrepareRange request'); then raise Exception.Create('invalid PrepareRange request');
// Do not LockChange, if FindRange changes something, then notification must be send to syncronize counts on IDE-object if (FPreparingBefore > 0) or (FPreparingAfter > 0) then begin
Result:= FindRange(AnAddr, ALinesBefore, ALinesAfter); if AnAddr <> FPreparingAddr then begin
if result then debugln(DBG_DISASSEMBLER, ['INFO: TDBGDisassembler.PrepareRange found existing data Addr=', AnAddr,' before=', ALinesBefore, ' After=', ALinesAfter ]); FPreparingBefore := ALinesBefore;
if Result FPreparingAfter := ALinesAfter;
then exit; FPreparingAddr := AnAddr;
end
else begin
FPreparingBefore := Max(FPreparingBefore, ALinesBefore);
FPreparingAfter := Max(FPreparingAfter, ALinesAfter);
end;
exit;
end;
if result then debugln(DBG_DISASSEMBLER, ['INFO: TDBGDisassembler.PrepareRange calling PrepareEntries Addr=', AnAddr,' before=', ALinesBefore, ' After=', ALinesAfter ]); FPreparingBefore := ALinesBefore;
if PrepareEntries(AnAddr, ALinesBefore, ALinesAfter) FPreparingAfter := ALinesAfter;
then Result:= FindRange(AnAddr, ALinesBefore, ALinesAfter); FPreparingAddr := AnAddr;
if result then debugln(DBG_DISASSEMBLER, ['INFO: TDBGDisassembler.PrepareRange found data AFTER PrepareEntries Addr=', AnAddr,' before=', ALinesBefore, ' After=', ALinesAfter ]); try
repeat
ALinesBefore := FPreparingBefore;
ALinesAfter := FPreparingAfter;
AnAddr := FPreparingAddr;
// Do not LockChange, if FindRange changes something, then notification must be send to syncronize counts on IDE-object
Result:= FindRange(AnAddr, ALinesBefore, ALinesAfter);
if result then debugln(DBG_DISASSEMBLER, ['INFO: TDBGDisassembler.PrepareRange found existing data Addr=', AnAddr,' before=', ALinesBefore, ' After=', ALinesAfter ]);
if Result
then exit;
if result then debugln(DBG_DISASSEMBLER, ['INFO: TDBGDisassembler.PrepareRange calling PrepareEntries Addr=', AnAddr,' before=', ALinesBefore, ' After=', ALinesAfter ]);
if PrepareEntries(AnAddr, ALinesBefore, ALinesAfter)
then Result:= FindRange(AnAddr, ALinesBefore, ALinesAfter);
if result then debugln(DBG_DISASSEMBLER, ['INFO: TDBGDisassembler.PrepareRange found data AFTER PrepareEntries Addr=', AnAddr,' before=', ALinesBefore, ' After=', ALinesAfter ]);
until (FPreparingBefore = ALinesBefore) and (FPreparingAfter = ALinesAfter) and (FPreparingAddr = AnAddr);
finally
FPreparingBefore := 0;
FPreparingAfter := 0;
end;
end; end;
(******************************************************************************) (******************************************************************************)