diff options
author | Araq <rumpf_a@web.de> | 2012-06-24 17:17:29 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2012-06-24 17:17:29 +0200 |
commit | 022f3718a9bd2b23f083b9804ece335afde2c1ef (patch) | |
tree | a623f06453fb723e5d82236247b3dd5c132de916 /tests/gc | |
parent | d257f7fd36e594803fc1605d46dcf1e654f0e48b (diff) | |
download | Nim-022f3718a9bd2b23f083b9804ece335afde2c1ef.tar.gz |
added gcleak4.nim test; fails in debug mode
Diffstat (limited to 'tests/gc')
-rw-r--r-- | tests/gc/gcleak4.nim | 42 |
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() |