diff --git a/internal/support/vwatch/vwatch.bi b/internal/support/vwatch/vwatch.bi index 09d6ac240..ed2cff4bd 100644 --- a/internal/support/vwatch/vwatch.bi +++ b/internal/support/vwatch/vwatch.bi @@ -3,12 +3,14 @@ DIM SHARED AS LONG vwatch_linenumber, vwatch_sublevel, vwatch_goto DIM SHARED AS STRING vwatch_subname, vwatch_internalsubname, vwatch_callstack REDIM SHARED vwatch_breakpoints(0) AS _BYTE REDIM SHARED vwatch_skiplines(0) AS _BYTE +REDIM SHARED vwatch_stack(1000) AS STRING 'next lines are just to avoid "unused variable" warnings: vwatch_linenumber = 0 vwatch_sublevel = 0 vwatch_goto = 0 vwatch_breakpoints(0) = 0 vwatch_skiplines(0) = 0 +vwatch_stack(0) = "" vwatch_subname = "" vwatch_internalsubname = "" vwatch_callstack = "" diff --git a/internal/support/vwatch/vwatch.bm b/internal/support/vwatch/vwatch.bm index e52340789..12e792516 100644 --- a/internal/support/vwatch/vwatch.bm +++ b/internal/support/vwatch/vwatch.bm @@ -8,7 +8,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) DIM AS LONG i, tempIndex, localIndex, varSize, sequence DIM AS _OFFSET address DIM AS _MEM m, m2 - DIM start!, temp$, cmd$, value$, k&, dataType$, result$, buf$ + DIM start!, temp$, cmd$, value$, k&, buf$, scope$ DECLARE LIBRARY SUB vwatch_stoptimers ALIAS stop_timers @@ -105,6 +105,10 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) 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 + REDIM _PRESERVE vwatch_stack(UBOUND(vwatch_stack) + 1000) AS STRING + END IF + vwatch_stack(vwatch_sublevel) = vwatch_internalsubname$ EXIT SUB ELSEIF vwatch_linenumber = -3 THEN 'handle STOP - instead of quitting, pause execution @@ -165,11 +169,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) IF vwatch_breakpoints(vwatch_linenumber) THEN cmd$ = "breakpoint:" cmd$ = cmd$ + MKL$(vwatch_linenumber) GOSUB SendCommand - IF vwatch_sublevel > 1 THEN - cmd$ = "current sub:" + vwatch_internalsubname$ - ELSE - cmd$ = "current sub:" - END IF + cmd$ = "current sub:" + vwatch_stack(vwatch_sublevel) GOSUB SendCommand DO 'main loop @@ -223,23 +223,21 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) tempIndex = CVL(LEFT$(value$, 4)) localIndex = CVL(MID$(value$, 5, 4)) address = _OFFSET(globalVariables) + LEN(address) * localIndex - $CONSOLE - _ECHO "arrelem address=" + HEX$(address) - address = _MEMGET(m, address, _OFFSET) - address = _MEMGET(m, address, _OFFSET) - _ECHO "var address=" + HEX$(address) + address = _MEMGET(m, address, _OFFSET) 'first resolve pass + address = _MEMGET(m, address, _OFFSET) 'second resolve pass cmd$ = "global var:" + MKL$(tempIndex) + STR$(address) GOSUB SendCommand CASE "local var" tempIndex = CVL(LEFT$(value$, 4)) localIndex = CVL(MID$(value$, 5, 4)) - address = _OFFSET(localVariables) + LEN(address) * localIndex - _ECHO "arrelem address=" + HEX$(address) - address = _MEMGET(m, address, _OFFSET) - address = _MEMGET(m, address, _OFFSET) - _ECHO "var address=" + HEX$(address) - cmd$ = "local var:" + MKL$(tempIndex) + STR$(address) - GOSUB SendCommand + scope$ = MID$(value$, 9) + IF scope$ = vwatch_stack(vwatch_sublevel) THEN + address = _OFFSET(localVariables) + LEN(address) * localIndex + address = _MEMGET(m, address, _OFFSET) 'first resolve pass + address = _MEMGET(m, address, _OFFSET) 'second resolve pass + cmd$ = "local var:" + MKL$(tempIndex) + STR$(address) + GOSUB SendCommand + END IF CASE "get address" tempIndex = CVL(LEFT$(value$, 4)) sequence = CVI(MID$(value$, 5, 2)) @@ -252,7 +250,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) cmd$ = "address read:" + MKL$(tempIndex) + MKI$(sequence) + buf$ GOSUB SendCommand CASE "current sub" - cmd$ = "current sub:" + vwatch_internalsubname$ + cmd$ = "current sub:" + vwatch_stack(vwatch_sublevel) GOSUB SendCommand CASE "set next line" pauseMode = -1 diff --git a/source/ide/ide_methods.bas b/source/ide/ide_methods.bas index 7e4ebe9ff..e9f723cf3 100644 --- a/source/ide/ide_methods.bas +++ b/source/ide/ide_methods.bas @@ -6940,18 +6940,13 @@ SUB DebugMode temp$ = MID$(temp$, 5) IF usedVariableList(tempIndex&).watch THEN cmd$ = "" - '_ECHO "usedVariableList(tempIndex&).subfunc =" + usedVariableList(tempIndex&).subfunc - '_ECHO "currentSub$ =" + currentSub$ IF LEN(usedVariableList(tempIndex&).subfunc) = 0 THEN cmd$ = "global var:" - ELSEIF usedVariableList(tempIndex&).subfunc = currentSub$ THEN + ELSE cmd$ = "local var:" END IF IF LEN(cmd$) THEN - _CONSOLE ON - _ECHO "Requesting " + cmd$ + STR$(tempIndex&) - '_ECHO "currentSub$ = " + currentSub$ - cmd$ = cmd$ + MKL$(tempIndex&) + MKL$(usedVariableList(tempIndex&).localIndex) + cmd$ = cmd$ + MKL$(tempIndex&) + MKL$(usedVariableList(tempIndex&).localIndex) + usedVariableList(tempIndex&).subfunc GOSUB SendCommand END IF END IF @@ -6973,13 +6968,11 @@ SUB DebugMode CASE "_OFFSET", "_UNSIGNED _OFFSET": varSize& = LEN(dummy%&) CASE "STRING": varSize& = LEN(dummy%&) + LEN(dummy&) END SELECT - _ECHO "Requesting " + STR$(varSize&) + " bytes from &H" + HEX$(address%&) cmd$ = "get address:" + MKL$(tempIndex&) + MKI$(1) + MKL$(varSize&) + STR$(address%&) GOSUB SendCommand CASE "address read" tempIndex& = CVL(LEFT$(value$, 4)) sequence% = CVI(MID$(value$, 5, 2)) - _ECHO "Received data for " + STR$(tempIndex&) recvData$ = MID$(value$, 7) varType$ = usedVariableList(tempIndex&).varType IF INSTR(varType$, "STRING *") THEN varType$ = "STRING" @@ -7007,7 +7000,6 @@ SUB DebugMode strLength& = CVL(MID$(recvData$, 5)) END IF address$ = LEFT$(recvData$, LEN(dummy%&)) 'Pointer to data - _ECHO "Requesting string of length " + STR$(strLength&) + " at &H" + HEX$(address%&) cmd$ = "get address:" + MKL$(tempIndex&) + MKI$(2) + MKL$(strLength&) + STR$(address%&) GOSUB SendCommand GOTO vwatch_string_seq1_done diff --git a/source/qb64.bas b/source/qb64.bas index bfdbd163a..d27be076e 100644 --- a/source/qb64.bas +++ b/source/qb64.bas @@ -31,7 +31,7 @@ DIM SHARED vWatchNewVariable$, vWatchVariableExclusions$ vWatchErrorCall$ = "if (stop_program) {*__LONG_VWATCH_LINENUMBER=0; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars);};if(new_error){bkp_new_error=new_error;new_error=0;*__LONG_VWATCH_LINENUMBER=-1; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars);new_error=bkp_new_error;};" vWatchVariableExclusions$ = "@__LONG_VWATCH_LINENUMBER@__LONG_VWATCH_SUBLEVEL@__LONG_VWATCH_GOTO@" + _ "@__STRING_VWATCH_SUBNAME@__STRING_VWATCH_CALLSTACK@__ARRAY_BYTE_VWATCH_BREAKPOINTS" + _ - "@__ARRAY_BYTE_VWATCH_SKIPLINES@__STRING_VWATCH_INTERNALSUBNAME@" + "@__ARRAY_BYTE_VWATCH_SKIPLINES@__STRING_VWATCH_INTERNALSUBNAME@__ARRAY_STRING_VWATCH_STACK@" DIM SHARED qb64prefix_set_recompileAttempts, qb64prefix_set_desiredState DIM SHARED opex_recompileAttempts, opex_desiredState