mirror of https://gitlab.com/basile.b/dexed.git
debugger: only use the central BP database
debugger: parses internal GDB messages as CLI
This commit is contained in:
parent
3e20fc1f88
commit
84f9988c72
|
@ -10,6 +10,7 @@ uses
|
||||||
type
|
type
|
||||||
|
|
||||||
TBreakPointKind = (
|
TBreakPointKind = (
|
||||||
|
bpkNone, // nothing
|
||||||
bpkBreak, // break point
|
bpkBreak, // break point
|
||||||
bpkWatch // watch point
|
bpkWatch // watch point
|
||||||
);
|
);
|
||||||
|
@ -21,6 +22,7 @@ type
|
||||||
function running: boolean;
|
function running: boolean;
|
||||||
procedure addBreakPoint(const fname: string; line: integer; kind: TBreakPointKind = bpkBreak);
|
procedure addBreakPoint(const fname: string; line: integer; kind: TBreakPointKind = bpkBreak);
|
||||||
procedure removeBreakPoint(const fname: string; line: integer; kind: TBreakPointKind = bpkBreak);
|
procedure removeBreakPoint(const fname: string; line: integer; kind: TBreakPointKind = bpkBreak);
|
||||||
|
procedure removeBreakPoints(const fname: string);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// Enumerates th e reason why debuging breaks.
|
// Enumerates th e reason why debuging breaks.
|
||||||
|
@ -40,11 +42,6 @@ type
|
||||||
procedure debugStart(debugger: ICEDebugger);
|
procedure debugStart(debugger: ICEDebugger);
|
||||||
// a debugging session terminates. Any pointer to a ICEDebugger becomes invalid.
|
// a debugging session terminates. Any pointer to a ICEDebugger becomes invalid.
|
||||||
procedure debugStop;
|
procedure debugStop;
|
||||||
// the debuger wants to know how many times debugQueryBreakPoints must be called.
|
|
||||||
function debugQueryBpCount: integer;
|
|
||||||
// the debuger wants breakpoints.
|
|
||||||
procedure debugQueryBreakPoint(const index: integer; out fname: string;
|
|
||||||
out line: integer; out kind: TBreakPointKind);
|
|
||||||
// a break happens when code in fname at line is executed.
|
// a break happens when code in fname at line is executed.
|
||||||
procedure debugBreak(const fname: string; line: integer; reason: TCEDebugBreakReason);
|
procedure debugBreak(const fname: string; line: integer; reason: TCEDebugBreakReason);
|
||||||
// debugging continue
|
// debugging continue
|
||||||
|
|
102
src/ce_gdb.pas
102
src/ce_gdb.pas
|
@ -444,6 +444,8 @@ type
|
||||||
protected
|
protected
|
||||||
procedure setToolBarFlat(value: boolean); override;
|
procedure setToolBarFlat(value: boolean); override;
|
||||||
private
|
private
|
||||||
|
fSynchronizedDocuments: TStringList;
|
||||||
|
fSynchronizingBreakpoints: boolean;
|
||||||
fSyms: ICESymStringExpander;
|
fSyms: ICESymStringExpander;
|
||||||
fExe: string;
|
fExe: string;
|
||||||
fOutputName: string;
|
fOutputName: string;
|
||||||
|
@ -485,9 +487,7 @@ type
|
||||||
procedure updateButtonsState;
|
procedure updateButtonsState;
|
||||||
procedure startDebugging;
|
procedure startDebugging;
|
||||||
procedure killGdb;
|
procedure killGdb;
|
||||||
procedure storeObserversBreakpoints;
|
|
||||||
procedure updateDebugeeOptionsEditor;
|
procedure updateDebugeeOptionsEditor;
|
||||||
procedure synchronizeBreakpointsFromDoc;
|
|
||||||
procedure deleteRedirectedIO;
|
procedure deleteRedirectedIO;
|
||||||
// GDB output processors
|
// GDB output processors
|
||||||
procedure gdboutQuiet(sender: TObject);
|
procedure gdboutQuiet(sender: TObject);
|
||||||
|
@ -525,6 +525,7 @@ type
|
||||||
kind: TBreakPointKind = bpkBReak);
|
kind: TBreakPointKind = bpkBReak);
|
||||||
procedure removeBreakPoint(const fname: string; line: integer;
|
procedure removeBreakPoint(const fname: string; line: integer;
|
||||||
kind: TBreakPointKind = bpkBreak);
|
kind: TBreakPointKind = bpkBreak);
|
||||||
|
procedure removeBreakPoints(const fname: string);
|
||||||
procedure executeFromShortcut(sender: TObject);
|
procedure executeFromShortcut(sender: TObject);
|
||||||
public
|
public
|
||||||
constructor create(aOwner: TComponent); override;
|
constructor create(aOwner: TComponent); override;
|
||||||
|
@ -1173,6 +1174,7 @@ begin
|
||||||
Edit1.Items.Assign(fOptions.commandsHistory);
|
Edit1.Items.Assign(fOptions.commandsHistory);
|
||||||
fAddWatchPointKind := wpkWrite;
|
fAddWatchPointKind := wpkWrite;
|
||||||
fBreakPoints := TPersistentBreakPoints.create(self);
|
fBreakPoints := TPersistentBreakPoints.create(self);
|
||||||
|
fSynchronizedDocuments := TStringList.Create;
|
||||||
|
|
||||||
TCEListViewCopyMenu.create(lstCallStack);
|
TCEListViewCopyMenu.create(lstCallStack);
|
||||||
TCEListViewCopyMenu.create(lstAsm);
|
TCEListViewCopyMenu.create(lstAsm);
|
||||||
|
@ -1195,6 +1197,7 @@ begin
|
||||||
fInspState.Free;
|
fInspState.Free;
|
||||||
fJson.Free;
|
fJson.Free;
|
||||||
fStackItems.Free;
|
fStackItems.Free;
|
||||||
|
fSynchronizedDocuments.Free;
|
||||||
EntitiesConnector.removeObserver(self);
|
EntitiesConnector.removeObserver(self);
|
||||||
fSubj.free;
|
fSubj.free;
|
||||||
inherited;
|
inherited;
|
||||||
|
@ -1406,11 +1409,22 @@ begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCEGdbWidget.docFocused(document: TCESynMemo);
|
procedure TCEGdbWidget.docFocused(document: TCESynMemo);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
b: TPersistentBreakPoint;
|
||||||
begin
|
begin
|
||||||
fDoc := document;
|
fDoc := document;
|
||||||
if fGdbState = gsNone then
|
if fGdbState = gsNone then
|
||||||
updateDebugeeOptionsEditor;
|
updateDebugeeOptionsEditor;
|
||||||
synchronizeBreakpointsFromDoc;
|
fSynchronizingBreakpoints:= true;
|
||||||
|
if fSynchronizedDocuments.IndexOf(document.fileName) = -1 then
|
||||||
|
for i:= 0 to fBreakPoints.count-1 do
|
||||||
|
begin
|
||||||
|
b := fBreakPoints.item[i];
|
||||||
|
if b.filename = fDoc.fileName then
|
||||||
|
fDoc.addBreakpoint(b.line);
|
||||||
|
end;
|
||||||
|
fSynchronizingBreakpoints:= false;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCEGdbWidget.docChanged(document: TCESynMemo);
|
procedure TCEGdbWidget.docChanged(document: TCESynMemo);
|
||||||
|
@ -1418,9 +1432,14 @@ begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCEGdbWidget.docClosing(document: TCESynMemo);
|
procedure TCEGdbWidget.docClosing(document: TCESynMemo);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
begin
|
begin
|
||||||
if fDoc <> document then
|
if fDoc <> document then
|
||||||
exit;
|
exit;
|
||||||
|
i := fSynchronizedDocuments.IndexOf(fDoc.fileName);
|
||||||
|
if i <> -1 then
|
||||||
|
fSynchronizedDocuments.delete(i);
|
||||||
fDoc := nil;
|
fDoc := nil;
|
||||||
if fGdbState = gsNone then
|
if fGdbState = gsNone then
|
||||||
updateDebugeeOptionsEditor;
|
updateDebugeeOptionsEditor;
|
||||||
|
@ -1451,25 +1470,6 @@ begin
|
||||||
updateDebugeeOptionsEditor;
|
updateDebugeeOptionsEditor;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCEGdbWidget.storeObserversBreakpoints;
|
|
||||||
var
|
|
||||||
i,j: integer;
|
|
||||||
obs: ICEDebugObserver;
|
|
||||||
nme: string;
|
|
||||||
lne: integer;
|
|
||||||
knd: TBreakPointKind;
|
|
||||||
begin
|
|
||||||
for i:= 0 to fSubj.observersCount-1 do
|
|
||||||
begin
|
|
||||||
obs := fSubj.observers[i] as ICEDebugObserver;
|
|
||||||
for j := 0 to obs.debugQueryBpCount-1 do
|
|
||||||
begin
|
|
||||||
obs.debugQueryBreakPoint(j, nme, lne, knd);
|
|
||||||
fBreakPoints.addItem(nme, lne, knd);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TCEGdbWidget.waitCommandProcessed;
|
procedure TCEGdbWidget.waitCommandProcessed;
|
||||||
var
|
var
|
||||||
i: integer = 0;
|
i: integer = 0;
|
||||||
|
@ -1489,6 +1489,8 @@ var
|
||||||
r: boolean;
|
r: boolean;
|
||||||
a: boolean = false;
|
a: boolean = false;
|
||||||
begin
|
begin
|
||||||
|
if fSynchronizingBreakpoints then
|
||||||
|
exit;
|
||||||
if assigned(fBreakPoints) then
|
if assigned(fBreakPoints) then
|
||||||
a := fBreakPoints.addItem(fname, line, kind);
|
a := fBreakPoints.addItem(fname, line, kind);
|
||||||
if not a or fGdb.isNil or not fGdb.Running then
|
if not a or fGdb.isNil or not fGdb.Running then
|
||||||
|
@ -1537,6 +1539,11 @@ begin
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCEGdbWidget.removeBreakPoints(const fname: string);
|
||||||
|
begin
|
||||||
|
fBreakPoints.clearFile(fname);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TCEGdbWidget.setState(value: TGdbState);
|
procedure TCEGdbWidget.setState(value: TGdbState);
|
||||||
begin
|
begin
|
||||||
if fGdbState = value then
|
if fGdbState = value then
|
||||||
|
@ -1713,7 +1720,6 @@ begin
|
||||||
fGdb.OnTerminate:= @gdboutJsonize;
|
fGdb.OnTerminate:= @gdboutJsonize;
|
||||||
fgdb.execute;
|
fgdb.execute;
|
||||||
// file:line breakpoints
|
// file:line breakpoints
|
||||||
storeObserversBreakpoints;
|
|
||||||
for i:= 0 to fBreakPoints.Count-1 do
|
for i:= 0 to fBreakPoints.Count-1 do
|
||||||
begin
|
begin
|
||||||
b := fBreakPoints[i];
|
b := fBreakPoints[i];
|
||||||
|
@ -1806,46 +1812,6 @@ begin
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCEGdbWidget.synchronizeBreakpointsFromDoc;
|
|
||||||
var
|
|
||||||
i: integer;
|
|
||||||
c: integer;
|
|
||||||
j: integer;
|
|
||||||
l: integer;
|
|
||||||
k: TBreakPointKind;
|
|
||||||
s: string;
|
|
||||||
b: boolean;
|
|
||||||
f: ICEDebugObserver;
|
|
||||||
begin
|
|
||||||
if fDoc.isNil then
|
|
||||||
exit;
|
|
||||||
f := fDoc as ICEDebugObserver;
|
|
||||||
if not assigned(f) then
|
|
||||||
exit;
|
|
||||||
c := f.debugQueryBpCount;
|
|
||||||
if c <> 0 then
|
|
||||||
begin
|
|
||||||
for i := fBreakPoints.count-1 downto 0 do
|
|
||||||
begin
|
|
||||||
b := false;
|
|
||||||
if not (fBreakPoints[i].filename = fDoc.fileName) then
|
|
||||||
continue;
|
|
||||||
for j := 0 to c-1 do
|
|
||||||
begin
|
|
||||||
f.debugQueryBreakPoint(j, s, l, k);
|
|
||||||
if l = fBreakPoints[i].line then
|
|
||||||
begin
|
|
||||||
b := true;
|
|
||||||
break;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
if not b then
|
|
||||||
fBreakPoints.items.Delete(i);
|
|
||||||
end;
|
|
||||||
end
|
|
||||||
else fBreakPoints.clearFile(fDoc.fileName);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TCEGdbWidget.deleteRedirectedIO;
|
procedure TCEGdbWidget.deleteRedirectedIO;
|
||||||
begin
|
begin
|
||||||
if fOptions.keepRedirectedStreams then
|
if fOptions.keepRedirectedStreams then
|
||||||
|
@ -2043,9 +2009,7 @@ begin
|
||||||
// internal gdb messages
|
// internal gdb messages
|
||||||
'&':
|
'&':
|
||||||
begin
|
begin
|
||||||
rng.popUntil(#10);
|
parseCLI(json, rng.popFront);
|
||||||
if not rng.empty then
|
|
||||||
rng.popFront;
|
|
||||||
end;
|
end;
|
||||||
// async notify / status / out stream when remote (@)
|
// async notify / status / out stream when remote (@)
|
||||||
'=', '+','@':
|
'=', '+','@':
|
||||||
|
@ -2243,6 +2207,7 @@ begin
|
||||||
subjDebugStop(fSubj);
|
subjDebugStop(fSubj);
|
||||||
deleteRedirectedIO;
|
deleteRedirectedIO;
|
||||||
updateDebugeeOptionsEditor;
|
updateDebugeeOptionsEditor;
|
||||||
|
killGdb;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -2428,7 +2393,7 @@ begin
|
||||||
fShowFromCustomCommand := false;
|
fShowFromCustomCommand := false;
|
||||||
if fJson.findArray('CLI', arr) then
|
if fJson.findArray('CLI', arr) then
|
||||||
for i := 0 to arr.Count-1 do
|
for i := 0 to arr.Count-1 do
|
||||||
fMsg.message(arr.Strings[i], nil, amcMisc, amkBub);
|
fMsg.message(arr.Strings[i], nil, amcMisc, amkAuto);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
@ -2518,7 +2483,7 @@ end;
|
||||||
|
|
||||||
procedure TCEGdbWidget.infoVariables;
|
procedure TCEGdbWidget.infoVariables;
|
||||||
begin
|
begin
|
||||||
gdbCommand('-stack-list-variables --skip-unavailable --simple-values');
|
gdbCommand('-stack-list-variables --skip-unavailable --all-values');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCEGdbWidget.infoThreads;
|
procedure TCEGdbWidget.infoThreads;
|
||||||
|
@ -2604,6 +2569,7 @@ begin
|
||||||
setState(gsNone);
|
setState(gsNone);
|
||||||
deleteRedirectedIO;
|
deleteRedirectedIO;
|
||||||
updateDebugeeOptionsEditor;
|
updateDebugeeOptionsEditor;
|
||||||
|
killGdb;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCEGdbWidget.btnWatchClick(Sender: TObject);
|
procedure TCEGdbWidget.btnWatchClick(Sender: TObject);
|
||||||
|
|
|
@ -82,8 +82,6 @@ type
|
||||||
fFontSize: Integer;
|
fFontSize: Integer;
|
||||||
fSourceFilename: string;
|
fSourceFilename: string;
|
||||||
procedure setFolds(someFolds: TCollection);
|
procedure setFolds(someFolds: TCollection);
|
||||||
procedure writeBreakpoints(str: TStream);
|
|
||||||
procedure readBreakpoints(str: TStream);
|
|
||||||
published
|
published
|
||||||
property caretPosition: Integer read fCaretPosition write fCaretPosition;
|
property caretPosition: Integer read fCaretPosition write fCaretPosition;
|
||||||
property sourceFilename: string read fSourceFilename write fSourceFilename;
|
property sourceFilename: string read fSourceFilename write fSourceFilename;
|
||||||
|
@ -93,8 +91,6 @@ type
|
||||||
public
|
public
|
||||||
constructor create(aComponent: TComponent); override;
|
constructor create(aComponent: TComponent); override;
|
||||||
destructor destroy; override;
|
destructor destroy; override;
|
||||||
procedure DefineProperties(Filer: TFiler); override;
|
|
||||||
//
|
|
||||||
procedure beforeSave; override;
|
procedure beforeSave; override;
|
||||||
procedure afterLoad; override;
|
procedure afterLoad; override;
|
||||||
procedure save;
|
procedure save;
|
||||||
|
@ -204,7 +200,6 @@ type
|
||||||
fD2Highlighter: TSynD2Syn;
|
fD2Highlighter: TSynD2Syn;
|
||||||
fTxtHighlighter: TSynTxtSyn;
|
fTxtHighlighter: TSynTxtSyn;
|
||||||
fImages: TImageList;
|
fImages: TImageList;
|
||||||
fBreakPoints: TFPList;
|
|
||||||
fMatchSelectionOpts: TSynSearchOptions;
|
fMatchSelectionOpts: TSynSearchOptions;
|
||||||
fMatchIdentOpts: TSynSearchOptions;
|
fMatchIdentOpts: TSynSearchOptions;
|
||||||
fMatchOpts: TIdentifierMatchOptions;
|
fMatchOpts: TIdentifierMatchOptions;
|
||||||
|
@ -282,18 +277,15 @@ type
|
||||||
procedure patchClipboardIndentation;
|
procedure patchClipboardIndentation;
|
||||||
//
|
//
|
||||||
procedure gutterClick(Sender: TObject; X, Y, Line: integer; mark: TSynEditMark);
|
procedure gutterClick(Sender: TObject; X, Y, Line: integer; mark: TSynEditMark);
|
||||||
procedure addBreakPoint(line: integer);
|
|
||||||
procedure removeBreakPoint(line: integer);
|
|
||||||
procedure removeDebugTimeMarks;
|
procedure removeDebugTimeMarks;
|
||||||
function findBreakPoint(line: integer): boolean;
|
function findBreakPoint(line: integer): boolean;
|
||||||
procedure debugStart(debugger: ICEDebugger);
|
procedure debugStart(debugger: ICEDebugger);
|
||||||
procedure debugStop;
|
procedure debugStop;
|
||||||
procedure debugContinue;
|
procedure debugContinue;
|
||||||
function debugQueryBpCount: integer;
|
function debugQueryBpCount: integer;
|
||||||
procedure debugQueryBreakPoint(const index: integer; out fname: string; out line: integer; out kind: TBreakPointKind);
|
procedure debugQueryBreakPoint(const line: integer; out fname: string; out kind: TBreakPointKind);
|
||||||
procedure debugBreak(const fname: string; line: integer; reason: TCEDebugBreakReason);
|
procedure debugBreak(const fname: string; line: integer; reason: TCEDebugBreakReason);
|
||||||
function breakPointsCount: integer;
|
function breakPointsCount: integer;
|
||||||
function breakPointLine(index: integer): integer;
|
|
||||||
protected
|
protected
|
||||||
procedure DoEnter; override;
|
procedure DoEnter; override;
|
||||||
procedure DoExit; override;
|
procedure DoExit; override;
|
||||||
|
@ -322,6 +314,8 @@ type
|
||||||
procedure save;
|
procedure save;
|
||||||
procedure saveTempFile;
|
procedure saveTempFile;
|
||||||
//
|
//
|
||||||
|
procedure addBreakPoint(line: integer);
|
||||||
|
procedure removeBreakPoint(line: integer);
|
||||||
procedure curlyBraceCloseAndIndent;
|
procedure curlyBraceCloseAndIndent;
|
||||||
procedure insertLeadingDDocSymbol(c: char);
|
procedure insertLeadingDDocSymbol(c: char);
|
||||||
procedure commentSelection;
|
procedure commentSelection;
|
||||||
|
@ -576,42 +570,11 @@ begin
|
||||||
inherited;
|
inherited;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCESynMemoCache.DefineProperties(Filer: TFiler);
|
|
||||||
begin
|
|
||||||
inherited;
|
|
||||||
Filer.DefineBinaryProperty('breakpoints', @readBreakpoints, @writeBreakpoints, true);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TCESynMemoCache.setFolds(someFolds: TCollection);
|
procedure TCESynMemoCache.setFolds(someFolds: TCollection);
|
||||||
begin
|
begin
|
||||||
fFolds.Assign(someFolds);
|
fFolds.Assign(someFolds);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCESynMemoCache.writeBreakpoints(str: TStream);
|
|
||||||
var
|
|
||||||
i: integer;
|
|
||||||
begin
|
|
||||||
if fMemo.isNil then exit;
|
|
||||||
{$HINTS OFF}
|
|
||||||
for i:= 0 to fMemo.fBreakPoints.Count-1 do
|
|
||||||
str.Write(PtrUint(fMemo.fBreakPoints.Items[i]), sizeOf(PtrUint));
|
|
||||||
{$HINTS ON}
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TCESynMemoCache.readBreakpoints(str: TStream);
|
|
||||||
var
|
|
||||||
i, cnt: integer;
|
|
||||||
line: ptrUint = 0;
|
|
||||||
begin
|
|
||||||
if fMemo.isNil then exit;
|
|
||||||
cnt := str.Size div sizeOf(PtrUint);
|
|
||||||
for i := 0 to cnt-1 do
|
|
||||||
begin
|
|
||||||
str.Read(line, sizeOf(line));
|
|
||||||
fMemo.addBreakPoint(line);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TCESynMemoCache.beforeSave;
|
procedure TCESynMemoCache.beforeSave;
|
||||||
var
|
var
|
||||||
i, start, prev: Integer;
|
i, start, prev: Integer;
|
||||||
|
@ -941,7 +904,6 @@ begin
|
||||||
fImages.AddResourceName(HINSTANCE, 'STEP');
|
fImages.AddResourceName(HINSTANCE, 'STEP');
|
||||||
fImages.AddResourceName(HINSTANCE, 'CAMERA_GO');
|
fImages.AddResourceName(HINSTANCE, 'CAMERA_GO');
|
||||||
fImages.AddResourceName(HINSTANCE, 'WARNING');
|
fImages.AddResourceName(HINSTANCE, 'WARNING');
|
||||||
fBreakPoints := TFPList.Create;
|
|
||||||
|
|
||||||
fPositions := TCESynMemoPositions.create(self);
|
fPositions := TCESynMemoPositions.create(self);
|
||||||
fMultiDocSubject := TCEMultiDocSubject.create;
|
fMultiDocSubject := TCEMultiDocSubject.create;
|
||||||
|
@ -978,7 +940,6 @@ begin
|
||||||
fMultiDocSubject.Free;
|
fMultiDocSubject.Free;
|
||||||
fPositions.Free;
|
fPositions.Free;
|
||||||
fCompletion.Free;
|
fCompletion.Free;
|
||||||
fBreakPoints.Free;
|
|
||||||
fCallTipStrings.Free;
|
fCallTipStrings.Free;
|
||||||
fLexToks.Clear;
|
fLexToks.Clear;
|
||||||
fLexToks.Free;
|
fLexToks.Free;
|
||||||
|
@ -3237,17 +3198,12 @@ end;
|
||||||
|
|
||||||
{$REGION debugging/breakpoints -----------------------------------------------------------}
|
{$REGION debugging/breakpoints -----------------------------------------------------------}
|
||||||
function TCESynMemo.breakPointsCount: integer;
|
function TCESynMemo.breakPointsCount: integer;
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
begin
|
begin
|
||||||
exit(fBreakPoints.Count);
|
result := 0;
|
||||||
end;
|
for i := 0 to marks.count-1 do
|
||||||
|
result += byte(marks[i].ImageIndex = integer(giBreakSet));
|
||||||
function TCESynMemo.BreakPointLine(index: integer): integer;
|
|
||||||
begin
|
|
||||||
if index >= fBreakPoints.Count then
|
|
||||||
exit(0);
|
|
||||||
{$PUSH}{$WARNINGS OFF}{$HINTS OFF}
|
|
||||||
exit(Integer(fBreakPoints.Items[index]));
|
|
||||||
{$POP}
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCESynMemo.addBreakPoint(line: integer);
|
procedure TCESynMemo.addBreakPoint(line: integer);
|
||||||
|
@ -3255,9 +3211,6 @@ begin
|
||||||
if findBreakPoint(line) then
|
if findBreakPoint(line) then
|
||||||
exit;
|
exit;
|
||||||
addGutterIcon(line, giBreakSet);
|
addGutterIcon(line, giBreakSet);
|
||||||
{$PUSH}{$WARNINGS OFF}{$HINTS OFF}
|
|
||||||
fBreakPoints.Add(pointer(line));
|
|
||||||
{$POP}
|
|
||||||
if assigned(fDebugger) then
|
if assigned(fDebugger) then
|
||||||
fDebugger.addBreakPoint(fFilename, line, bpkBreak);
|
fDebugger.addBreakPoint(fFilename, line, bpkBreak);
|
||||||
end;
|
end;
|
||||||
|
@ -3267,9 +3220,6 @@ begin
|
||||||
if not findBreakPoint(line) then
|
if not findBreakPoint(line) then
|
||||||
exit;
|
exit;
|
||||||
removeGutterIcon(line, giBreakSet);
|
removeGutterIcon(line, giBreakSet);
|
||||||
{$PUSH}{$WARNINGS OFF}{$HINTS OFF}
|
|
||||||
fBreakPoints.Remove(pointer(line));
|
|
||||||
{$POP}
|
|
||||||
if assigned(fDebugger) then
|
if assigned(fDebugger) then
|
||||||
fDebugger.removeBreakPoint(fFilename, line);
|
fDebugger.removeBreakPoint(fFilename, line);
|
||||||
end;
|
end;
|
||||||
|
@ -3308,10 +3258,17 @@ begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCESynMemo.findBreakPoint(line: integer): boolean;
|
function TCESynMemo.findBreakPoint(line: integer): boolean;
|
||||||
|
var
|
||||||
|
m: TSynEditMarkLine;
|
||||||
|
i: integer;
|
||||||
begin
|
begin
|
||||||
{$PUSH}{$WARNINGS OFF}{$HINTS OFF}
|
result := false;
|
||||||
exit(fBreakPoints.IndexOf(pointer(line)) <> -1);
|
if line <= lines.count then
|
||||||
{$POP}
|
m := marks.Line[line];
|
||||||
|
if m.isNotNil then
|
||||||
|
for i := 0 to m.count - 1 do
|
||||||
|
if m[i].ImageIndex = integer(giBreakSet) then
|
||||||
|
exit(true);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCESynMemo.gutterClick(Sender: TObject; X, Y, Line: integer; mark: TSynEditMark);
|
procedure TCESynMemo.gutterClick(Sender: TObject; X, Y, Line: integer; mark: TSynEditMark);
|
||||||
|
@ -3370,8 +3327,18 @@ begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCESynMemo.debugStart(debugger: ICEDebugger);
|
procedure TCESynMemo.debugStart(debugger: ICEDebugger);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
m: TSynEditMark;
|
||||||
begin
|
begin
|
||||||
fDebugger := debugger;
|
fDebugger := debugger;
|
||||||
|
fDebugger.removeBreakPoints(fileName);
|
||||||
|
for i := 0 to marks.count - 1 do
|
||||||
|
begin
|
||||||
|
m := marks[i];
|
||||||
|
if m.ImageIndex = integer(giBreakSet) then
|
||||||
|
fDebugger.addBreakPoint(filename, m.line, bpkBreak);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCESynMemo.debugStop;
|
procedure TCESynMemo.debugStop;
|
||||||
|
@ -3386,15 +3353,17 @@ end;
|
||||||
|
|
||||||
function TCESynMemo.debugQueryBpCount: integer;
|
function TCESynMemo.debugQueryBpCount: integer;
|
||||||
begin
|
begin
|
||||||
exit(fBreakPoints.Count);
|
exit(breakPointsCount());
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCESynMemo.debugQueryBreakPoint(const index: integer; out fname: string;
|
procedure TCESynMemo.debugQueryBreakPoint(const line: integer; out fname: string; out kind: TBreakPointKind);
|
||||||
out line: integer; out kind: TBreakPointKind);
|
|
||||||
begin
|
begin
|
||||||
fname:= fFilename;
|
if findBreakPoint(line) then
|
||||||
line := breakPointLine(index);
|
begin
|
||||||
kind := bpkBreak;
|
fname:= fFilename;
|
||||||
|
kind := bpkBreak;
|
||||||
|
end
|
||||||
|
else kind := bpkNone;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCESynMemo.debugBreak(const fname: string; line: integer;
|
procedure TCESynMemo.debugBreak(const fname: string; line: integer;
|
||||||
|
|
Loading…
Reference in New Issue