mirror of
https://github.com/QB64-Phoenix-Edition/QB64pe.git
synced 2024-07-01 15:00:38 +00:00
Properly implements call stack log.
This commit is contained in:
parent
9ad93c183f
commit
27893f66c2
|
@ -2,7 +2,7 @@ $CHECKING:OFF
|
||||||
|
|
||||||
SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
|
SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
|
||||||
STATIC AS LONG ideHost, breakpointCount, skipCount, timeout, startLevel, lastLine
|
STATIC AS LONG ideHost, breakpointCount, skipCount, timeout, startLevel, lastLine
|
||||||
STATIC AS LONG callStackLength, runToLine
|
STATIC AS LONG runToLine
|
||||||
STATIC AS _BYTE pauseMode, stepOver, bypass, setNextLine
|
STATIC AS _BYTE pauseMode, stepOver, bypass, setNextLine
|
||||||
STATIC buffer$, endc$
|
STATIC buffer$, endc$
|
||||||
DIM AS LONG i, tempIndex, localIndex, varSize, sequence
|
DIM AS LONG i, tempIndex, localIndex, varSize, sequence
|
||||||
|
@ -98,17 +98,10 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
|
||||||
EXIT SUB
|
EXIT SUB
|
||||||
ELSEIF vwatch_linenumber = -2 THEN
|
ELSEIF vwatch_linenumber = -2 THEN
|
||||||
'report a new sub/function has been "entered"
|
'report a new sub/function has been "entered"
|
||||||
IF LEN(vwatch_callstack) > 100000 THEN
|
|
||||||
vwatch_callstack = ""
|
|
||||||
callStackLength = 0
|
|
||||||
END IF
|
|
||||||
callStackLength = callStackLength + 1
|
|
||||||
IF LEN(vwatch_callstack) THEN vwatch_callstack = vwatch_callstack + CHR$(0)
|
|
||||||
vwatch_callstack = vwatch_callstack + vwatch_subname$ + ", line" + STR$(lastLine)
|
|
||||||
IF vwatch_sublevel > UBOUND(vwatch_stack) THEN
|
IF vwatch_sublevel > UBOUND(vwatch_stack) THEN
|
||||||
REDIM _PRESERVE vwatch_stack(UBOUND(vwatch_stack) + 1000) AS STRING
|
REDIM _PRESERVE vwatch_stack(UBOUND(vwatch_stack) + 1000) AS STRING
|
||||||
END IF
|
END IF
|
||||||
vwatch_stack(vwatch_sublevel) = vwatch_internalsubname$
|
vwatch_stack(vwatch_sublevel) = vwatch_internalsubname$ + "," + vwatch_subname$ + ", line" + STR$(lastLine)
|
||||||
EXIT SUB
|
EXIT SUB
|
||||||
ELSEIF vwatch_linenumber = -3 THEN
|
ELSEIF vwatch_linenumber = -3 THEN
|
||||||
'handle STOP - instead of quitting, pause execution
|
'handle STOP - instead of quitting, pause execution
|
||||||
|
@ -169,7 +162,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
|
||||||
IF vwatch_breakpoints(vwatch_linenumber) THEN cmd$ = "breakpoint:"
|
IF vwatch_breakpoints(vwatch_linenumber) THEN cmd$ = "breakpoint:"
|
||||||
cmd$ = cmd$ + MKL$(vwatch_linenumber)
|
cmd$ = cmd$ + MKL$(vwatch_linenumber)
|
||||||
GOSUB SendCommand
|
GOSUB SendCommand
|
||||||
cmd$ = "current sub:" + vwatch_stack(vwatch_sublevel)
|
cmd$ = "current sub:" + LEFT$(vwatch_stack(vwatch_sublevel), INSTR(vwatch_stack(vwatch_sublevel), ",") - 1)
|
||||||
GOSUB SendCommand
|
GOSUB SendCommand
|
||||||
|
|
||||||
DO 'main loop
|
DO 'main loop
|
||||||
|
@ -231,7 +224,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
|
||||||
tempIndex = CVL(LEFT$(value$, 4))
|
tempIndex = CVL(LEFT$(value$, 4))
|
||||||
localIndex = CVL(MID$(value$, 5, 4))
|
localIndex = CVL(MID$(value$, 5, 4))
|
||||||
scope$ = MID$(value$, 9)
|
scope$ = MID$(value$, 9)
|
||||||
IF scope$ = vwatch_stack(vwatch_sublevel) THEN
|
IF scope$ = LEFT$(vwatch_stack(vwatch_sublevel), INSTR(vwatch_stack(vwatch_sublevel), ",") - 1) THEN
|
||||||
address = _OFFSET(localVariables) + LEN(address) * localIndex
|
address = _OFFSET(localVariables) + LEN(address) * localIndex
|
||||||
address = _MEMGET(m, address, _OFFSET) 'first resolve pass
|
address = _MEMGET(m, address, _OFFSET) 'first resolve pass
|
||||||
address = _MEMGET(m, address, _OFFSET) 'second resolve pass
|
address = _MEMGET(m, address, _OFFSET) 'second resolve pass
|
||||||
|
@ -250,7 +243,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
|
||||||
cmd$ = "address read:" + MKL$(tempIndex) + MKI$(sequence) + buf$
|
cmd$ = "address read:" + MKL$(tempIndex) + MKI$(sequence) + buf$
|
||||||
GOSUB SendCommand
|
GOSUB SendCommand
|
||||||
CASE "current sub"
|
CASE "current sub"
|
||||||
cmd$ = "current sub:" + vwatch_stack(vwatch_sublevel)
|
cmd$ = "current sub:" + LEFT$(vwatch_stack(vwatch_sublevel), INSTR(vwatch_stack(vwatch_sublevel), ",") - 1)
|
||||||
GOSUB SendCommand
|
GOSUB SendCommand
|
||||||
CASE "set next line"
|
CASE "set next line"
|
||||||
pauseMode = -1
|
pauseMode = -1
|
||||||
|
@ -306,7 +299,15 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
SendCallStack:
|
SendCallStack:
|
||||||
cmd$ = "call stack size:" + MKL$(callStackLength)
|
IF vwatch_sublevel - 1 > 0 THEN
|
||||||
|
vwatch_callstack = MID$(vwatch_stack(2), INSTR(vwatch_stack(2), ",") + 1)
|
||||||
|
FOR i = 3 TO vwatch_sublevel
|
||||||
|
vwatch_callstack = vwatch_callstack + CHR$(0) + MID$(vwatch_stack(i), INSTR(vwatch_stack(i), ",") + 1)
|
||||||
|
NEXT
|
||||||
|
ELSE
|
||||||
|
vwatch_callstack = ""
|
||||||
|
END IF
|
||||||
|
cmd$ = "call stack size:" + MKL$(vwatch_sublevel - 1)
|
||||||
GOSUB SendCommand
|
GOSUB SendCommand
|
||||||
cmd$ = "call stack:" + vwatch_callstack
|
cmd$ = "call stack:" + vwatch_callstack
|
||||||
GOSUB SendCommand
|
GOSUB SendCommand
|
||||||
|
|
Loading…
Reference in a new issue