tarc.nim 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. discard """
  2. output: '''
  3. @[1, 2, 3]
  4. Success
  5. @["a", "b", "c"]
  6. Hello
  7. 1
  8. 2
  9. 0
  10. List
  11. '''
  12. cmd: '''nim c --gc:arc $file'''
  13. """
  14. import os
  15. import math
  16. import lists
  17. import strutils
  18. proc mkleak() =
  19. # allocate 1 MB via linked lists
  20. let numberOfLists = 100
  21. for i in countUp(1, numberOfLists):
  22. var leakList = initDoublyLinkedList[string]()
  23. let numberOfLeaks = 5000
  24. for j in countUp(1, numberOfLeaks):
  25. leakList.append(newString(200))
  26. proc mkManyLeaks() =
  27. for i in 0..0:
  28. mkleak()
  29. echo "Success"
  30. iterator foobar(c: string): seq[string] {.closure.} =
  31. yield @["a", "b", c]
  32. proc tsimpleClosureIterator =
  33. var myc = "c"
  34. for it in foobar(myc):
  35. echo it
  36. type
  37. LazyList = ref object
  38. c: proc() {.closure.}
  39. proc tlazyList =
  40. let dep = @[1, 2, 3]
  41. var x = LazyList(c: proc () = echo(dep))
  42. x.c()
  43. type
  44. Foo = ref object
  45. proc tleakingNewStmt =
  46. var x: Foo
  47. for i in 0..10:
  48. new(x)
  49. iterator infinite(): int {.closure.} =
  50. var i = 0
  51. while true:
  52. yield i
  53. inc i
  54. iterator take(it: iterator (): int, numToTake: int): int {.closure.} =
  55. var i = 0
  56. for x in it():
  57. if i >= numToTake:
  58. break
  59. yield x
  60. inc i
  61. proc take3 =
  62. for x in infinite.take(3):
  63. discard
  64. type
  65. A = ref object of RootObj
  66. x: int
  67. B = ref object of A
  68. more: string
  69. proc inheritanceBug(param: string) =
  70. var s: (A, A)
  71. s[0] = B(more: "a" & param)
  72. s[1] = B(more: "a" & param)
  73. type
  74. PAsyncHttpServer = ref object
  75. value: string
  76. proc serve(server: PAsyncHttpServer) = discard
  77. proc leakObjConstr =
  78. serve(PAsyncHttpServer(value: "asdas"))
  79. let startMem = getOccupiedMem()
  80. take3()
  81. tlazyList()
  82. inheritanceBug("whatever")
  83. mkManyLeaks()
  84. tsimpleClosureIterator()
  85. tleakingNewStmt()
  86. leakObjConstr()
  87. # bug #12964
  88. type
  89. Token* = ref object of RootObj
  90. Li* = ref object of Token
  91. proc bug12964*() =
  92. var token = Li()
  93. var tokens = @[Token()]
  94. tokens.add token
  95. bug12964()
  96. # bug #13119
  97. import streams
  98. proc bug13119 =
  99. var m = newStringStream("Hello world")
  100. let buffer = m.readStr(5)
  101. echo buffer
  102. m.close
  103. bug13119()
  104. # bug #13105
  105. type
  106. Result[T, E] = object
  107. a: T
  108. b: E
  109. D = ref object
  110. x: int
  111. R = Result[D, int]
  112. proc bug13105 =
  113. for n in [R(b: 1), R(b: 2)]:
  114. echo n.b
  115. bug13105()
  116. echo getOccupiedMem() - startMem
  117. #------------------------------------------------------------------------------
  118. # issue #14294
  119. import tables
  120. type
  121. TagKind = enum
  122. List = 0, Compound
  123. Tag = object
  124. case kind: TagKind
  125. of List:
  126. values: seq[Tag]
  127. of Compound:
  128. compound: Table[string, Tag]
  129. var a = Tag(kind: List)
  130. var b = a
  131. echo a.kind
  132. var c = a