summary refs log tree commit diff stats
path: root/tests/gc
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2012-06-24 17:17:29 +0200
committerAraq <rumpf_a@web.de>2012-06-24 17:17:29 +0200
commit022f3718a9bd2b23f083b9804ece335afde2c1ef (patch)
treea623f06453fb723e5d82236247b3dd5c132de916 /tests/gc
parentd257f7fd36e594803fc1605d46dcf1e654f0e48b (diff)
downloadNim-022f3718a9bd2b23f083b9804ece335afde2c1ef.tar.gz
added gcleak4.nim test; fails in debug mode
Diffstat (limited to 'tests/gc')
-rw-r--r--tests/gc/gcleak4.nim42
1 files changed, 42 insertions, 0 deletions
diff --git a/tests/gc/gcleak4.nim b/tests/gc/gcleak4.nim
new file mode 100644
index 000000000..13a82c7f4
--- /dev/null
+++ b/tests/gc/gcleak4.nim
@@ -0,0 +1,42 @@
+discard """
+  outputsub: "no leak: "
+"""
+
+when defined(GC_setMaxPause):
+  GC_setMaxPause 2_000
+
+type
+  TExpr = object ## abstract base class for an expression
+  PLiteral = ref TLiteral
+  TLiteral = object of TExpr
+    x: int
+  TPlusExpr = object of TExpr
+    a, b: ref TExpr
+    
+method eval(e: ref TExpr): int =
+  # override this base method
+  quit "to override!"
+
+method eval(e: ref TLiteral): int = return e.x
+
+method eval(e: ref TPlusExpr): int =
+  # watch out: relies on dynamic binding
+  return eval(e.a) + eval(e.b)
+
+proc newLit(x: int): ref TLiteral =
+  new(result)
+  {.watchpoint: result.}
+  result.x = x
+  
+proc newPlus(a, b: ref TExpr): ref TPlusExpr =
+  new(result)
+  {.watchpoint: result.}
+  result.a = a
+  result.b = b
+
+for i in 0..100_000:
+  if eval(newPlus(newPlus(newLit(1), newLit(2)), newLit(4))) != 7:
+    quit "error: wrong result"
+  if getOccupiedMem() > 3000_000: quit("still a leak!")
+
+echo "no leak: ", getOccupiedMem()