enable VM tracing in user code via {.define(nimVmTrace).} (#18244)
* enable VM tracing in user code via `{.define(nimVmTrace).}`
* add vmutils.vmTrace
* add vmTrace
This commit is contained in:
parent
0c8d3ae985
commit
565e07a993
6 changed files with 53 additions and 2 deletions
|
|
@ -330,6 +330,7 @@ type
|
|||
warnCounter*: int
|
||||
errorMax*: int
|
||||
maxLoopIterationsVM*: int ## VM: max iterations of all loops
|
||||
isVmTrace*: bool
|
||||
configVars*: StringTableRef
|
||||
symbols*: StringTableRef ## We need to use a StringTableRef here as defined
|
||||
## symbols are always guaranteed to be style
|
||||
|
|
|
|||
|
|
@ -548,9 +548,12 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
|
|||
"pc", $pc, "opcode", alignLeft($c.code[pc].opcode, 15),
|
||||
"ra", regDescr("ra", ra), "rb", regDescr("rb", instr.regB),
|
||||
"rc", regDescr("rc", instr.regC)]
|
||||
|
||||
if c.config.isVmTrace:
|
||||
# unlike nimVMDebug, this doesn't require re-compiling nim and is controlled by user code
|
||||
let info = c.debug[pc]
|
||||
# other useful variables: c.loopIterations
|
||||
echo "$# [$#] $#" % [c.config$info, $instr.opcode, c.config.sourceLine(info)]
|
||||
c.profiler.enter(c, tos)
|
||||
|
||||
case instr.opcode
|
||||
of opcEof: return regs[ra]
|
||||
of opcRet:
|
||||
|
|
|
|||
|
|
@ -249,6 +249,9 @@ proc registerAdditionalOps*(c: PCtx) =
|
|||
"isExported() requires a symbol. '" & $n & "' is of kind '" & $n.kind & "'", n.info)
|
||||
setResult(a, sfExported in n.sym.flags)
|
||||
|
||||
registerCallback c, "stdlib.vmutils.vmTrace", proc (a: VmArgs) =
|
||||
c.config.isVmTrace = getBool(a, 0)
|
||||
|
||||
proc hashVmImpl(a: VmArgs) =
|
||||
var res = hashes.hash(a.getString(0), a.getInt(1).int, a.getInt(2).int)
|
||||
if c.config.backend == backendJs:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue