|
@@ -38,7 +38,7 @@ type
|
|
TDebugEntryArray = array[0..0] of TDebugEntry;
|
|
TDebugEntryArray = array[0..0] of TDebugEntry;
|
|
PVariableDebugEntryArray = ^TVariableDebugEntryArray;
|
|
PVariableDebugEntryArray = ^TVariableDebugEntryArray;
|
|
TVariableDebugEntryArray = array[0..0] of TVariableDebugEntry;
|
|
TVariableDebugEntryArray = array[0..0] of TVariableDebugEntry;
|
|
- TStepMode = (smRun, smStepInto, smStepOver, smRunToCursor);
|
|
|
|
|
|
+ TStepMode = (smRun, smStepInto, smStepOver, smStepOut, smRunToCursor);
|
|
TDebugTarget = (dtSetup, dtUninstall);
|
|
TDebugTarget = (dtSetup, dtUninstall);
|
|
|
|
|
|
const
|
|
const
|
|
@@ -185,6 +185,7 @@ type
|
|
HMailingList: TMenuItem;
|
|
HMailingList: TMenuItem;
|
|
MemosTabSet: TNewTabSet; { First tab is the main memo, last tab is the preprocessor output memo }
|
|
MemosTabSet: TNewTabSet; { First tab is the main memo, last tab is the preprocessor output memo }
|
|
FSaveAll: TMenuItem;
|
|
FSaveAll: TMenuItem;
|
|
|
|
+ RStepOut: TMenuItem;
|
|
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
|
|
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
|
|
procedure FExitClick(Sender: TObject);
|
|
procedure FExitClick(Sender: TObject);
|
|
procedure FOpenMainFileClick(Sender: TObject);
|
|
procedure FOpenMainFileClick(Sender: TObject);
|
|
@@ -272,6 +273,7 @@ type
|
|
procedure TInsertMsgBoxClick(Sender: TObject);
|
|
procedure TInsertMsgBoxClick(Sender: TObject);
|
|
procedure MemosTabSetClick(Sender: TObject);
|
|
procedure MemosTabSetClick(Sender: TObject);
|
|
procedure FSaveAllClick(Sender: TObject);
|
|
procedure FSaveAllClick(Sender: TObject);
|
|
|
|
+ procedure RStepOutClick(Sender: TObject);
|
|
private
|
|
private
|
|
{ Private declarations }
|
|
{ Private declarations }
|
|
FMemos: TList<TCompScintEdit>; { FMemos[0] is the main memo and FMemos[1] the preprocessor output memo - also see MemosTabSet comment above }
|
|
FMemos: TList<TCompScintEdit>; { FMemos[0] is the main memo and FMemos[1] the preprocessor output memo - also see MemosTabSet comment above }
|
|
@@ -332,7 +334,7 @@ type
|
|
FLoadingIncludedFiles: Boolean;
|
|
FLoadingIncludedFiles: Boolean;
|
|
FDebugging: Boolean;
|
|
FDebugging: Boolean;
|
|
FStepMode: TStepMode;
|
|
FStepMode: TStepMode;
|
|
- FPaused: Boolean;
|
|
|
|
|
|
+ FPaused, FPausedAtCodeLine: Boolean;
|
|
FRunToCursorPoint: TDebugEntry;
|
|
FRunToCursorPoint: TDebugEntry;
|
|
FReplyString: String;
|
|
FReplyString: String;
|
|
FDebuggerException: String;
|
|
FDebuggerException: String;
|
|
@@ -437,7 +439,8 @@ type
|
|
procedure WMDebuggerHello(var Message: TMessage); message WM_Debugger_Hello;
|
|
procedure WMDebuggerHello(var Message: TMessage); message WM_Debugger_Hello;
|
|
procedure WMDebuggerGoodbye(var Message: TMessage); message WM_Debugger_Goodbye;
|
|
procedure WMDebuggerGoodbye(var Message: TMessage); message WM_Debugger_Goodbye;
|
|
procedure WMDebuggerQueryVersion(var Message: TMessage); message WM_Debugger_QueryVersion;
|
|
procedure WMDebuggerQueryVersion(var Message: TMessage); message WM_Debugger_QueryVersion;
|
|
- procedure GetMemoAndLineNumberFromEntry(Kind, Index: Integer; var Memo: TCompScintFileEdit; var LineNumber: Integer);
|
|
|
|
|
|
+ procedure GetMemoAndDebugEntryFromMessage(Kind, Index: Integer; var Memo: TCompScintFileEdit;
|
|
|
|
+ var DebugEntry: PDebugEntry);
|
|
procedure DebuggerStepped(var Message: TMessage; const Intermediate: Boolean);
|
|
procedure DebuggerStepped(var Message: TMessage; const Intermediate: Boolean);
|
|
procedure WMDebuggerStepped(var Message: TMessage); message WM_Debugger_Stepped;
|
|
procedure WMDebuggerStepped(var Message: TMessage); message WM_Debugger_Stepped;
|
|
procedure WMDebuggerSteppedIntermediate(var Message: TMessage); message WM_Debugger_SteppedIntermediate;
|
|
procedure WMDebuggerSteppedIntermediate(var Message: TMessage); message WM_Debugger_SteppedIntermediate;
|
|
@@ -3205,7 +3208,7 @@ begin
|
|
DebuggingStopped(True);
|
|
DebuggingStopped(True);
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure TCompileForm.GetMemoAndLineNumberFromEntry(Kind, Index: Integer; var Memo: TCompScintFileEdit; var LineNumber: Integer);
|
|
|
|
|
|
+procedure TCompileForm.GetMemoAndDebugEntryFromMessage(Kind, Index: Integer; var Memo: TCompScintFileEdit; var DebugEntry: PDebugEntry);
|
|
|
|
|
|
function GetMemoFromDebugEntryFileIndex(const FileIndex: Integer): TCompScintFileEdit;
|
|
function GetMemoFromDebugEntryFileIndex(const FileIndex: Integer): TCompScintFileEdit;
|
|
var
|
|
var
|
|
@@ -3229,12 +3232,12 @@ begin
|
|
for I := 0 to FDebugEntriesCount-1 do begin
|
|
for I := 0 to FDebugEntriesCount-1 do begin
|
|
if (FDebugEntries[I].Kind = Kind) and (FDebugEntries[I].Index = Index) then begin
|
|
if (FDebugEntries[I].Kind = Kind) and (FDebugEntries[I].Index = Index) then begin
|
|
Memo := GetMemoFromDebugEntryFileIndex(FDebugEntries[I].FileIndex);
|
|
Memo := GetMemoFromDebugEntryFileIndex(FDebugEntries[I].FileIndex);
|
|
- LineNumber := FDebugEntries[I].LineNumber;
|
|
|
|
|
|
+ DebugEntry := @FDebugEntries[I];
|
|
Exit;
|
|
Exit;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
Memo := nil;
|
|
Memo := nil;
|
|
- LineNumber := -1;
|
|
|
|
|
|
+ DebugEntry := nil;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TCompileForm.BringToForeground;
|
|
procedure TCompileForm.BringToForeground;
|
|
@@ -3261,10 +3264,16 @@ end;
|
|
procedure TCompileForm.DebuggerStepped(var Message: TMessage; const Intermediate: Boolean);
|
|
procedure TCompileForm.DebuggerStepped(var Message: TMessage; const Intermediate: Boolean);
|
|
var
|
|
var
|
|
Memo: TCompScintFileEdit;
|
|
Memo: TCompScintFileEdit;
|
|
|
|
+ DebugEntry: PDebugEntry;
|
|
LineNumber: Integer;
|
|
LineNumber: Integer;
|
|
begin
|
|
begin
|
|
- GetMemoAndLineNumberFromEntry(Message.WParam, Message.LParam, Memo, LineNumber);
|
|
|
|
- if (Memo = nil) or (LineNumber < 0) then
|
|
|
|
|
|
+ GetMemoAndDebugEntryFromMessage(Message.WParam, Message.LParam, Memo, DebugEntry);
|
|
|
|
+ if (Memo = nil) or (DebugEntry = nil) then
|
|
|
|
+ Exit;
|
|
|
|
+
|
|
|
|
+ LineNumber := DebugEntry.LineNumber;
|
|
|
|
+
|
|
|
|
+ if LineNumber = -1 then { UninstExe has a DebugEntry but not a line number }
|
|
Exit;
|
|
Exit;
|
|
|
|
|
|
if (LineNumber < Memo.LineStateCount) and
|
|
if (LineNumber < Memo.LineStateCount) and
|
|
@@ -3273,12 +3282,14 @@ begin
|
|
UpdateLineMarkers(Memo, LineNumber);
|
|
UpdateLineMarkers(Memo, LineNumber);
|
|
end;
|
|
end;
|
|
|
|
|
|
- if (FStepMode = smStepInto) or
|
|
|
|
- ((FStepMode = smStepOver) and not Intermediate) or
|
|
|
|
- ((FStepMode = smRunToCursor) and
|
|
|
|
- (FRunToCursorPoint.Kind = Integer(Message.WParam)) and
|
|
|
|
- (FRunToCursorPoint.Index = Message.LParam)) or
|
|
|
|
- (Memo.BreakPoints.IndexOf(LineNumber) <> -1) then begin
|
|
|
|
|
|
+ if (FStepMode = smStepOut) and DebugEntry.StepOutMarker then
|
|
|
|
+ FStepMode := smStepInto { Pause on next line }
|
|
|
|
+ else if (FStepMode = smStepInto) or
|
|
|
|
+ ((FStepMode = smStepOver) and not Intermediate) or
|
|
|
|
+ ((FStepMode = smRunToCursor) and
|
|
|
|
+ (FRunToCursorPoint.Kind = Integer(Message.WParam)) and
|
|
|
|
+ (FRunToCursorPoint.Index = Message.LParam)) or
|
|
|
|
+ (Memo.BreakPoints.IndexOf(LineNumber) <> -1) then begin
|
|
MoveCaretAndActivateMemo(Memo, LineNumber, True);
|
|
MoveCaretAndActivateMemo(Memo, LineNumber, True);
|
|
HideError;
|
|
HideError;
|
|
SetStepLine(Memo, LineNumber);
|
|
SetStepLine(Memo, LineNumber);
|
|
@@ -3286,6 +3297,7 @@ begin
|
|
{ Tell Setup to pause }
|
|
{ Tell Setup to pause }
|
|
Message.Result := 1;
|
|
Message.Result := 1;
|
|
FPaused := True;
|
|
FPaused := True;
|
|
|
|
+ FPausedAtCodeLine := DebugEntry.Kind = Ord(deCodeLine);
|
|
UpdateRunMenu;
|
|
UpdateRunMenu;
|
|
UpdateCaption;
|
|
UpdateCaption;
|
|
end;
|
|
end;
|
|
@@ -3304,11 +3316,17 @@ end;
|
|
procedure TCompileForm.WMDebuggerException(var Message: TMessage);
|
|
procedure TCompileForm.WMDebuggerException(var Message: TMessage);
|
|
var
|
|
var
|
|
Memo: TCompScintFileEdit;
|
|
Memo: TCompScintFileEdit;
|
|
|
|
+ DebugEntry: PDebugEntry;
|
|
LineNumber: Integer;
|
|
LineNumber: Integer;
|
|
S: String;
|
|
S: String;
|
|
begin
|
|
begin
|
|
if FOptions.PauseOnDebuggerExceptions then begin
|
|
if FOptions.PauseOnDebuggerExceptions then begin
|
|
- GetMemoAndLineNumberFromEntry(Message.WParam, Message.LParam, Memo, LineNumber);
|
|
|
|
|
|
+ GetMemoAndDebugEntryFromMessage(Message.WParam, Message.LParam, Memo, DebugEntry);
|
|
|
|
+
|
|
|
|
+ if DebugEntry <> nil then
|
|
|
|
+ LineNumber := DebugEntry.LineNumber
|
|
|
|
+ else
|
|
|
|
+ LineNumber := -1;
|
|
|
|
|
|
if (Memo <> nil) and (LineNumber >= 0) then begin
|
|
if (Memo <> nil) and (LineNumber >= 0) then begin
|
|
MoveCaretAndActivateMemo(Memo, LineNumber, True);
|
|
MoveCaretAndActivateMemo(Memo, LineNumber, True);
|
|
@@ -3320,6 +3338,7 @@ begin
|
|
{ Tell Setup to pause }
|
|
{ Tell Setup to pause }
|
|
Message.Result := 1;
|
|
Message.Result := 1;
|
|
FPaused := True;
|
|
FPaused := True;
|
|
|
|
+ FPausedAtCodeLine := (DebugEntry <> nil) and (DebugEntry.Kind = Ord(deCodeLine));
|
|
UpdateRunMenu;
|
|
UpdateRunMenu;
|
|
UpdateCaption;
|
|
UpdateCaption;
|
|
|
|
|
|
@@ -3638,6 +3657,7 @@ begin
|
|
RRunToCursor.Enabled := RRun.Enabled and (FActiveMemo is TCompScintFileEdit);
|
|
RRunToCursor.Enabled := RRun.Enabled and (FActiveMemo is TCompScintFileEdit);
|
|
RStepInto.Enabled := RRun.Enabled;
|
|
RStepInto.Enabled := RRun.Enabled;
|
|
RStepOver.Enabled := RRun.Enabled;
|
|
RStepOver.Enabled := RRun.Enabled;
|
|
|
|
+ RStepOut.Enabled := FPaused;
|
|
RToggleBreakPoint.Enabled := FActiveMemo is TCompScintFileEdit;
|
|
RToggleBreakPoint.Enabled := FActiveMemo is TCompScintFileEdit;
|
|
RTerminate.Enabled := FDebugging and (FDebugClientWnd <> 0);
|
|
RTerminate.Enabled := FDebugging and (FDebugClientWnd <> 0);
|
|
TerminateButton.Enabled := RTerminate.Enabled;
|
|
TerminateButton.Enabled := RTerminate.Enabled;
|
|
@@ -3955,6 +3975,14 @@ begin
|
|
Go(smStepInto);
|
|
Go(smStepInto);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+procedure TCompileForm.RStepOutClick(Sender: TObject);
|
|
|
|
+begin
|
|
|
|
+ if FPausedAtCodeLine then
|
|
|
|
+ Go(smStepOut)
|
|
|
|
+ else
|
|
|
|
+ Go(smStepInto);
|
|
|
|
+end;
|
|
|
|
+
|
|
procedure TCompileForm.RStepOverClick(Sender: TObject);
|
|
procedure TCompileForm.RStepOverClick(Sender: TObject);
|
|
begin
|
|
begin
|
|
Go(smStepOver);
|
|
Go(smStepOver);
|