diff --git a/components/debuggerintf/dbgintfdebuggerbase.pp b/components/debuggerintf/dbgintfdebuggerbase.pp
index 3a4eaad90f..15cc590488 100644
--- a/components/debuggerintf/dbgintfdebuggerbase.pp
+++ b/components/debuggerintf/dbgintfdebuggerbase.pp
@@ -67,6 +67,7 @@ type
dcStepInto,
dcStepOut,
dcStepTo,
+ dcRunTo,
dcJumpto,
dcAttach,
dcDetach,
@@ -1945,6 +1946,7 @@ type
procedure StepIntoInstr;
procedure StepOut;
procedure StepTo(const ASource: String; const ALine: Integer); // Executes til a certain point
+ procedure RunTo(const ASource: String; const ALine: Integer); // Executes til a certain point
procedure JumpTo(const ASource: String; const ALine: Integer); // No execute, only set exec point
procedure Attach(AProcessID: String);
procedure Detach;
@@ -2069,11 +2071,11 @@ const
COMMANDMAP: array[TDBGState] of TDBGCommands = (
{dsNone } [],
{dsIdle } [dcEnvironment],
- {dsStop } [dcRun, dcStepOver, dcStepInto, dcStepOverInstr, dcStepIntoInstr,
+ {dsStop } [dcRun, dcStepOver, dcStepInto, dcStepOverInstr, dcStepIntoInstr, dcRunTo,
dcAttach, dcBreak, dcWatch, dcEvaluate, dcEnvironment,
dcSendConsoleInput],
{dsPause} [dcRun, dcStop, dcStepOver, dcStepInto, dcStepOverInstr, dcStepIntoInstr,
- dcStepOut, dcStepTo, dcJumpto, dcDetach, dcBreak, dcWatch, dcLocal, dcEvaluate, dcModify,
+ dcStepOut, dcStepTo, dcRunTo, dcJumpto, dcDetach, dcBreak, dcWatch, dcLocal, dcEvaluate, dcModify,
dcEnvironment, dcSetStackFrame, dcDisassemble, dcSendConsoleInput {, dcSendSignal}],
{dsInternalPause} // same as run, so not really used
[dcStop, dcBreak, dcWatch, dcEnvironment, dcSendConsoleInput{, dcSendSignal}],
@@ -6239,6 +6241,11 @@ begin
ReqCmd(dcStepTo, [ASource, ALine]);
end;
+procedure TDebuggerIntf.RunTo(const ASource: String; const ALine: Integer);
+begin
+ ReqCmd(dcRunTo, [ASource, ALine]);
+end;
+
procedure TDebuggerIntf.SetDebuggerEnvironment (const AValue: TStrings );
begin
FDebuggerEnvironment.Assign(AValue);
diff --git a/components/ideintf/idecommands.pas b/components/ideintf/idecommands.pas
index cf53f677a0..8b6b6fffa8 100644
--- a/components/ideintf/idecommands.pas
+++ b/components/ideintf/idecommands.pas
@@ -278,6 +278,8 @@ const
ecStopProgram = ecFirstLazarus + 415;
ecResetDebugger = ecFirstLazarus + 416;
ecRunParameters = ecFirstLazarus + 417;
+ ecRunToCursor = ecFirstLazarus + 418;
+
ecBuildFile = ecFirstLazarus + 431;
ecRunFile = ecFirstLazarus + 432;
ecConfigBuildFile = ecFirstLazarus + 433;
@@ -1933,7 +1935,7 @@ begin
end;
const
- IDEEditorCommandStrs: array[0..322] of TIdentMapEntry = (
+ IDEEditorCommandStrs: array[0..323] of TIdentMapEntry = (
// search
(Value: ecFind; Name: 'ecFind'),
(Value: ecFindAgain; Name: 'ecFindAgain'),
@@ -2152,6 +2154,7 @@ const
(Value: ecStepInto; Name: 'ecStepInto'),
(Value: ecStepOver; Name: 'ecStepOver'),
(Value: ecStepToCursor; Name: 'ecStepToCursor'),
+ (Value: ecRunToCursor; Name: 'ecRunToCursor'),
(Value: ecStopProgram; Name: 'ecStopProgram'),
(Value: ecResetDebugger; Name: 'ecResetDebugger'),
(Value: ecRunParameters; Name: 'ecRunParameters'),
diff --git a/debugger/debugger.pp b/debugger/debugger.pp
index 797af6bcd9..9f905f7367 100644
--- a/debugger/debugger.pp
+++ b/debugger/debugger.pp
@@ -1735,6 +1735,7 @@ const
'StepInto',
'StepOut',
'StepTo',
+ 'RunTo',
'Jumpto',
'Attach',
'Detach',
diff --git a/ide/basedebugmanager.pas b/ide/basedebugmanager.pas
index e52ad0a28a..889a31cf66 100644
--- a/ide/basedebugmanager.pas
+++ b/ide/basedebugmanager.pas
@@ -165,6 +165,7 @@ type
function DoStepIntoInstrProject: TModalResult; virtual; abstract;
function DoStepOverInstrProject: TModalResult; virtual; abstract;
function DoStepToCursor: TModalResult; virtual; abstract;
+ function DoRunToCursor: TModalResult; virtual; abstract;
function DoStopProject: TModalResult; virtual; abstract;
procedure DoToggleCallStack; virtual; abstract;
procedure DoSendConsoleInput(AText: String); virtual; abstract;
diff --git a/ide/debugmanager.pas b/ide/debugmanager.pas
index 9f8352a715..c8b923b751 100644
--- a/ide/debugmanager.pas
+++ b/ide/debugmanager.pas
@@ -224,6 +224,7 @@ type
function DoStepOverInstrProject: TModalResult; override;
function DoStepOutProject: TModalResult; override;
function DoStepToCursor: TModalResult; override;
+ function DoRunToCursor: TModalResult; override;
function DoStopProject: TModalResult; override;
procedure DoToggleCallStack; override;
procedure DoSendConsoleInput(AText: String); override;
@@ -2057,6 +2058,7 @@ procedure TDebugManager.SetupSourceMenuShortCuts;
begin
SrcEditMenuToggleBreakpoint.Command:=GetCommand(ecToggleBreakPoint);
SrcEditMenuStepToCursor.Command:=GetCommand(ecStepToCursor);
+ SrcEditMenuRunToCursor.Command:=GetCommand(ecRunToCursor);
SrcEditMenuEvaluateModify.Command:=GetCommand(ecEvaluate);
SrcEditMenuAddWatchAtCursor.Command:=GetCommand(ecAddWatch);
SrcEditMenuAddWatchPointAtCursor.Command:=GetCommand(ecAddBpDataWatch);
@@ -2102,9 +2104,12 @@ begin
// Step out
itmRunMenuStepOut.Enabled := CanRun and DebuggerIsValid
and (dcStepOut in FDebugger.Commands) and (FDebugger.State = dsPause);
- // Run to cursor
+ // Step to cursor
itmRunMenuStepToCursor.Enabled := CanRun and DebuggerIsValid
and (dcStepTo in FDebugger.Commands);
+ // Run to cursor
+ itmRunMenuRunToCursor.Enabled := CanRun and DebuggerIsValid
+ and (dcRunTo in FDebugger.Commands);
// Stop
itmRunMenuStop.Enabled := CanRun and DebuggerIsValid;
@@ -2758,7 +2763,8 @@ begin
else DoStepOverProject;
end;
ecStepOut: DoStepOutProject;
- ecStepToCursor: DoStepToCursor;
+ ecStepToCursor: DoStepToCursor;
+ ecRunToCursor: DoRunToCursor;
ecStopProgram: DoStopProject;
ecResetDebugger: ResetDebugger;
ecToggleCallStack: DoToggleCallStack;
@@ -3078,6 +3084,47 @@ begin
Result := mrOK;
end;
+function TDebugManager.DoRunToCursor: TModalResult;
+var
+ ActiveSrcEdit: TSourceEditorInterface;
+ ActiveUnitInfo: TUnitInfo;
+ UnitFilename: string;
+begin
+ if (FDebugger = nil) or not(dcRunTo in FDebugger.Commands)
+ then begin
+ Result := mrAbort;
+ Exit;
+ end;
+
+ if (MainIDE.DoInitProjectRun <> mrOK)
+ or (MainIDE.ToolStatus <> itDebugger)
+ or (FDebugger = nil) or Destroying
+ then begin
+ Result := mrAbort;
+ Exit;
+ end;
+
+ Result := mrCancel;
+
+ MainIDE.GetCurrentUnitInfo(ActiveSrcEdit,ActiveUnitInfo);
+ if (ActiveSrcEdit=nil) or (ActiveUnitInfo=nil)
+ then begin
+ IDEMessageDialog(lisRunToFailed, lisPleaseOpenAUnitBeforeRun, mtError,
+ [mbCancel]);
+ Result := mrCancel;
+ Exit;
+ end;
+
+ if not ActiveUnitInfo.Source.IsVirtual
+ then UnitFilename:=ActiveUnitInfo.Filename
+ else UnitFilename:=BuildBoss.GetTestUnitFilename(ActiveUnitInfo);
+
+ FDebugger.RunTo(ExtractFilename(UnitFilename),
+ TSourceEditor(ActiveSrcEdit).EditorComponent.CaretY);
+
+ Result := mrOK;
+end;
+
function TDebugManager.GetState: TDBGState;
begin
if FDebugger = nil
diff --git a/ide/keymapping.pp b/ide/keymapping.pp
index 89d59d1e29..5f6bebf29c 100644
--- a/ide/keymapping.pp
+++ b/ide/keymapping.pp
@@ -705,6 +705,7 @@ begin
ecAttach : Result:= srkmecAttach;
ecDetach : Result:= srkmecDetach;
ecStepToCursor : Result:= lisMenuStepToCursor;
+ ecRunToCursor : Result:= lisMenuRunToCursor;
ecStopProgram : Result:= srkmecStopProgram;
ecResetDebugger : Result:= srkmecResetDebugger;
ecRunParameters : Result:= srkmecRunParameters;
@@ -3169,6 +3170,7 @@ begin
AddDefault(C, 'Step over context', lisMenuStepOverContext, ecStepOverContext);
AddDefault(C, 'Step out', n(lisMenuStepOut), ecStepOut);
AddDefault(C, 'Step to cursor line', n(lisMenuStepToCursor), ecStepToCursor);
+ AddDefault(C, 'Run to cursor line', n(lisMenuRunToCursor), ecRunToCursor);
AddDefault(C, 'Stop program', lisKMStopProgram, ecStopProgram);
AddDefault(C, 'Reset debugger', lisMenuResetDebugger, ecResetDebugger);
AddDefault(C, 'Run parameters', dlgRunParameters, ecRunParameters);
diff --git a/ide/lazarus.lpi b/ide/lazarus.lpi
index a92d4044ad..b5b2e5b6a6 100644
--- a/ide/lazarus.lpi
+++ b/ide/lazarus.lpi
@@ -1036,6 +1036,7 @@
+
@@ -1191,6 +1192,7 @@
+
@@ -1234,6 +1236,7 @@
+
diff --git a/ide/lazarus.res b/ide/lazarus.res
index daf660f5e4..853e17f061 100644
Binary files a/ide/lazarus.res and b/ide/lazarus.res differ
diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas
index 66aa7b6cfa..7ed5c4ffa3 100644
--- a/ide/lazarusidestrconsts.pas
+++ b/ide/lazarusidestrconsts.pas
@@ -530,6 +530,7 @@ resourcestring
lisMenuStepOverContext = 'Step Over (Context)';
lisMenuStepOut = 'Step O&ut';
lisMenuStepToCursor = 'Step over to &Cursor';
+ lisMenuRunToCursor = 'Run to Cursor';
lisKMStopProgram = 'Stop Program';
lisContinueAndDoNotAskAgain = 'Continue and do not ask again';
lisSuspiciousUnitPath = 'Suspicious unit path';
diff --git a/ide/main.pp b/ide/main.pp
index 357ca7af0b..73ff9f310e 100644
--- a/ide/main.pp
+++ b/ide/main.pp
@@ -347,6 +347,7 @@ type
procedure mnuStepIntoInstrProjectClicked(Sender: TObject);
procedure mnuStepOverInstrProjectClicked(Sender: TObject);
procedure mnuStepOutProjectClicked(Sender: TObject);
+ procedure mnuRunToCursorProjectClicked(Sender: TObject);
procedure mnuStepToCursorProjectClicked(Sender: TObject);
procedure mnuStopProjectClicked(Sender: TObject);
procedure mnuAttachDebuggerClicked(Sender: TObject);
@@ -3097,6 +3098,7 @@ begin
itmRunMenuStepInto.Command:=GetCommand(ecStepInto, @mnuStepIntoProjectClicked);
itmRunMenuStepOver.Command:=GetCommand(ecStepOver, @mnuStepOverProjectClicked);
itmRunMenuStepOut.Command:=GetCommand(ecStepOut, @mnuStepOutProjectClicked);
+ itmRunMenuRunToCursor.Command:=GetCommand(ecRunToCursor, @mnuRunToCursorProjectClicked);
itmRunMenuStepToCursor.Command:=GetCommand(ecStepToCursor, @mnuStepToCursorProjectClicked);
itmRunMenuStop.Command:=GetCommand(ecStopProgram, @mnuStopProjectClicked);
itmRunMenuAttach.Command:=GetCommand(ecAttach, @mnuAttachDebuggerClicked);
@@ -4632,6 +4634,11 @@ begin
DebugBoss.DoStepOutProject;
end;
+procedure TMainIDE.mnuRunToCursorProjectClicked(Sender: TObject);
+begin
+ DebugBoss.DoRunToCursor;
+end;
+
procedure TMainIDE.mnuStepToCursorProjectClicked(Sender: TObject);
begin
DebugBoss.DoStepToCursor;
diff --git a/ide/mainbar.pas b/ide/mainbar.pas
index a3e5c04da0..e21fb857c7 100644
--- a/ide/mainbar.pas
+++ b/ide/mainbar.pas
@@ -298,6 +298,7 @@ type
itmRunMenuStepOver: TIDEMenuCommand;
itmRunMenuStepOut: TIDEMenuCommand;
itmRunMenuStepToCursor: TIDEMenuCommand;
+ itmRunMenuRunToCursor: TIDEMenuCommand;
itmRunMenuStop: TIDEMenuCommand;
itmRunMenuAttach: TIDEMenuCommand;
itmRunMenuDetach: TIDEMenuCommand;
diff --git a/ide/mainbase.pas b/ide/mainbase.pas
index f0fb77dd1a..310e3c4301 100644
--- a/ide/mainbase.pas
+++ b/ide/mainbase.pas
@@ -1358,6 +1358,7 @@ begin
CreateMenuItem(ParentMI,itmRunMenuStepOver,'itmRunMenuStepOver',lisMenuStepOver,'menu_stepover');
CreateMenuItem(ParentMI,itmRunMenuStepOut,'itmRunMenuStepOut',lisMenuStepOut,'menu_stepout');
CreateMenuItem(ParentMI,itmRunMenuStepToCursor,'itmRunMenuStepToCursor',lisMenuStepToCursor,'menu_step_cursor');
+ CreateMenuItem(ParentMI,itmRunMenuRunToCursor,'itmRunMenuRunToCursor',lisMenuRunToCursor,'menu_run_cursor');
CreateMenuItem(ParentMI,itmRunMenuStop,'itmRunMenuStop',lisStop,'menu_stop', False);
CreateMenuItem(ParentMI,itmRunMenuAttach,'itmRunMenuAttach',srkmecAttach+' ...','', False);
diff --git a/ide/sourceeditor.pp b/ide/sourceeditor.pp
index 1e6b2be77d..c9b26b928d 100644
--- a/ide/sourceeditor.pp
+++ b/ide/sourceeditor.pp
@@ -1376,6 +1376,7 @@ var
// debugging
SrcEditMenuToggleBreakpoint: TIDEMenuCommand;
SrcEditMenuStepToCursor: TIDEMenuCommand;
+ SrcEditMenuRunToCursor: TIDEMenuCommand;
SrcEditMenuEvaluateModify: TIDEMenuCommand;
SrcEditMenuAddWatchAtCursor: TIDEMenuCommand;
SrcEditMenuAddWatchPointAtCursor: TIDEMenuCommand;
@@ -1738,6 +1739,8 @@ begin
SrcEditMenuInspect.Enabled:=False;
SrcEditMenuStepToCursor:=RegisterIDEMenuCommand(AParent,
'Run to cursor', lisMenuStepToCursor, nil, nil, nil, 'menu_step_cursor');
+ SrcEditMenuRunToCursor:=RegisterIDEMenuCommand(AParent,
+ 'Run to cursor', lisMenuRunToCursor, nil, nil, nil, 'menu_run_cursor');
SrcEditMenuViewCallStack:=RegisterIDEMenuCommand(AParent,
'View Call Stack', uemViewCallStack, nil, @ExecuteIdeMenuClick, nil, 'debugger_call_stack');
{%endregion}