summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2014-08-05 21:38:27 +0200
committerAraq <rumpf_a@web.de>2014-08-05 21:38:27 +0200
commit053b34d91d5dd7d57cb3878a1286b351c67b217c (patch)
tree5acd00658ac12702602cc6ae4892e756b36095b2 /compiler
parent9673e4f2df941bfeeb3e1fe8e66d89fddea1145b (diff)
downloadNim-053b34d91d5dd7d57cb3878a1286b351c67b217c.tar.gz
fixes yet another LL bug
Diffstat (limited to 'compiler')
-rw-r--r--compiler/lambdalifting.nim11
1 files changed, 9 insertions, 2 deletions
diff --git a/compiler/lambdalifting.nim b/compiler/lambdalifting.nim
index bdad0e471..6c650eee3 100644
--- a/compiler/lambdalifting.nim
+++ b/compiler/lambdalifting.nim
@@ -843,8 +843,15 @@ proc transformOuterProc(o: POuterContext, n: PNode; it: TIter): PNode =
       # every local goes through the closure:
       #if not containsOrIncl(o.capturedVars, local.id):
       #  addField(it.obj, local)
-      addUniqueField(it.obj, local)
-      return indirectAccess(newSymNode(it.closureParam), local, n.info)
+      if contains(o.capturedVars, local.id):
+        # change 'local' to 'closure.local', unless it's a 'byCopy' variable:
+        # if sfByCopy notin local.flags:
+        result = idNodeTableGet(o.localsToAccess, local)
+        assert result != nil, "cannot find: " & local.name.s
+        return result
+      else:
+        addUniqueField(it.obj, local)
+        return indirectAccess(newSymNode(it.closureParam), local, n.info)
 
     var closure = PEnv(idTableGet(o.lambdasToEnv, local))
     if local.kind == skClosureIterator: