diff options
author | Dominik Picheta <dominikpicheta@googlemail.com> | 2014-08-11 20:47:38 +0100 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@googlemail.com> | 2014-08-11 20:47:38 +0100 |
commit | 25610a2f704db32784d52b96118f164cb5113632 (patch) | |
tree | bb0b1710405d3f574bd2a67798e4d110bf4bf49f /compiler | |
parent | aaf4b04203221a350198748bc041d81cd5969ccc (diff) | |
download | Nim-25610a2f704db32784d52b96118f164cb5113632.tar.gz |
Fixes incorrect macro stack traces.
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/vm.nim | 11 | ||||
-rw-r--r-- | compiler/vmdef.nim | 4 |
2 files changed, 13 insertions, 2 deletions
diff --git a/compiler/vm.nim b/compiler/vm.nim index a06d10f81..e40acca6c 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -1078,6 +1078,7 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg = of opcNKind: decodeB(rkInt) regs[ra].intVal = ord(regs[rb].node.kind) + c.comesFromHeuristic = regs[rb].node.info of opcNIntVal: decodeB(rkInt) let a = regs[rb].node @@ -1253,8 +1254,16 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg = internalError(c.debug[pc], "request to create a NimNode of invalid kind") let cc = regs[rc].node + regs[ra].node = newNodeI(TNodeKind(int(k)), - if cc.kind == nkNilLit: c.debug[pc] else: cc.info) + if cc.kind != nkNilLit: + cc.info + elif c.comesFromHeuristic.line > -1: + c.comesFromHeuristic + elif c.callsite != nil and c.callsite.safeLen > 1: + c.callsite[1].info + else: + c.debug[pc]) regs[ra].node.flags.incl nfIsRef of opcNCopyNimNode: decodeB(rkNode) diff --git a/compiler/vmdef.nim b/compiler/vmdef.nim index 873d8eebd..cad48abea 100644 --- a/compiler/vmdef.nim +++ b/compiler/vmdef.nim @@ -188,6 +188,7 @@ type features*: TSandboxFlags traceActive*: bool loopIterations*: int + comesFromHeuristic*: TLineInfo # Heuristic for better macro stack traces TPosition* = distinct int @@ -196,7 +197,8 @@ type proc newCtx*(module: PSym): PCtx = PCtx(code: @[], debug: @[], globals: newNode(nkStmtListExpr), constants: newNode(nkStmtList), types: @[], - prc: PProc(blocks: @[]), module: module, loopIterations: MaxLoopIterations) + prc: PProc(blocks: @[]), module: module, loopIterations: MaxLoopIterations, + comesFromHeuristic: unknownLineInfo()) proc refresh*(c: PCtx, module: PSym) = c.module = module |