ARC related bugfixes and refactorings (#12781)

This commit is contained in:
Andreas Rumpf 2019-12-05 16:59:06 +01:00 • committed by Miran
commit 3fbb3bfd3f
11 changed files with 381 additions and 367 deletions

View file

@ -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

View file

@ -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()

View file

@ -1,7 +1,7 @@
discard """
cmd: '''nim c --newruntime $file'''
output: '''OK 3
5 1'''
5 2'''
"""
import strutils, math