diff --git a/internal/support/vwatch/vwatch.bm b/internal/support/vwatch/vwatch.bm index cc6371f89..e3641a1f5 100644 --- a/internal/support/vwatch/vwatch.bm +++ b/internal/support/vwatch/vwatch.bm @@ -1,14 +1,14 @@ $CHECKING:OFF -SUB vwatch (localVariables AS _OFFSET) +SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) STATIC AS LONG ideHost, breakpointCount, skipCount, timeout, startLevel, lastLine STATIC AS LONG callStackLength, runToLine STATIC AS _BYTE pauseMode, stepOver, bypass, setNextLine STATIC buffer$, endc$ - DIM AS LONG i + DIM AS LONG i, tempIndex, localIndex DIM AS _OFFSET address DIM AS _MEM m - DIM start!, temp$, cmd$, value$, k& + DIM start!, temp$, cmd$, value$, k&, dataType$, result$ DECLARE LIBRARY SUB vwatch_stoptimers ALIAS stop_timers @@ -213,10 +213,27 @@ SUB vwatch (localVariables AS _OFFSET) CASE "call stack" 'send call stack history" GOSUB SendCallStack - CASE "local" - i = CVL(value$) - address = localVariables + LEN(address) * i - PRINT "Local"; i; "is at"; _MEMGET(m, address, _OFFSET) + CASE "global var" + tempIndex = CVL(LEFT$(value$, 4)) + localIndex = CVL(MID$(value$, 5, 4)) + dataType$ = MID$(value$, 9) + address = globalVariables + LEN(address) * localIndex + GOSUB GetMemData + $CONSOLE + _ECHO "global var requested:" + STR$(tempIndex) + dataType$ + _ECHO "== result = " + result$ + cmd$ = "global var:" + MKL$(tempIndex) + result$ + GOSUB SendCommand + CASE "local var" + tempIndex = CVL(LEFT$(value$, 4)) + localIndex = CVL(MID$(value$, 5, 4)) + dataType$ = MID$(value$, 9) + address = localVariables + LEN(address) * localIndex + GOSUB GetMemData + _ECHO "local var requested:" + STR$(tempIndex) + dataType$ + _ECHO "== result = " + result$ + cmd$ = "local var:" + MKL$(tempIndex) + result$ + GOSUB SendCommand CASE "current sub" cmd$ = "current sub:" + vwatch_subname GOSUB SendCommand @@ -285,4 +302,31 @@ SUB vwatch (localVariables AS _OFFSET) PUT #ideHost, , cmd$ cmd$ = "" RETURN + + GetMemData: + DIM integerType AS INTEGER, uintegerType AS _UNSIGNED INTEGER + DIM longType AS LONG, ulongType AS _UNSIGNED LONG + DIM singleType AS SINGLE, doubleType AS DOUBLE + + SELECT CASE dataType$ + CASE "INTEGER" + integerType = _MEMGET(m, address, INTEGER) + result$ = STR$(integerType) + CASE "_UNSIGNED INTEGER" + uintegerType = _MEMGET(m, address, _UNSIGNED INTEGER) + result$ = STR$(uintegerType) + CASE "LONG" + longType = _MEMGET(m, address, LONG) + result$ = STR$(longType) + CASE "_UNSIGNED LONG" + ulongType = _MEMGET(m, address, _UNSIGNED LONG) + result$ = STR$(ulongType) + CASE "SINGLE" + singleType = _MEMGET(m, address, SINGLE) + result$ = STR$(singleType) + CASE "DOUBLE" + doubleType = _MEMGET(m, address, DOUBLE) + result$ = STR$(doubleType) + END SELECT + RETURN END SUB diff --git a/source/ide/ide_global.bas b/source/ide/ide_global.bas index afbe6da3a..5bfa39647 100644 --- a/source/ide/ide_global.bas +++ b/source/ide/ide_global.bas @@ -11,7 +11,7 @@ DIM SHARED IDEBuildModeChanged DIM SHARED IdeInfo AS STRING DIM SHARED IdeContextHelpSF AS _BYTE -DIM SHARED host&, hostport$ +DIM SHARED host&, hostport$, variableWatchList$ DIM SHARED IdeSystem AS LONG '1=Entering text into the main IDE window diff --git a/source/ide/ide_methods.bas b/source/ide/ide_methods.bas index 0de2d6ff1..6f8be8748 100644 --- a/source/ide/ide_methods.bas +++ b/source/ide/ide_methods.bas @@ -6743,48 +6743,15 @@ SUB DebugMode END IF GOSUB UpdateDisplay CASE 15872 'F4 - IF PauseMode THEN - requestCallStack: - cmd$ = "call stack" + IF PauseMode = 0 THEN + cmd$ = "break" + PauseMode = -1 GOSUB SendCommand - - IF BypassRequestCallStack THEN GOTO ShowCallStack - dummy = DarkenFGBG(0) - clearStatusWindow 0 - setStatusMessage 1, "Requesting call stack...", 7 - - start! = TIMER - callStackLength = -1 - DO - GOSUB GetCommand - IF cmd$ = "call stack size" THEN - callStackLength = CVL(value$) - IF callStackLength = 0 THEN EXIT DO - END IF - _LIMIT 100 - LOOP UNTIL cmd$ = "call stack" OR TIMER - start! > timeout - - IF cmd$ = "call stack" THEN - 'display call stack - callstacklist$ = value$ - ShowCallStack: - clearStatusWindow 0 - setStatusMessage 1, "Paused.", 2 - retval = idecallstackbox - PCOPY 3, 0: SCREEN , , 3, 0 - WHILE _MOUSEINPUT: WEND - ELSE - IF callStackLength = -1 THEN - callStackLength = 0 - clearStatusWindow 0 - setStatusMessage 1, "Error retrieving call stack.", 2 - ELSEIF callStackLength = 0 THEN - clearStatusWindow 0 - setStatusMessage 1, "No call stack log available.", 2 - END IF - END IF - noFocusMessage = NOT noFocusMessage END IF + result = idevariablewatchbox + PCOPY 3, 0: SCREEN , , 3, 0 + WHILE _MOUSEINPUT: WEND + GOSUB UpdateDisplay CASE 16128 'F5 requestContinue: PauseMode = 0 @@ -6856,6 +6823,49 @@ SUB DebugMode GOSUB SendCommand END IF GOSUB UpdateDisplay + CASE 34304 'F12 + IF PauseMode THEN + requestCallStack: + cmd$ = "call stack" + GOSUB SendCommand + + IF BypassRequestCallStack THEN GOTO ShowCallStack + dummy = DarkenFGBG(0) + clearStatusWindow 0 + setStatusMessage 1, "Requesting call stack...", 7 + + start! = TIMER + callStackLength = -1 + DO + GOSUB GetCommand + IF cmd$ = "call stack size" THEN + callStackLength = CVL(value$) + IF callStackLength = 0 THEN EXIT DO + END IF + _LIMIT 100 + LOOP UNTIL cmd$ = "call stack" OR TIMER - start! > timeout + + IF cmd$ = "call stack" THEN + 'display call stack + callstacklist$ = value$ + ShowCallStack: + clearStatusWindow 0 + setStatusMessage 1, "Paused.", 2 + retval = idecallstackbox + PCOPY 3, 0: SCREEN , , 3, 0 + WHILE _MOUSEINPUT: WEND + ELSE + IF callStackLength = -1 THEN + callStackLength = 0 + clearStatusWindow 0 + setStatusMessage 1, "Error retrieving call stack.", 2 + ELSEIF callStackLength = 0 THEN + clearStatusWindow 0 + setStatusMessage 1, "No call stack log available.", 2 + END IF + END IF + noFocusMessage = NOT noFocusMessage + END IF CASE 103, 71 'g, G IF _KEYDOWN(100306) OR _KEYDOWN(100305) THEN IF _KEYDOWN(100304) OR _KEYDOWN(100303) THEN @@ -6920,6 +6930,26 @@ SUB DebugMode setStatusMessage 1, "Paused.", 2 END IF PauseMode = -1 + + 'request variables + IF LEN(variableWatchList$) THEN + temp$ = variableWatchList$ + DO WHILE LEN(temp$) + tempIndex& = CVL(LEFT$(temp$, 4)) + temp$ = MID$(temp$, 5) + IF LEN(usedVariableList(tempIndex&).subfunc) = 0 THEN + cmd$ = "global var:" + ELSE + cmd$ = "local var:" + END IF + cmd$ = cmd$ + MKL$(tempIndex&) + MKL$(usedVariableList(tempIndex&).localIndex) + usedVariableList(tempIndex&).varType + GOSUB SendCommand + LOOP + END IF + CASE "global var", "local var" + tempIndex& = CVL(LEFT$(value$, 4)) + value$ = MID$(value$, 5) + usedVariableList(tempIndex&).mostRecentValue = value$ CASE "quit" CLOSE #client& dummy = DarkenFGBG(0) @@ -7018,7 +7048,7 @@ FUNCTION idevariablewatchbox '-------- init -------- - mainmodule$ = "MAIN MODULE" + mainmodule$ = "GLOBAL" maxModuleNameLen = LEN(mainmodule$) maxVarLen = LEN("Variable") maxTypeLen = LEN("Type") @@ -7068,6 +7098,9 @@ FUNCTION idevariablewatchbox END IF l$ = l$ + text$ + l3$ + IF IdeDebugMode > 0 AND LEN(usedVariableList(x).mostRecentValue) > 0 THEN + l$ = l$ + " = " + usedVariableList(x).mostRecentValue + END IF IF x < totalVariablesCreated THEN l$ = l$ + sep NEXT @@ -7191,6 +7224,12 @@ FUNCTION idevariablewatchbox END IF IF K$ = CHR$(27) OR (focus = 4 AND info <> 0) THEN + variableWatchList$ = "" + FOR y = 1 TO totalVisibleVariables + IF usedVariableList(varDlgList(y).index).watch THEN + variableWatchList$ = variableWatchList$ + MKL$(varDlgList(y).index) + END IF + NEXT EXIT FUNCTION END IF diff --git a/source/qb64.bas b/source/qb64.bas index b836ef63b..9fc856755 100644 --- a/source/qb64.bas +++ b/source/qb64.bas @@ -28,7 +28,7 @@ Set_OrderOfOperations DIM SHARED vWatchOn, vWatchRecompileAttempts, vWatchDesiredState, vWatchErrorCall$ DIM SHARED vWatchNewVariable$, vWatchVariableExclusions$ -vWatchErrorCall$ = "if (stop_program) {*__LONG_VWATCH_LINENUMBER=0; SUB_VWATCH((ptrszint*)vwatch_local_vars);};if(new_error){bkp_new_error=new_error;new_error=0;*__LONG_VWATCH_LINENUMBER=-1; SUB_VWATCH((ptrszint*)vwatch_local_vars);new_error=bkp_new_error;};" +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@" @@ -111,6 +111,7 @@ DIM SHARED MonochromeLoggingMode AS _BYTE TYPE usedVarList used AS _BYTE watch AS _BYTE + mostRecentValue AS STRING linenumber AS LONG includeLevel AS LONG includedLine AS LONG @@ -5157,7 +5158,7 @@ DO PRINT #12, "qbs_set(__STRING_VWATCH_SUBNAME,qbs_new_txt_len(" + CHR$(34) + inclinenump$ + subfuncoriginalname$ + CHR$(34) + "," + str2$(LEN(inclinenump$ + subfuncoriginalname$)) + "));" PRINT #12, "qbs_cleanup(qbs_tmp_base,0);" - PRINT #12, "*__LONG_VWATCH_LINENUMBER=-2; SUB_VWATCH((ptrszint*)vwatch_local_vars);" + PRINT #12, "*__LONG_VWATCH_LINENUMBER=-2; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars);" END IF END IF @@ -5301,7 +5302,7 @@ DO IF vWatchOn = 1 THEN IF NoChecks = 0 AND inclinenumber(inclevel) = 0 THEN vWatchAddLabel linenumber, 0 - PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" + PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" vWatchAddLabel 0, -1 END IF PRINT #12, "*__LONG_VWATCH_SUBLEVEL=*__LONG_VWATCH_SUBLEVEL- 1 ;" @@ -5569,7 +5570,7 @@ DO PRINT #12, "fornext_continue_" + str2$(controlid(controllevel)) + ":;" IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 AND NoChecks = 0 THEN vWatchAddLabel linenumber, 0 - PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" + PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" END IF PRINT #12, "}" PRINT #12, "fornext_exit_" + str2$(controlid(controllevel)) + ":;" @@ -5619,7 +5620,7 @@ DO IF (typ AND ISSTRING) THEN a$ = "WHILE ERROR! Cannot accept a STRING type.": GOTO errmes IF NoChecks = 0 AND vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN vWatchAddLabel linenumber, 0 - PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" + PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" END IF PRINT #12, "while((" + e$ + ")||new_error){" ELSE @@ -5679,14 +5680,14 @@ DO IF whileuntil = 1 THEN PRINT #12, "while((" + e$ + ")||new_error){" ELSE PRINT #12, "while((!(" + e$ + "))||new_error){" IF NoChecks = 0 AND vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN vWatchAddLabel linenumber, 0 - PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" + PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" END IF controltype(controllevel) = 4 ELSE controltype(controllevel) = 3 IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 AND NoChecks = 0 THEN vWatchAddLabel linenumber, 0 - PRINT #12, "do{*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" + PRINT #12, "do{*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" ELSE PRINT #12, "do{" END IF @@ -5721,7 +5722,7 @@ DO PRINT #12, "dl_continue_" + str2$(controlid(controllevel)) + ":;" IF NoChecks = 0 AND vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN vWatchAddLabel linenumber, 0 - PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" + PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" END IF IF whileuntil = 1 THEN PRINT #12, "}while((" + e$ + ")&&(!new_error));" ELSE PRINT #12, "}while((!(" + e$ + "))&&(!new_error));" ELSE @@ -5729,7 +5730,7 @@ DO IF NoChecks = 0 AND vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN vWatchAddLabel linenumber, 0 - PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" + PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" END IF IF controltype(controllevel) = 4 THEN @@ -5883,7 +5884,7 @@ DO IF NoChecks = 0 AND vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN vWatchAddLabel linenumber, 0 - PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" + PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" END IF PRINT #12, "fornext_step" + u$ + "=" + e$ + ";" @@ -5971,7 +5972,7 @@ DO PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1 IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN vWatchAddLabel linenumber, 0 - PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" + PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" END IF END IF FOR i = controllevel TO 1 STEP -1 @@ -6013,7 +6014,7 @@ DO PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1 IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN vWatchAddLabel linenumber, 0 - PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" + PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" END IF END IF @@ -6096,7 +6097,7 @@ DO IF NoChecks = 0 AND vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN vWatchAddLabel linenumber, 0 - PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" + PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" END IF PRINT #12, "}" @@ -6117,7 +6118,7 @@ DO PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1 IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN vWatchAddLabel linenumber, 0 - PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" + PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" END IF END IF @@ -6243,7 +6244,7 @@ DO IF NoChecks = 0 AND vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN vWatchAddLabel linenumber, 0 - PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" + PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" END IF IF SelectCaseCounter > 0 AND SelectCaseHasCaseBlock(SelectCaseCounter) = 0 THEN @@ -6362,7 +6363,7 @@ DO PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1 IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN vWatchAddLabel linenumber, 0 - PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" + PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" END IF END IF @@ -6551,7 +6552,7 @@ DO IF NoChecks = 0 THEN IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN vWatchAddLabel linenumber, 0 - PRINT #12, "do{*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" + PRINT #12, "do{*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" ELSE PRINT #12, "do{" END IF @@ -7548,7 +7549,6 @@ DO END IF END IF - IF ids(currentid).share = 0 THEN vWatchVariable RTRIM$(ids(currentid).callname), -2 ids(currentid).share = ids(currentid).share OR 2 'set as temporarily shared 'method must apply to the current sub/function regardless of how the variable was defined in 'main' @@ -8910,7 +8910,7 @@ DO IF vWatchOn = 1 THEN vWatchAddLabel linenumber, 0 - PRINT #12, "*__LONG_VWATCH_LINENUMBER= 0; SUB_VWATCH((ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" + PRINT #12, "*__LONG_VWATCH_LINENUMBER= 0; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" END IF PRINT #12, "if (sub_gl_called) error(271);" PRINT #12, "close_program=1;" @@ -8933,7 +8933,7 @@ DO END IF layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$ IF vWatchOn = 1 AND NoChecks = 0 AND inclinenumber(inclevel) = 0 THEN - PRINT #12, "*__LONG_VWATCH_LINENUMBER=-3; SUB_VWATCH((ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" + PRINT #12, "*__LONG_VWATCH_LINENUMBER=-3; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;" vWatchAddLabel linenumber, 0 ELSE PRINT #12, "close_program=1;" @@ -14223,19 +14223,13 @@ END SUB SUB vWatchVariable (this$, action AS _BYTE) STATIC totalLocalVariables AS LONG, localVariablesList$ STATIC totalMainModuleVariables AS LONG, mainModuleVariablesList$ - STATIC totalSharedVariablesFromMainModule AS LONG, mainModuleSharedVariablesList$ SELECT CASE action - CASE -2 'new variable added to main module using SHARED in a SUB - totalLocalVariables = totalLocalVariables + 1 - localVariablesList$ = localVariablesList$ + "vwatch_local_vars[" + str2$(totalLocalVariables - 1) + "] = &" + this$ + ";" + CRLF CASE -1 'reset totalLocalVariables = 0 localVariablesList$ = "" totalMainModuleVariables = 0 mainModuleVariablesList$ = "" - totalSharedVariablesFromMainModule = 0 - mainModuleSharedVariablesList$ = "" CASE 0 'add IF INSTR(vWatchVariableExclusions$, "@" + this$ + "@") > 0 OR LEFT$(this$, 12) = "_SUB_VWATCH_" THEN EXIT SUB @@ -14244,12 +14238,7 @@ SUB vWatchVariable (this$, action AS _BYTE) vWatchNewVariable$ = this$ IF subfunc = "" THEN totalMainModuleVariables = totalMainModuleVariables + 1 - mainModuleVariablesList$ = mainModuleVariablesList$ + "vwatch_local_vars[" + str2$(totalMainModuleVariables - 1) + "] = &" + this$ + ";" + CRLF - IF dimshared = 1 THEN - 'DIM SHARED variables will be appended to every SUB - totalSharedVariablesFromMainModule = totalSharedVariablesFromMainModule + 1 - mainModuleSharedVariablesList$ = mainModuleSharedVariablesList$ + MKL$(LEN(this$)) + this$ - END IF + mainModuleVariablesList$ = mainModuleVariablesList$ + "vwatch_global_vars[" + str2$(totalMainModuleVariables - 1) + "] = &" + this$ + ";" + CRLF manageVariableList id.cn, this$, totalMainModuleVariables - 1, 0 ELSE totalLocalVariables = totalLocalVariables + 1 @@ -14259,28 +14248,20 @@ SUB vWatchVariable (this$, action AS _BYTE) CASE 1 'dump to data[].txt & reset IF subfunc = "" THEN IF totalMainModuleVariables > 0 THEN - PRINT #13, "void *vwatch_local_vars["; totalMainModuleVariables; "];" + PRINT #13, "void *vwatch_local_vars[0];" + PRINT #18, "void *vwatch_global_vars["; totalMainModuleVariables; "];" PRINT #13, mainModuleVariablesList$ ELSE PRINT #13, "void *vwatch_local_vars[0];" + PRINT #18, "void *vwatch_global_vars[0];" END IF mainModuleVariablesList$ = "" totalMainModuleVariables = 0 ELSE IF subfunc <> "SUB_VWATCH" THEN - IF totalLocalVariables + totalSharedVariablesFromMainModule > 0 THEN - PRINT #13, "void *vwatch_local_vars["; (totalLocalVariables + totalSharedVariablesFromMainModule); "];" - i = totalLocalVariables - tempShared$ = mainModuleSharedVariablesList$ - tempVar$ = "" - DO UNTIL i = totalLocalVariables + totalSharedVariablesFromMainModule - length = CVL(LEFT$(tempShared$, 4)) - tempVar$ = MID$(tempShared$, 5, length) - tempShared$ = MID$(tempShared$, 5 + length) - localVariablesList$ = localVariablesList$ + "vwatch_local_vars[" + str2$(i) + "] = &" + tempVar$ + ";" + CRLF - i = i + 1 - LOOP + IF totalLocalVariables > 0 THEN + PRINT #13, "void *vwatch_local_vars["; (totalLocalVariables); "];" PRINT #13, localVariablesList$ ELSE PRINT #13, "void *vwatch_local_vars[0];" @@ -22817,7 +22798,7 @@ END FUNCTION SUB xend IF vWatchOn = 1 THEN IF (inclinenumber(inclevel) = 0 OR closedmain = 0) THEN vWatchAddLabel 0, -1 - PRINT #12, "*__LONG_VWATCH_LINENUMBER= 0; SUB_VWATCH((ptrszint*)vwatch_local_vars);" + PRINT #12, "*__LONG_VWATCH_LINENUMBER= 0; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars);" END IF PRINT #12, "sub_end();" END SUB @@ -25941,6 +25922,7 @@ SUB manageVariableList (__name$, __cname$, localIndex AS LONG, action AS _BYTE) END IF usedVariableList(i).used = 0 usedVariableList(i).watch = 0 + usedVariableList(i).mostRecentValue = "" usedVariableList(i).linenumber = linenumber usedVariableList(i).includeLevel = inclevel IF inclevel > 0 THEN