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:
Timothee Cour 2021-06-24 02:55:31 -07:00 • committed by GitHub
commit 565e07a993
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 53 additions and 2 deletions

View file

@ -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

View file

@ -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:

View file

@ -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: