summary refs log blame commit diff stats
path: root/tests/arc/tclosureiter.nim
blob: e4a2ceac682563e930c5be63494744cb4e82f5a8 (plain) (tree)



































                                                                                                               
discard """
  cmd: '''nim c -d:nimAllocStats --gc:arc $file'''
  output: '''(allocCount: 102, deallocCount: 102)'''
"""

type
  FutureBase = ref object
    someData: string

const
  # Just to occupy some RAM
  BigData = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

iterator mainIter(): FutureBase {.closure.} =
  for x in 0 .. 100:
    var internalTmpFuture = FutureBase(someData: BigData)
    yield internalTmpFuture

proc main() =
  var nameIterVar = mainIter
  var next = nameIterVar()
  while not isNil(next):
    next = nameIterVar()
    if not isNil(next):
      doAssert next.someData.len == 97
    # GC_unref(next)
    # If you uncomment the GC_ref above,
    # the program basically uses no memory after the run.
    # but crashes with refc, which might indicate
    # that arc/orc simply never frees the result of "next"?
    if finished(nameIterVar):
      break

main()
GC_fullCollect()
echo getAllocStats()