summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2014-07-02 21:15:29 +0200
committerAraq <rumpf_a@web.de>2014-07-02 21:15:29 +0200
commit21be7bf85a4d8cdff1acfcc5c8b9bf9c0727b290 (patch)
treef48c70ad378b679b60cc04b3bd3fc6bedfb5d5ef /compiler
parent887a1ebe688a01259263ad6e11c9061cfc940456 (diff)
downloadNim-21be7bf85a4d8cdff1acfcc5c8b9bf9c0727b290.tar.gz
fixes #1310
Diffstat (limited to 'compiler')
-rw-r--r--compiler/vm.nim7
-rw-r--r--compiler/vmgen.nim9
2 files changed, 15 insertions, 1 deletions
diff --git a/compiler/vm.nim b/compiler/vm.nim
index 0c2c23987..7f5e0d1c5 100644
--- a/compiler/vm.nim
+++ b/compiler/vm.nim
@@ -138,6 +138,9 @@ proc createStrKeepNode(x: var TFullReg) =
 template createStr(x) =
   x.node = newNode(nkStrLit)
 
+template createSet(x) =
+  x.node = newNode(nkCurly)
+
 proc moveConst(x: var TFullReg, y: TFullReg) =
   if x.kind != y.kind:
     myreset(x)
@@ -722,18 +725,22 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
       regs[ra].intVal = ord(containsSets(a, b) and not equalSets(a, b))
     of opcMulSet:
       decodeBC(rkNode)
+      createSet(regs[ra])
       move(regs[ra].node.sons, 
             nimsets.intersectSets(regs[rb].node, regs[rc].node).sons)
     of opcPlusSet: 
       decodeBC(rkNode)
+      createSet(regs[ra])
       move(regs[ra].node.sons,
            nimsets.unionSets(regs[rb].node, regs[rc].node).sons)
     of opcMinusSet:
       decodeBC(rkNode)
+      createSet(regs[ra])
       move(regs[ra].node.sons,
            nimsets.diffSets(regs[rb].node, regs[rc].node).sons)
     of opcSymdiffSet:
       decodeBC(rkNode)
+      createSet(regs[ra])
       move(regs[ra].node.sons,
            nimsets.symdiffSets(regs[rb].node, regs[rc].node).sons)    
     of opcConcatStr:
diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim
index 3819bed98..28e0a8fd6 100644
--- a/compiler/vmgen.nim
+++ b/compiler/vmgen.nim
@@ -14,7 +14,12 @@
 #   assignments ('x = y'). For simple data types that fit into a register
 #   this doesn't matter. However it matters for strings and other complex
 #   types that use the 'node' field; the reason is that slots are
-#   re-used in a register based VM. XXX Come up with an example.
+#   re-used in a register based VM. Example:
+# 
+# .. code-block:: nimrod
+#   let s = a & b  # no matter what, create fresh node
+#   s = a & b  # no matter what, keep the node
+#   
 
 import
   unsigned, strutils, ast, astalgo, types, msgs, renderer, vmdef, 
@@ -1335,6 +1340,8 @@ proc genVarSection(c: PCtx; n: PNode) =
         if a.sons[2].kind == nkEmpty:
           c.gABx(a, ldNullOpcode(s.typ), s.position, c.genType(s.typ))
         else:
+          if not fitsRegister(s.typ):
+            c.gABx(a, ldNullOpcode(s.typ), s.position, c.genType(s.typ))
           gen(c, a.sons[2], s.position.TRegister)
     else:
       # assign to a.sons[0]; happens for closures