diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2019-12-05 16:59:06 +0100 |
---|---|---|
committer | Miran <narimiran@disroot.org> | 2019-12-05 16:59:06 +0100 |
commit | 3fbb3bfd3f440c059d6290c12834a38a61da98f2 (patch) | |
tree | b4561f510b23ce4fe2a19e58e15246c5ec5293a0 /tests/destructor | |
parent | 9b0e874687177af4f758b70994b3a08f963a75cd (diff) | |
download | Nim-3fbb3bfd3f440c059d6290c12834a38a61da98f2.tar.gz |
ARC related bugfixes and refactorings (#12781)
Diffstat (limited to 'tests/destructor')
-rw-r--r-- | tests/destructor/texceptions.nim | 29 | ||||
-rw-r--r-- | tests/destructor/tgcleak4.nim | 47 | ||||
-rw-r--r-- | tests/destructor/tv2_raise.nim | 2 |
3 files changed, 77 insertions, 1 deletions
diff --git a/tests/destructor/texceptions.nim b/tests/destructor/texceptions.nim new file mode 100644 index 000000000..335ca23be --- /dev/null +++ b/tests/destructor/texceptions.nim @@ -0,0 +1,29 @@ +discard """ + cmd: '''nim c --gc:arc $file''' + output: '''0''' +""" + +proc other = + raise newException(ValueError, "stuff happening") + +proc indirectViaProcCall = + var correct = 0 + for i in 1 .. 20: + try: + other() + except: + let x = getCurrentException() + correct += ord(x of ValueError) + doAssert correct == 20 + +proc direct = + for i in 1 .. 20: + try: + raise newException(ValueError, "stuff happening") + except ValueError: + discard + +let mem = getOccupiedMem() +indirectViaProcCall() +direct() +echo getOccupiedMem() - mem diff --git a/tests/destructor/tgcleak4.nim b/tests/destructor/tgcleak4.nim new file mode 100644 index 000000000..4299c8841 --- /dev/null +++ b/tests/destructor/tgcleak4.nim @@ -0,0 +1,47 @@ +discard """ + outputsub: "no leak: " + cmd: "nim c --gc:arc $file" +""" +# bug #12758 +type + TExpr {.inheritable.} = object ## abstract base class for an expression + PLiteral = ref TLiteral + TLiteral = object of TExpr + x: int + op1: string + TPlusExpr = object of TExpr + a, b: ref TExpr + op2: string + +method eval(e: ref TExpr): int {.base.} = + # 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) + result.x = x + result.op1 = $getOccupiedMem() + +proc newPlus(a, b: ref TExpr): ref TPlusExpr = + new(result) + result.a = a + result.b = b + result.op2 = $getOccupiedMem() + +const Limit = when compileOption("gc", "markAndSweep") or compileOption("gc", "boehm"): 5*1024*1024 else: 500_000 + +for i in 0..100_000: + var s: array[0..11, ref TExpr] + for j in 0..high(s): + s[j] = newPlus(newPlus(newLit(j), newLit(2)), newLit(4)) + if eval(s[j]) != j+6: + quit "error: wrong result" + if getOccupiedMem() > Limit: quit("still a leak!") + +echo "no leak: ", getOccupiedMem() diff --git a/tests/destructor/tv2_raise.nim b/tests/destructor/tv2_raise.nim index 5795c08a0..dcc3b1b38 100644 --- a/tests/destructor/tv2_raise.nim +++ b/tests/destructor/tv2_raise.nim @@ -1,7 +1,7 @@ discard """ cmd: '''nim c --newruntime $file''' output: '''OK 3 -5 1''' +5 2''' """ import strutils, math |