summary refs log tree commit diff stats
path: root/tests/gc
diff options
context:
space:
mode:
authorZahary Karadjov <zahary@gmail.com>2012-11-22 21:57:37 +0200
committerZahary Karadjov <zahary@gmail.com>2012-11-22 21:57:37 +0200
commitad53e0b022cb50bc069cfb9d196c3a11b4205b44 (patch)
treea7d35b24fcbf2696b7851e199d808ca2ad08fd7c /tests/gc
parent338683a1980e32fb31d8a09e0308e422b883e686 (diff)
downloadNim-ad53e0b022cb50bc069cfb9d196c3a11b4205b44.tar.gz
added 2 GC leak test cases
Diffstat (limited to 'tests/gc')
-rw-r--r--tests/gc/cycleleak.nim42
-rw-r--r--tests/gc/stackrefleak.nim33
2 files changed, 75 insertions, 0 deletions
diff --git a/tests/gc/cycleleak.nim b/tests/gc/cycleleak.nim
new file mode 100644
index 000000000..0a0f2c540
--- /dev/null
+++ b/tests/gc/cycleleak.nim
@@ -0,0 +1,42 @@
+discard """
+  outputsub: "no leak: "
+"""
+
+type
+  Module = object
+    nodes*: seq[PNode]
+
+  PModule = ref Module
+
+  Node = object
+    owner*: PModule
+    data*: array[0..200, char] # some fat to drain memory faster
+
+  PNode = ref Node
+
+proc newNode(owner: PModule): PNode =
+  new(result)
+  result.owner = owner
+
+proc compileModule: PModule =
+  new(result)
+  result.nodes = @[]
+  for i in 0..100:
+    result.nodes.add newNode(result)
+
+var gModuleCache: PModule
+
+proc loop =
+  for i in 0..10000:
+    gModuleCache = compileModule()
+    gModuleCache = nil
+    GC_fullCollect()
+
+  if getOccupiedMem() > 300_000:
+    echo "still a leak! ", getOccupiedMem()
+    quit(1)
+  else:
+    echo "no leak: ", getOccupiedMem()
+
+loop()
+
diff --git a/tests/gc/stackrefleak.nim b/tests/gc/stackrefleak.nim
new file mode 100644
index 000000000..2c652d6bf
--- /dev/null
+++ b/tests/gc/stackrefleak.nim
@@ -0,0 +1,33 @@
+discard """
+  outputsub: "no leak: "
+"""
+
+type
+  Cyclic = object
+    sibling: PCyclic
+    data: array[0..200, char]
+
+  PCyclic = ref Cyclic
+
+proc makePair: PCyclic =
+  new(result)
+  new(result.sibling)
+  result.sibling.sibling = result
+
+proc loop =
+  for i in 0..10000:
+    var x = makePair()
+    GC_fullCollect()
+    x = nil
+    GC_fullCollect()
+
+  if getOccupiedMem() > 300_000:
+    echo "still a leak! ", getOccupiedMem()
+    quit(1)
+  else:
+    echo "no leak: ", getOccupiedMem()
+
+loop()
+
+
+