diff options
author | Araq <rumpf_a@web.de> | 2012-11-26 08:47:57 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2012-11-26 08:47:57 +0100 |
commit | 2591ac0ada7f022b695b91f8ce9e5cfe1e7df299 (patch) | |
tree | a7543d5861638f15c75fce9758318ce78cb9c82e /compiler/semexprs.nim | |
parent | dd9ad9e49730cec954e9113f0136053c5020aafd (diff) | |
download | Nim-2591ac0ada7f022b695b91f8ce9e5cfe1e7df299.tar.gz |
'return' for first class iterators
Diffstat (limited to 'compiler/semexprs.nim')
-rwxr-xr-x | compiler/semexprs.nim | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 910100e92..e1d69c0bc 100755 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -1098,23 +1098,25 @@ proc semAsgn(c: PContext, n: PNode): PNode = asgnToResultVar(c, n, n.sons[0], n.sons[1]) result = n -proc SemReturn(c: PContext, n: PNode): PNode = +proc SemReturn(c: PContext, n: PNode): PNode = result = n checkSonsLen(n, 1) - if c.p.owner.kind notin {skConverter, skMethod, skProc, skMacro}: + if c.p.owner.kind in {skConverter, skMethod, skProc, skMacro} or + (c.p.owner.kind == skIterator and c.p.owner.typ.callConv == ccClosure): + if n.sons[0].kind != nkEmpty: + # transform ``return expr`` to ``result = expr; return`` + if c.p.resultSym != nil: + var a = newNodeI(nkAsgn, n.sons[0].info) + addSon(a, newSymNode(c.p.resultSym)) + addSon(a, n.sons[0]) + n.sons[0] = semAsgn(c, a) + # optimize away ``result = result``: + if n[0][1].kind == nkSym and n[0][1].sym == c.p.resultSym: + n.sons[0] = ast.emptyNode + else: + LocalError(n.info, errNoReturnTypeDeclared) + else: LocalError(n.info, errXNotAllowedHere, "\'return\'") - elif n.sons[0].kind != nkEmpty: - # transform ``return expr`` to ``result = expr; return`` - if c.p.resultSym != nil: - var a = newNodeI(nkAsgn, n.sons[0].info) - addSon(a, newSymNode(c.p.resultSym)) - addSon(a, n.sons[0]) - n.sons[0] = semAsgn(c, a) - # optimize away ``result = result``: - if n[0][1].kind == nkSym and n[0][1].sym == c.p.resultSym: - n.sons[0] = ast.emptyNode - else: - LocalError(n.info, errNoReturnTypeDeclared) proc semProcBody(c: PContext, n: PNode): PNode = openScope(c.tab) |