diff options
author | Araq <rumpf_a@web.de> | 2019-01-13 14:05:09 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2019-01-13 14:09:13 +0100 |
commit | 0c10fc67eb259ede0de4501cee5fe81463064294 (patch) | |
tree | 7c54b0f4fd846663210fb27a7073103966a009cb /compiler | |
parent | d740a5b79a004632f90da6702cd351ae214e273d (diff) | |
download | Nim-0c10fc67eb259ede0de4501cee5fe81463064294.tar.gz |
fixes #10104
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/vm.nim | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/compiler/vm.nim b/compiler/vm.nim index e2586e615..c001981f8 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -85,7 +85,7 @@ proc stackTraceAux(c: PCtx; x: PStackFrame; pc: int; recursionLimit=100) = add(s, x.prc.name.s) msgWriteln(c.config, s) -proc stackTrace(c: PCtx, tos: PStackFrame, pc: int, +proc stackTraceImpl(c: PCtx, tos: PStackFrame, pc: int, msg: string, lineInfo: TLineInfo) = msgWriteln(c.config, "stack trace: (most recent call last)") stackTraceAux(c, tos, pc) @@ -93,8 +93,14 @@ proc stackTrace(c: PCtx, tos: PStackFrame, pc: int, if c.mode == emRepl: globalError(c.config, lineInfo, msg) else: localError(c.config, lineInfo, msg) -proc stackTrace(c: PCtx, tos: PStackFrame, pc: int, msg: string) = - stackTrace(c, tos, pc, msg, c.debug[pc]) +template stackTrace(c: PCtx, tos: PStackFrame, pc: int, + msg: string, lineInfo: TLineInfo) = + stackTraceImpl(c, tos, pc, msg, lineInfo) + return + +template stackTrace(c: PCtx, tos: PStackFrame, pc: int, msg: string) = + stackTraceImpl(c, tos, pc, msg, c.debug[pc]) + return proc bailOut(c: PCtx; tos: PStackFrame) = stackTrace(c, tos, c.exceptionInstr, "unhandled exception: " & @@ -955,13 +961,13 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg = decodeBC(rkInt) let a = regs[rb].node let b = regs[rc].node - if a.kind == nkSym and a.sym.kind in skProcKinds and + if a.kind == nkSym and a.sym.kind in skProcKinds and b.kind == nkSym and b.sym.kind in skProcKinds: regs[ra].intVal = if sfFromGeneric in a.sym.flags and a.sym.owner == b.sym: 1 else: 0 - else: - stackTrace(c, tos, pc, "node is not a proc symbol") + else: + stackTrace(c, tos, pc, "node is not a proc symbol") of opcEcho: let rb = instr.regB if rb == 1: |