summary refs log blame commit diff stats
path: root/tests/arc/tasyncleak2.nim
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"