diff options
author | Araq <rumpf_a@web.de> | 2014-08-05 21:38:27 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2014-08-05 21:38:27 +0200 |
commit | 053b34d91d5dd7d57cb3878a1286b351c67b217c (patch) | |
tree | 5acd00658ac12702602cc6ae4892e756b36095b2 /compiler | |
parent | 9673e4f2df941bfeeb3e1fe8e66d89fddea1145b (diff) | |
download | Nim-053b34d91d5dd7d57cb3878a1286b351c67b217c.tar.gz |
fixes yet another LL bug
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/lambdalifting.nim | 11 |
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: |