1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-06-29 10:30:36 +00:00

Adds ability to fetch data from arrays of UDTs.

This commit is contained in:
FellippeHeitor 2021-08-23 18:02:22 -03:00
parent 687276bccd
commit 62f3496c36
3 changed files with 43 additions and 11 deletions

View file

@ -7,6 +7,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
STATIC AS _OFFSET vw_idehwnd STATIC AS _OFFSET vw_idehwnd
STATIC vw_buffer$ STATIC vw_buffer$
DIM AS LONG vw_i, vw_tempIndex, vw_localIndex, vw_varSize, vw_cmdsize 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 _OFFSET vw_address, vw_elementoffset, vw_lbound, vw_ubound
DIM AS _MEM vw_m, vw_m2 DIM AS _MEM vw_m, vw_m2
DIM AS _BYTE vw_isarray 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_isarray = _CV(_BYTE, MID$(vw_value$, 5, 1))
vw_localIndex = CVL(MID$(vw_value$, 6, 4)) vw_localIndex = CVL(MID$(vw_value$, 6, 4))
vw_arrayIndex = CVL(MID$(vw_value$, 10, 4)) vw_arrayIndex = CVL(MID$(vw_value$, 10, 4))
vw_elementoffset = _CV(_OFFSET, MID$(vw_value$, 14, LEN(vw_elementoffset))) vw_arrayelementsize = CVL(MID$(vw_value$, 14, 4))
vw_varSize = CVL(MID$(vw_value$, 14 + LEN(vw_elementoffset), 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 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 IF vw_i THEN
vw_scope$ = MID$(vw_value$, 20 + LEN(vw_elementoffset), vw_i) vw_scope$ = MID$(vw_value$, 24 + LEN(vw_elementoffset), vw_i)
vw_i = CVI(MID$(vw_value$, 20 + LEN(vw_elementoffset) + vw_i, 2)) vw_i = CVI(MID$(vw_value$, 24 + LEN(vw_elementoffset) + vw_i, 2))
vw_varType$ = RIGHT$(vw_value$, vw_i) vw_varType$ = RIGHT$(vw_value$, vw_i)
ELSE 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) vw_varType$ = RIGHT$(vw_value$, vw_i)
END IF END IF
IF vw_cmd$ = "get global var" THEN IF vw_cmd$ = "get global var" THEN
@ -312,7 +314,11 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
END IF END IF
'this is where we calculate the actual element position in memory '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 END IF
'vw_address now points to the actual data 'vw_address now points to the actual data

View file

@ -7388,16 +7388,26 @@ SUB DebugMode
tempIndex& = CVL(LEFT$(temp$, 4)) tempIndex& = CVL(LEFT$(temp$, 4))
tempArrayIndex& = CVL(MID$(temp$, 5, 4)) tempArrayIndex& = CVL(MID$(temp$, 5, 4))
temp$ = MID$(temp$, 9) temp$ = MID$(temp$, 9)
cmd$ = ""
IF LEN(usedVariableList(tempIndex&).subfunc) = 0 THEN IF LEN(usedVariableList(tempIndex&).subfunc) = 0 THEN
cmd$ = "get global var:" cmd$ = "get global var:"
ELSE ELSE
cmd$ = "get local var:" cmd$ = "get local var:"
END IF END IF
GOSUB GetVarSize GOSUB GetVarSize
IF LEN(cmd$) THEN IF varSize& 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$ 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 GOSUB SendCommand
ELSE
cmd$ = ""
END IF END IF
LOOP LOOP
END IF END IF
@ -8093,6 +8103,21 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
usedVariableList(varDlgList(y).index).elements = v$ usedVariableList(varDlgList(y).index).elements = v$
v$ = lineformat$(UCASE$(v$)) v$ = lineformat$(UCASE$(v$))
getid usedVariableList(varDlgList(y).index).id 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 Error_Happened = 0
result$ = udtreference$("", v$, typ) result$ = udtreference$("", v$, typ)
IF Error_Happened THEN IF Error_Happened THEN
@ -8149,7 +8174,6 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
GOTO unWatch GOTO unWatch
END IF END IF
END SELECT END SELECT
'result = idemessagebox("Result", v$ + "\n" + result$ + "\n" + STR$(typ), "#OK")
usedVariableList(varDlgList(y).index).elementOffset = VAL(MID$(result$, _INSTRREV(result$, sp3) + 1)) usedVariableList(varDlgList(y).index).elementOffset = VAL(MID$(result$, _INSTRREV(result$, sp3) + 1))
END IF END IF
ELSE ELSE

View file

@ -110,6 +110,7 @@ DIM SHARED MonochromeLoggingMode AS _BYTE
TYPE usedVarList TYPE usedVarList
AS LONG id, linenumber, includeLevel, includedLine, scope, localIndex AS LONG id, linenumber, includeLevel, includedLine, scope, localIndex
AS LONG arrayElementSize
AS _BYTE used, watch, isarray AS _BYTE used, watch, isarray
AS STRING name, cname, varType, includedFile, subfunc, mostRecentValue AS STRING name, cname, varType, includedFile, subfunc, mostRecentValue
AS STRING watchRange, indexes, elements, elementTypes 'for Arrays and UDTs 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 usedVariableList(i).isarray = 0
END IF END IF
usedVariableList(i).watchRange = "" usedVariableList(i).watchRange = ""
usedVariableList(i).arrayElementSize = 0
usedVariableList(i).indexes = "" usedVariableList(i).indexes = ""
usedVariableList(i).elements = "" usedVariableList(i).elements = ""
usedVariableList(i).elementTypes = "" usedVariableList(i).elementTypes = ""