summary refs log tree commit diff stats
path: root/compiler/vmgen.nim
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2014-02-25 08:41:29 +0100
committerAraq <rumpf_a@web.de>2014-02-25 08:41:29 +0100
commitb7bb56bdca9ced8fdc0dea18dc54f732c6e17d3e (patch)
treeb10b53ba60ff226f77c6c6034ba1b45fb7ec44f7 /compiler/vmgen.nim
parent3a2e1ce538f65942dae426b3183353353850e93f (diff)
downloadNim-b7bb56bdca9ced8fdc0dea18dc54f732c6e17d3e.tar.gz
made some tests green; htmlgen still broken
Diffstat (limited to 'compiler/vmgen.nim')
-rw-r--r--compiler/vmgen.nim12
1 files changed, 7 insertions, 5 deletions
diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim
index b594c00a9..a9029442e 100644
--- a/compiler/vmgen.nim
+++ b/compiler/vmgen.nim
@@ -924,7 +924,7 @@ proc genAddrDeref(c: PCtx; n: PNode; dest: var TDest; opc: TOpcode;
                   flags: TGenFlags) = 
   # a nop for certain types
   let isAddr = opc in {opcAddrNode, opcAddrReg}
-  let flags = if isAddr: flags+{gfAddrOf} else: flags
+  let newflags = if isAddr: flags+{gfAddrOf} else: flags
   # consider:
   # proc foo(f: var ref int) =
   #   f = new(int)
@@ -935,12 +935,14 @@ proc genAddrDeref(c: PCtx; n: PNode; dest: var TDest; opc: TOpcode;
   # The type of 'f' is 'var ref int' and of 'x' is 'ref int'. Hence for
   # nkAddr we must not use 'unneededIndirection', but for deref we use it.
   if not isAddr and unneededIndirection(n.sons[0]):
-    gen(c, n.sons[0], dest, flags)
+    gen(c, n.sons[0], dest, newflags)
   else:
-    let tmp = c.genx(n.sons[0], flags)
+    let tmp = c.genx(n.sons[0], newflags)
     if dest < 0: dest = c.getTemp(n.typ)
     if not isAddr:
       gABC(c, n, opc, dest, tmp)
+      if gfAddrOf notin flags and fitsRegister(n.typ):
+        c.gABC(n, opcNodeToReg, dest, dest)
     elif c.prc.slots[tmp].kind >= slotTempUnknown:
       gABC(c, n, opcAddrReg, dest, tmp)
     else:
@@ -1541,8 +1543,8 @@ proc genProc(c: PCtx; s: PSym): int =
     c.optimizeJumps(result)
     s.offset = c.prc.maxSlots
     #if s.name.s == "importImpl_forward" or s.name.s == "importImpl":
-    #  c.echoCode(result)
-    # echo renderTree(body)
+    #c.echoCode(result)
+    #echo renderTree(body)
     c.prc = oldPrc
   else:
     c.prc.maxSlots = s.offset