summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/lambdalifting.nim7
-rwxr-xr-xcompiler/semstmts.nim5
-rw-r--r--tests/compile/tircbot.nim20
-rwxr-xr-xtodo.txt6
4 files changed, 18 insertions, 20 deletions
diff --git a/compiler/lambdalifting.nim b/compiler/lambdalifting.nim
index 0748b99b3..5896615c0 100644
--- a/compiler/lambdalifting.nim
+++ b/compiler/lambdalifting.nim
@@ -538,9 +538,6 @@ proc liftLambdas*(fn: PSym, body: PNode): PNode =
   if body.kind == nkEmpty or gCmd == cmdCompileToEcmaScript:
     # ignore forward declaration:
     result = body
-  elif not containsNode(body, procDefs) and false:
-    # fast path: no inner procs, so no closure needed:
-    result = body
   else:
     var o = newOuterContext(fn)
     let ex = closureCreationPoint(body)
@@ -552,6 +549,10 @@ proc liftLambdas*(fn: PSym, body: PNode): PNode =
         InternalError(params.info, "liftLambdas: strange params")
       let param = params.sons[i].sym
       IdTablePut(o.localsToEnv, param, o.currentEnv)
+    # put the 'result' into the environment so it can be captured:
+    let ast = fn.ast
+    if resultPos < sonsLen(ast) and ast.sons[resultPos].kind == nkSym:
+      IdTablePut(o.localsToEnv, ast.sons[resultPos].sym, o.currentEnv)
     searchForInnerProcs(o, body)
     discard transformOuterProc(o, body)
     result = ex
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index 8a82e629a..2bd5898a7 100755
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -661,7 +661,7 @@ proc semLambda(c: PContext, n: PNode): PNode =
       LocalError(n.sons[bodyPos].info, errImplOfXNotAllowed, s.name.s)
     pushProcCon(c, s)
     addResult(c, s.typ.sons[0], n.info, skProc)
-    let semBody = hloBody(c, semStmtScope(c, n.sons[bodyPos]))
+    let semBody = hloBody(c, semProcBody(c, n.sons[bodyPos]))
     n.sons[bodyPos] = transformBody(c.module, semBody, s)
     addResultNode(c, n)
     popProcCon(c)
@@ -765,13 +765,14 @@ proc semProcAux(c: PContext, n: PNode, kind: TSymKind,
       pushProcCon(c, s)
       if s.typ.sons[0] != nil and kind != skIterator: 
         addResult(c, s.typ.sons[0], n.info, kind)
+        addResultNode(c, n)
       if sfImportc notin s.flags:
         # no semantic checking for importc:
         let semBody = hloBody(c, semProcBody(c, n.sons[bodyPos]))
         # unfortunately we cannot skip this step when in 'system.compiles'
         # context as it may even be evaluated in 'system.compiles':
         n.sons[bodyPos] = transformBody(c.module, semBody, s)
-      if s.typ.sons[0] != nil and kind != skIterator: addResultNode(c, n)
+      #if s.typ.sons[0] != nil and kind != skIterator: addResultNode(c, n)
       popProcCon(c)
     else: 
       if s.typ.sons[0] != nil and kind != skIterator:
diff --git a/tests/compile/tircbot.nim b/tests/compile/tircbot.nim
index e538a7e57..10482c3f6 100644
--- a/tests/compile/tircbot.nim
+++ b/tests/compile/tircbot.nim
@@ -426,21 +426,23 @@ proc handleIrc(irc: var TAsyncIRC, event: TIRCEvent, state: PState) =
       nil # TODO: ?
 
 proc open(port: TPort = TPort(5123)): PState =
-  new(result)
-  result.dispatcher = newDispatcher()
+  var res: PState
+  new(res)
+  res.dispatcher = newDispatcher()
   
-  result.hubPort = port
-  result.hubConnect()
+  res.hubPort = port
+  res.hubConnect()
   let hirc =
     proc (a: var TAsyncIRC, ev: TIRCEvent) =
-      handleIrc(a, ev, result)
+      handleIrc(a, ev, res)
   # Connect to the irc server.
-  result.ircClient = AsyncIrc(ircServer, nick = botNickname, user = botNickname,
+  res.ircClient = AsyncIrc(ircServer, nick = botNickname, user = botNickname,
                  joinChans = joinChans, ircEvent = hirc)
-  result.ircClient.connect()
-  result.dispatcher.register(result.ircClient)
+  res.ircClient.connect()
+  res.dispatcher.register(res.ircClient)
 
-  result.dbConnected = false
+  res.dbConnected = false
+  result = res
 
 var state = tircbot.open() # Connect to the website and the IRC server.
 
diff --git a/todo.txt b/todo.txt
index 03a619b66..53bd9d714 100755
--- a/todo.txt
+++ b/todo.txt
@@ -1,9 +1,3 @@
-version 0.9.0
-=============
-
-- fix tirc capture of 'result'
-
-
 version 0.9.2
 =============