some progress on bug #12443
This commit is contained in:
parent
cbbc2cc237
commit
7192b13609
5 changed files with 45 additions and 26 deletions
|
|
@ -636,7 +636,8 @@ proc reverseDestroys(destroys: seq[PNode]): seq[PNode] =
|
||||||
result.add destroys[i]
|
result.add destroys[i]
|
||||||
|
|
||||||
proc injectDestructorCalls*(g: ModuleGraph; owner: PSym; n: PNode): PNode =
|
proc injectDestructorCalls*(g: ModuleGraph; owner: PSym; n: PNode): PNode =
|
||||||
if sfGeneratedOp in owner.flags or (owner.kind == skIterator and isInlineIterator(owner.typ)): return n
|
if sfGeneratedOp in owner.flags or (owner.kind == skIterator and isInlineIterator(owner.typ)):
|
||||||
|
return n
|
||||||
var c: Con
|
var c: Con
|
||||||
c.owner = owner
|
c.owner = owner
|
||||||
c.destroys = newNodeI(nkStmtList, n.info)
|
c.destroys = newNodeI(nkStmtList, n.info)
|
||||||
|
|
|
||||||
|
|
@ -245,7 +245,7 @@ proc liftIterSym*(g: ModuleGraph; n: PNode; owner: PSym): PNode =
|
||||||
var env: PNode
|
var env: PNode
|
||||||
if owner.isIterator:
|
if owner.isIterator:
|
||||||
let it = getHiddenParam(g, owner)
|
let it = getHiddenParam(g, owner)
|
||||||
addUniqueField(it.typ.sons[0], hp, g.cache)
|
addUniqueField(it.typ.skipTypes({tyOwned}).sons[0], hp, g.cache)
|
||||||
env = indirectAccess(newSymNode(it), hp, hp.info)
|
env = indirectAccess(newSymNode(it), hp, hp.info)
|
||||||
else:
|
else:
|
||||||
let e = newSym(skLet, iter.name, owner, n.info)
|
let e = newSym(skLet, iter.name, owner, n.info)
|
||||||
|
|
|
||||||
|
|
@ -670,7 +670,7 @@ proc semForVars(c: PContext, n: PNode; flags: TExprFlags): PNode =
|
||||||
result = n
|
result = n
|
||||||
var length = len(n)
|
var length = len(n)
|
||||||
let iterBase = n.sons[length-2].typ
|
let iterBase = n.sons[length-2].typ
|
||||||
var iter = skipTypes(iterBase, {tyGenericInst, tyAlias, tySink})
|
var iter = skipTypes(iterBase, {tyGenericInst, tyAlias, tySink, tyOwned})
|
||||||
var iterAfterVarLent = iter.skipTypes({tyLent, tyVar})
|
var iterAfterVarLent = iter.skipTypes({tyLent, tyVar})
|
||||||
# length == 3 means that there is one for loop variable
|
# length == 3 means that there is one for loop variable
|
||||||
# and thus no tuple unpacking:
|
# and thus no tuple unpacking:
|
||||||
|
|
@ -717,14 +717,14 @@ proc semForVars(c: PContext, n: PNode; flags: TExprFlags): PNode =
|
||||||
if n.sons[i].kind == nkVarTuple:
|
if n.sons[i].kind == nkVarTuple:
|
||||||
var mutable = false
|
var mutable = false
|
||||||
var isLent = false
|
var isLent = false
|
||||||
iter[i] = case iter[i].kind
|
case iter[i].kind
|
||||||
of tyVar:
|
of tyVar:
|
||||||
mutable = true
|
mutable = true
|
||||||
iter[i].skipTypes({tyVar})
|
iter[i] = iter[i].skipTypes({tyVar})
|
||||||
of tyLent:
|
of tyLent:
|
||||||
isLent = true
|
isLent = true
|
||||||
iter[i].skipTypes({tyLent})
|
iter[i] = iter[i].skipTypes({tyLent})
|
||||||
else: iter[i]
|
else: discard
|
||||||
|
|
||||||
if len(n[i])-1 != len(iter[i]):
|
if len(n[i])-1 != len(iter[i]):
|
||||||
localError(c.config, n[i].info, errWrongNumberOfVariables)
|
localError(c.config, n[i].info, errWrongNumberOfVariables)
|
||||||
|
|
@ -871,8 +871,7 @@ proc semFor(c: PContext, n: PNode; flags: TExprFlags): PNode =
|
||||||
result.kind = nkParForStmt
|
result.kind = nkParForStmt
|
||||||
else:
|
else:
|
||||||
result = semForFields(c, n, call.sons[0].sym.magic)
|
result = semForFields(c, n, call.sons[0].sym.magic)
|
||||||
elif isCallExpr and call.sons[0].typ.callConv == ccClosure and
|
elif isCallExpr and isClosureIterator(call.sons[0].typ.skipTypes(abstractInst)):
|
||||||
tfIterator in call.sons[0].typ.flags:
|
|
||||||
# first class iterator:
|
# first class iterator:
|
||||||
result = semForVars(c, n, flags)
|
result = semForVars(c, n, flags)
|
||||||
elif not isCallExpr or call.sons[0].kind != nkSym or
|
elif not isCallExpr or call.sons[0].kind != nkSym or
|
||||||
|
|
@ -1984,6 +1983,9 @@ proc semIterator(c: PContext, n: PNode): PNode =
|
||||||
s.typ.callConv = ccInline
|
s.typ.callConv = ccInline
|
||||||
if n.sons[bodyPos].kind == nkEmpty and s.magic == mNone:
|
if n.sons[bodyPos].kind == nkEmpty and s.magic == mNone:
|
||||||
localError(c.config, n.info, errImplOfXexpected % s.name.s)
|
localError(c.config, n.info, errImplOfXexpected % s.name.s)
|
||||||
|
if optOwnedRefs in c.config.globalOptions and result.typ != nil:
|
||||||
|
result.typ = makeVarType(c, result.typ, tyOwned)
|
||||||
|
result.typ.callConv = ccClosure
|
||||||
|
|
||||||
proc semProc(c: PContext, n: PNode): PNode =
|
proc semProc(c: PContext, n: PNode): PNode =
|
||||||
result = semProcAux(c, n, skProc, procPragmas)
|
result = semProcAux(c, n, skProc, procPragmas)
|
||||||
|
|
|
||||||
|
|
@ -608,7 +608,7 @@ proc transformFor(c: PTransf, n: PNode): PTransNode =
|
||||||
return result
|
return result
|
||||||
c.breakSyms.add(labl)
|
c.breakSyms.add(labl)
|
||||||
if call.kind notin nkCallKinds or call.sons[0].kind != nkSym or
|
if call.kind notin nkCallKinds or call.sons[0].kind != nkSym or
|
||||||
call.sons[0].typ.callConv == ccClosure:
|
call.sons[0].typ.skipTypes(abstractInst).callConv == ccClosure:
|
||||||
result[1] = n.PTransNode
|
result[1] = n.PTransNode
|
||||||
result[1][^1] = transformLoopBody(c, n[^1])
|
result[1][^1] = transformLoopBody(c, n[^1])
|
||||||
result[1][^2] = transform(c, n[^2])
|
result[1][^2] = transform(c, n[^2])
|
||||||
|
|
|
||||||
|
|
@ -44,5 +44,21 @@ ok0()
|
||||||
var ok1 = say
|
var ok1 = say
|
||||||
ok1()
|
ok1()
|
||||||
|
|
||||||
|
when false:
|
||||||
|
# bug #12443
|
||||||
|
func newStringIterator(s: string): owned(iterator(): char) =
|
||||||
|
result = iterator(): char =
|
||||||
|
var pos = 0
|
||||||
|
while pos < s.len:
|
||||||
|
yield s[pos]
|
||||||
|
inc pos
|
||||||
|
|
||||||
|
proc stringIter() =
|
||||||
|
let si = newStringIterator("foo")
|
||||||
|
for i in si():
|
||||||
|
echo i
|
||||||
|
|
||||||
|
stringIter()
|
||||||
|
|
||||||
let (a, d) = allocCounters()
|
let (a, d) = allocCounters()
|
||||||
discard cprintf("%ld %ld alloc/dealloc pairs: %ld\n", a, d, system.allocs)
|
discard cprintf("%ld %ld alloc/dealloc pairs: %ld\n", a, d, system.allocs)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue