From 82d4de881f21111e1e71fbe802dd564f37be1c7a Mon Sep 17 00:00:00 2001 From: FellippeHeitor Date: Sat, 21 Aug 2021 17:39:41 -0300 Subject: [PATCH 01/10] Keeps array index selection made before entering Debug mode. --- source/ide/ide_methods.bas | 2 +- source/qb64.bas | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/source/ide/ide_methods.bas b/source/ide/ide_methods.bas index ebd869a6c..ca5886cfb 100644 --- a/source/ide/ide_methods.bas +++ b/source/ide/ide_methods.bas @@ -737,7 +737,7 @@ FUNCTION ide2 (ignore) IdeDebugMode = 1 FOR x = 1 TO totalVariablesCreated - usedVariableList(x).mostRecentValue = "" + IF usedVariableList(x).isarray = 0 THEN usedVariableList(x).mostRecentValue = "" NEXT EnterDebugMode: diff --git a/source/qb64.bas b/source/qb64.bas index 9567d655a..51680fadd 100644 --- a/source/qb64.bas +++ b/source/qb64.bas @@ -25981,10 +25981,11 @@ SUB manageVariableList (__name$, __cname$, localIndex AS LONG, action AS _BYTE) usedVariableList(i).name = usedVariableList(i).name + "()" ELSE usedVariableList(i).isarray = 0 - usedVariableList(i).watchRange = "" - usedVariableList(i).indexes = "" - usedVariableList(i).elements = "" END IF + usedVariableList(i).watchRange = "" + usedVariableList(i).indexes = "" + usedVariableList(i).elements = "" + usedVariableList(i).elementOffset = 0 totalVariablesCreated = totalVariablesCreated + 1 END IF CASE ELSE 'find and mark as used From 5a40ebd15b91ed3e24a80abfb26f9eccfb4ac6e9 Mon Sep 17 00:00:00 2001 From: FellippeHeitor Date: Sat, 21 Aug 2021 19:21:33 -0300 Subject: [PATCH 02/10] Attempt at pointing properly to the element offset. --- internal/support/vwatch/vwatch.bm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/support/vwatch/vwatch.bm b/internal/support/vwatch/vwatch.bm index 7655c6320..d995a39bc 100644 --- a/internal/support/vwatch/vwatch.bm +++ b/internal/support/vwatch/vwatch.bm @@ -281,7 +281,6 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) END IF vw_address = _MEMGET(vw_m, vw_address, _OFFSET) 'first resolve pass vw_address = _MEMGET(vw_m, vw_address, _OFFSET) 'second resolve pass - vw_address = vw_address + vw_elementoffset IF vw_isarray THEN vw_lbound = check_lbound%&(vw_address) @@ -316,6 +315,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) END IF 'vw_address now points to the actual data + vw_address = vw_address + vw_elementoffset vw_buf$ = SPACE$(vw_varSize) vw_m = _MEM(vw_address, vw_varSize) vw_m2 = _MEM(_OFFSET(vw_buf$), vw_varSize) From 1049d9db164327116f24694409424eaf0c66a645 Mon Sep 17 00:00:00 2001 From: FellippeHeitor Date: Sat, 21 Aug 2021 20:09:06 -0300 Subject: [PATCH 03/10] Fixes $NOPREFIX mode changing MEM to _MEM as a sub parameter. --- source/qb64.bas | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/qb64.bas b/source/qb64.bas index 51680fadd..6a9a1c9cc 100644 --- a/source/qb64.bas +++ b/source/qb64.bas @@ -4986,8 +4986,9 @@ DO IF typ AND ISUDT THEN IF RTRIM$(udtxcname(typ AND 511)) = "_MEM" AND UCASE$(t3$) = "MEM" AND qb64prefix_set = 1 THEN t3$ = MID$(RTRIM$(udtxcname(typ AND 511)), 2) + ELSE + t3$ = RTRIM$(udtxcname(typ AND 511)) END IF - t3$ = RTRIM$(udtxcname(typ AND 511)) l$ = l$ + sp + t3$ ELSE FOR t3i = 1 TO LEN(t3$) From 9423080f6b780367d7ebdb2120b922969f8028e8 Mon Sep 17 00:00:00 2001 From: FellippeHeitor Date: Sun, 22 Aug 2021 00:12:01 -0300 Subject: [PATCH 04/10] Allows watching one element of UDTs (no strings yet). --- internal/support/vwatch/vwatch.bm | 2 ++ source/ide/ide_methods.bas | 46 +++++++++++++++++++++++++++++++ source/qb64.bas | 3 +- 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/internal/support/vwatch/vwatch.bm b/internal/support/vwatch/vwatch.bm index d995a39bc..117ae27f2 100644 --- a/internal/support/vwatch/vwatch.bm +++ b/internal/support/vwatch/vwatch.bm @@ -261,6 +261,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) vw_arrayIndex = CVL(MID$(vw_value$, 10, 4)) vw_elementoffset = _CV(_OFFSET, MID$(vw_value$, 14, LEN(vw_elementoffset))) vw_varSize = CVL(MID$(vw_value$, 14 + LEN(vw_elementoffset), 4)) + IF vw_varSize = 0 THEN PRINT "NoSize": GOTO cmdProcessingDone vw_i = CVI(MID$(vw_value$, 18 + LEN(vw_elementoffset), 2)) IF vw_i THEN vw_scope$ = MID$(vw_value$, 20 + LEN(vw_elementoffset), vw_i) @@ -315,6 +316,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) END IF 'vw_address now points to the actual data + PRINT "vw_elementoffset =" ; vw_elementoffset vw_address = vw_address + vw_elementoffset vw_buf$ = SPACE$(vw_varSize) vw_m = _MEM(vw_address, vw_varSize) diff --git a/source/ide/ide_methods.bas b/source/ide/ide_methods.bas index ca5886cfb..2a32bfeb8 100644 --- a/source/ide/ide_methods.bas +++ b/source/ide/ide_methods.bas @@ -7574,8 +7574,10 @@ SUB DebugMode RETURN GetVarSize: + varSize& = 0 varType$ = usedVariableList(tempIndex&).varType IF INSTR(varType$, "STRING *") THEN varType$ = "STRING" + checkVarType: SELECT CASE varType$ CASE "_BYTE", "_UNSIGNED _BYTE", "BYTE", "UNSIGNED BYTE": varSize& = LEN(dummy%%) CASE "INTEGER", "_UNSIGNED INTEGER", "UNSIGNED INTEGER": varSize& = LEN(dummy%) @@ -7586,6 +7588,9 @@ SUB DebugMode CASE "_FLOAT", "FLOAT": varSize& = LEN(dummy##) CASE "_OFFSET", "_UNSIGNED _OFFSET", "OFFSET", "UNSIGNED OFFSET": varSize& = LEN(dummy%&) CASE "STRING": varSize& = LEN(dummy%&) + LEN(dummy&) + CASE ELSE 'UDT? + varType$ = usedVariableList(tempIndex&).elementTypes + IF LEN(varType$) THEN GOTO checkVarType END SELECT RETURN END SUB @@ -8078,6 +8083,47 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) usedVariableList(varDlgList(y).index).elementOffset = 0 GOTO unWatch ELSE + typ = typ - ISUDT + typ = typ - ISREFERENCE + IF typ AND ISINCONVENTIONALMEMORY THEN typ = typ - ISINCONVENTIONALMEMORY + SELECT CASE typ + CASE BYTETYPE + usedVariableList(varDlgList(y).index).elementTypes = "_BYTE" + CASE UBYTETYPE + usedVariableList(varDlgList(y).index).elementTypes = "_UNSIGNED _BYTE" + CASE INTEGERTYPE + usedVariableList(varDlgList(y).index).elementTypes = "INTEGER" + CASE UINTEGERTYPE + usedVariableList(varDlgList(y).index).elementTypes = "_UNSIGNED INTEGER" + CASE LONGTYPE + usedVariableList(varDlgList(y).index).elementTypes = "LONG" + CASE ULONGTYPE + usedVariableList(varDlgList(y).index).elementTypes = "_UNSIGNED LONG" + CASE INTEGER64TYPE + usedVariableList(varDlgList(y).index).elementTypes = "_INTEGER64" + CASE UINTEGER64TYPE + usedVariableList(varDlgList(y).index).elementTypes = "_UNSIGNED _INTEGER64" + CASE SINGLETYPE + usedVariableList(varDlgList(y).index).elementTypes = "SINGLE" + CASE DOUBLETYPE + usedVariableList(varDlgList(y).index).elementTypes = "DOUBLE" + CASE FLOATTYPE + usedVariableList(varDlgList(y).index).elementTypes = "_FLOAT" + CASE OFFSETTYPE + usedVariableList(varDlgList(y).index).elementTypes = "_OFFSET" + CASE UOFFSETTYPE + usedVariableList(varDlgList(y).index).elementTypes = "_UNSIGNED _OFFSET" + CASE ELSE + IF typ AND ISSTRING THEN + usedVariableList(varDlgList(y).index).elementTypes = "STRING" + ELSE + usedVariableList(varDlgList(y).index).watch = 0 + usedVariableList(varDlgList(y).index).elements = "" + usedVariableList(varDlgList(y).index).elementOffset = 0 + result = idemessagebox("Error", "Element must be of a native data type", "#OK") + GOTO unWatch + END IF + END SELECT 'result = idemessagebox("Result", v$ + "\n" + result$ + "\n" + STR$(typ), "#OK") usedVariableList(varDlgList(y).index).elementOffset = VAL(MID$(result$, _INSTRREV(result$, sp3) + 1)) END IF diff --git a/source/qb64.bas b/source/qb64.bas index 6a9a1c9cc..17b51d8c7 100644 --- a/source/qb64.bas +++ b/source/qb64.bas @@ -112,7 +112,7 @@ TYPE usedVarList AS LONG id, linenumber, includeLevel, includedLine, scope, localIndex AS _BYTE used, watch, isarray AS STRING name, cname, varType, includedFile, subfunc, mostRecentValue - AS STRING watchRange, indexes, elements 'for Arrays and UDTs + AS STRING watchRange, indexes, elements, elementTypes 'for Arrays and UDTs AS _OFFSET elementOffset END TYPE @@ -25986,6 +25986,7 @@ SUB manageVariableList (__name$, __cname$, localIndex AS LONG, action AS _BYTE) usedVariableList(i).watchRange = "" usedVariableList(i).indexes = "" usedVariableList(i).elements = "" + usedVariableList(i).elementTypes = "" usedVariableList(i).elementOffset = 0 totalVariablesCreated = totalVariablesCreated + 1 END IF From bf9ab3458c8b847e38186ff7bae5b99c68aafeb9 Mon Sep 17 00:00:00 2001 From: FellippeHeitor Date: Sun, 22 Aug 2021 11:49:48 -0300 Subject: [PATCH 05/10] Allows outputting the watch list to the console. --- internal/support/vwatch/vwatch.bm | 3 +- source/global/IDEsettings.bas | 35 +++++---- source/ide/ide_global.bas | 2 +- source/ide/ide_methods.bas | 113 +++++++++++++++++------------- 4 files changed, 85 insertions(+), 68 deletions(-) diff --git a/internal/support/vwatch/vwatch.bm b/internal/support/vwatch/vwatch.bm index 117ae27f2..c6646a601 100644 --- a/internal/support/vwatch/vwatch.bm +++ b/internal/support/vwatch/vwatch.bm @@ -261,7 +261,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) vw_arrayIndex = CVL(MID$(vw_value$, 10, 4)) vw_elementoffset = _CV(_OFFSET, MID$(vw_value$, 14, LEN(vw_elementoffset))) vw_varSize = CVL(MID$(vw_value$, 14 + LEN(vw_elementoffset), 4)) - IF vw_varSize = 0 THEN PRINT "NoSize": GOTO cmdProcessingDone + IF vw_varSize = 0 THEN GOTO cmdProcessingDone vw_i = CVI(MID$(vw_value$, 18 + LEN(vw_elementoffset), 2)) IF vw_i THEN vw_scope$ = MID$(vw_value$, 20 + LEN(vw_elementoffset), vw_i) @@ -316,7 +316,6 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) END IF 'vw_address now points to the actual data - PRINT "vw_elementoffset =" ; vw_elementoffset vw_address = vw_address + vw_elementoffset vw_buf$ = SPACE$(vw_varSize) vw_m = _MEM(vw_address, vw_varSize) diff --git a/source/global/IDEsettings.bas b/source/global/IDEsettings.bas index 4fbb771ce..024566b63 100644 --- a/source/global/IDEsettings.bas +++ b/source/global/IDEsettings.bas @@ -14,10 +14,10 @@ DIM SHARED ShowLineNumbersSeparator AS _BYTE, ShowLineNumbersUseBG AS _BYTE DIM SHARED IgnoreWarnings AS _BYTE, qb64versionprinted AS _BYTE DIM SHARED DisableSyntaxHighlighter AS _BYTE, ExeToSourceFolderFirstTimeMsg AS _BYTE DIM SHARED WhiteListQB64FirstTimeMsg AS _BYTE, ideautolayoutkwcapitals AS _BYTE -'DIM SHARED IdeAutoComplete AS _BYTE +DIM SHARED WatchListToConsole AS _BYTE DIM SHARED windowSettingsSection$, colorSettingsSection$, customDictionarySection$ DIM SHARED mouseSettingsSection$, generalSettingsSection$, displaySettingsSection$ -DIM SHARED colorSchemesSection$, iniFolderIndex$, DebugInfoIniWarning$, ConfigFile$ +DIM SHARED colorSchemesSection$, debugSettingsSection$, iniFolderIndex$, DebugInfoIniWarning$, ConfigFile$ DIM SHARED idebaseTcpPort AS LONG windowSettingsSection$ = "IDE WINDOW" @@ -27,6 +27,7 @@ customDictionarySection$ = "CUSTOM DICTIONARIES" mouseSettingsSection$ = "MOUSE SETTINGS" generalSettingsSection$ = "GENERAL SETTINGS" displaySettingsSection$ = "IDE DISPLAY SETTINGS" +debugSettingsSection$ = "DEBUG SETTINGS" ConfigFile$ = "internal/config.ini" iniFolderIndex$ = STR$(tempfolderindex) @@ -203,26 +204,10 @@ ELSE WriteConfigSetting generalSettingsSection$, "IgnoreWarnings", "False" END IF -'IF ReadConfigSetting(generalSettingsSection$, "IdeAutoComplete", value$) THEN -' IF UCASE$(value$) = "TRUE" OR ABS(VAL(value$)) = 1 THEN -' IdeAutoComplete = -1 -' ELSE -' IdeAutoComplete = 0 -' WriteConfigSetting generalSettingsSection$, "IdeAutoComplete", "False" -' END IF -'ELSE -' IdeAutoComplete = -1 -' WriteConfigSetting generalSettingsSection$, "IdeAutoComplete", "True" -'END IF - result = ReadConfigSetting(generalSettingsSection$, "BackupSize", value$) idebackupsize = VAL(value$) IF idebackupsize < 10 OR idebackupsize > 2000 THEN idebackupsize = 100: WriteConfigSetting generalSettingsSection$, "BackupSize", "100 'in MB" -result = ReadConfigSetting(generalSettingsSection$, "BaseTCPPort", value$) -idebaseTcpPort = VAL(value$) -IF idebaseTcpPort = 0 THEN idebaseTcpPort = 9000: WriteConfigSetting generalSettingsSection$, "BaseTCPPort", "9000" - result = ReadConfigSetting(generalSettingsSection$, "DebugInfo", value$) idedebuginfo = VAL(value$) IF UCASE$(LEFT$(value$, 4)) = "TRUE" THEN idedebuginfo = 1 @@ -242,6 +227,20 @@ ELSE WriteConfigSetting mouseSettingsSection$, "SwapMouseButton", "False" END IF +'Debug settings --------------------------------------------------------------- +result = ReadConfigSetting(debugSettingsSection$, "BaseTCPPort", value$) +idebaseTcpPort = VAL(value$) +IF idebaseTcpPort = 0 THEN idebaseTcpPort = 9000: WriteConfigSetting debugSettingsSection$, "BaseTCPPort", "9000" + +result = ReadConfigSetting(debugSettingsSection$, "WatchListToConsole", value$) +IF UCASE$(value$) = "TRUE" OR VAL(value$) = -1 THEN + WatchListToConsole = -1 + WriteConfigSetting debugSettingsSection$, "WatchListToConsole", "True" +ELSE + WatchListToConsole = 0 + WriteConfigSetting debugSettingsSection$, "WatchListToConsole", "False" +END IF + 'Display settings ------------------------------------------------------------- IF ReadConfigSetting(displaySettingsSection$, "IDE_SortSUBs", value$) THEN IF UCASE$(value$) = "TRUE" OR VAL(value$) = -1 THEN diff --git a/source/ide/ide_global.bas b/source/ide/ide_global.bas index b63ff18f4..40c3c9f48 100644 --- a/source/ide/ide_global.bas +++ b/source/ide/ide_global.bas @@ -221,7 +221,7 @@ DIM SHARED ViewMenuID AS INTEGER, ViewMenuShowLineNumbersSubMenuID AS INTEGER DIM SHARED ViewMenuShowSeparatorID AS INTEGER, ViewMenuShowBGID AS INTEGER DIM SHARED ViewMenuCompilerWarnings AS INTEGER DIM SHARED RunMenuID AS INTEGER, RunMenuSaveExeWithSource AS INTEGER, brackethighlight AS INTEGER -DIM SHARED DebugMenuID AS INTEGER, DebugMenuCallStack AS INTEGER +DIM SHARED DebugMenuID AS INTEGER, DebugMenuCallStack AS INTEGER, DebugMenuWatchListToConsole AS INTEGER DIM SHARED multihighlight AS INTEGER, keywordHighlight AS INTEGER DIM SHARED PresetColorSchemes AS INTEGER, TotalColorSchemes AS INTEGER, ColorSchemes$(0) DIM SHARED LastValidColorScheme AS INTEGER diff --git a/source/ide/ide_methods.bas b/source/ide/ide_methods.bas index 2a32bfeb8..06ae1670d 100644 --- a/source/ide/ide_methods.bas +++ b/source/ide/ide_methods.bas @@ -357,6 +357,12 @@ FUNCTION ide2 (ignore) menu$(DebugMenuID, DebugMenuCallStack) = "Call #Stack... F12": i = i + 1 menuDesc$(m, i - 1) = "Displays the call stack of the current program's last execution" menu$(m, i) = "-": i = i + 1 + DebugMenuWatchListToConsole = i + menu$(m, i) = "#Output Watch List to Console": i = i + 1 + menuDesc$(m, i - 1) = "Toggles directing the output of the watch list to the console window" + IF WatchListToConsole THEN + menu$(DebugMenuID, DebugMenuWatchListToConsole) = CHR$(7) + menu$(DebugMenuID, DebugMenuWatchListToConsole) + END IF menu$(m, i) = "Set Base #TCP/IP Port Number...": i = i + 1 menuDesc$(m, i - 1) = "Sets the initial port number for TCP/IP communication with the debuggee" menu$(m, i) = "#Advanced (C++)...": i = i + 1 @@ -755,6 +761,7 @@ FUNCTION ide2 (ignore) ready = 1 _RESIZE OFF DebugMode + IF WatchListToConsole THEN _CONSOLE OFF UpdateMenuHelpLine "" SELECT CASE IdeDebugMode CASE 1 'clean exit @@ -4954,22 +4961,6 @@ FUNCTION ide2 (ignore) GOTO ideloop END IF - 'IF RIGHT$(menu$(m, s), 17) = "Code Suggest#ions" THEN - ' PCOPY 2, 0 - ' IF IdeAutoComplete = 0 THEN - ' IdeAutoComplete = -1 - ' WriteConfigSetting generalSettingsSection$, "IdeAutoComplete", "True" - ' menu$(OptionsMenuID, OptionsMenuAutoComplete) = CHR$(7) + "Code Suggest#ions" - ' ELSE - ' IdeAutoComplete = 0 - ' WriteConfigSetting generalSettingsSection$, "IdeAutoComplete", "False" - ' menu$(OptionsMenuID, OptionsMenuAutoComplete) = "Code Suggest#ions" - ' END IF - ' idechangemade = 1 - ' PCOPY 3, 0: SCREEN , , 3, 0 - ' GOTO ideloop - 'END IF - IF RIGHT$(menu$(m, s), 28) = "Output EXE to Source #Folder" THEN PCOPY 2, 0 SaveExeWithSource = NOT SaveExeWithSource @@ -4985,6 +4976,21 @@ FUNCTION ide2 (ignore) GOTO ideloop END IF + IF RIGHT$(menu$(m, s), 29) = "#Output Watch List to Console" THEN + PCOPY 2, 0 + WatchListToConsole = NOT WatchListToConsole + IF WatchListToConsole THEN + WriteConfigSetting debugSettingsSection$, "WatchListToConsole", "True" + menu$(DebugMenuID, DebugMenuWatchListToConsole) = CHR$(7) + "#Output Watch List to Console" + ELSE + WriteConfigSetting debugSettingsSection$, "WatchListToConsole", "False" + menu$(DebugMenuID, DebugMenuWatchListToConsole) = "#Output Watch List to Console" + END IF + PCOPY 3, 0: SCREEN , , 3, 0 + GOTO ideloop + END IF + + IF MID$(menu$(m, s), 1, 17) = "#Quick Navigation" OR MID$(menu$(m, s), 2, 17) = "#Quick Navigation" THEN PCOPY 2, 0 EnableQuickNav = NOT EnableQuickNav @@ -7553,7 +7559,10 @@ SUB DebugMode ideshowtext UpdateTitleOfMainWindow - IF PauseMode <> 0 AND LEN(variableWatchList$) > 0 THEN showvWatchPanel vWatchPanel, currentSub$, totalVisibleVariables + IF PauseMode <> 0 AND LEN(variableWatchList$) > 0 THEN + IF WatchListToConsole THEN _CONSOLE ON + showvWatchPanel vWatchPanel, currentSub$, totalVisibleVariables + END IF PCOPY 3, 0 RETURN @@ -7622,17 +7631,21 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, totalVisibleVariabl IF this.x + this.w + 2 > idewx THEN this.x = idewx - (this.w + 2) END IF - COLOR fg, bg - ideboxshadow this.x, this.y, this.w, this.h - COLOR 15, bg - _PRINTSTRING (this.x + this.w - 1, this.y + this.h - 1), CHR$(254) 'resize handle + IF WatchListToConsole = 0 THEN + COLOR fg, bg + ideboxshadow this.x, this.y, this.w, this.h + COLOR 15, bg + _PRINTSTRING (this.x + this.w - 1, this.y + this.h - 1), CHR$(254) 'resize handle - x = LEN(title$) + 2 - COLOR fg, bg - _PRINTSTRING (this.x + (this.w \ 2) - (x - 1) \ 2, this.y), " " + title$ + " " - COLOR 15, 4 - _PRINTSTRING (this.x + this.w - 3, this.y), " x " 'close button - COLOR , bg + x = LEN(title$) + 2 + COLOR fg, bg + _PRINTSTRING (this.x + (this.w \ 2) - (x - 1) \ 2, this.y), " " + title$ + " " + COLOR 15, 4 + _PRINTSTRING (this.x + this.w - 3, this.y), " x " 'close button + COLOR , bg + ELSE + _ECHO "-------- " + title$ + END IF y = 0 i = 0 @@ -7644,9 +7657,9 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, totalVisibleVariabl tempArrayIndex& = CVL(MID$(temp$, 5, 4)) temp$ = MID$(temp$, 9) i = i + 1 - IF this.firstVisible > i THEN _CONTINUE + IF this.firstVisible > i AND WatchListToConsole <> 0 THEN _CONTINUE y = y + 1 - IF y > this.h - 2 THEN EXIT DO + IF y > this.h - 2 AND WatchListToConsole <> 0 THEN EXIT DO thisName$ = usedVariableList(tempIndex&).name IF usedVariableList(tempIndex&).isarray THEN @@ -7675,30 +7688,36 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, totalVisibleVariabl COLOR fg ELSE item$ = item$ + "" - COLOR 2 + IF WatchListToConsole = 0 THEN COLOR 2 END IF IF LEN(item$) > this.contentWidth THEN this.contentWidth = LEN(item$) - _PRINTSTRING (this.x + 2, this.y + y), MID$(item$, this.hPos, this.w - 4) + IF WatchListToConsole = 0 THEN + _PRINTSTRING (this.x + 2, this.y + y), MID$(item$, this.hPos, this.w - 4) + ELSE + _ECHO item$ + END IF LOOP - IF totalVisibleVariables > this.h - 2 THEN - y = idevbar(this.x + this.w - 1, this.y + 1, this.h - 2, this.firstVisible, totalVisibleVariables - (this.h - 2) + 1) - IF this.draggingVBar = 0 THEN - this.vBarThumb = y + IF WatchListToConsole = 0 THEN + IF totalVisibleVariables > this.h - 2 THEN + y = idevbar(this.x + this.w - 1, this.y + 1, this.h - 2, this.firstVisible, totalVisibleVariables - (this.h - 2) + 1) + IF this.draggingVBar = 0 THEN + this.vBarThumb = y + END IF + ELSE + this.vBarThumb = 0 + this.firstVisible = 1 END IF - ELSE - this.vBarThumb = 0 - this.firstVisible = 1 - END IF - IF this.contentWidth > this.w - 4 THEN - x = idehbar(this.x, this.y + this.h - 1, this.w - 1, this.hPos, this.contentWidth - (this.w - 4) + 1) - IF this.draggingHBar = 0 THEN - this.hBarThumb = x + IF this.contentWidth > this.w - 4 THEN + x = idehbar(this.x, this.y + this.h - 1, this.w - 1, this.hPos, this.contentWidth - (this.w - 4) + 1) + IF this.draggingHBar = 0 THEN + this.hBarThumb = x + END IF + ELSE + this.hBarThumb = 0 + this.hPos = 1 END IF - ELSE - this.hBarThumb = 0 - this.hPos = 1 END IF END SUB @@ -13490,7 +13509,7 @@ SUB ideSetTCPPortBox idebaseTcpPort = VAL(v$) IF idebaseTcpPort = 0 THEN idebaseTcpPort = 9000 - WriteConfigSetting generalSettingsSection$, "BaseTCPPort", str2$(idebaseTcpPort) + WriteConfigSetting debugSettingsSection$, "BaseTCPPort", str2$(idebaseTcpPort) END SUB FUNCTION idegetlinenumberbox(title$, initialValue&) From 687276bccd448b5397f4410bb10894fbf39be527 Mon Sep 17 00:00:00 2001 From: FellippeHeitor Date: Sun, 22 Aug 2021 22:47:48 -0300 Subject: [PATCH 06/10] Adds support to STRING elements in UDTs. --- internal/support/vwatch/vwatch.bm | 4 ++-- source/ide/ide_methods.bas | 16 +++++++++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/internal/support/vwatch/vwatch.bm b/internal/support/vwatch/vwatch.bm index c6646a601..3c1a3ad30 100644 --- a/internal/support/vwatch/vwatch.bm +++ b/internal/support/vwatch/vwatch.bm @@ -322,10 +322,10 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) vw_m2 = _MEM(_OFFSET(vw_buf$), vw_varSize) _MEMCOPY vw_m, vw_m.OFFSET, vw_m.SIZE TO vw_m2, vw_m2.OFFSET - IF INSTR(vw_varType$, "STRING *") > 0 AND vw_isarray <> 0 THEN + IF INSTR(vw_varType$, "STRING *") > 0 AND (vw_isarray <> 0 OR vw_elementoffset > 0) THEN 'actual data already fetched; nothing else to do ELSEIF INSTR(vw_varType$, "STRING") THEN - IF vw_isarray THEN + IF vw_isarray <> 0 OR vw_elementoffset > 0 THEN 'First pass vw_varSize = LEN(vw_dummy%&) vw_buf$ = SPACE$(vw_varSize) diff --git a/source/ide/ide_methods.bas b/source/ide/ide_methods.bas index 06ae1670d..a72d2d4a5 100644 --- a/source/ide/ide_methods.bas +++ b/source/ide/ide_methods.bas @@ -7396,7 +7396,7 @@ SUB DebugMode END IF GOSUB GetVarSize IF LEN(cmd$) THEN - cmd$ = cmd$ + MKL$(tempIndex&) + _MK$(_BYTE, usedVariableList(tempIndex&).isarray) + MKL$(usedVariableList(tempIndex&).localIndex) + MKL$(tempArrayIndex&) + _MK$(_OFFSET, usedVariableList(tempIndex&).elementOffset) + MKL$(varSize&) + MKI$(LEN(usedVariableList(tempIndex&).subfunc)) + usedVariableList(tempIndex&).subfunc + MKI$(LEN(usedVariableList(tempIndex&).varType)) + usedVariableList(tempIndex&).varType + cmd$ = cmd$ + MKL$(tempIndex&) + _MK$(_BYTE, usedVariableList(tempIndex&).isarray) + MKL$(usedVariableList(tempIndex&).localIndex) + MKL$(tempArrayIndex&) + _MK$(_OFFSET, usedVariableList(tempIndex&).elementOffset) + MKL$(varSize&) + MKI$(LEN(usedVariableList(tempIndex&).subfunc)) + usedVariableList(tempIndex&).subfunc + MKI$(LEN(varType$)) + varType$ GOSUB SendCommand END IF LOOP @@ -7585,9 +7585,10 @@ SUB DebugMode GetVarSize: varSize& = 0 varType$ = usedVariableList(tempIndex&).varType - IF INSTR(varType$, "STRING *") THEN varType$ = "STRING" checkVarType: - SELECT CASE varType$ + tempVarType$ = varType$ + IF INSTR(tempVarType$, "STRING *") THEN tempVarType$ = "STRING" + SELECT CASE tempVarType$ CASE "_BYTE", "_UNSIGNED _BYTE", "BYTE", "UNSIGNED BYTE": varSize& = LEN(dummy%%) CASE "INTEGER", "_UNSIGNED INTEGER", "UNSIGNED INTEGER": varSize& = LEN(dummy%) CASE "LONG", "_UNSIGNED LONG", "UNSIGNED LONG": varSize& = LEN(dummy&) @@ -8134,12 +8135,17 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) usedVariableList(varDlgList(y).index).elementTypes = "_UNSIGNED _OFFSET" CASE ELSE IF typ AND ISSTRING THEN - usedVariableList(varDlgList(y).index).elementTypes = "STRING" + IF (typ AND ISFIXEDLENGTH) = 0 THEN + usedVariableList(varDlgList(y).index).elementTypes = "STRING" + ELSE + 'E contains the UDT element index at this point + usedVariableList(varDlgList(y).index).elementTypes = "STRING *" + STR$(udtetypesize(E)) + END IF ELSE usedVariableList(varDlgList(y).index).watch = 0 usedVariableList(varDlgList(y).index).elements = "" usedVariableList(varDlgList(y).index).elementOffset = 0 - result = idemessagebox("Error", "Element must be of a native data type", "#OK") + result = idemessagebox("Error", "Cannot add full UDT to Watch List", "#OK") GOTO unWatch END IF END SELECT From 62f3496c363cb0681cd7bb0a9fef299d195446a1 Mon Sep 17 00:00:00 2001 From: FellippeHeitor Date: Mon, 23 Aug 2021 18:02:22 -0300 Subject: [PATCH 07/10] Adds ability to fetch data from arrays of UDTs. --- internal/support/vwatch/vwatch.bm | 20 ++++++++++++------- source/ide/ide_methods.bas | 32 +++++++++++++++++++++++++++---- source/qb64.bas | 2 ++ 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/internal/support/vwatch/vwatch.bm b/internal/support/vwatch/vwatch.bm index 3c1a3ad30..b4468d21f 100644 --- a/internal/support/vwatch/vwatch.bm +++ b/internal/support/vwatch/vwatch.bm @@ -7,6 +7,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) STATIC AS _OFFSET vw_idehwnd STATIC vw_buffer$ DIM AS LONG vw_i, vw_tempIndex, vw_localIndex, vw_varSize, vw_cmdsize + DIM AS LONG vw_arrayelementsize DIM AS _OFFSET vw_address, vw_elementoffset, vw_lbound, vw_ubound DIM AS _MEM vw_m, vw_m2 DIM AS _BYTE vw_isarray @@ -259,16 +260,17 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) vw_isarray = _CV(_BYTE, MID$(vw_value$, 5, 1)) vw_localIndex = CVL(MID$(vw_value$, 6, 4)) vw_arrayIndex = CVL(MID$(vw_value$, 10, 4)) - vw_elementoffset = _CV(_OFFSET, MID$(vw_value$, 14, LEN(vw_elementoffset))) - vw_varSize = CVL(MID$(vw_value$, 14 + LEN(vw_elementoffset), 4)) + vw_arrayelementsize = CVL(MID$(vw_value$, 14, 4)) + vw_elementoffset = _CV(_OFFSET, MID$(vw_value$, 18, LEN(vw_elementoffset))) + vw_varSize = CVL(MID$(vw_value$, 18 + LEN(vw_elementoffset), 4)) IF vw_varSize = 0 THEN GOTO cmdProcessingDone - vw_i = CVI(MID$(vw_value$, 18 + LEN(vw_elementoffset), 2)) + vw_i = CVI(MID$(vw_value$, 22 + LEN(vw_elementoffset), 2)) IF vw_i THEN - vw_scope$ = MID$(vw_value$, 20 + LEN(vw_elementoffset), vw_i) - vw_i = CVI(MID$(vw_value$, 20 + LEN(vw_elementoffset) + vw_i, 2)) + vw_scope$ = MID$(vw_value$, 24 + LEN(vw_elementoffset), vw_i) + vw_i = CVI(MID$(vw_value$, 24 + LEN(vw_elementoffset) + vw_i, 2)) vw_varType$ = RIGHT$(vw_value$, vw_i) ELSE - vw_i = CVI(MID$(vw_value$, 20 + LEN(vw_elementoffset), 2)) + vw_i = CVI(MID$(vw_value$, 24 + LEN(vw_elementoffset), 2)) vw_varType$ = RIGHT$(vw_value$, vw_i) END IF IF vw_cmd$ = "get global var" THEN @@ -312,7 +314,11 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) END IF 'this is where we calculate the actual element position in memory - vw_address = vw_address + ((vw_arrayIndex - vw_lbound) * vw_varSize) + IF vw_arrayelementsize = 0 THEN + vw_address = vw_address + ((vw_arrayIndex - vw_lbound) * vw_varSize) + ELSE + vw_address = vw_address + ((vw_arrayIndex - vw_lbound) * vw_arrayelementsize) + END IF END IF 'vw_address now points to the actual data diff --git a/source/ide/ide_methods.bas b/source/ide/ide_methods.bas index a72d2d4a5..7b84db512 100644 --- a/source/ide/ide_methods.bas +++ b/source/ide/ide_methods.bas @@ -7388,16 +7388,26 @@ SUB DebugMode tempIndex& = CVL(LEFT$(temp$, 4)) tempArrayIndex& = CVL(MID$(temp$, 5, 4)) temp$ = MID$(temp$, 9) - cmd$ = "" IF LEN(usedVariableList(tempIndex&).subfunc) = 0 THEN cmd$ = "get global var:" ELSE cmd$ = "get local var:" END IF GOSUB GetVarSize - IF LEN(cmd$) THEN - cmd$ = cmd$ + MKL$(tempIndex&) + _MK$(_BYTE, usedVariableList(tempIndex&).isarray) + MKL$(usedVariableList(tempIndex&).localIndex) + MKL$(tempArrayIndex&) + _MK$(_OFFSET, usedVariableList(tempIndex&).elementOffset) + MKL$(varSize&) + MKI$(LEN(usedVariableList(tempIndex&).subfunc)) + usedVariableList(tempIndex&).subfunc + MKI$(LEN(varType$)) + varType$ + IF varSize& THEN + cmd$ = cmd$ + MKL$(tempIndex&) + cmd$ = cmd$ + _MK$(_BYTE, usedVariableList(tempIndex&).isarray) + cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).localIndex) + cmd$ = cmd$ + MKL$(tempArrayIndex&) + cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).arrayElementSize) + cmd$ = cmd$ + _MK$(_OFFSET, usedVariableList(tempIndex&).elementOffset) + cmd$ = cmd$ + MKL$(varSize&) + cmd$ = cmd$ + MKI$(LEN(usedVariableList(tempIndex&).subfunc)) + cmd$ = cmd$ + usedVariableList(tempIndex&).subfunc + cmd$ = cmd$ + MKI$(LEN(varType$)) + varType$ GOSUB SendCommand + ELSE + cmd$ = "" END IF LOOP END IF @@ -8093,6 +8103,21 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) usedVariableList(varDlgList(y).index).elements = v$ v$ = lineformat$(UCASE$(v$)) getid usedVariableList(varDlgList(y).index).id + IF id.t = 0 THEN + typ = id.arraytype AND 511 + IF id.arraytype AND ISINCONVENTIONALMEMORY THEN + typ = typ - ISINCONVENTIONALMEMORY + END IF + END IF + IF usedVariableList(varDlgList(y).index).isarray THEN + usedVariableList(varDlgList(y).index).arrayElementSize = udtxsize(typ) + IF udtxbytealign(typ) THEN + IF usedVariableList(varDlgList(y).index).arrayElementSize MOD 8 THEN usedVariableList(varDlgList(y).index).arrayElementSize = usedVariableList(varDlgList(y).index).arrayElementSize + (8 - (usedVariableList(varDlgList(y).index).arrayElementSize MOD 8)) 'round up to nearest byte + usedVariableList(varDlgList(y).index).arrayElementSize = usedVariableList(varDlgList(y).index).arrayElementSize \ 8 + END IF + ELSE + usedVariableList(varDlgList(y).index).arrayElementSize = 0 + END IF Error_Happened = 0 result$ = udtreference$("", v$, typ) IF Error_Happened THEN @@ -8149,7 +8174,6 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) GOTO unWatch END IF END SELECT - 'result = idemessagebox("Result", v$ + "\n" + result$ + "\n" + STR$(typ), "#OK") usedVariableList(varDlgList(y).index).elementOffset = VAL(MID$(result$, _INSTRREV(result$, sp3) + 1)) END IF ELSE diff --git a/source/qb64.bas b/source/qb64.bas index 17b51d8c7..42bea84ba 100644 --- a/source/qb64.bas +++ b/source/qb64.bas @@ -110,6 +110,7 @@ DIM SHARED MonochromeLoggingMode AS _BYTE TYPE usedVarList AS LONG id, linenumber, includeLevel, includedLine, scope, localIndex + AS LONG arrayElementSize AS _BYTE used, watch, isarray AS STRING name, cname, varType, includedFile, subfunc, mostRecentValue AS STRING watchRange, indexes, elements, elementTypes 'for Arrays and UDTs @@ -25984,6 +25985,7 @@ SUB manageVariableList (__name$, __cname$, localIndex AS LONG, action AS _BYTE) usedVariableList(i).isarray = 0 END IF usedVariableList(i).watchRange = "" + usedVariableList(i).arrayElementSize = 0 usedVariableList(i).indexes = "" usedVariableList(i).elements = "" usedVariableList(i).elementTypes = "" From 38fe93a6cf5d28fa8f24edddc958970aa738b3b7 Mon Sep 17 00:00:00 2001 From: FellippeHeitor Date: Tue, 24 Aug 2021 02:13:42 -0300 Subject: [PATCH 08/10] Adds support for watching multiple indexes arrays of UDTs. Not multiple dimensions yet tho. --- internal/support/vwatch/vwatch.bm | 20 +- source/ide/ide_global.bas | 2 +- source/ide/ide_methods.bas | 618 ++++++++++++++++++++++++------ source/qb64.bas | 11 +- 4 files changed, 517 insertions(+), 134 deletions(-) diff --git a/internal/support/vwatch/vwatch.bm b/internal/support/vwatch/vwatch.bm index b4468d21f..7c3673d41 100644 --- a/internal/support/vwatch/vwatch.bm +++ b/internal/support/vwatch/vwatch.bm @@ -7,8 +7,8 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) STATIC AS _OFFSET vw_idehwnd STATIC vw_buffer$ DIM AS LONG vw_i, vw_tempIndex, vw_localIndex, vw_varSize, vw_cmdsize - DIM AS LONG vw_arrayelementsize - DIM AS _OFFSET vw_address, vw_elementoffset, vw_lbound, vw_ubound + DIM AS LONG vw_arrayelementsize, vw_element, vw_elementoffset, vw_storage + DIM AS _OFFSET vw_address, vw_lbound, vw_ubound DIM AS _MEM vw_m, vw_m2 DIM AS _BYTE vw_isarray DIM vw_start!, vw_temp$, vw_cmd$, vw_value$, vw_k&, vw_buf$, vw_scope$, vw_varType$ @@ -261,16 +261,18 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) vw_localIndex = CVL(MID$(vw_value$, 6, 4)) vw_arrayIndex = CVL(MID$(vw_value$, 10, 4)) vw_arrayelementsize = CVL(MID$(vw_value$, 14, 4)) - vw_elementoffset = _CV(_OFFSET, MID$(vw_value$, 18, LEN(vw_elementoffset))) - vw_varSize = CVL(MID$(vw_value$, 18 + LEN(vw_elementoffset), 4)) + vw_element = CVL(MID$(vw_value$, 18, 4)) + vw_elementoffset = CVL(MID$(vw_value$, 22, 4)) + vw_varSize = CVL(MID$(vw_value$, 26, 4)) IF vw_varSize = 0 THEN GOTO cmdProcessingDone - vw_i = CVI(MID$(vw_value$, 22 + LEN(vw_elementoffset), 2)) + vw_storage = CVL(MID$(vw_value$, 30, 4)) + vw_i = CVI(MID$(vw_value$, 34, 2)) IF vw_i THEN - vw_scope$ = MID$(vw_value$, 24 + LEN(vw_elementoffset), vw_i) - vw_i = CVI(MID$(vw_value$, 24 + LEN(vw_elementoffset) + vw_i, 2)) + vw_scope$ = MID$(vw_value$, 36, vw_i) + vw_i = CVI(MID$(vw_value$, 36 + vw_i, 2)) vw_varType$ = RIGHT$(vw_value$, vw_i) ELSE - vw_i = CVI(MID$(vw_value$, 24 + LEN(vw_elementoffset), 2)) + vw_i = CVI(MID$(vw_value$, 36, 2)) vw_varType$ = RIGHT$(vw_value$, vw_i) END IF IF vw_cmd$ = "get global var" THEN @@ -368,7 +370,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) _MEMCOPY vw_m, vw_m.OFFSET, vw_m.SIZE TO vw_m2, vw_m2.OFFSET END IF - vw_cmd$ = "address read:" + MKL$(vw_tempIndex) + MKL$(vw_arrayIndex) + vw_buf$ + vw_cmd$ = "address read:" + MKL$(vw_tempIndex) + MKL$(vw_arrayIndex) + MKL$(vw_element) + MKL$(vw_storage) + vw_buf$ GOSUB SendCommand CASE "set global address", "set local address" vw_localIndex = CVL(LEFT$(vw_value$, 4)) diff --git a/source/ide/ide_global.bas b/source/ide/ide_global.bas index 40c3c9f48..cde1730e4 100644 --- a/source/ide/ide_global.bas +++ b/source/ide/ide_global.bas @@ -12,7 +12,7 @@ DIM SHARED IdeInfo AS STRING DIM SHARED IdeContextHelpSF AS _BYTE DIM SHARED host&, debugClient&, hostport$, variableWatchList$ -DIM SHARED vWatchArrayReceivedData$(1 TO 1000), nextvWatchArraySlot +DIM SHARED vWatchReceivedData$(1 TO 1000), nextvWatchDataSlot DIM SHARED startPausedPending AS _BYTE DIM SHARED IdeSystem AS LONG diff --git a/source/ide/ide_methods.bas b/source/ide/ide_methods.bas index 7b84db512..0c2dfc5a3 100644 --- a/source/ide/ide_methods.bas +++ b/source/ide/ide_methods.bas @@ -742,9 +742,7 @@ FUNCTION ide2 (ignore) '$DEBUG mode on IdeDebugMode = 1 - FOR x = 1 TO totalVariablesCreated - IF usedVariableList(x).isarray = 0 THEN usedVariableList(x).mostRecentValue = "" - NEXT + REDIM vWatchReceivedData$(1 TO UBOUND(vWatchReceivedData$)) 'empty data array EnterDebugMode: IF idehelp THEN @@ -7144,7 +7142,7 @@ SUB DebugMode END IF cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).localIndex) + MKL$(varSize&) + value$ GOSUB SendCommand - usedVariableList(tempIndex&).mostRecentValue = MID$(result$, 5) + 'usedVariableList(tempIndex&).mostRecentValue = MID$(result$, 5) PCOPY 3, 0: SCREEN , , 3, 0 WHILE _MOUSEINPUT: WEND GOSUB UpdateDisplay @@ -7152,7 +7150,7 @@ SUB DebugMode END SELECT cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).localIndex) + MKL$(varSize&) + value$ GOSUB SendCommand - usedVariableList(tempIndex&).mostRecentValue = result$ + 'usedVariableList(tempIndex&).mostRecentValue = result$ PCOPY 3, 0: SCREEN , , 3, 0 WHILE _MOUSEINPUT: WEND @@ -7387,7 +7385,9 @@ SUB DebugMode DO WHILE LEN(temp$) tempIndex& = CVL(LEFT$(temp$, 4)) tempArrayIndex& = CVL(MID$(temp$, 5, 4)) - temp$ = MID$(temp$, 9) + tempElement& = CVL(MID$(temp$, 9, 4)) + tempStorage& = CVL(MID$(temp$, 13, 4)) + temp$ = MID$(temp$, 17) IF LEN(usedVariableList(tempIndex&).subfunc) = 0 THEN cmd$ = "get global var:" ELSE @@ -7400,8 +7400,15 @@ SUB DebugMode cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).localIndex) cmd$ = cmd$ + MKL$(tempArrayIndex&) cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).arrayElementSize) - cmd$ = cmd$ + _MK$(_OFFSET, usedVariableList(tempIndex&).elementOffset) + cmd$ = cmd$ + MKL$(tempElement&) + IF tempElement& THEN + tempElementOffset& = CVL(MID$(usedVariableList(tempIndex&).elementOffset, tempElement& * 4 - 3, 4)) + ELSE + tempElementOffset& = 0 + END IF + cmd$ = cmd$ + MKL$(tempElementOffset&) cmd$ = cmd$ + MKL$(varSize&) + cmd$ = cmd$ + MKL$(tempStorage&) cmd$ = cmd$ + MKI$(LEN(usedVariableList(tempIndex&).subfunc)) cmd$ = cmd$ + usedVariableList(tempIndex&).subfunc cmd$ = cmd$ + MKI$(LEN(varType$)) + varType$ @@ -7416,7 +7423,9 @@ SUB DebugMode CASE "address read" tempIndex& = CVL(LEFT$(value$, 4)) tempArrayIndex& = CVL(MID$(value$, 5, 4)) - recvData$ = MID$(value$, 9) + tempElement& = CVL(MID$(value$, 9, 4)) + tempStorage& = CVL(MID$(value$, 13, 4)) + recvData$ = MID$(value$, 17) GOSUB GetVarSize SELECT CASE varType$ CASE "_BYTE", "BYTE": recvData$ = STR$(_CV(_BYTE, recvData$)) @@ -7434,15 +7443,7 @@ SUB DebugMode CASE "_UNSIGNED _OFFSET", "UNSIGNED OFFSET": recvData$ = STR$(_CV(_UNSIGNED _OFFSET, recvData$)) 'CASE "STRING": 'no conversion required END SELECT - IF usedVariableList(tempIndex&).isarray THEN - seqIndex& = INSTR(usedVariableList(tempIndex&).indexes, MKL$(tempArrayIndex&)) - IF seqIndex& <= LEN(usedVariableList(tempIndex&).mostRecentValue) - 3 THEN - storageSlot& = CVL(MID$(usedVariableList(tempIndex&).mostRecentValue, seqIndex&, 4)) - vWatchArrayReceivedData$(storageSlot&) = recvData$ - END IF - ELSE - usedVariableList(tempIndex&).mostRecentValue = recvData$ - END IF + vWatchReceivedData$(tempStorage&) = recvData$ IF PauseMode THEN GOSUB UpdateDisplay CASE "current sub" currentSub$ = value$ @@ -7609,7 +7610,7 @@ SUB DebugMode CASE "_OFFSET", "_UNSIGNED _OFFSET", "OFFSET", "UNSIGNED OFFSET": varSize& = LEN(dummy%&) CASE "STRING": varSize& = LEN(dummy%&) + LEN(dummy&) CASE ELSE 'UDT? - varType$ = usedVariableList(tempIndex&).elementTypes + varType$ = getelement(usedVariableList(tempIndex&).elementTypes, tempElement&) IF LEN(varType$) THEN GOTO checkVarType END SELECT RETURN @@ -7627,7 +7628,7 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, totalVisibleVariabl 'new setup previousVariableWatchList$ = variableWatchList$ longestVarName = CVL(LEFT$(variableWatchList$, 4)) - totalVisibleVariables = (LEN(variableWatchList$) - 4) \ 8 + totalVisibleVariables = (LEN(variableWatchList$) - 4) \ 16 this.h = totalVisibleVariables + 2 IF this.h > idewy - 10 THEN this.h = idewy - 10 IF this.h < 5 THEN this.h = 5 @@ -7666,7 +7667,9 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, totalVisibleVariabl DO WHILE LEN(temp$) tempIndex& = CVL(LEFT$(temp$, 4)) tempArrayIndex& = CVL(MID$(temp$, 5, 4)) - temp$ = MID$(temp$, 9) + tempElement& = CVL(MID$(temp$, 9, 4)) + tempStorage& = CVL(MID$(temp$, 13, 4)) + temp$ = MID$(temp$, 17) i = i + 1 IF this.firstVisible > i AND WatchListToConsole <> 0 THEN _CONTINUE y = y + 1 @@ -7677,20 +7680,19 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, totalVisibleVariabl thisName$ = LEFT$(thisName$, LEN(thisName$) - 1) + _ LTRIM$(STR$(tempArrayIndex&)) + ")" END IF - thisName$ = thisName$ + usedVariableList(tempIndex&).elements + IF tempElement& THEN + tempElementList$ = MID$(usedVariableList(tempIndex&).elements, 5) + thisName$ = thisName$ + getelement$(tempElementList$, tempElement&) + END IF item$ = thisName$ + SPACE$(longestVarName - LEN(thisName$)) + " = " IF usedVariableList(tempIndex&).subfunc = currentScope$ OR usedVariableList(tempIndex&).subfunc = "" THEN - thisIsAString = (INSTR(usedVariableList(tempIndex&).varType, "STRING *") > 0 OR usedVariableList(tempIndex&).varType = "STRING") - IF usedVariableList(tempIndex&).isarray THEN - seqIndex& = INSTR(usedVariableList(tempIndex&).indexes, MKL$(tempArrayIndex&)) - IF seqIndex& <= LEN(usedVariableList(tempIndex&).mostRecentValue) - 3 THEN - storageSlot& = CVL(MID$(usedVariableList(tempIndex&).mostRecentValue, seqIndex&, 4)) - tempValue$ = vWatchArrayReceivedData$(storageSlot&) - END IF + IF tempElement& THEN + tempVarType$ = getelement$(usedVariableList(tempIndex&).elementTypes, tempElement&) ELSE - tempValue$ = usedVariableList(tempIndex&).mostRecentValue + tempVarType$ = usedVariableList(tempIndex&).varType END IF - + thisIsAString = (INSTR(tempVarType$, "STRING *") > 0 OR tempVarType$ = "STRING") + tempValue$ = vWatchReceivedData$(tempStorage&) IF thisIsAString THEN item$ = item$ + CHR$(34) + tempValue$ + CHR$(34) ELSE @@ -7783,6 +7785,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) TYPE varDlgList AS LONG index, bgColorFlag, colorFlag, colorFlag2, indicator AS _BYTE selected + AS STRING varType END TYPE REDIM varDlgList(1 TO totalVariablesCreated) AS varDlgList @@ -7965,7 +7968,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) i = o(varListBox).sel IF usedVariableList(varDlgList(i).index).subfunc = currentScope$ OR usedVariableList(varDlgList(i).index).subfunc = "" THEN 'scope is valid - a2$ = usedVariableList(varDlgList(i).index).mostRecentValue + 'a2$ = usedVariableList(varDlgList(i).index).mostRecentValue IF INSTR(usedVariableList(varDlgList(i).index).varType, "STRING") THEN thisWidth = idewx - 20 ELSE @@ -7994,34 +7997,85 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) (IdeDebugMode > 0 AND focus = 6 AND info <> 0) THEN variableWatchList$ = "" longestVarName = 0 - nextvWatchArraySlot = 0 + nextvWatchDataSlot = 0 FOR y = 1 TO totalVariablesCreated - usedVariableList(y).mostRecentValue = "" IF usedVariableList(y).watch THEN - thisLen = LEN(usedVariableList(y).name) + LEN(usedVariableList(y).elements) + thisLen = LEN(usedVariableList(y).name) IF usedVariableList(y).isarray THEN thisLen = thisLen + LEN(STR$(CVL(RIGHT$(usedVariableList(y).indexes, 4)))) - 1 END IF + IF LEN(usedVariableList(y).elements) THEN + thisLen = thisLen + CVL(LEFT$(usedVariableList(y).elements, 4)) + END IF + IF thisLen > longestVarName THEN longestVarName = thisLen IF variableWatchList$ = "" THEN variableWatchList$ = SPACE$(4) MID$(variableWatchList$, 1, 4) = MKL$(longestVarName) END IF - IF usedVariableList(y).isarray THEN + + IF usedVariableList(y).isarray <> 0 AND LEN(usedVariableList(y).elements) = 0 THEN + 'array of native data type temp$ = usedVariableList(y).indexes DO WHILE LEN(temp$) - variableWatchList$ = variableWatchList$ + MKL$(y) + LEFT$(temp$, 4) - nextvWatchArraySlot = nextvWatchArraySlot + 1 - WHILE nextvWatchArraySlot > UBOUND(vWatchArrayReceivedData$) - REDIM _PRESERVE vWatchArrayReceivedData$(1 TO UBOUND(vWatchArrayReceivedData$) + 999) + nextvWatchDataSlot = nextvWatchDataSlot + 1 + WHILE nextvWatchDataSlot > UBOUND(vWatchReceivedData$) + REDIM _PRESERVE vWatchReceivedData$(1 TO UBOUND(vWatchReceivedData$) + 999) WEND - usedVariableList(y).mostRecentValue = usedVariableList(y).mostRecentValue + MKL$(nextvWatchArraySlot) - vWatchArrayReceivedData$(nextvWatchArraySlot) = "" + variableWatchList$ = variableWatchList$ + MKL$(y) + LEFT$(temp$, 4) + MKL$(0) + MKL$(nextvWatchDataSlot) + usedVariableList(y).storage = usedVariableList(y).storage + MKL$(nextvWatchDataSlot) + vWatchReceivedData$(nextvWatchDataSlot) = "" temp$ = MID$(temp$, 5) LOOP - ELSE - variableWatchList$ = variableWatchList$ + MKL$(y) + MKL$(0) + ELSEIF usedVariableList(y).isarray <> 0 AND LEN(usedVariableList(y).elements) > 0 THEN + 'array of UDT + temp$ = usedVariableList(y).indexes + DO WHILE LEN(temp$) + thisTempElement$ = MKL$(y) + LEFT$(temp$, 4) + thisElementList$ = MID$(usedVariableList(y).elements, 5) + i = 0 + DO + i = i + 1 + temp2$ = getelement$(thisElementList$, i) + IF temp2$ = "" THEN EXIT DO + + nextvWatchDataSlot = nextvWatchDataSlot + 1 + WHILE nextvWatchDataSlot > UBOUND(vWatchReceivedData$) + REDIM _PRESERVE vWatchReceivedData$(1 TO UBOUND(vWatchReceivedData$) + 999) + WEND + variableWatchList$ = variableWatchList$ + thisTempElement$ + MKL$(i) + MKL$(nextvWatchDataSlot) + usedVariableList(y).storage = usedVariableList(y).storage + MKL$(nextvWatchDataSlot) + vWatchReceivedData$(nextvWatchDataSlot) = "" + LOOP + temp$ = MID$(temp$, 5) + LOOP + ELSEIF usedVariableList(y).isarray = 0 AND LEN(usedVariableList(y).elements) > 0 THEN + 'single variable of UDT + thisTempElement$ = MKL$(y) + MKL$(0) + thisElementList$ = MID$(usedVariableList(y).elements, 5) + i = 0 + DO + i = i + 1 + temp2$ = getelement$(thisElementList$, i) + IF temp2$ = "" THEN EXIT DO + + nextvWatchDataSlot = nextvWatchDataSlot + 1 + WHILE nextvWatchDataSlot > UBOUND(vWatchReceivedData$) + REDIM _PRESERVE vWatchReceivedData$(1 TO UBOUND(vWatchReceivedData$) + 999) + WEND + variableWatchList$ = variableWatchList$ + thisTempElement$ + MKL$(i) + MKL$(nextvWatchDataSlot) + usedVariableList(y).storage = usedVariableList(y).storage + MKL$(nextvWatchDataSlot) + vWatchReceivedData$(nextvWatchDataSlot) = "" + LOOP + ELSEIF usedVariableList(y).isarray = 0 AND LEN(usedVariableList(y).elements) = 0 THEN + 'single variable + nextvWatchDataSlot = nextvWatchDataSlot + 1 + WHILE nextvWatchDataSlot > UBOUND(vWatchReceivedData$) + REDIM _PRESERVE vWatchReceivedData$(1 TO UBOUND(vWatchReceivedData$) + 999) + WEND + variableWatchList$ = variableWatchList$ + MKL$(y) + MKL$(0) + MKL$(0) + MKL$(nextvWatchDataSlot) + usedVariableList(y).storage = MKL$(nextvWatchDataSlot) END IF END IF NEXT @@ -8071,9 +8125,6 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) temp$ = parseRange$(v$) usedVariableList(varDlgList(y).index).indexes = temp$ temp$ = formatRange$(temp$) - IF usedVariableList(varDlgList(y).index).watchRange <> temp$ THEN - usedVariableList(x).mostRecentValue = "" - END IF usedVariableList(varDlgList(y).index).watchRange = temp$ ELSE usedVariableList(varDlgList(y).index).indexes = "" @@ -8093,23 +8144,37 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) varType$ = usedVariableList(varDlgList(y).index).varType IF INSTR(varType$, "STRING *") THEN varType$ = "STRING" - nativeDataTypes$ = "@_BYTE@_UNSIGNED _BYTE@BYTE@UNSIGNED BYTE@INTEGER@_UNSIGNED INTEGER@UNSIGNED INTEGER@LONG@_UNSIGNED LONG@UNSIGNED LONG@_INTEGER64@INTEGER64@_UNSIGNED _INTEGER64@UNSIGNED INTEGER64@SINGLE@DOUBLE@_FLOAT@FLOAT@STRING@" IF INSTR(nativeDataTypes$, varType$) = 0 THEN 'It's a UDT - temp$ = usedVariableList(varDlgList(y).index).name + "." - v$ = ideinputbox$("Watch UDT", temp$, "", "", 45, 0, ok) + elementIndexes$ = "" + thisUDT = 0 + E = 0 + FOR i = 1 TO lasttype + IF RTRIM$(udtxcname(i)) = varType$ THEN thisUDT = i: EXIT FOR + NEXT + + i = 0 + DO + IF E = 0 THEN E = udtxnext(thisUDT) ELSE E = udtenext(E) + IF E = 0 THEN EXIT DO + elementIndexes$ = elementIndexes$ + MKL$(E) + i = i + 1 + LOOP + PCOPY 0, 4 + v$ = ideelementwatchbox$(usedVariableList(varDlgList(y).index).name + ".", elementIndexes$, 0, ok) + PCOPY 2, 0 + PCOPY 2, 1 + SCREEN , , 1, 0 IF ok THEN - IF LEFT$(v$, 1) <> "." THEN v$ = "." + v$ - usedVariableList(varDlgList(y).index).elements = v$ - v$ = lineformat$(UCASE$(v$)) + longestElementName = 0 + usedVariableList(varDlgList(y).index).elements = "" getid usedVariableList(varDlgList(y).index).id IF id.t = 0 THEN typ = id.arraytype AND 511 IF id.arraytype AND ISINCONVENTIONALMEMORY THEN typ = typ - ISINCONVENTIONALMEMORY END IF - END IF - IF usedVariableList(varDlgList(y).index).isarray THEN + usedVariableList(varDlgList(y).index).arrayElementSize = udtxsize(typ) IF udtxbytealign(typ) THEN IF usedVariableList(varDlgList(y).index).arrayElementSize MOD 8 THEN usedVariableList(varDlgList(y).index).arrayElementSize = usedVariableList(varDlgList(y).index).arrayElementSize + (8 - (usedVariableList(varDlgList(y).index).arrayElementSize MOD 8)) 'round up to nearest byte @@ -8118,68 +8183,90 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) ELSE usedVariableList(varDlgList(y).index).arrayElementSize = 0 END IF - Error_Happened = 0 - result$ = udtreference$("", v$, typ) - IF Error_Happened THEN + + temp$ = v$ + i = 0 + DO + i = i + 1 + v$ = getelement$(temp$, i) + IF LEN(v$) = 0 THEN EXIT DO + + '------- + IF LEN(v$) > longestElementName THEN longestElementName = LEN(v$) + IF LEN(usedVariableList(varDlgList(y).index).elements) = 0 THEN + usedVariableList(varDlgList(y).index).elements = MKL$(longestElementName) + ELSE + MID$(usedVariableList(varDlgList(y).index).elements, 1, 4) = MKL$(longestElementName) + END IF + usedVariableList(varDlgList(y).index).elements = usedVariableList(varDlgList(y).index).elements + v$ + sp + v$ = lineformat$(UCASE$(v$)) Error_Happened = 0 - result = idemessagebox("Error", Error_Message, "#OK") - usedVariableList(varDlgList(y).index).watch = 0 - usedVariableList(varDlgList(y).index).elements = "" - usedVariableList(varDlgList(y).index).elementOffset = 0 - GOTO unWatch - ELSE - typ = typ - ISUDT - typ = typ - ISREFERENCE - IF typ AND ISINCONVENTIONALMEMORY THEN typ = typ - ISINCONVENTIONALMEMORY - SELECT CASE typ - CASE BYTETYPE - usedVariableList(varDlgList(y).index).elementTypes = "_BYTE" - CASE UBYTETYPE - usedVariableList(varDlgList(y).index).elementTypes = "_UNSIGNED _BYTE" - CASE INTEGERTYPE - usedVariableList(varDlgList(y).index).elementTypes = "INTEGER" - CASE UINTEGERTYPE - usedVariableList(varDlgList(y).index).elementTypes = "_UNSIGNED INTEGER" - CASE LONGTYPE - usedVariableList(varDlgList(y).index).elementTypes = "LONG" - CASE ULONGTYPE - usedVariableList(varDlgList(y).index).elementTypes = "_UNSIGNED LONG" - CASE INTEGER64TYPE - usedVariableList(varDlgList(y).index).elementTypes = "_INTEGER64" - CASE UINTEGER64TYPE - usedVariableList(varDlgList(y).index).elementTypes = "_UNSIGNED _INTEGER64" - CASE SINGLETYPE - usedVariableList(varDlgList(y).index).elementTypes = "SINGLE" - CASE DOUBLETYPE - usedVariableList(varDlgList(y).index).elementTypes = "DOUBLE" - CASE FLOATTYPE - usedVariableList(varDlgList(y).index).elementTypes = "_FLOAT" - CASE OFFSETTYPE - usedVariableList(varDlgList(y).index).elementTypes = "_OFFSET" - CASE UOFFSETTYPE - usedVariableList(varDlgList(y).index).elementTypes = "_UNSIGNED _OFFSET" - CASE ELSE - IF typ AND ISSTRING THEN - IF (typ AND ISFIXEDLENGTH) = 0 THEN - usedVariableList(varDlgList(y).index).elementTypes = "STRING" + result$ = udtreference$("", v$, typ) + IF Error_Happened THEN + 'shouldn't ever happen + Error_Happened = 0 + result = idemessagebox("Error", Error_Message, "#OK") + usedVariableList(varDlgList(y).index).watch = 0 + usedVariableList(varDlgList(y).index).elements = "" + usedVariableList(varDlgList(y).index).elementOffset = "" + GOTO unWatch + ELSE + typ = typ - ISUDT + typ = typ - ISREFERENCE + IF typ AND ISINCONVENTIONALMEMORY THEN typ = typ - ISINCONVENTIONALMEMORY + SELECT CASE typ + CASE BYTETYPE + usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_BYTE" + sp + CASE UBYTETYPE + usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_UNSIGNED _BYTE" + sp + CASE INTEGERTYPE + usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "INTEGER" + sp + CASE UINTEGERTYPE + usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_UNSIGNED INTEGER" + sp + CASE LONGTYPE + usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "LONG" + sp + CASE ULONGTYPE + usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_UNSIGNED LONG" + sp + CASE INTEGER64TYPE + usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_INTEGER64" + sp + CASE UINTEGER64TYPE + usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_UNSIGNED _INTEGER64" + sp + CASE SINGLETYPE + usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "SINGLE" + sp + CASE DOUBLETYPE + usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "DOUBLE" + sp + CASE FLOATTYPE + usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_FLOAT" + sp + CASE OFFSETTYPE + usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_OFFSET" + sp + CASE UOFFSETTYPE + usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_UNSIGNED _OFFSET" + sp + CASE ELSE + IF typ AND ISSTRING THEN + IF (typ AND ISFIXEDLENGTH) = 0 THEN + usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "STRING" + sp + ELSE + 'E contains the UDT element index at this point + usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "STRING *" + STR$(udtetypesize(E)) + sp + END IF ELSE - 'E contains the UDT element index at this point - usedVariableList(varDlgList(y).index).elementTypes = "STRING *" + STR$(udtetypesize(E)) + 'shouldn't ever happen + usedVariableList(varDlgList(y).index).watch = 0 + usedVariableList(varDlgList(y).index).elements = "" + usedVariableList(varDlgList(y).index).elementOffset = "" + result = idemessagebox("Error", "Cannot add full UDT to Watch List", "#OK") + GOTO unWatch END IF - ELSE - usedVariableList(varDlgList(y).index).watch = 0 - usedVariableList(varDlgList(y).index).elements = "" - usedVariableList(varDlgList(y).index).elementOffset = 0 - result = idemessagebox("Error", "Cannot add full UDT to Watch List", "#OK") - GOTO unWatch - END IF - END SELECT - usedVariableList(varDlgList(y).index).elementOffset = VAL(MID$(result$, _INSTRREV(result$, sp3) + 1)) - END IF + END SELECT + usedVariableList(varDlgList(y).index).elementOffset = usedVariableList(varDlgList(y).index).elementOffset + MKL$(VAL(MID$(result$, _INSTRREV(result$, sp3) + 1))) + END IF + '------- + LOOP + 'remove trailing sp: + usedVariableList(varDlgList(y).index).elements = LEFT$(usedVariableList(varDlgList(y).index).elements, LEN(usedVariableList(varDlgList(y).index).elements) - 1) + usedVariableList(varDlgList(y).index).elementTypes = LEFT$(usedVariableList(varDlgList(y).index).elementTypes, LEN(usedVariableList(varDlgList(y).index).elementTypes) - 1) ELSE usedVariableList(varDlgList(y).index).watch = 0 - usedVariableList(varDlgList(y).index).elements = "" - usedVariableList(varDlgList(y).index).elementOffset = 0 GOTO unWatch END IF END IF @@ -8252,7 +8339,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) IF LEN(searchTerm$) THEN thisScope$ = usedVariableList(x).subfunc IF thisScope$ = "" THEN thisScope$ = mainmodule$ - item$ = usedVariableList(x).name + usedVariableList(x).varType + thisScope$ + usedVariableList(x).mostRecentValue + item$ = usedVariableList(x).name + usedVariableList(x).varType + thisScope$ IF multiSearch(item$, searchTerm$) = 0 THEN _CONTINUE 'skip variable if no field matches the search END IF @@ -8292,13 +8379,17 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) IF usedVariableList(x).subfunc = currentScope$ OR usedVariableList(x).subfunc = "" THEN 'it's ok ELSE - usedVariableList(x).mostRecentValue = "" + 'usedVariableList(x).mostRecentValue = "" END IF IF LEN(searchTerm$) THEN thisScope$ = usedVariableList(x).subfunc IF thisScope$ = "" THEN thisScope$ = mainmodule$ - item$ = usedVariableList(x).name + usedVariableList(x).varType + thisScope$ + usedVariableList(x).mostRecentValue + item$ = usedVariableList(x).name + usedVariableList(x).varType + thisScope$ + IF usedVariableList(x).isarray = 0 AND LEN(usedVariableList(x).elements) = 0 AND LEN(usedVariableList(x).storage) = 4 THEN + 'single var + item$ = item$ + vWatchReceivedData$(CVL(usedVariableList(x).storage)) + END IF IF multiSearch(item$, searchTerm$) = 0 THEN _CONTINUE 'skip variable if no field matches the search END IF @@ -8356,22 +8447,24 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) IF usedVariableList(x).subfunc = currentScope$ OR usedVariableList(x).subfunc = "" THEN IF usedVariableList(x).watch THEN thisIsAString = (INSTR(usedVariableList(x).varType, "STRING *") > 0 OR usedVariableList(x).varType = "STRING") - IF usedVariableList(x).isarray THEN - temp$ = usedVariableList(x).mostRecentValue + IF usedVariableList(x).isarray <> 0 AND LEN(usedVariableList(x).elements) = 0 THEN + 'array of native data type + temp$ = usedVariableList(x).storage IF LEN(temp$) THEN l$ = l$ + " = " + CHR$(16) + CHR$(variableNameColor) + "{" DO WHILE LEN(temp$) storageSlot& = CVL(LEFT$(temp$, 4)) temp$ = MID$(temp$, 5) IF thisIsAString THEN l$ = l$ + CHR$(34) - l$ = l$ + StrReplace$(vWatchArrayReceivedData$(storageSlot&), CHR$(0), " ") + l$ = l$ + StrReplace$(vWatchReceivedData$(storageSlot&), CHR$(0), " ") IF thisIsAString THEN l$ = l$ + CHR$(34) IF LEN(temp$) THEN l$ = l$ + "," LOOP - IF LEN(usedVariableList(x).mostRecentValue) THEN l$ = l$ + "}" - ELSE + IF LEN(usedVariableList(x).storage) THEN l$ = l$ + "}" + ELSEIF usedVariableList(x).isarray = 0 AND LEN(usedVariableList(x).elements) = 0 THEN + storageSlot& = CVL(usedVariableList(x).storage) l$ = l$ + " = " + CHR$(16) + CHR$(variableNameColor) IF thisIsAString THEN l$ = l$ + CHR$(34) - l$ = l$ + StrReplace$(usedVariableList(x).mostRecentValue, CHR$(0), " ") + l$ = l$ + StrReplace$(vWatchReceivedData$(storageSlot&), CHR$(0), " ") IF thisIsAString THEN l$ = l$ + CHR$(34) END IF END IF @@ -8385,6 +8478,291 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) RETURN END FUNCTION +FUNCTION ideelementwatchbox$(currentPath$, elementIndexes$, level, ok) + + '-------- generic dialog box header -------- + PCOPY 4, 0 + PCOPY 0, 1 + SCREEN , , 1, 0 + focus = 1 + DIM p AS idedbptype + DIM o(1 TO 100) AS idedbotype + DIM sep AS STRING * 1 + sep = CHR$(0) + '-------- end of generic dialog box header -------- + + '-------- init -------- + + STATIC returnList$ + IF level = 0 THEN returnList$ = "" + + ok = 0 + variableNameColor = 3 + typeColumnColor = 15 + selectedBG = 2 + + totalElements = LEN(elementIndexes$) \ 4 + REDIM varDlgList(1 TO totalElements) AS varDlgList + dialogHeight = (totalElements) + 4 + i = 0 + IF dialogHeight > idewy + idesubwindow - 6 THEN + dialogHeight = idewy + idesubwindow - 6 + END IF + IF dialogHeight < 5 THEN dialogHeight = 5 + + + GOSUB buildList + dialogWidth = 6 + longestName + maxTypeLen + IF dialogWidth < 40 THEN dialogWidth = 40 + IF dialogWidth > idewx - 8 THEN dialogWidth = idewx - 8 + + idepar p, dialogWidth, dialogHeight, "Add UDT Elements" + + i = i + 1: varListBox = i + o(varListBox).typ = 2 + o(varListBox).y = 2 + o(varListBox).w = dialogWidth - 4: o(i).h = dialogHeight - 4 + IF o(varListBox).txt = 0 THEN o(varListBox).txt = idenewtxt(l$) ELSE idetxt(o(varListBox).txt) = l$ + + i = i + 1: buttonSet = i + o(buttonSet).typ = 3 + o(buttonSet).y = dialogHeight + IF o(buttonSet).txt = 0 THEN + o(buttonSet).txt = idenewtxt("#Add All" + sep + "#Remove All" + sep + "#Close") + END IF + + '-------- end of init -------- + + '-------- generic init -------- + FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects + '-------- end of generic init -------- + + DO 'main loop + + '-------- generic display dialog box & objects -------- + idedrawpar p + f = 1: cx = 0: cy = 0 + FOR i = 1 TO 100 + IF o(i).typ THEN + 'prepare object + o(i).foc = focus - f 'focus offset + o(i).cx = 0: o(i).cy = 0 + idedrawobj o(i), f 'display object + IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy + END IF + NEXT i + lastfocus = f - 1 + '-------- end of generic display dialog box & objects -------- + + '-------- custom display changes -------- + COLOR 0, 7 + temp$ = currentPath$ + IF LEN(temp$) > p.w - 4 THEN temp$ = STRING$(3, 250) + RIGHT$(temp$, p.w - 7) + _PRINTSTRING (p.x + 2, p.y + 1), temp$ + + '-------- end of custom display changes -------- + + 'update visual page and cursor position + PCOPY 1, 0 + IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0 + + '-------- read input -------- + change = 0 + DO + GetInput + IF mWHEEL THEN change = 1 + IF KB THEN change = 1 + IF mCLICK THEN mousedown = 1: change = 1 + IF mRELEASE THEN mouseup = 1: change = 1 + IF mB THEN change = 1 + alt = KALT: IF alt <> oldalt THEN change = 1 + oldalt = alt + _LIMIT 100 + LOOP UNTIL change + IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0 + 'convert "alt+letter" scancode to letter's ASCII character + altletter$ = "" + IF alt AND NOT KCTRL THEN + IF LEN(K$) = 1 THEN + k = ASC(UCASE$(K$)) + IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k) + END IF + END IF + SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0 + '-------- end of read input -------- + + '-------- generic input response -------- + info = 0 + IF K$ = "" THEN K$ = CHR$(255) + IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1 + IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = "" + IF focus < 1 THEN focus = lastfocus + IF focus > lastfocus THEN focus = 1 + f = 1 + FOR i = 1 TO 100 + t = o(i).typ + IF t THEN + focusoffset = focus - f + ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL + END IF + NEXT + '-------- end of generic input response -------- + IF (focus = 2 AND info <> 0) THEN 'add all + FOR y = 1 TO totalElements + varType$ = varDlgList(y).varType + IF INSTR(varType$, "STRING *") THEN varType$ = "STRING" + IF INSTR(nativeDataTypes$, varType$) > 0 THEN + varDlgList(y).selected = -1 + ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = variableNameColor + ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = typeColumnColor + ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = selectedBG + ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 43 '+ + END IF + NEXT + _CONTINUE + END IF + + IF (focus = 3 AND info <> 0) THEN 'remove all + FOR y = 1 TO totalElements + varDlgList(y).selected = 0 + ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = 16 + ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = 2 + ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = 17 + ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 32 'space + NEXT + _CONTINUE + END IF + + IF K$ = CHR$(27) OR (focus = 4 AND info <> 0) THEN + 'build element list to return + FOR y = 1 TO totalElements + IF varDlgList(y).selected THEN + varType$ = varDlgList(y).varType + IF INSTR(varType$, "STRING *") THEN varType$ = "STRING" + IF INSTR(nativeDataTypes$, varType$) > 0 THEN + 'non-native data types will have already been added to the return list + thisName$ = RTRIM$(udtecname(varDlgList(y).index)) + IF LEN(returnList$) THEN returnList$ = returnList$ + sp + returnList$ = returnList$ + currentPath$ + thisName$ + END IF + END IF + NEXT + + ok = LEN(returnList$) > 0 + IF level = 0 THEN returnList$ = StrReplace$(returnList$, currentPath$, ".") + ideelementwatchbox$ = returnList$ + + IF mousedown THEN + DO + GetInput + _LIMIT 100 + LOOP UNTIL mRELEASE + END IF + EXIT FUNCTION + END IF + + IF mCLICK AND focus = 1 THEN 'list click + IF timeElapsedSince(lastClick!) < .3 AND clickedItem = o(varListBox).sel THEN + GOTO toggleWatch + END IF + lastClick! = TIMER + IF o(varListBox).sel > 0 THEN clickedItem = o(varListBox).sel + _CONTINUE + END IF + + IF (K$ = CHR$(13) AND focus = 1) THEN + K$ = "" + toggleWatch: + y = ABS(o(varListBox).sel) + + IF y >= 1 AND y <= totalElements THEN + varDlgList(y).selected = NOT varDlgList(y).selected + IF varDlgList(y).selected THEN + varType$ = varDlgList(y).varType + IF INSTR(varType$, "STRING *") THEN varType$ = "STRING" + IF INSTR(nativeDataTypes$, varType$) = 0 THEN + 'It's a UDT + elementIndexes2$ = "" + thisUDT = 0 + E = 0 + FOR i = 1 TO lasttype + IF RTRIM$(udtxcname(i)) = varType$ THEN thisUDT = i: EXIT FOR + NEXT + + i = 0 + DO + IF E = 0 THEN E = udtxnext(thisUDT) ELSE E = udtenext(E) + IF E = 0 THEN EXIT DO + elementIndexes2$ = elementIndexes2$ + MKL$(E) + i = i + 1 + LOOP + v$ = ideelementwatchbox$(currentPath$ + RTRIM$(udtecname(varDlgList(y).index)) + ".", elementIndexes2$, level + 1, ok2) + END IF + + ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = variableNameColor + ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = typeColumnColor + ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = selectedBG + ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 43 '+ + ELSE + ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = 16 + ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = 2 + ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = 17 + ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 32 'space + END IF + END IF + _CONTINUE + END IF + + 'end of custom controls + mousedown = 0 + mouseup = 0 + LOOP + + EXIT FUNCTION + + buildList: + maxTypeLen = 0 + FOR x = 1 TO totalElements + thisType = CVL(MID$(elementIndexes$, x * 4 - 3, 4)) + IF LEN(RTRIM$(udtecname(thisType))) > longestName THEN longestName = LEN(RTRIM$(udtecname(thisType))) + varDlgList(x).index = thisType + id.t = udtetype(thisType) + id.tsize = udtesize(thisType) + + IF id.t AND ISFIXEDLENGTH THEN + id.tsize = udtetypesize(thisType) + END IF + + varDlgList(x).varType = id2fulltypename$ + thisLen = LEN(varDlgList(x).varType) + IF thisLen > maxTypeLen THEN maxTypeLen = thisLen + NEXT + + l$ = "" + FOR x = 1 TO totalElements + thisElement = varDlgList(x).index + l$ = l$ + CHR$(17) + varDlgList(x).bgColorFlag = LEN(l$) + 1 + l$ = l$ + CHR$(17) + + l$ = l$ + CHR$(16) + varDlgList(x).colorFlag = LEN(l$) + 1 + varDlgList(x).indicator = LEN(l$) + 2 + l$ = l$ + CHR$(16) + " " + + thisName$ = RTRIM$(udtecname(thisElement)) + text$ = thisName$ + CHR$(16) + varDlgList(x).colorFlag2 = LEN(l$) + LEN(text$) + 1 + text$ = text$ + CHR$(2) + " " + text$ = text$ + SPACE$(longestName - LEN(thisName$)) + text$ = text$ + " " + varDlgList(x).varType + SPACE$(maxTypeLen - LEN(varDlgList(x).varType)) + + l$ = l$ + text$ + IF x < totalElements THEN l$ = l$ + sep + NEXT + RETURN +END FUNCTION + FUNCTION formatRange$(__text$) '__text$ is a series of MKL$(values) concatenated temp$ = __text$ diff --git a/source/qb64.bas b/source/qb64.bas index 42bea84ba..8d54b2b8c 100644 --- a/source/qb64.bas +++ b/source/qb64.bas @@ -33,6 +33,9 @@ vWatchVariableExclusions$ = "@__LONG_VWATCH_LINENUMBER@__LONG_VWATCH_SUBLEVEL@__ "@__STRING_VWATCH_SUBNAME@__STRING_VWATCH_CALLSTACK@__ARRAY_BYTE_VWATCH_BREAKPOINTS" + _ "@__ARRAY_BYTE_VWATCH_SKIPLINES@__STRING_VWATCH_INTERNALSUBNAME@__ARRAY_STRING_VWATCH_STACK@" +DIM SHARED nativeDataTypes$ +nativeDataTypes$ = "@_BYTE@_UNSIGNED _BYTE@BYTE@UNSIGNED BYTE@INTEGER@_UNSIGNED INTEGER@UNSIGNED INTEGER@LONG@_UNSIGNED LONG@UNSIGNED LONG@_INTEGER64@INTEGER64@_UNSIGNED _INTEGER64@UNSIGNED INTEGER64@SINGLE@DOUBLE@_FLOAT@FLOAT@STRING@" + DIM SHARED qb64prefix_set_recompileAttempts, qb64prefix_set_desiredState DIM SHARED opex_recompileAttempts, opex_desiredState DIM SHARED opexarray_recompileAttempts, opexarray_desiredState @@ -112,9 +115,9 @@ TYPE usedVarList AS LONG id, linenumber, includeLevel, includedLine, scope, localIndex AS LONG arrayElementSize AS _BYTE used, watch, isarray - AS STRING name, cname, varType, includedFile, subfunc, mostRecentValue + AS STRING name, cname, varType, includedFile, subfunc AS STRING watchRange, indexes, elements, elementTypes 'for Arrays and UDTs - AS _OFFSET elementOffset + AS STRING elementOffset, storage END TYPE DIM SHARED totalVariablesCreated AS LONG @@ -25956,7 +25959,7 @@ SUB manageVariableList (__name$, __cname$, localIndex AS LONG, action AS _BYTE) usedVariableList(i).id = currentid usedVariableList(i).used = 0 usedVariableList(i).watch = 0 - usedVariableList(i).mostRecentValue = "" + usedVariableList(i).storage = "" usedVariableList(i).linenumber = linenumber usedVariableList(i).includeLevel = inclevel IF inclevel > 0 THEN @@ -25989,7 +25992,7 @@ SUB manageVariableList (__name$, __cname$, localIndex AS LONG, action AS _BYTE) usedVariableList(i).indexes = "" usedVariableList(i).elements = "" usedVariableList(i).elementTypes = "" - usedVariableList(i).elementOffset = 0 + usedVariableList(i).elementOffset = "" totalVariablesCreated = totalVariablesCreated + 1 END IF CASE ELSE 'find and mark as used From ec295db7f518c6655fa17e471b2ddbe414971053 Mon Sep 17 00:00:00 2001 From: FellippeHeitor Date: Tue, 24 Aug 2021 03:05:42 -0300 Subject: [PATCH 09/10] Fixes crash readding arrays of UDTs to Watch List during execution. --- source/ide/ide_methods.bas | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/ide/ide_methods.bas b/source/ide/ide_methods.bas index 0c2dfc5a3..2af2cf027 100644 --- a/source/ide/ide_methods.bas +++ b/source/ide/ide_methods.bas @@ -8168,6 +8168,8 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) IF ok THEN longestElementName = 0 usedVariableList(varDlgList(y).index).elements = "" + usedVariableList(varDlgList(y).index).elementTypes = "" + usedVariableList(varDlgList(y).index).elementOffset = "" getid usedVariableList(varDlgList(y).index).id IF id.t = 0 THEN typ = id.arraytype AND 511 @@ -8208,6 +8210,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) result = idemessagebox("Error", Error_Message, "#OK") usedVariableList(varDlgList(y).index).watch = 0 usedVariableList(varDlgList(y).index).elements = "" + usedVariableList(varDlgList(y).index).elementTypes = "" usedVariableList(varDlgList(y).index).elementOffset = "" GOTO unWatch ELSE @@ -8253,6 +8256,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) 'shouldn't ever happen usedVariableList(varDlgList(y).index).watch = 0 usedVariableList(varDlgList(y).index).elements = "" + usedVariableList(varDlgList(y).index).elementTypes = "" usedVariableList(varDlgList(y).index).elementOffset = "" result = idemessagebox("Error", "Cannot add full UDT to Watch List", "#OK") GOTO unWatch @@ -8386,7 +8390,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) thisScope$ = usedVariableList(x).subfunc IF thisScope$ = "" THEN thisScope$ = mainmodule$ item$ = usedVariableList(x).name + usedVariableList(x).varType + thisScope$ - IF usedVariableList(x).isarray = 0 AND LEN(usedVariableList(x).elements) = 0 AND LEN(usedVariableList(x).storage) = 4 THEN + IF IdeDebugMode > 0 AND usedVariableList(x).isarray = 0 AND LEN(usedVariableList(x).elements) = 0 AND LEN(usedVariableList(x).storage) = 4 THEN 'single var item$ = item$ + vWatchReceivedData$(CVL(usedVariableList(x).storage)) END IF From 28661bbf362b0da4518acf3cdfde9f43fa4c908b Mon Sep 17 00:00:00 2001 From: FellippeHeitor Date: Tue, 24 Aug 2021 03:53:39 -0300 Subject: [PATCH 10/10] Adds minimal support for watching _BIT variables. --- source/ide/ide_methods.bas | 20 ++++++++++++++++++-- source/qb64.bas | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/source/ide/ide_methods.bas b/source/ide/ide_methods.bas index 2af2cf027..5adbbc224 100644 --- a/source/ide/ide_methods.bas +++ b/source/ide/ide_methods.bas @@ -7411,7 +7411,7 @@ SUB DebugMode cmd$ = cmd$ + MKL$(tempStorage&) cmd$ = cmd$ + MKI$(LEN(usedVariableList(tempIndex&).subfunc)) cmd$ = cmd$ + usedVariableList(tempIndex&).subfunc - cmd$ = cmd$ + MKI$(LEN(varType$)) + varType$ + cmd$ = cmd$ + MKI$(LEN(tempVarType$)) + tempVarType$ GOSUB SendCommand ELSE cmd$ = "" @@ -7427,7 +7427,7 @@ SUB DebugMode tempStorage& = CVL(MID$(value$, 13, 4)) recvData$ = MID$(value$, 17) GOSUB GetVarSize - SELECT CASE varType$ + SELECT CASE tempVarType$ CASE "_BYTE", "BYTE": recvData$ = STR$(_CV(_BYTE, recvData$)) CASE "_UNSIGNED _BYTE", "UNSIGNED BYTE": recvData$ = STR$(_CV(_UNSIGNED _BYTE, recvData$)) CASE "INTEGER": recvData$ = STR$(_CV(INTEGER, recvData$)) @@ -7599,6 +7599,18 @@ SUB DebugMode checkVarType: tempVarType$ = varType$ IF INSTR(tempVarType$, "STRING *") THEN tempVarType$ = "STRING" + IF INSTR(tempVarType$, "BIT *") THEN + IF VAL(MID$(tempVarType$, _INSTRREV(tempVarType$, " ") + 1)) > 32 THEN + tempVarType$ = "_INTEGER64" + IF INSTR(tempVarType$, "UNSIGNED") THEN tempVarType$ = "_UNSIGNED _INTEGER64" + ELSE + tempVarType$ = "LONG" + IF INSTR(tempVarType$, "UNSIGNED") THEN tempVarType$ = "_UNSIGNED LONG" + END IF + ELSEIF INSTR("@_BIT@BIT@_UNSIGNED _BIT@UNSIGNED BIT@", "@" + tempVarType$ + "@") THEN + tempVarType$ = "LONG" + IF INSTR(tempVarType$, "UNSIGNED") THEN tempVarType$ = "_UNSIGNED LONG" + END IF SELECT CASE tempVarType$ CASE "_BYTE", "_UNSIGNED _BYTE", "BYTE", "UNSIGNED BYTE": varSize& = LEN(dummy%%) CASE "INTEGER", "_UNSIGNED INTEGER", "UNSIGNED INTEGER": varSize& = LEN(dummy%) @@ -8144,6 +8156,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction) varType$ = usedVariableList(varDlgList(y).index).varType IF INSTR(varType$, "STRING *") THEN varType$ = "STRING" + IF INSTR(varType$, "_BIT *") THEN varType$ = "_BIT" IF INSTR(nativeDataTypes$, varType$) = 0 THEN 'It's a UDT elementIndexes$ = "" @@ -8615,6 +8628,7 @@ FUNCTION ideelementwatchbox$(currentPath$, elementIndexes$, level, ok) FOR y = 1 TO totalElements varType$ = varDlgList(y).varType IF INSTR(varType$, "STRING *") THEN varType$ = "STRING" + IF INSTR(varType$, "BIT *") THEN varType$ = "_BIT" IF INSTR(nativeDataTypes$, varType$) > 0 THEN varDlgList(y).selected = -1 ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = variableNameColor @@ -8643,6 +8657,7 @@ FUNCTION ideelementwatchbox$(currentPath$, elementIndexes$, level, ok) IF varDlgList(y).selected THEN varType$ = varDlgList(y).varType IF INSTR(varType$, "STRING *") THEN varType$ = "STRING" + IF INSTR(varType$, "BIT *") THEN varType$ = "_BIT" IF INSTR(nativeDataTypes$, varType$) > 0 THEN 'non-native data types will have already been added to the return list thisName$ = RTRIM$(udtecname(varDlgList(y).index)) @@ -8684,6 +8699,7 @@ FUNCTION ideelementwatchbox$(currentPath$, elementIndexes$, level, ok) IF varDlgList(y).selected THEN varType$ = varDlgList(y).varType IF INSTR(varType$, "STRING *") THEN varType$ = "STRING" + IF INSTR(varType$, "BIT *") THEN varType$ = "_BIT" IF INSTR(nativeDataTypes$, varType$) = 0 THEN 'It's a UDT elementIndexes2$ = "" diff --git a/source/qb64.bas b/source/qb64.bas index 8d54b2b8c..a72db394f 100644 --- a/source/qb64.bas +++ b/source/qb64.bas @@ -34,7 +34,7 @@ vWatchVariableExclusions$ = "@__LONG_VWATCH_LINENUMBER@__LONG_VWATCH_SUBLEVEL@__ "@__ARRAY_BYTE_VWATCH_SKIPLINES@__STRING_VWATCH_INTERNALSUBNAME@__ARRAY_STRING_VWATCH_STACK@" DIM SHARED nativeDataTypes$ -nativeDataTypes$ = "@_BYTE@_UNSIGNED _BYTE@BYTE@UNSIGNED BYTE@INTEGER@_UNSIGNED INTEGER@UNSIGNED INTEGER@LONG@_UNSIGNED LONG@UNSIGNED LONG@_INTEGER64@INTEGER64@_UNSIGNED _INTEGER64@UNSIGNED INTEGER64@SINGLE@DOUBLE@_FLOAT@FLOAT@STRING@" +nativeDataTypes$ = "@_BIT@_BYTE@_UNSIGNED _BYTE@BYTE@UNSIGNED BYTE@INTEGER@_UNSIGNED INTEGER@UNSIGNED INTEGER@LONG@_UNSIGNED LONG@UNSIGNED LONG@_INTEGER64@INTEGER64@_UNSIGNED _INTEGER64@UNSIGNED INTEGER64@SINGLE@DOUBLE@_FLOAT@FLOAT@STRING@" DIM SHARED qb64prefix_set_recompileAttempts, qb64prefix_set_desiredState DIM SHARED opex_recompileAttempts, opex_desiredState