1
1
Fork 0
mirror of https://github.com/QB64Official/qb64.git synced 2024-07-16 00:15:29 +00:00

Merge branch 'var-export' into development

This commit is contained in:
Fellippe Heitor 2021-07-21 18:27:46 -03:00
commit 5cbe6d87f2
6 changed files with 1177 additions and 609 deletions

View file

@ -42,6 +42,7 @@ DIM SHARED QuickNavTotal AS LONG
DIM SHARED QuickNavHistory(0) AS QuickNavType DIM SHARED QuickNavHistory(0) AS QuickNavType
REDIM SHARED IdeBreakpoints(1) AS _BYTE REDIM SHARED IdeBreakpoints(1) AS _BYTE
REDIM SHARED IdeSkipLines(1) AS _BYTE
'GetInput global variables 'GetInput global variables
DIM SHARED iCHECKLATER 'the values will be checked later DIM SHARED iCHECKLATER 'the values will be checked later

File diff suppressed because it is too large Load diff

View file

@ -174,7 +174,7 @@ SUB Help_NewLine
IF Help_Pos > help_w THEN help_w = Help_Pos IF Help_Pos > help_w THEN help_w = Help_Pos
Help_Txt_Len = Help_Txt_Len + 1: ASC(Help_Txt$, Help_Txt_Len) = 13 Help_Txt_Len = Help_Txt_Len + 1: ASC(Help_Txt$, Help_Txt_Len) = 13
Help_Txt_Len = Help_Txt_Len + 1: ASC(Help_Txt$, Help_Txt_Len) = col + Help_BG_Col * 16 Help_Txt_Len = Help_Txt_Len + 1: ASC(Help_Txt$, Help_Txt_Len) = Help_BG_Col * 16
Help_Txt_Len = Help_Txt_Len + 1: ASC(Help_Txt$, Help_Txt_Len) = 0 Help_Txt_Len = Help_Txt_Len + 1: ASC(Help_Txt$, Help_Txt_Len) = 0
Help_Txt_Len = Help_Txt_Len + 1: ASC(Help_Txt$, Help_Txt_Len) = 0 Help_Txt_Len = Help_Txt_Len + 1: ASC(Help_Txt$, Help_Txt_Len) = 0

View file

@ -27,6 +27,7 @@ REDIM SHARED PP_TypeMod(0) AS STRING, PP_ConvertedMod(0) AS STRING 'Prepass Name
Set_OrderOfOperations Set_OrderOfOperations
DIM SHARED vWatchOn, vWatchRecompileAttempts, vWatchDesiredState, vWatchErrorCall$ DIM SHARED vWatchOn, vWatchRecompileAttempts, vWatchDesiredState, vWatchErrorCall$
DIM SHARED vWatchNewVariable$
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_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;};"
DIM SHARED qb64prefix_set_recompileAttempts, qb64prefix_set_desiredState DIM SHARED qb64prefix_set_recompileAttempts, qb64prefix_set_desiredState
@ -778,6 +779,8 @@ DIM SHARED findidinternal AS LONG
DIM SHARED currentid AS LONG 'is the index of the last ID accessed DIM SHARED currentid AS LONG 'is the index of the last ID accessed
DIM SHARED linenumber AS LONG, reallinenumber AS LONG, totallinenumber AS LONG, definingtypeerror AS LONG DIM SHARED linenumber AS LONG, reallinenumber AS LONG, totallinenumber AS LONG, definingtypeerror AS LONG
DIM SHARED wholeline AS STRING DIM SHARED wholeline AS STRING
DIM SHARED firstLineNumberLabelvWatch AS LONG, lastLineNumberLabelvWatch AS LONG
DIM SHARED vWatchUsedLabels AS STRING
DIM SHARED linefragment AS STRING DIM SHARED linefragment AS STRING
'COMMON SHARED bitmask() AS _INTEGER64 'COMMON SHARED bitmask() AS _INTEGER64
'COMMON SHARED bitmaskinv() AS _INTEGER64 'COMMON SHARED bitmaskinv() AS _INTEGER64
@ -1455,6 +1458,8 @@ duplicateConstWarning = 0
emptySCWarning = 0 emptySCWarning = 0
warningListItems = 0 warningListItems = 0
lastWarningHeader = "" lastWarningHeader = ""
vWatchUsedLabels = SPACE$(1000)
firstLineNumberLabelvWatch = 0
REDIM SHARED warning$(1000) REDIM SHARED warning$(1000)
REDIM SHARED warningLines(1000) AS LONG REDIM SHARED warningLines(1000) AS LONG
REDIM SHARED warningIncLines(1000) AS LONG REDIM SHARED warningIncLines(1000) AS LONG
@ -5278,18 +5283,7 @@ DO
layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
IF vWatchOn = 1 THEN IF vWatchOn = 1 THEN
totalLocalVariables = 0 vWatchVariable "", 1
localVariablesList$ = ""
FOR i = 1 TO totalVariablesCreated
IF usedVariableList(i).scope = subfuncn THEN
totalLocalVariables = totalLocalVariables + 1
localVariablesList$ = localVariablesList$ + "vwatch_local_vars[" + str2$(totalLocalVariables - 1) + "] = &" + usedVariableList(i).cname + ";" + CRLF
END IF
NEXT
IF totalLocalVariables > 0 THEN
PRINT #13, "void *vwatch_local_vars["; totalLocalVariables; "];"
PRINT #13, localVariablesList$
END IF
END IF END IF
staticarraylist = "": staticarraylistn = 0 'remove previously listed arrays staticarraylist = "": staticarraylistn = 0 'remove previously listed arrays
@ -5297,9 +5291,45 @@ DO
PRINT #12, "exit_subfunc:;" PRINT #12, "exit_subfunc:;"
IF vWatchOn = 1 THEN IF vWatchOn = 1 THEN
IF NoChecks = 0 THEN IF NoChecks = 0 THEN
PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars);" 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;"
vWatchAddLabel 0, -1
END IF END IF
PRINT #12, "*__LONG_VWATCH_SUBLEVEL=*__LONG_VWATCH_SUBLEVEL- 1 ;" PRINT #12, "*__LONG_VWATCH_SUBLEVEL=*__LONG_VWATCH_SUBLEVEL- 1 ;"
IF subfunc <> "SUB_VWATCH" AND firstLineNumberLabelvWatch > 0 THEN
PRINT #12, "goto VWATCH_SKIPSETNEXTLINE;"
PRINT #12, "VWATCH_SETNEXTLINE:;"
PRINT #12, "switch (*__LONG_VWATCH_GOTO) {"
FOR i = firstLineNumberLabelvWatch TO lastLineNumberLabelvWatch
WHILE i > LEN(vWatchUsedLabels)
vWatchUsedLabels = vWatchUsedLabels + SPACE$(1000)
WEND
IF ASC(vWatchUsedLabels, i) = 1 THEN
PRINT #12, " case " + str2$(i) + ":"
PRINT #12, " goto VWATCH_LABEL_" + str2$(i) + ";"
PRINT #12, " break;"
END IF
NEXT
PRINT #12, " default:"
PRINT #12, " *__LONG_VWATCH_GOTO=*__LONG_VWATCH_LINENUMBER;"
PRINT #12, " goto VWATCH_SETNEXTLINE;"
PRINT #12, "}"
PRINT #12, "VWATCH_SKIPLINE:;"
PRINT #12, "switch (*__LONG_VWATCH_GOTO) {"
FOR i = firstLineNumberLabelvWatch TO lastLineNumberLabelvWatch
IF ASC(vWatchUsedLabels, i) = 1 THEN
PRINT #12, " case -" + str2$(i) + ":"
PRINT #12, " goto VWATCH_SKIPLABEL_" + str2$(i) + ";"
PRINT #12, " break;"
END IF
NEXT
PRINT #12, "}"
PRINT #12, "VWATCH_SKIPSETNEXTLINE:;"
END IF
firstLineNumberLabelvWatch = 0
END IF END IF
'release _MEM lock for this scope 'release _MEM lock for this scope
@ -5528,6 +5558,10 @@ DO
IF controltype(controllevel) <> 2 THEN a$ = "NEXT without FOR": GOTO errmes IF controltype(controllevel) <> 2 THEN a$ = "NEXT without FOR": GOTO errmes
IF n <> 1 AND controlvalue(controllevel) <> currentid THEN a$ = "Incorrect variable after NEXT": GOTO errmes IF n <> 1 AND controlvalue(controllevel) <> currentid THEN a$ = "Incorrect variable after NEXT": GOTO errmes
PRINT #12, "fornext_continue_" + str2$(controlid(controllevel)) + ":;" 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;"
END IF
PRINT #12, "}" PRINT #12, "}"
PRINT #12, "fornext_exit_" + str2$(controlid(controllevel)) + ":;" PRINT #12, "fornext_exit_" + str2$(controlid(controllevel)) + ":;"
controllevel = controllevel - 1 controllevel = controllevel - 1
@ -5575,7 +5609,8 @@ DO
IF stringprocessinghappened THEN e$ = cleanupstringprocessingcall$ + e$ + ")" IF stringprocessinghappened THEN e$ = cleanupstringprocessingcall$ + e$ + ")"
IF (typ AND ISSTRING) THEN a$ = "WHILE ERROR! Cannot accept a STRING type.": GOTO errmes IF (typ AND ISSTRING) THEN a$ = "WHILE ERROR! Cannot accept a STRING type.": GOTO errmes
IF NoChecks = 0 AND vWatchOn = 1 THEN IF NoChecks = 0 AND vWatchOn = 1 THEN
PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars);" 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;"
END IF END IF
PRINT #12, "while((" + e$ + ")||new_error){" PRINT #12, "while((" + e$ + ")||new_error){"
ELSE ELSE
@ -5634,13 +5669,15 @@ DO
IF (typ AND ISSTRING) THEN a$ = "DO ERROR! Cannot accept a STRING type.": GOTO errmes IF (typ AND ISSTRING) THEN a$ = "DO ERROR! Cannot accept a STRING type.": GOTO errmes
IF whileuntil = 1 THEN PRINT #12, "while((" + e$ + ")||new_error){" ELSE PRINT #12, "while((!(" + e$ + "))||new_error){" IF whileuntil = 1 THEN PRINT #12, "while((" + e$ + ")||new_error){" ELSE PRINT #12, "while((!(" + e$ + "))||new_error){"
IF NoChecks = 0 AND vWatchOn = 1 THEN IF NoChecks = 0 AND vWatchOn = 1 THEN
PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars);" 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;"
END IF END IF
controltype(controllevel) = 4 controltype(controllevel) = 4
ELSE ELSE
controltype(controllevel) = 3 controltype(controllevel) = 3
IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 AND NoChecks = 0 THEN IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 AND NoChecks = 0 THEN
PRINT #12, "do{*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars);" 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;"
ELSE ELSE
PRINT #12, "do{" PRINT #12, "do{"
END IF END IF
@ -5674,14 +5711,16 @@ DO
IF (typ AND ISSTRING) THEN a$ = "LOOP ERROR! Cannot accept a STRING type.": GOTO errmes IF (typ AND ISSTRING) THEN a$ = "LOOP ERROR! Cannot accept a STRING type.": GOTO errmes
PRINT #12, "dl_continue_" + str2$(controlid(controllevel)) + ":;" PRINT #12, "dl_continue_" + str2$(controlid(controllevel)) + ":;"
IF NoChecks = 0 AND vWatchOn = 1 THEN IF NoChecks = 0 AND vWatchOn = 1 THEN
PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars);" 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;"
END IF END IF
IF whileuntil = 1 THEN PRINT #12, "}while((" + e$ + ")&&(!new_error));" ELSE PRINT #12, "}while((!(" + e$ + "))&&(!new_error));" IF whileuntil = 1 THEN PRINT #12, "}while((" + e$ + ")&&(!new_error));" ELSE PRINT #12, "}while((!(" + e$ + "))&&(!new_error));"
ELSE ELSE
PRINT #12, "dl_continue_" + str2$(controlid(controllevel)) + ":;" PRINT #12, "dl_continue_" + str2$(controlid(controllevel)) + ":;"
IF NoChecks = 0 AND vWatchOn = 1 THEN IF NoChecks = 0 AND vWatchOn = 1 THEN
PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars);" 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;"
END IF END IF
IF controltype(controllevel) = 4 THEN IF controltype(controllevel) = 4 THEN
@ -5834,7 +5873,8 @@ DO
IF Error_Happened THEN GOTO errmes IF Error_Happened THEN GOTO errmes
IF NoChecks = 0 AND vWatchOn = 1 THEN IF NoChecks = 0 AND vWatchOn = 1 THEN
PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars);" 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;"
END IF END IF
PRINT #12, "fornext_step" + u$ + "=" + e$ + ";" PRINT #12, "fornext_step" + u$ + "=" + e$ + ";"
@ -5921,7 +5961,8 @@ DO
IF NoChecks = 0 THEN IF NoChecks = 0 THEN
PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1 PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN
PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars);" 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;"
END IF END IF
END IF END IF
FOR i = controllevel TO 1 STEP -1 FOR i = controllevel TO 1 STEP -1
@ -5962,7 +6003,8 @@ DO
IF NoChecks = 0 THEN IF NoChecks = 0 THEN
PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1 PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN
PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars);" 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;"
END IF END IF
END IF END IF
@ -6043,6 +6085,11 @@ DO
IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$ IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
END IF END IF
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;"
END IF
PRINT #12, "}" PRINT #12, "}"
FOR i = 1 TO controlvalue(controllevel) FOR i = 1 TO controlvalue(controllevel)
PRINT #12, "}" PRINT #12, "}"
@ -6060,7 +6107,8 @@ DO
IF NoChecks = 0 THEN IF NoChecks = 0 THEN
PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1 PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN
PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars);" 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;"
END IF END IF
END IF END IF
@ -6180,9 +6228,15 @@ DO
controllevel = controllevel - 1 controllevel = controllevel - 1
IF EveryCaseSet(SelectCaseCounter) THEN PRINT #12, "} /* End of SELECT EVERYCASE ELSE */" IF EveryCaseSet(SelectCaseCounter) THEN PRINT #12, "} /* End of SELECT EVERYCASE ELSE */"
END IF END IF
PRINT #12, "sc_" + str2$(controlid(controllevel)) + "_end:;" PRINT #12, "sc_" + str2$(controlid(controllevel)) + "_end:;"
IF controltype(controllevel) < 10 OR controltype(controllevel) > 17 THEN a$ = "END SELECT without SELECT CASE": GOTO errmes IF controltype(controllevel) < 10 OR controltype(controllevel) > 17 THEN a$ = "END SELECT without SELECT CASE": GOTO errmes
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;"
END IF
IF SelectCaseCounter > 0 AND SelectCaseHasCaseBlock(SelectCaseCounter) = 0 THEN IF SelectCaseCounter > 0 AND SelectCaseHasCaseBlock(SelectCaseCounter) = 0 THEN
'warn user of empty SELECT CASE block 'warn user of empty SELECT CASE block
IF NOT IgnoreWarnings THEN IF NOT IgnoreWarnings THEN
@ -6298,7 +6352,8 @@ DO
IF NoChecks = 0 THEN IF NoChecks = 0 THEN
PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1 PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN
PRINT #12, "*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars);" 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;"
END IF END IF
END IF END IF
@ -6486,7 +6541,8 @@ DO
IF NoChecks = 0 THEN IF NoChecks = 0 THEN
IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN IF vWatchOn = 1 AND inclinenumber(inclevel) = 0 THEN
PRINT #12, "do{*__LONG_VWATCH_LINENUMBER= " + str2$(linenumber) + "; SUB_VWATCH((ptrszint*)vwatch_local_vars);" 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;"
ELSE ELSE
PRINT #12, "do{" PRINT #12, "do{"
END IF END IF
@ -7467,6 +7523,7 @@ DO
IF optionexplicit THEN a$ = "Variable '" + n$ + "' (" + symbol2fulltypename$(typ$) + ") not defined": GOTO errmes IF optionexplicit THEN a$ = "Variable '" + n$ + "' (" + symbol2fulltypename$(typ$) + ") not defined": GOTO errmes
bypassNextVariable = -1 bypassNextVariable = -1
retval = dim2(n$, typ$, method, "") retval = dim2(n$, typ$, method, "")
manageVariableList "", vWatchNewVariable$, 2
IF Error_Happened THEN GOTO errmes IF Error_Happened THEN GOTO errmes
'note: variable created! 'note: variable created!
@ -8833,7 +8890,8 @@ DO
IF vWatchOn = 1 THEN IF vWatchOn = 1 THEN
PRINT #12, "*__LONG_VWATCH_LINENUMBER= 0; SUB_VWATCH((ptrszint*)vwatch_local_vars);" 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;"
END IF END IF
PRINT #12, "if (sub_gl_called) error(271);" PRINT #12, "if (sub_gl_called) error(271);"
PRINT #12, "close_program=1;" PRINT #12, "close_program=1;"
@ -8856,7 +8914,8 @@ DO
END IF END IF
layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
IF vWatchOn = 1 AND NoChecks = 0 THEN IF vWatchOn = 1 AND NoChecks = 0 THEN
PRINT #12, "*__LONG_VWATCH_LINENUMBER=-3; SUB_VWATCH((ptrszint*)vwatch_local_vars);" vWatchAddLabel linenumber, 0
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;"
ELSE ELSE
PRINT #12, "close_program=1;" PRINT #12, "close_program=1;"
PRINT #12, "end();" PRINT #12, "end();"
@ -11652,18 +11711,7 @@ END IF
CLOSE #fh CLOSE #fh
IF vWatchOn = 1 THEN IF vWatchOn = 1 THEN
totalLocalVariables = 0 vWatchVariable "", 1
localVariablesList$ = ""
FOR i = 1 TO totalVariablesCreated
IF usedVariableList(i).scope = 0 THEN
totalLocalVariables = totalLocalVariables + 1
localVariablesList$ = localVariablesList$ + "vwatch_local_vars[" + str2$(totalLocalVariables - 1) + "] = &" + usedVariableList(i).cname + ";" + CRLF
END IF
NEXT
IF totalLocalVariables > 0 THEN
PRINT #13, "void *vwatch_local_vars["; totalLocalVariables; "];"
PRINT #13, localVariablesList$
END IF
END IF END IF
@ -14009,7 +14057,7 @@ END FUNCTION
FUNCTION arrayreference$ (indexes$, typ) FUNCTION arrayreference$ (indexes$, typ)
arrayprocessinghappened = 1 arrayprocessinghappened = 1
'*returns an array reference: idnumber CHR$(179) index$ '*returns an array reference: idnumber | index$
'*does not take into consideration the type of the array '*does not take into consideration the type of the array
'*expects array id to be passed in the global id structure '*expects array id to be passed in the global id structure
@ -14146,18 +14194,128 @@ SUB clearid
id = cleariddata id = cleariddata
END SUB END SUB
SUB vWatchVariable (this$, action AS _BYTE)
STATIC totalLocalVariables AS LONG, localVariablesList$
STATIC totalMainModuleVariables AS LONG, mainModuleVariablesList$
STATIC exclusions$
IF LEN(exclusions$) = 0 THEN
exclusions$ = "@__LONG_VWATCH_LINENUMBER@__LONG_VWATCH_SUBLEVEL@__LONG_VWATCH_GOTO@" + _
"@__STRING_VWATCH_SUBNAME@__STRING_VWATCH_CALLSTACK@__ARRAY_BYTE_VWATCH_BREAKPOINTS" + _
"@__ARRAY_BYTE_VWATCH_SKIPLINES@"
END IF
SELECT CASE action
CASE 0 'add
IF INSTR(exclusions$, "@" + this$ + "@") > 0 OR LEFT$(this$, 12) = "_SUB_VWATCH_" THEN
EXIT SUB
END IF
vWatchNewVariable$ = this$
IF subfunc = "" THEN
totalMainModuleVariables = totalMainModuleVariables + 1
mainModuleVariablesList$ = mainModuleVariablesList$ + "vwatch_local_vars[" + str2$(totalMainModuleVariables - 1) + "] = &" + this$ + ";" + CRLF
ELSE
totalLocalVariables = totalLocalVariables + 1
localVariablesList$ = localVariablesList$ + "vwatch_local_vars[" + str2$(totalLocalVariables - 1) + "] = &" + this$ + ";" + CRLF
END IF
manageVariableList RTRIM$(id.cn), this$, 0
CASE 1 'dump to data[].txt & reset
IF subfunc = "" THEN
IF totalMainModuleVariables > 0 THEN
PRINT #13, "void *vwatch_local_vars["; totalMainModuleVariables; "];"
PRINT #13, mainModuleVariablesList$
ELSE
PRINT #13, "void *vwatch_local_vars[0];"
END IF
mainModuleVariablesList$ = ""
totalMainModuleVariables = 0
ELSE
IF totalLocalVariables > 0 THEN
PRINT #13, "void *vwatch_local_vars["; totalLocalVariables; "];"
PRINT #13, localVariablesList$
ELSE
PRINT #13, "void *vwatch_local_vars[0];"
END IF
localVariablesList$ = ""
totalLocalVariables = 0
END IF
END SELECT
END SUB
SUB vWatchAddLabel (this AS LONG, lastLine AS _BYTE)
STATIC prevLabel AS LONG, prevSkip AS LONG
IF lastLine = 0 THEN
WHILE this > LEN(vWatchUsedLabels)
vWatchUsedLabels = vWatchUsedLabels + SPACE$(1000)
WEND
IF firstLineNumberLabelvWatch = 0 THEN
firstLineNumberLabelvWatch = this
ELSE
IF prevSkip <> prevLabel THEN
PRINT #12, "VWATCH_SKIPLABEL_" + str2$(prevLabel) + ":;"
prevSkip = prevLabel
END IF
END IF
IF prevLabel <> this THEN
ASC(vWatchUsedLabels, this) = 1
PRINT #12, "VWATCH_LABEL_" + str2$(this) + ":;"
prevLabel = this
lastLineNumberLabelvWatch = this
END IF
ELSE
IF prevSkip <> prevLabel THEN
PRINT #12, "VWATCH_SKIPLABEL_" + str2$(prevLabel) + ":;"
prevSkip = prevLabel
END IF
END IF
END SUB
SUB closemain SUB closemain
xend xend
PRINT #12, "return;" PRINT #12, "return;"
IF vWatchOn AND firstLineNumberLabelvWatch > 0 THEN
PRINT #12, "VWATCH_SETNEXTLINE:;"
PRINT #12, "switch (*__LONG_VWATCH_GOTO) {"
FOR i = firstLineNumberLabelvWatch TO lastLineNumberLabelvWatch
IF ASC(vWatchUsedLabels, i) = 1 THEN
PRINT #12, " case " + str2$(i) + ":"
PRINT #12, " goto VWATCH_LABEL_" + str2$(i) + ";"
PRINT #12, " break;"
END IF
NEXT
PRINT #12, " default:"
PRINT #12, " *__LONG_VWATCH_GOTO=*__LONG_VWATCH_LINENUMBER;"
PRINT #12, " goto VWATCH_SETNEXTLINE;"
PRINT #12, "}"
PRINT #12, "VWATCH_SKIPLINE:;"
PRINT #12, "switch (*__LONG_VWATCH_GOTO) {"
FOR i = firstLineNumberLabelvWatch TO lastLineNumberLabelvWatch
IF ASC(vWatchUsedLabels, i) = 1 THEN
PRINT #12, " case -" + str2$(i) + ":"
PRINT #12, " goto VWATCH_SKIPLABEL_" + str2$(i) + ";"
PRINT #12, " break;"
END IF
NEXT
PRINT #12, "}"
END IF
PRINT #12, "}" PRINT #12, "}"
PRINT #15, "}" 'end case PRINT #15, "}" 'end case
PRINT #15, "}" PRINT #15, "}"
PRINT #15, "error(3);" 'no valid return possible PRINT #15, "error(3);" 'no valid return possible
closedmain = 1 closedmain = 1
firstLineNumberLabelvWatch = 0
END SUB END SUB
FUNCTION countelements (a$) FUNCTION countelements (a$)
@ -14284,6 +14442,7 @@ FUNCTION dim2 (varname$, typ2$, method, elements$)
id.arrayelements = nume id.arrayelements = nume
id.callname = n$ id.callname = n$
regid regid
vWatchVariable n$, 0
IF Error_Happened THEN EXIT FUNCTION IF Error_Happened THEN EXIT FUNCTION
GOTO dim2exitfunc GOTO dim2exitfunc
END IF END IF
@ -14321,6 +14480,7 @@ FUNCTION dim2 (varname$, typ2$, method, elements$)
END IF END IF
END IF END IF
regid regid
vWatchVariable n$, 0
IF Error_Happened THEN EXIT FUNCTION IF Error_Happened THEN EXIT FUNCTION
GOTO dim2exitfunc GOTO dim2exitfunc
END IF END IF
@ -14487,6 +14647,7 @@ FUNCTION dim2 (varname$, typ2$, method, elements$)
id.musthave = "$" + str2(bytes) id.musthave = "$" + str2(bytes)
END IF END IF
regid regid
vWatchVariable n$, 0
IF Error_Happened THEN EXIT FUNCTION IF Error_Happened THEN EXIT FUNCTION
GOTO dim2exitfunc GOTO dim2exitfunc
END IF END IF
@ -14577,6 +14738,7 @@ FUNCTION dim2 (varname$, typ2$, method, elements$)
id.musthave = "$" id.musthave = "$"
END IF END IF
regid regid
vWatchVariable n$, 0
IF Error_Happened THEN EXIT FUNCTION IF Error_Happened THEN EXIT FUNCTION
GOTO dim2exitfunc GOTO dim2exitfunc
END IF END IF
@ -14680,6 +14842,7 @@ FUNCTION dim2 (varname$, typ2$, method, elements$)
IF unsgn THEN id.musthave = "~`" + str2(bits) ELSE id.musthave = "`" + str2(bits) IF unsgn THEN id.musthave = "~`" + str2(bits) ELSE id.musthave = "`" + str2(bits)
END IF END IF
regid regid
vWatchVariable n$, 0
IF Error_Happened THEN EXIT FUNCTION IF Error_Happened THEN EXIT FUNCTION
GOTO dim2exitfunc GOTO dim2exitfunc
END IF END IF
@ -14765,6 +14928,7 @@ FUNCTION dim2 (varname$, typ2$, method, elements$)
IF unsgn THEN id.musthave = "~%%" ELSE id.musthave = "%%" IF unsgn THEN id.musthave = "~%%" ELSE id.musthave = "%%"
END IF END IF
regid regid
vWatchVariable n$, 0
IF Error_Happened THEN EXIT FUNCTION IF Error_Happened THEN EXIT FUNCTION
GOTO dim2exitfunc GOTO dim2exitfunc
END IF END IF
@ -14847,6 +15011,7 @@ FUNCTION dim2 (varname$, typ2$, method, elements$)
IF unsgn THEN id.musthave = "~%" ELSE id.musthave = "%" IF unsgn THEN id.musthave = "~%" ELSE id.musthave = "%"
END IF END IF
regid regid
vWatchVariable n$, 0
IF Error_Happened THEN EXIT FUNCTION IF Error_Happened THEN EXIT FUNCTION
GOTO dim2exitfunc GOTO dim2exitfunc
END IF END IF
@ -14934,6 +15099,7 @@ FUNCTION dim2 (varname$, typ2$, method, elements$)
IF unsgn THEN id.musthave = "~%&" ELSE id.musthave = "%&" IF unsgn THEN id.musthave = "~%&" ELSE id.musthave = "%&"
END IF END IF
regid regid
vWatchVariable n$, 0
IF Error_Happened THEN EXIT FUNCTION IF Error_Happened THEN EXIT FUNCTION
GOTO dim2exitfunc GOTO dim2exitfunc
END IF END IF
@ -15018,6 +15184,7 @@ FUNCTION dim2 (varname$, typ2$, method, elements$)
IF unsgn THEN id.musthave = "~&" ELSE id.musthave = "&" IF unsgn THEN id.musthave = "~&" ELSE id.musthave = "&"
END IF END IF
regid regid
vWatchVariable n$, 0
IF Error_Happened THEN EXIT FUNCTION IF Error_Happened THEN EXIT FUNCTION
GOTO dim2exitfunc GOTO dim2exitfunc
END IF END IF
@ -15102,6 +15269,7 @@ FUNCTION dim2 (varname$, typ2$, method, elements$)
IF unsgn THEN id.musthave = "~&&" ELSE id.musthave = "&&" IF unsgn THEN id.musthave = "~&&" ELSE id.musthave = "&&"
END IF END IF
regid regid
vWatchVariable n$, 0
IF Error_Happened THEN EXIT FUNCTION IF Error_Happened THEN EXIT FUNCTION
GOTO dim2exitfunc GOTO dim2exitfunc
END IF END IF
@ -15186,6 +15354,7 @@ FUNCTION dim2 (varname$, typ2$, method, elements$)
id.musthave = "!" id.musthave = "!"
END IF END IF
regid regid
vWatchVariable n$, 0
IF Error_Happened THEN EXIT FUNCTION IF Error_Happened THEN EXIT FUNCTION
GOTO dim2exitfunc GOTO dim2exitfunc
END IF END IF
@ -15268,6 +15437,7 @@ FUNCTION dim2 (varname$, typ2$, method, elements$)
id.musthave = "#" id.musthave = "#"
END IF END IF
regid regid
vWatchVariable n$, 0
IF Error_Happened THEN EXIT FUNCTION IF Error_Happened THEN EXIT FUNCTION
GOTO dim2exitfunc GOTO dim2exitfunc
END IF END IF
@ -15350,6 +15520,7 @@ FUNCTION dim2 (varname$, typ2$, method, elements$)
id.musthave = "##" id.musthave = "##"
END IF END IF
regid regid
vWatchVariable n$, 0
IF Error_Happened THEN EXIT FUNCTION IF Error_Happened THEN EXIT FUNCTION
GOTO dim2exitfunc GOTO dim2exitfunc
END IF END IF
@ -15357,9 +15528,6 @@ FUNCTION dim2 (varname$, typ2$, method, elements$)
Give_Error "Unknown type": EXIT FUNCTION Give_Error "Unknown type": EXIT FUNCTION
dim2exitfunc: dim2exitfunc:
IF bypassNextVariable = 0 THEN
manageVariableList cvarname$, n$, 0
END IF
bypassNextVariable = 0 bypassNextVariable = 0
IF dimsfarray THEN IF dimsfarray THEN
@ -15450,7 +15618,7 @@ FUNCTION udtreference$ (o$, a$, typ AS LONG)
GOTO udtfindelenext GOTO udtfindelenext
END IF END IF
'Change e reference to u CHR$(179) 0 reference? 'Change e reference to u | 0 reference?
IF udtetype(E) AND ISUDT THEN IF udtetype(E) AND ISUDT THEN
u = udtetype(E) AND 511 u = udtetype(E) AND 511
E = 0 E = 0
@ -15950,6 +16118,7 @@ FUNCTION evaluate$ (a2$, typ AS LONG)
IF optionexplicit THEN Give_Error "Variable '" + x$ + "' (" + symbol2fulltypename$(typ$) + ") not defined": EXIT FUNCTION IF optionexplicit THEN Give_Error "Variable '" + x$ + "' (" + symbol2fulltypename$(typ$) + ") not defined": EXIT FUNCTION
bypassNextVariable = -1 bypassNextVariable = -1
retval = dim2(x$, typ$, 1, "") retval = dim2(x$, typ$, 1, "")
manageVariableList "", vWatchNewVariable$, 3
IF Error_Happened THEN EXIT FUNCTION IF Error_Happened THEN EXIT FUNCTION
simplevarfound: simplevarfound:
@ -18286,7 +18455,7 @@ FUNCTION findid& (n2$)
''' END IF 'safeguard ''' END IF 'safeguard
END IF END IF
'optomizations for later comparisons 'optimizations for later comparisons
insf$ = subfunc + SPACE$(256 - LEN(subfunc)) insf$ = subfunc + SPACE$(256 - LEN(subfunc))
secondarg$ = secondarg$ + SPACE$(256 - LEN(secondarg$)) secondarg$ = secondarg$ + SPACE$(256 - LEN(secondarg$))
IF LEN(sc$) THEN scpassed = 1: sc$ = sc$ + SPACE$(8 - LEN(sc$)) ELSE scpassed = 0 IF LEN(sc$) THEN scpassed = 1: sc$ = sc$ + SPACE$(8 - LEN(sc$)) ELSE scpassed = 0
@ -18390,33 +18559,8 @@ FUNCTION findid& (n2$)
id = ids(i) id = ids(i)
t = id.t t = id.t
IF id.subfunc = 0 THEN temp$ = refer$(str2$(i), t, 1)
IF t = 0 THEN manageVariableList "", temp$, 1
t = id.arraytype
IF t AND ISUDT THEN
manageVariableList "", scope$ + "ARRAY_UDT_" + RTRIM$(id.n), 1
ELSE
n$ = id2shorttypename$
IF LEFT$(n$, 1) = "_" THEN
manageVariableList "", scope$ + "ARRAY" + n$ + "_" + RTRIM$(id.n), 2
ELSE
manageVariableList "", scope$ + "ARRAY_" + n$ + "_" + RTRIM$(id.n), 3
END IF
END IF
ELSE
IF t AND ISUDT THEN
manageVariableList "", scope$ + "UDT_" + RTRIM$(id.n), 4
ELSE
n$ = id2shorttypename$
IF LEFT$(n$, 1) = "_" THEN
'manageVariableList "", scope$ + MID$(n$, 2) + "_" + RTRIM$(id.n), 5
ELSE
manageVariableList "", scope$ + n$ + "_" + RTRIM$(id.n), 6
END IF
END IF
END IF
END IF
currentid = i currentid = i
EXIT FUNCTION EXIT FUNCTION
@ -19617,7 +19761,7 @@ FUNCTION isvalidvariable (a$)
NEXT NEXT
isvalidvariable = 1 isvalidvariable = 1
IF i > n THEN EXIT FUNCTION IF i > n THEN EXIT FUNCTION 'i is always greater than n because n is undefined here. Why didn't I remove this line and the ones below it, which will never run? Cause I'm a coward. F.h.
e$ = RIGHT$(a$, LEN(a$) - i - 1) e$ = RIGHT$(a$, LEN(a$) - i - 1)
IF e$ = "%%" OR e$ = "~%%" THEN EXIT FUNCTION IF e$ = "%%" OR e$ = "~%%" THEN EXIT FUNCTION
IF e$ = "%" OR e$ = "~%" THEN EXIT FUNCTION IF e$ = "%" OR e$ = "~%" THEN EXIT FUNCTION
@ -21952,7 +22096,6 @@ SUB setrefer (a2$, typ2 AS LONG, e2$, method AS LONG)
directudt: directudt:
IF u <> u2 OR e2 <> 0 THEN Give_Error "Expected = similar user defined type": EXIT SUB IF u <> u2 OR e2 <> 0 THEN Give_Error "Expected = similar user defined type": EXIT SUB
dst$ = "((char*)" + lhsscope$ + n$ + ")+(" + o$ + ")" dst$ = "((char*)" + lhsscope$ + n$ + ")+(" + o$ + ")"
copy_full_udt dst$, src$, 12, 0, u copy_full_udt dst$, src$, 12, 0, u
'print "setFULLUDTrefer!" 'print "setFULLUDTrefer!"
@ -21989,7 +22132,6 @@ SUB setrefer (a2$, typ2 AS LONG, e2$, method AS LONG)
'print "setUDTrefer:"+r$,e$ 'print "setUDTrefer:"+r$,e$
tlayout$ = tl$ tlayout$ = tl$
IF LEFT$(r$, 1) = "*" THEN r$ = MID$(r$, 2) IF LEFT$(r$, 1) = "*" THEN r$ = MID$(r$, 2)
manageVariableList "", scope$ + n$, 7
EXIT SUB EXIT SUB
END IF END IF
@ -22024,7 +22166,6 @@ SUB setrefer (a2$, typ2 AS LONG, e2$, method AS LONG)
PRINT #12, cleanupstringprocessingcall$ + "0);" PRINT #12, cleanupstringprocessingcall$ + "0);"
tlayout$ = tl$ tlayout$ = tl$
IF LEFT$(r$, 1) = "*" THEN r$ = MID$(r$, 2) IF LEFT$(r$, 1) = "*" THEN r$ = MID$(r$, 2)
manageVariableList "", r$, 8
EXIT SUB EXIT SUB
END IF END IF
@ -22100,7 +22241,6 @@ SUB setrefer (a2$, typ2 AS LONG, e2$, method AS LONG)
IF arrayprocessinghappened THEN arrayprocessinghappened = 0 IF arrayprocessinghappened THEN arrayprocessinghappened = 0
tlayout$ = tl$ tlayout$ = tl$
IF LEFT$(r$, 1) = "*" THEN r$ = MID$(r$, 2) IF LEFT$(r$, 1) = "*" THEN r$ = MID$(r$, 2)
manageVariableList "", r$, 9
EXIT SUB EXIT SUB
END IF END IF
@ -22132,7 +22272,6 @@ SUB setrefer (a2$, typ2 AS LONG, e2$, method AS LONG)
IF arrayprocessinghappened THEN arrayprocessinghappened = 0 IF arrayprocessinghappened THEN arrayprocessinghappened = 0
tlayout$ = tl$ tlayout$ = tl$
IF LEFT$(r$, 1) = "*" THEN r$ = MID$(r$, 2) IF LEFT$(r$, 1) = "*" THEN r$ = MID$(r$, 2)
manageVariableList "", r$, 10
EXIT SUB EXIT SUB
END IF END IF
@ -22161,8 +22300,6 @@ SUB setrefer (a2$, typ2 AS LONG, e2$, method AS LONG)
tlayout$ = tl$ tlayout$ = tl$
IF LEFT$(r$, 1) = "*" THEN r$ = MID$(r$, 2) IF LEFT$(r$, 1) = "*" THEN r$ = MID$(r$, 2)
manageVariableList "", r$, 11
EXIT SUB EXIT SUB
END IF 'variable END IF 'variable
@ -22206,7 +22343,7 @@ FUNCTION typ2ctyp$ (t AS LONG, tstr AS STRING)
IF b = 16 THEN ctyp$ = "int16" IF b = 16 THEN ctyp$ = "int16"
IF b = 32 THEN ctyp$ = "int32" IF b = 32 THEN ctyp$ = "int32"
IF b = 64 THEN ctyp$ = "int64" IF b = 64 THEN ctyp$ = "int64"
IF typ AND ISOFFSET THEN ctyp$ = "ptrszint" IF t AND ISOFFSET THEN ctyp$ = "ptrszint"
IF (t AND ISUNSIGNED) THEN ctyp$ = "u" + ctyp$ IF (t AND ISUNSIGNED) THEN ctyp$ = "u" + ctyp$
END IF END IF
IF t AND ISOFFSET THEN IF t AND ISOFFSET THEN
@ -22617,6 +22754,7 @@ END FUNCTION
SUB xend SUB xend
IF vWatchOn = 1 THEN IF vWatchOn = 1 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_local_vars);"
END IF END IF
PRINT #12, "sub_end();" PRINT #12, "sub_end();"
@ -25712,8 +25850,9 @@ SUB dump_udts
CLOSE #f CLOSE #f
END SUB END SUB
SUB manageVariableList (name$, __cname$, action AS _BYTE) SUB manageVariableList (__name$, __cname$, action AS _BYTE)
DIM findItem AS LONG, cname$, i AS LONG DIM findItem AS LONG, cname$, i AS LONG, name$
name$ = __name$
cname$ = __cname$ cname$ = __cname$
IF LEN(cname$) = 0 THEN EXIT SUB IF LEN(cname$) = 0 THEN EXIT SUB
@ -25748,15 +25887,13 @@ SUB manageVariableList (name$, __cname$, action AS _BYTE)
END IF END IF
usedVariableList(i).scope = subfuncn usedVariableList(i).scope = subfuncn
usedVariableList(i).cname = cname$ usedVariableList(i).cname = cname$
IF LEN(RTRIM$(id.musthave)) > 0 THEN name$ = name$ + RTRIM$(id.musthave)
usedVariableList(i).name = name$ usedVariableList(i).name = name$
totalVariablesCreated = totalVariablesCreated + 1 totalVariablesCreated = totalVariablesCreated + 1
END IF END IF
CASE ELSE 'find and mark as used CASE ELSE 'find and mark as used
IF found THEN IF found THEN
usedVariableList(i).used = -1 usedVariableList(i).used = -1
ELSE
manageVariableList name$, __cname$, 0
manageVariableList name$, __cname$, 12
END IF END IF
END SELECT END SELECT
END SUB END SUB

View file

@ -1,11 +1,14 @@
$CHECKING:OFF $CHECKING:OFF
DIM SHARED AS LONG vwatch_linenumber, vwatch_sublevel DIM SHARED AS LONG vwatch_linenumber, vwatch_sublevel, vwatch_goto
DIM SHARED AS STRING vwatch_subname, vwatch_callstack DIM SHARED AS STRING vwatch_subname, vwatch_callstack
REDIM SHARED vwatch_breakpoints(0) AS _BYTE REDIM SHARED vwatch_breakpoints(0) AS _BYTE
REDIM SHARED vwatch_skiplines(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_sublevel = 0
vwatch_goto = 0
vwatch_breakpoints(0) = 0 vwatch_breakpoints(0) = 0
vwatch_skiplines(0) = 0
vwatch_subname = "" vwatch_subname = ""
vwatch_callstack = "" vwatch_callstack = ""
$CHECKING:ON $CHECKING:ON

View file

@ -1,225 +1,280 @@
$CHECKING:OFF $CHECKING:OFF
SUB vwatch (localVariables AS _OFFSET) SUB vwatch (localVariables AS _OFFSET)
STATIC AS LONG ide, breakpointCount, timeout, startLevel, lastLine STATIC AS LONG ideHost, breakpointCount, skipCount, timeout, startLevel, lastLine
STATIC AS LONG callStackLength STATIC AS LONG callStackLength, runToLine
STATIC AS _BYTE pauseMode, stepOver, bypass STATIC AS _BYTE pauseMode, stepOver, bypass, setNextLine
STATIC buffer$, endc$ STATIC buffer$, endc$
DIM AS LONG i DIM AS LONG i
DIM AS _OFFSET address DIM AS _OFFSET address
DIM AS _MEM m DIM AS _MEM m
DIM start!, temp$, cmd$, value$, k& DIM start!, temp$, cmd$, value$, k&
DECLARE LIBRARY DECLARE LIBRARY
SUB vwatch_stoptimers ALIAS stop_timers SUB vwatch_stoptimers ALIAS stop_timers
SUB vwatch_starttimers ALIAS start_timers SUB vwatch_starttimers ALIAS start_timers
END DECLARE END DECLARE
IF bypass THEN EXIT SUB IF bypass THEN EXIT SUB
IF ide = 0 THEN vwatch_goto = 0
timeout = 10
endc$ = "<END>" IF ideHost = 0 THEN
timeout = 10
'initial setup endc$ = "<END>"
GOSUB Connect
'initial setup
'send this binary's path/exe name GOSUB Connect
cmd$ = "me:" + COMMAND$(0)
GOSUB SendCommand 'send this binary's path/exe name
cmd$ = "me:" + COMMAND$(0)
DO GOSUB SendCommand
GOSUB GetCommand
SELECT CASE cmd$ DO
CASE "vwatch" GOSUB GetCommand
IF value$ <> "ok" THEN SELECT CASE cmd$
CLOSE #ide CASE "vwatch"
bypass = -1 IF value$ <> "ok" THEN
EXIT SUB CLOSE #ideHost
END IF bypass = -1
CASE "line count" EXIT SUB
REDIM vwatch_breakpoints(CVL(value$)) AS _BYTE END IF
CASE "breakpoint count" CASE "line count"
breakpointCount = CVL(value$) REDIM vwatch_breakpoints(CVL(value$)) AS _BYTE
CASE "breakpoint list" REDIM vwatch_skiplines(CVL(value$)) AS _BYTE
IF LEN(value$) \ 4 <> breakpointCount THEN CASE "breakpoint count"
cmd$ = "quit:Communication error." breakpointCount = CVL(value$)
GOSUB SendCommand CASE "breakpoint list"
CLOSE #ide IF LEN(value$) \ 4 <> breakpointCount THEN
bypass = -1 cmd$ = "quit:Communication error."
EXIT SUB GOSUB SendCommand
END IF CLOSE #ideHost
FOR i = 1 TO breakpointCount bypass = -1
temp$ = MID$(value$, i * 4 - 3, 4) EXIT SUB
vwatch_breakpoints(CVL(temp$)) = -1 END IF
NEXT FOR i = 1 TO breakpointCount
CASE "run" temp$ = MID$(value$, i * 4 - 3, 4)
IF vwatch_breakpoints(vwatch_linenumber) THEN EXIT DO vwatch_breakpoints(CVL(temp$)) = -1
pauseMode = 0 NEXT
EXIT SUB CASE "skip count"
CASE "break" skipCount = CVL(value$)
pauseMode = -1 CASE "skip list"
EXIT DO IF LEN(value$) \ 4 <> skipCount THEN
END SELECT cmd$ = "quit:Communication error."
LOOP GOSUB SendCommand
END IF CLOSE #ideHost
bypass = -1
IF vwatch_linenumber = 0 THEN EXIT SUB
cmd$ = "call stack size:" + MKL$(callStackLength) END IF
GOSUB SendCommand FOR i = 1 TO skipCount
cmd$ = "call stack:" + vwatch_callstack temp$ = MID$(value$, i * 4 - 3, 4)
GOSUB SendCommand vwatch_skiplines(CVL(temp$)) = -1
cmd$ = "quit:Program ended." NEXT
GOSUB SendCommand CASE "run"
CLOSE #ide IF vwatch_breakpoints(vwatch_linenumber) THEN EXIT DO
bypass = -1 pauseMode = 0
ide = 0 EXIT SUB
EXIT SUB CASE "break"
ELSEIF vwatch_linenumber = -1 THEN pauseMode = -1
'report an error in the most recent line EXIT DO
cmd$ = "error:" + MKL$(lastLine) END SELECT
GOSUB SendCommand LOOP
EXIT SUB END IF
ELSEIF vwatch_linenumber = -2 THEN
'report a new sub/function has been "entered" IF vwatch_linenumber = 0 THEN
IF LEN(vwatch_callstack) > 100000 THEN GOSUB SendCallStack
vwatch_callstack = "" cmd$ = "quit:Program ended."
callStackLength = 0 GOSUB SendCommand
END IF CLOSE #ideHost
callStackLength = callStackLength + 1 bypass = -1
IF LEN(vwatch_callstack) THEN vwatch_callstack = vwatch_callstack + CHR$(0) ideHost = 0
vwatch_callstack = vwatch_callstack + vwatch_subname$ + ", line" + STR$(lastLine) EXIT SUB
EXIT SUB ELSEIF vwatch_linenumber = -1 THEN
ELSEIF vwatch_linenumber = -3 THEN 'report an error in the most recent line
'handle STOP - instead of quitting, pause execution GOSUB SendCallStack
pauseMode = -1 cmd$ = "error:" + MKL$(lastLine)
stepOver = 0 GOSUB SendCommand
EXIT SUB EXIT SUB
END IF ELSEIF vwatch_linenumber = -2 THEN
'report a new sub/function has been "entered"
IF vwatch_linenumber = lastLine THEN EXIT SUB IF LEN(vwatch_callstack) > 100000 THEN
lastLine = vwatch_linenumber vwatch_callstack = ""
callStackLength = 0
GOSUB GetCommand END IF
SELECT CASE cmd$ callStackLength = callStackLength + 1
CASE "break" IF LEN(vwatch_callstack) THEN vwatch_callstack = vwatch_callstack + CHR$(0)
pauseMode = -1 vwatch_callstack = vwatch_callstack + vwatch_subname$ + ", line" + STR$(lastLine)
stepOver = 0 EXIT SUB
cmd$ = "" ELSEIF vwatch_linenumber = -3 THEN
CASE "set breakpoint" 'handle STOP - instead of quitting, pause execution
vwatch_breakpoints(CVL(value$)) = -1 pauseMode = -1
CASE "clear breakpoint" stepOver = 0
vwatch_breakpoints(CVL(value$)) = 0 EXIT SUB
CASE "clear all breakpoints" END IF
REDIM vwatch_breakpoints(UBOUND(vwatch_breakpoints)) AS _BYTE
END SELECT IF vwatch_linenumber = lastLine AND setNextLine = 0 THEN EXIT SUB
setNextLine = 0
IF stepOver = -1 AND vwatch_sublevel > startLevel AND vwatch_breakpoints(vwatch_linenumber) = 0 THEN lastLine = vwatch_linenumber
EXIT SUB
ELSEIF stepOver = -1 AND vwatch_sublevel = startLevel THEN GOSUB GetCommand
stepOver = 0 SELECT CASE cmd$
pauseMode = -1 CASE "break"
END IF pauseMode = -1
stepOver = 0
IF vwatch_breakpoints(vwatch_linenumber) = 0 AND pauseMode = 0 THEN runToLine = 0
EXIT SUB cmd$ = ""
END IF CASE "set breakpoint"
vwatch_breakpoints(CVL(value$)) = -1
vwatch_stoptimers vwatch_skiplines(CVL(value$)) = 0
cmd$ = "line number:" CASE "clear breakpoint"
IF vwatch_breakpoints(vwatch_linenumber) THEN cmd$ = "breakpoint:" vwatch_breakpoints(CVL(value$)) = 0
cmd$ = cmd$ + MKL$(vwatch_linenumber) CASE "set skip line"
GOSUB SendCommand vwatch_skiplines(CVL(value$)) = -1
vwatch_breakpoints(CVL(value$)) = 0
DO 'main loop CASE "clear skip line"
SELECT CASE cmd$ vwatch_skiplines(CVL(value$)) = 0
CASE "run" CASE "clear all breakpoints"
pauseMode = 0 REDIM vwatch_breakpoints(UBOUND(vwatch_breakpoints)) AS _BYTE
stepOver = 0 END SELECT
vwatch_starttimers
EXIT SUB IF vwatch_skiplines(vwatch_linenumber) THEN vwatch_goto = -vwatch_linenumber: EXIT SUB
CASE "step"
pauseMode = -1 IF stepOver = -1 AND vwatch_sublevel > startLevel AND vwatch_breakpoints(vwatch_linenumber) = 0 THEN
stepOver = 0 EXIT SUB
EXIT SUB ELSEIF stepOver = -1 AND vwatch_sublevel = startLevel THEN
CASE "step over" stepOver = 0
pauseMode = -1 pauseMode = -1
stepOver = -1 END IF
startLevel = vwatch_sublevel
vwatch_starttimers IF runToLine > 0 AND runToLine <> vwatch_linenumber THEN
EXIT SUB EXIT SUB
CASE "step out" ELSEIF runToLine > 0 AND runToLine = vwatch_linenumber THEN
pauseMode = -1 pauseMode = -1
stepOver = -1 runToLine = 0
startLevel = vwatch_sublevel - 1 END IF
vwatch_starttimers
EXIT SUB IF vwatch_breakpoints(vwatch_linenumber) = 0 AND pauseMode = 0 THEN
CASE "free" EXIT SUB
CLOSE #ide END IF
ide = 0
bypass = -1 vwatch_stoptimers
vwatch_starttimers cmd$ = "line number:"
EXIT SUB IF vwatch_breakpoints(vwatch_linenumber) THEN cmd$ = "breakpoint:"
CASE "set breakpoint" cmd$ = cmd$ + MKL$(vwatch_linenumber)
vwatch_breakpoints(CVL(value$)) = -1 GOSUB SendCommand
CASE "clear breakpoint"
vwatch_breakpoints(CVL(value$)) = 0 DO 'main loop
CASE "clear all breakpoints" SELECT CASE cmd$
REDIM vwatch_breakpoints(UBOUND(vwatch_breakpoints)) AS _BYTE CASE "run"
CASE "call stack" pauseMode = 0
'send call stack history" stepOver = 0
cmd$ = "call stack size:" + MKL$(callStackLength) vwatch_starttimers
GOSUB SendCommand EXIT SUB
cmd$ = "call stack:" + vwatch_callstack CASE "run to line"
GOSUB SendCommand pauseMode = 0
CASE "local" stepOver = 0
i = CVL(value$) runToLine = CVL(value$)
address = localVariables + LEN(address) * i vwatch_starttimers
PRINT "Local"; i; "is at"; _MEMGET(m, address, _OFFSET) EXIT SUB
END SELECT CASE "step"
pauseMode = -1
GOSUB GetCommand stepOver = 0
_LIMIT 100 EXIT SUB
LOOP CASE "step over"
pauseMode = -1
vwatch_starttimers stepOver = -1
EXIT SUB startLevel = vwatch_sublevel
vwatch_starttimers
Connect: EXIT SUB
ideport$ = ENVIRON$("QB64DEBUGPORT") CASE "step out"
IF ideport$ = "" THEN bypass = -1: EXIT SUB pauseMode = -1
stepOver = -1
start! = TIMER startLevel = vwatch_sublevel - 1
DO vwatch_starttimers
k& = _KEYHIT EXIT SUB
ide = _OPENCLIENT("TCP/IP:" + ideport$ + ":localhost") CASE "free"
_LIMIT 30 CLOSE #ideHost
LOOP UNTIL k& = 27 OR ide <> 0 OR TIMER - start! > timeout ideHost = 0
IF ide = 0 THEN bypass = -1: EXIT SUB bypass = -1
RETURN vwatch_starttimers
EXIT SUB
GetCommand: CASE "set breakpoint"
GET #ide, , temp$ vwatch_breakpoints(CVL(value$)) = -1
buffer$ = buffer$ + temp$ vwatch_skiplines(CVL(value$)) = 0
CASE "clear breakpoint"
IF INSTR(buffer$, endc$) THEN vwatch_breakpoints(CVL(value$)) = 0
cmd$ = LEFT$(buffer$, INSTR(buffer$, endc$) - 1) CASE "clear all breakpoints"
buffer$ = MID$(buffer$, INSTR(buffer$, endc$) + LEN(endc$)) REDIM vwatch_breakpoints(UBOUND(vwatch_breakpoints)) AS _BYTE
CASE "call stack"
IF INSTR(cmd$, ":") THEN 'send call stack history"
value$ = MID$(cmd$, INSTR(cmd$, ":") + 1) GOSUB SendCallStack
cmd$ = LEFT$(cmd$, INSTR(cmd$, ":") - 1) CASE "local"
ELSE i = CVL(value$)
value$ = "" address = localVariables + LEN(address) * i
END IF PRINT "Local"; i; "is at"; _MEMGET(m, address, _OFFSET)
ELSE CASE "set next line"
cmd$ = "": value$ = "" pauseMode = -1
END IF stepOver = 0
RETURN setNextLine = -1
vwatch_goto = CVL(value$)
SendCommand: EXIT SUB
cmd$ = cmd$ + endc$ CASE "set skip line"
PUT #ide, , cmd$ vwatch_skiplines(CVL(value$)) = -1
cmd$ = "" vwatch_breakpoints(CVL(value$)) = 0
RETURN CASE "clear skip line"
END SUB vwatch_skiplines(CVL(value$)) = 0
END SELECT
GOSUB GetCommand
_LIMIT 100
LOOP
vwatch_starttimers
EXIT SUB
Connect:
DIM ideport$
ideport$ = ENVIRON$("QB64DEBUGPORT")
IF ideport$ = "" THEN bypass = -1: EXIT SUB
start! = TIMER
DO
k& = _KEYHIT
ideHost = _OPENCLIENT("TCP/IP:" + ideport$ + ":localhost")
_LIMIT 30
LOOP UNTIL k& = 27 OR ideHost <> 0 OR TIMER - start! > timeout
IF ideHost = 0 THEN bypass = -1: EXIT SUB
RETURN
GetCommand:
GET #ideHost, , temp$
buffer$ = buffer$ + temp$
IF INSTR(buffer$, endc$) THEN
cmd$ = LEFT$(buffer$, INSTR(buffer$, endc$) - 1)
buffer$ = MID$(buffer$, INSTR(buffer$, endc$) + LEN(endc$))
IF INSTR(cmd$, ":") THEN
value$ = MID$(cmd$, INSTR(cmd$, ":") + 1)
cmd$ = LEFT$(cmd$, INSTR(cmd$, ":") - 1)
ELSE
value$ = ""
END IF
ELSE
cmd$ = "": value$ = ""
END IF
RETURN
SendCallStack:
cmd$ = "call stack size:" + MKL$(callStackLength)
GOSUB SendCommand
cmd$ = "call stack:" + vwatch_callstack
GOSUB SendCommand
RETURN
SendCommand:
cmd$ = cmd$ + endc$
PUT #ideHost, , cmd$
cmd$ = ""
RETURN
END SUB