blob: 87d7e73f9ddd915d42fecacd127218e7cf6749e4 (
plain) (
tree)
|
|
discard """
output: "success"
cmd: "nim c --gc:orc $file"
"""
# issue #15076
import deques, strutils, asyncdispatch
proc doNothing(): Future[void] =
#[
var
:env
:env_1
try:
`=destroy`(:env)
internalNew(:env)
`=sink`(:env.retFuture1, newFuture("doNothing"))
`=destroy_1`(:env_1)
internalNew(:env_1)
`=`(:env_1.:up, :env)
`=sink_1`(:env.nameIterVar2, (doNothingIter, :env_1))
(doNothingNimAsyncContinue, :env)()
return `=_1`(result, :env.retFuture1)
finally:
`=destroy`(:env)
]#
var retFuture = newFuture[void]("doNothing")
iterator doNothingIter(): FutureBase {.closure.} =
# inspected ARC code: looks correct!
block:
var qqq = initDeque[string]()
for i in 0 .. 1000:
qqq.addLast($i)
complete(retFuture) # env.up.retFuture1
var nameIterVar = doNothingIter # iter_Env -> retFuture ->
proc doNothingNimAsyncContinue() {.closure.} =
# inspected ARC code: looks correct
if not nameIterVar.finished:
var next_gensym0 = nameIterVar()
while (not next_gensym0.isNil) and next_gensym0.finished:
next_gensym0 = nameIterVar()
if nameIterVar.finished:
break
if next_gensym0 != nil:
{.gcsafe.}:
next_gensym0.addCallback cast[proc () {.closure, gcsafe.}](doNothingNimAsyncContinue)
doNothingNimAsyncContinue()
return retFuture
proc main(): Future[void] =
template await[T](f_gensym12: Future[T]): auto {.used.} =
var internalTmpFuture_gensym12: FutureBase = f_gensym12
yield internalTmpFuture_gensym12
(cast[typeof(f_gensym12)](internalTmpFuture_gensym12)).read()
var retFuture = newFuture[void]("main")
iterator mainIter(): FutureBase {.closure.} =
block:
for x in 0 .. 1000:
await doNothing()
complete(retFuture)
var nameIterVar_gensym11 = mainIter
proc mainNimAsyncContinue() {.closure.} =
if not nameIterVar_gensym11.finished:
var next_gensym11 = unown nameIterVar_gensym11()
while (not next_gensym11.isNil) and next_gensym11.finished:
next_gensym11 = unown nameIterVar_gensym11()
if nameIterVar_gensym11.finished:
break
if next_gensym11 != nil:
{.gcsafe.}:
next_gensym11.addCallback cast[proc () {.closure, gcsafe.}](mainNimAsyncContinue)
mainNimAsyncContinue()
return retFuture
for i in 0..9:
waitFor main()
GC_fullCollect()
doAssert getOccupiedMem() < 1024
echo "success"
|