diff options
-rw-r--r-- | compiler/lambdalifting.nim | 7 | ||||
-rwxr-xr-x | compiler/semstmts.nim | 5 | ||||
-rw-r--r-- | tests/compile/tircbot.nim | 20 | ||||
-rwxr-xr-x | todo.txt | 6 |
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 ============= |