bugfix: invoking a generic iterator twice triggers a code gen bug (titer2)
This commit is contained in:
parent
8b6f9ef5e8
commit
c3f11d1637
5 changed files with 24 additions and 19 deletions
|
|
@ -472,6 +472,7 @@ proc transformFor(c: PTransf, n: PNode): PTransNode =
|
|||
# generate access statements for the parameters (unless they are constant)
|
||||
# put mapping from formal parameters to actual parameters
|
||||
if n.kind != nkForStmt: InternalError(n.info, "transformFor")
|
||||
#echo "transforming: ", renderTree(n)
|
||||
result = newTransNode(nkStmtList, n.info, 0)
|
||||
var length = sonsLen(n)
|
||||
var loopBody = transformLoopBody(c, n.sons[length-1])
|
||||
|
|
@ -480,14 +481,13 @@ proc transformFor(c: PTransf, n: PNode): PTransNode =
|
|||
addVar(v, copyTree(n.sons[i])) # declare new vars
|
||||
add(result, v.ptransNode)
|
||||
var call = n.sons[length - 2]
|
||||
if (call.kind != nkCall) or (call.sons[0].kind != nkSym):
|
||||
if call.kind != nkCall or call.sons[0].kind != nkSym:
|
||||
InternalError(call.info, "transformFor")
|
||||
|
||||
var newC = newTransCon(call.sons[0].sym)
|
||||
newC.forStmt = n
|
||||
newC.forLoopBody = loopBody
|
||||
if (newC.owner.kind != skIterator):
|
||||
InternalError(call.info, "transformFor")
|
||||
if newC.owner.kind != skIterator: InternalError(call.info, "transformFor")
|
||||
# generate access statements for the parameters (unless they are constant)
|
||||
pushTransCon(c, newC)
|
||||
for i in countup(1, sonsLen(call) - 1):
|
||||
|
|
@ -512,6 +512,8 @@ proc transformFor(c: PTransf, n: PNode): PTransNode =
|
|||
dec(c.inlining)
|
||||
popInfoContext()
|
||||
popTransCon(c)
|
||||
#echo "transformed: ", renderTree(n)
|
||||
|
||||
|
||||
proc getMagicOp(call: PNode): TMagic =
|
||||
if call.sons[0].kind == nkSym and
|
||||
|
|
@ -660,7 +662,7 @@ proc transformCall(c: PTransf, n: PNode): PTransNode =
|
|||
inc(j)
|
||||
add(result, transform(c, a))
|
||||
if len(result) == 2: result = result[1]
|
||||
elif (n.sons[0].kind == nkSym) and (n.sons[0].sym.kind == skMethod):
|
||||
elif n.sons[0].kind == nkSym and n.sons[0].sym.kind == skMethod:
|
||||
# use the dispatcher for the call:
|
||||
result = methodCall(transformSons(c, n).pnode).ptransNode
|
||||
else:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue