mirror of
https://github.com/QB64-Phoenix-Edition/QB64pe.git
synced 2024-07-01 11:30:37 +00:00
Implements Step Over for $DEBUG mode
Using Shift+F8 when stepping line by line when on a line of code that contains a SUB/FUNCTION call, the sub-procedure lines will be run without entering the block of code, and execution will resume in the next line of code after the SUB/FUNCTION call.
This commit is contained in:
parent
6d374bebcd
commit
b54de08aa3
|
@ -6114,13 +6114,28 @@ SUB DebugMode
|
||||||
|
|
||||||
clearStatusWindow 1
|
clearStatusWindow 1
|
||||||
setStatusMessage 1, "$DEBUG MODE: Set focus to the IDE to control execution", 15
|
setStatusMessage 1, "$DEBUG MODE: Set focus to the IDE to control execution", 15
|
||||||
|
|
||||||
noFocusMessage = -1
|
noFocusMessage = -1
|
||||||
|
|
||||||
DO 'main loop
|
DO 'main loop
|
||||||
IF _WINDOWHASFOCUS THEN
|
IF _WINDOWHASFOCUS THEN
|
||||||
|
IF _KEYDOWN(100304) OR _KEYDOWN(100303) THEN 'SHIFT
|
||||||
|
IF shiftDown = 0 THEN
|
||||||
|
stepOverMsg$ = " Over"
|
||||||
|
noFocusMessage = -1
|
||||||
|
END IF
|
||||||
|
shiftDown = -1
|
||||||
|
ELSE
|
||||||
|
IF shiftDown THEN
|
||||||
|
stepOverMsg$ = ""
|
||||||
|
noFocusMessage = -1
|
||||||
|
END IF
|
||||||
|
shiftDown = 0
|
||||||
|
END IF
|
||||||
|
|
||||||
IF noFocusMessage THEN
|
IF noFocusMessage THEN
|
||||||
clearStatusWindow 1
|
clearStatusWindow 1
|
||||||
setStatusMessage 1, "$DEBUG MODE: <F5=Continue> <F8=Step> <F9=Toggle Breakpoint> <ESC=Abort>", 15
|
setStatusMessage 1, "$DEBUG MODE: <F5=Continue> <F8=Step" + stepOverMsg$ + "> <F9=Toggle Breakpoint> <ESC=Abort>", 15
|
||||||
noFocusMessage = 0
|
noFocusMessage = 0
|
||||||
END IF
|
END IF
|
||||||
ELSE
|
ELSE
|
||||||
|
@ -6149,11 +6164,28 @@ SUB DebugMode
|
||||||
setStatusMessage 2, "Running...", 10
|
setStatusMessage 2, "Running...", 10
|
||||||
dummy = DarkenFGBG(1)
|
dummy = DarkenFGBG(1)
|
||||||
CASE 16896 'F8
|
CASE 16896 'F8
|
||||||
IF PauseMode = 0 THEN cmd$ = "break" ELSE cmd$ = "step"
|
IF PauseMode = 0 THEN
|
||||||
|
cmd$ = "break"
|
||||||
PauseMode = -1
|
PauseMode = -1
|
||||||
GOSUB SendCommand
|
GOSUB SendCommand
|
||||||
clearStatusWindow 2
|
clearStatusWindow 2
|
||||||
setStatusMessage 2, "Paused.", 2
|
setStatusMessage 2, "Paused.", 2
|
||||||
|
ELSE
|
||||||
|
IF shiftDown THEN
|
||||||
|
cmd$ = "step over"
|
||||||
|
PauseMode = 0
|
||||||
|
GOSUB SendCommand
|
||||||
|
clearStatusWindow 2
|
||||||
|
setStatusMessage 2, "Running...", 10
|
||||||
|
dummy = DarkenFGBG(1)
|
||||||
|
ELSE
|
||||||
|
cmd$ = "step"
|
||||||
|
PauseMode = -1
|
||||||
|
GOSUB SendCommand
|
||||||
|
clearStatusWindow 2
|
||||||
|
setStatusMessage 2, "Paused.", 2
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
CASE 17152 'F9
|
CASE 17152 'F9
|
||||||
IF PauseMode THEN
|
IF PauseMode THEN
|
||||||
IdeBreakpoints(l) = NOT IdeBreakpoints(l)
|
IdeBreakpoints(l) = NOT IdeBreakpoints(l)
|
||||||
|
|
|
@ -5112,6 +5112,9 @@ DO
|
||||||
PRINT #12, "uint8 *tmp_mem_static_pointer=mem_static_pointer;"
|
PRINT #12, "uint8 *tmp_mem_static_pointer=mem_static_pointer;"
|
||||||
PRINT #12, "uint32 tmp_cmem_sp=cmem_sp;"
|
PRINT #12, "uint32 tmp_cmem_sp=cmem_sp;"
|
||||||
PRINT #12, "#include " + CHR$(34) + "data" + str2$(subfuncn) + ".txt" + CHR$(34)
|
PRINT #12, "#include " + CHR$(34) + "data" + str2$(subfuncn) + ".txt" + CHR$(34)
|
||||||
|
IF vWatchOn THEN
|
||||||
|
PRINT #12, "*__LONG_VWATCH_SUBLEVEL=*__LONG_VWATCH_SUBLEVEL+ 1 ;"
|
||||||
|
END IF
|
||||||
|
|
||||||
'create new _MEM lock for this scope
|
'create new _MEM lock for this scope
|
||||||
PRINT #12, "mem_lock *sf_mem_lock;" 'MUST not be static for recursion reasons
|
PRINT #12, "mem_lock *sf_mem_lock;" 'MUST not be static for recursion reasons
|
||||||
|
@ -5252,6 +5255,9 @@ DO
|
||||||
staticarraylist = "": staticarraylistn = 0 'remove previously listed arrays
|
staticarraylist = "": staticarraylistn = 0 'remove previously listed arrays
|
||||||
dimstatic = 0
|
dimstatic = 0
|
||||||
PRINT #12, "exit_subfunc:;"
|
PRINT #12, "exit_subfunc:;"
|
||||||
|
IF vWatchOn THEN
|
||||||
|
PRINT #12, "*__LONG_VWATCH_SUBLEVEL=*__LONG_VWATCH_SUBLEVEL- 1 ;"
|
||||||
|
END IF
|
||||||
|
|
||||||
'release _MEM lock for this scope
|
'release _MEM lock for this scope
|
||||||
PRINT #12, "free_mem_lock(sf_mem_lock);"
|
PRINT #12, "free_mem_lock(sf_mem_lock);"
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
$CHECKING:OFF
|
$CHECKING:OFF
|
||||||
DIM SHARED vwatch_linenumber AS LONG
|
DIM SHARED AS LONG vwatch_linenumber, vwatch_sublevel
|
||||||
REDIM SHARED vwatch_breakpoints(0) AS _BYTE
|
REDIM SHARED vwatch_breakpoints(0) AS _BYTE
|
||||||
'next lines are just to avoid "unused variable" warnings:
|
'next lines are just to avoid "unused variable" warnings:
|
||||||
vwatch_linenumber = 0
|
vwatch_linenumber = 0
|
||||||
|
vwatch_sublevel = 0
|
||||||
vwatch_breakpoints(0) = 0
|
vwatch_breakpoints(0) = 0
|
||||||
$CHECKING:ON
|
$CHECKING:ON
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
$CHECKING:OFF
|
$CHECKING:OFF
|
||||||
|
|
||||||
SUB vwatch (linenumber AS LONG)
|
SUB vwatch (linenumber AS LONG)
|
||||||
STATIC AS LONG ide, breakpointCount, timeout
|
STATIC AS LONG ide, breakpointCount, timeout, startLevel
|
||||||
STATIC AS _BYTE PauseMode, bypass
|
STATIC AS _BYTE pauseMode, stepOver, bypass
|
||||||
STATIC buffer$, endc$
|
STATIC buffer$, endc$
|
||||||
DIM AS LONG i
|
DIM AS LONG i
|
||||||
DIM start!, temp$, cmd$, value$, k&
|
DIM start!, temp$, cmd$, value$, k&
|
||||||
|
@ -47,19 +47,26 @@ SUB vwatch (linenumber AS LONG)
|
||||||
NEXT
|
NEXT
|
||||||
CASE "run"
|
CASE "run"
|
||||||
IF vwatch_breakpoints(linenumber) THEN EXIT DO
|
IF vwatch_breakpoints(linenumber) THEN EXIT DO
|
||||||
PauseMode = 0
|
pauseMode = 0
|
||||||
EXIT SUB
|
EXIT SUB
|
||||||
CASE "break"
|
CASE "break"
|
||||||
PauseMode = -1
|
pauseMode = -1
|
||||||
EXIT DO
|
EXIT DO
|
||||||
END SELECT
|
END SELECT
|
||||||
LOOP
|
LOOP
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
GOSUB GetCommand
|
GOSUB GetCommand
|
||||||
IF cmd$ = "break" THEN PauseMode = -1: cmd$ = ""
|
IF cmd$ = "break" THEN pauseMode = -1: stepOver = 0: cmd$ = ""
|
||||||
|
|
||||||
IF vwatch_breakpoints(linenumber) = 0 AND PauseMode = 0 THEN
|
IF stepOver = -1 AND vwatch_sublevel > startLevel AND vwatch_breakpoints(linenumber) = 0 THEN
|
||||||
|
EXIT SUB
|
||||||
|
ELSEIF stepOver = -1 AND vwatch_sublevel = startLevel THEN
|
||||||
|
stepOver = 0
|
||||||
|
pauseMode = -1
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF vwatch_breakpoints(linenumber) = 0 AND pauseMode = 0 THEN
|
||||||
EXIT SUB
|
EXIT SUB
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
@ -71,10 +78,17 @@ SUB vwatch (linenumber AS LONG)
|
||||||
DO 'main loop
|
DO 'main loop
|
||||||
SELECT CASE cmd$
|
SELECT CASE cmd$
|
||||||
CASE "run"
|
CASE "run"
|
||||||
PauseMode = 0
|
pauseMode = 0
|
||||||
|
stepOver = 0
|
||||||
EXIT SUB
|
EXIT SUB
|
||||||
CASE "step"
|
CASE "step"
|
||||||
PauseMode = -1
|
pauseMode = -1
|
||||||
|
stepOver = 0
|
||||||
|
EXIT SUB
|
||||||
|
CASE "step over"
|
||||||
|
pauseMode = -1
|
||||||
|
stepOver = -1
|
||||||
|
startLevel = vwatch_sublevel
|
||||||
EXIT SUB
|
EXIT SUB
|
||||||
CASE "free"
|
CASE "free"
|
||||||
CLOSE #ide
|
CLOSE #ide
|
||||||
|
|
Loading…
Reference in a new issue