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