mirror of
https://github.com/QB64Official/qb64.git
synced 2024-07-07 20:20:25 +00:00
Add support for inspecting string variables
This commit is contained in:
parent
a2a49cef01
commit
7e4a5b9799
|
@ -5,10 +5,10 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
|
||||||
STATIC AS LONG callStackLength, runToLine
|
STATIC AS LONG callStackLength, runToLine
|
||||||
STATIC AS _BYTE pauseMode, stepOver, bypass, setNextLine
|
STATIC AS _BYTE pauseMode, stepOver, bypass, setNextLine
|
||||||
STATIC buffer$, endc$
|
STATIC buffer$, endc$
|
||||||
DIM AS LONG i, tempIndex, localIndex
|
DIM AS LONG i, tempIndex, localIndex, varSize, sequence
|
||||||
DIM AS _OFFSET address
|
DIM AS _OFFSET address
|
||||||
DIM AS _MEM m
|
DIM AS _MEM m, m2
|
||||||
DIM start!, temp$, cmd$, value$, k&, dataType$, result$
|
DIM start!, temp$, cmd$, value$, k&, dataType$, result$, buf$
|
||||||
|
|
||||||
DECLARE LIBRARY
|
DECLARE LIBRARY
|
||||||
SUB vwatch_stoptimers ALIAS stop_timers
|
SUB vwatch_stoptimers ALIAS stop_timers
|
||||||
|
@ -217,29 +217,37 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
|
||||||
CASE "clear all skips"
|
CASE "clear all skips"
|
||||||
REDIM vwatch_skiplines(UBOUND(vwatch_skiplines)) AS _BYTE
|
REDIM vwatch_skiplines(UBOUND(vwatch_skiplines)) AS _BYTE
|
||||||
CASE "call stack"
|
CASE "call stack"
|
||||||
'send call stack history"
|
'send call stack history
|
||||||
GOSUB SendCallStack
|
GOSUB SendCallStack
|
||||||
CASE "global var"
|
CASE "global var"
|
||||||
tempIndex = CVL(LEFT$(value$, 4))
|
tempIndex = CVL(LEFT$(value$, 4))
|
||||||
localIndex = CVL(MID$(value$, 5, 4))
|
localIndex = CVL(MID$(value$, 5, 4))
|
||||||
dataType$ = MID$(value$, 9)
|
|
||||||
address = globalVariables + LEN(address) * localIndex
|
address = globalVariables + LEN(address) * localIndex
|
||||||
address = _MEMGET(m, address, _OFFSET)
|
address = _MEMGET(m, address, _OFFSET)
|
||||||
GOSUB GetMemData
|
|
||||||
$CONSOLE
|
$CONSOLE
|
||||||
_ECHO "Sending global var: " + STR$(tempIndex) + " = " + result$
|
cmd$ = "global var:" + MKL$(tempIndex) + str$(address)
|
||||||
cmd$ = "global var:" + MKL$(tempIndex) + result$
|
|
||||||
GOSUB SendCommand
|
GOSUB SendCommand
|
||||||
CASE "local var"
|
CASE "local var"
|
||||||
tempIndex = CVL(LEFT$(value$, 4))
|
' tempIndex = CVL(LEFT$(value$, 4))
|
||||||
localIndex = CVL(MID$(value$, 5, 4))
|
' localIndex = CVL(MID$(value$, 5, 4))
|
||||||
dataType$ = MID$(value$, 9)
|
' dataType$ = MID$(value$, 9)
|
||||||
address = localVariables + LEN(address) * localIndex
|
' address = localVariables + LEN(address) * localIndex
|
||||||
address = _MEMGET(m, address, _OFFSET)
|
' address = _MEMGET(m, address, _OFFSET)
|
||||||
GOSUB GetMemData
|
' GOSUB GetMemData
|
||||||
_ECHO "Sending local var: " + STR$(tempIndex) + " = " + result$
|
' _ECHO "Sending local var: " + STR$(tempIndex) + " = " + result$
|
||||||
cmd$ = "local var:" + MKL$(tempIndex) + result$
|
' cmd$ = "local var:" + MKL$(tempIndex) + result$
|
||||||
GOSUB SendCommand
|
' GOSUB SendCommand
|
||||||
|
case "get address"
|
||||||
|
tempIndex = cvl(left$(value$, 4))
|
||||||
|
sequence = cvi(mid$(value$, 5, 2))
|
||||||
|
varSize = cvl(mid$(value$, 7, 4))
|
||||||
|
address = val(mid$(value$, 11))
|
||||||
|
buf$ = space$(varSize)
|
||||||
|
m = _mem(address, varSize)
|
||||||
|
m2 = _mem(_offset(buf$), varSize)
|
||||||
|
_memcopy m, m.offset, m.size to m2, m2.offset
|
||||||
|
cmd$ = "address read:" + mkl$(tempIndex) + mki$(sequence) + buf$
|
||||||
|
gosub sendcommand
|
||||||
CASE "current sub"
|
CASE "current sub"
|
||||||
cmd$ = "current sub:" + vwatch_internalsubname$
|
cmd$ = "current sub:" + vwatch_internalsubname$
|
||||||
GOSUB SendCommand
|
GOSUB SendCommand
|
||||||
|
@ -309,55 +317,4 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
|
||||||
cmd$ = ""
|
cmd$ = ""
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
GetMemData:
|
|
||||||
DIM integerType AS INTEGER, uintegerType AS _UNSIGNED INTEGER
|
|
||||||
DIM longType AS LONG, ulongType AS _UNSIGNED LONG
|
|
||||||
DIM singleType AS SINGLE, doubleType AS DOUBLE
|
|
||||||
DIM varOffset AS _OFFSET, m2 AS _MEM
|
|
||||||
|
|
||||||
SELECT CASE dataType$
|
|
||||||
CASE "INTEGER"
|
|
||||||
m = _MEM(address, 2)
|
|
||||||
m2 = _MEM(integerType)
|
|
||||||
_MEMCOPY m, m.OFFSET, m.SIZE TO m2, m2.OFFSET
|
|
||||||
_MEMFREE m
|
|
||||||
_MEMFREE m2
|
|
||||||
result$ = STR$(integerType)
|
|
||||||
CASE "_UNSIGNED INTEGER"
|
|
||||||
m = _MEM(address, 2)
|
|
||||||
m2 = _MEM(uintegerType)
|
|
||||||
_MEMCOPY m, m.OFFSET, m.SIZE TO m2, m2.OFFSET
|
|
||||||
_MEMFREE m
|
|
||||||
_MEMFREE m2
|
|
||||||
result$ = STR$(uintegerType)
|
|
||||||
CASE "LONG"
|
|
||||||
m = _MEM(address, 4)
|
|
||||||
m2 = _MEM(longType)
|
|
||||||
_MEMCOPY m, m.OFFSET, m.SIZE TO m2, m2.OFFSET
|
|
||||||
_MEMFREE m
|
|
||||||
_MEMFREE m2
|
|
||||||
result$ = STR$(longType)
|
|
||||||
CASE "_UNSIGNED LONG"
|
|
||||||
m = _MEM(address, 4)
|
|
||||||
m2 = _MEM(ulongType)
|
|
||||||
_MEMCOPY m, m.OFFSET, m.SIZE TO m2, m2.OFFSET
|
|
||||||
_MEMFREE m
|
|
||||||
_MEMFREE m2
|
|
||||||
result$ = STR$(ulongType)
|
|
||||||
CASE "SINGLE"
|
|
||||||
m = _MEM(address, 4)
|
|
||||||
m2 = _MEM(singleType)
|
|
||||||
_MEMCOPY m, m.OFFSET, m.SIZE TO m2, m2.OFFSET
|
|
||||||
_MEMFREE m
|
|
||||||
_MEMFREE m2
|
|
||||||
result$ = STR$(singleType)
|
|
||||||
CASE "DOUBLE"
|
|
||||||
m = _MEM(address, 8)
|
|
||||||
m2 = _MEM(doubleType)
|
|
||||||
_MEMCOPY m, m.OFFSET, m.SIZE TO m2, m2.OFFSET
|
|
||||||
_MEMFREE m
|
|
||||||
_MEMFREE m2
|
|
||||||
result$ = STR$(doubleType)
|
|
||||||
END SELECT
|
|
||||||
RETURN
|
|
||||||
END SUB
|
END SUB
|
||||||
|
|
|
@ -6940,8 +6940,8 @@ SUB DebugMode
|
||||||
temp$ = MID$(temp$, 5)
|
temp$ = MID$(temp$, 5)
|
||||||
IF usedVariableList(tempIndex&).watch THEN
|
IF usedVariableList(tempIndex&).watch THEN
|
||||||
cmd$ = ""
|
cmd$ = ""
|
||||||
_ECHO "usedVariableList(tempIndex&).subfunc =" + usedVariableList(tempIndex&).subfunc
|
'_ECHO "usedVariableList(tempIndex&).subfunc =" + usedVariableList(tempIndex&).subfunc
|
||||||
_ECHO "currentSub$ =" + currentSub$
|
'_ECHO "currentSub$ =" + currentSub$
|
||||||
IF LEN(usedVariableList(tempIndex&).subfunc) = 0 THEN
|
IF LEN(usedVariableList(tempIndex&).subfunc) = 0 THEN
|
||||||
cmd$ = "global var:"
|
cmd$ = "global var:"
|
||||||
ELSEIF usedVariableList(tempIndex&).subfunc = currentSub$ THEN
|
ELSEIF usedVariableList(tempIndex&).subfunc = currentSub$ THEN
|
||||||
|
@ -6949,21 +6949,72 @@ SUB DebugMode
|
||||||
END IF
|
END IF
|
||||||
IF LEN(cmd$) THEN
|
IF LEN(cmd$) THEN
|
||||||
_CONSOLE ON
|
_CONSOLE ON
|
||||||
_ECHO "Requesting " + cmd$
|
_ECHO "Requesting " + cmd$ + str$(tempIndex&)
|
||||||
_ECHO "currentSub$ = " + currentSub$
|
'_ECHO "currentSub$ = " + currentSub$
|
||||||
cmd$ = cmd$ + MKL$(tempIndex&) + MKL$(usedVariableList(tempIndex&).localIndex) + usedVariableList(tempIndex&).varType
|
cmd$ = cmd$ + MKL$(tempIndex&) + MKL$(usedVariableList(tempIndex&).localIndex)
|
||||||
GOSUB SendCommand
|
GOSUB SendCommand
|
||||||
END IF
|
END IF
|
||||||
END IF
|
END IF
|
||||||
LOOP
|
LOOP
|
||||||
END IF
|
END IF
|
||||||
CASE "global var", "local var"
|
CASE "global var", "local var"
|
||||||
_ECHO "Received " + cmd$
|
|
||||||
tempIndex& = CVL(LEFT$(value$, 4))
|
tempIndex& = CVL(LEFT$(value$, 4))
|
||||||
value$ = MID$(value$, 5)
|
address%& = val(mid$(value$, 5))
|
||||||
_ECHO "index = " + STR$(tempIndex&)
|
varType$ = usedVariableList(tempIndex&).varType
|
||||||
_ECHO "=== value$ = " + value$
|
if instr(varType$, "STRING *") then varType$ = "STRING"
|
||||||
usedVariableList(tempIndex&).mostRecentValue = value$
|
select case varType$
|
||||||
|
case "_BYTE", "_UNSIGNED _BYTE": varSize& = len(dummy%%)
|
||||||
|
case "INTEGER", "_UNSIGNED INTEGER": varSize& = len(dummy%)
|
||||||
|
case "LONG", "_UNSIGNED LONG": varSize& = len(dummy&)
|
||||||
|
case "_INTEGER64", "_UNSIGNED _INTEGER64": varSize& = len(dummy&&)
|
||||||
|
case "SINGLE": varSize& = len(dummy!)
|
||||||
|
case "DOUBLE": varSize& = len(dummy#)
|
||||||
|
case "_FLOAT": varSize& = len(dummy##)
|
||||||
|
case "_OFFSET", "_UNSIGNED _OFFSET": varSize& = len(dummy%&)
|
||||||
|
case "STRING": varSize& = len(dummy%&) + len(dummy&)
|
||||||
|
end select
|
||||||
|
_echo "Requesting " + str$(varSize&) + " bytes from &H" + hex$(address%&)
|
||||||
|
cmd$ = "get address:" + mkl$(tempIndex&) + mki$(1) + mkl$(varSize&) + str$(address%&)
|
||||||
|
gosub SendCommand
|
||||||
|
case "address read"
|
||||||
|
tempIndex& = cvl(left$(value$, 4))
|
||||||
|
sequence% = cvi(mid$(value$, 5, 2))
|
||||||
|
_echo "Received data for " + str$(tempIndex&)
|
||||||
|
recvData$ = mid$(value$, 7)
|
||||||
|
varType$ = usedVariableList(tempIndex&).varType
|
||||||
|
if instr(varType$, "STRING *") then varType$ = "STRING"
|
||||||
|
select case varType$
|
||||||
|
case "_BYTE": recvData$ = str$(_cv(_byte, recvData$))
|
||||||
|
case "_UNSIGNED _BYTE": recvData$ = str$(_cv(_unsigned _byte, recvData$))
|
||||||
|
case "INTEGER": recvData$ = str$(_cv(integer, recvData$))
|
||||||
|
case "_UNSIGNED INTEGER": recvData$ = str$(_cv(_unsigned integer, recvData$))
|
||||||
|
case "LONG": recvData$ = str$(_cv(long, recvData$))
|
||||||
|
case "_UNSIGNED LONG": recvData$ = str$(_cv(_unsigned long, recvData$))
|
||||||
|
case "_INTEGER64": recvData$ = str$(_cv(_integer64, recvData$))
|
||||||
|
case "_UNSIGNED _INTEGER64": recvData$ = str$(_cv(_unsigned _integer64, recvData$))
|
||||||
|
case "SINGLE": recvData$ = str$(_cv(single, recvData$))
|
||||||
|
case "DOUBLE": recvData$ = str$(_cv(double, recvData$))
|
||||||
|
case "_FLOAT": recvData$ = str$(_cv(_float, recvData$))
|
||||||
|
case "_OFFSET": 'TODO
|
||||||
|
case "_UNSIGNED _OFFSET": 'TODO
|
||||||
|
case "STRING"
|
||||||
|
if sequence% = 1 then
|
||||||
|
if len(dummy%&) = 8 then
|
||||||
|
address%& = _cv(_integer64, left$(recvData$, 8))
|
||||||
|
strLength& = cvl(mid$(recvData$, 9))
|
||||||
|
else
|
||||||
|
address%& = _cv(long, left$(recvData$, 4))
|
||||||
|
strLength& = cvl(mid$(recvData$, 5))
|
||||||
|
end if
|
||||||
|
address$ = left$(recvData$, len(dummy%&)) 'Pointer to data
|
||||||
|
_echo "Requesting string of length " + str$(strLength&) + " at &H" + hex$(address%&)
|
||||||
|
cmd$ = "get address:" + mkl$(tempIndex&) + mki$(2) + mkl$(strLength&) + str$(address%&)
|
||||||
|
gosub sendcommand
|
||||||
|
goto vwatch_string_seq1_done
|
||||||
|
end if
|
||||||
|
end select
|
||||||
|
usedVariableList(tempIndex&).mostRecentValue = recvData$
|
||||||
|
vwatch_string_seq1_done:
|
||||||
CASE "current sub"
|
CASE "current sub"
|
||||||
currentSub$ = value$
|
currentSub$ = value$
|
||||||
CASE "quit"
|
CASE "quit"
|
||||||
|
|
Loading…
Reference in a new issue