diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2019-11-14 23:19:18 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-14 23:19:18 +0100 |
commit | a14abc57088ec775284e1bab5815e0229ab582a3 (patch) | |
tree | 0454551a60cfb492ea9e417b44c585c85bf82ad5 /compiler/vm.nim | |
parent | f22d3c75aa68833ae1b01d747d0c71074ccef310 (diff) | |
download | Nim-a14abc57088ec775284e1bab5815e0229ab582a3.tar.gz |
ARC: solves phase ordering problems (#12654)
Diffstat (limited to 'compiler/vm.nim')
-rw-r--r-- | compiler/vm.nim | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/compiler/vm.nim b/compiler/vm.nim index 922208034..ae8cc25af 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -1005,13 +1005,15 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg = decodeB(rkNode) let a = regs[rb].node if a.kind == nkSym: - regs[ra].node = if a.sym.ast.isNil: newNode(nkNilLit) - else: - let ast = a.sym.ast.shallowCopy - for i in 0..<a.sym.ast.len: - ast[i] = a.sym.ast[i] - ast[bodyPos] = transformBody(c.graph, a.sym) - ast.copyTree() + regs[ra].node = + if a.sym.ast.isNil: + newNode(nkNilLit) + else: + let ast = a.sym.ast.shallowCopy + for i in 0..<a.sym.ast.len: + ast[i] = a.sym.ast[i] + ast[bodyPos] = transformBody(c.graph, a.sym, cache=true) + ast.copyTree() of opcSymOwner: decodeB(rkNode) let a = regs[rb].node @@ -1983,7 +1985,7 @@ proc execProc*(c: PCtx; sym: PSym; args: openArray[PNode]): PNode = "NimScript: attempt to call non-routine: " & sym.name.s) proc evalStmt*(c: PCtx, n: PNode) = - let n = transformExpr(c.graph, c.module, n, noDestructors = true) + let n = transformExpr(c.graph, c.module, n) let start = genStmt(c, n) # execute new instructions; this redundant opcEof check saves us lots # of allocations in 'execute': @@ -1991,7 +1993,7 @@ proc evalStmt*(c: PCtx, n: PNode) = discard execute(c, start) proc evalExpr*(c: PCtx, n: PNode): PNode = - let n = transformExpr(c.graph, c.module, n, noDestructors = true) + let n = transformExpr(c.graph, c.module, n) let start = genExpr(c, n) assert c.code[start].opcode != opcEof result = execute(c, start) @@ -2037,7 +2039,7 @@ proc evalConstExprAux(module: PSym; g: ModuleGraph; prc: PSym, n: PNode, mode: TEvalMode): PNode = if g.config.errorCounter > 0: return n - let n = transformExpr(g, module, n, noDestructors = true) + let n = transformExpr(g, module, n) setupGlobalCtx(module, g) var c = PCtx g.vm let oldMode = c.mode |