ARC related bugfixes and refactorings (#12781)
This commit is contained in:
parent
9b0e874687
commit
3fbb3bfd3f
11 changed files with 381 additions and 367 deletions
29
tests/destructor/texceptions.nim
Normal file
29
tests/destructor/texceptions.nim
Normal 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
|
||||
47
tests/destructor/tgcleak4.nim
Normal file
47
tests/destructor/tgcleak4.nim
Normal 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()
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
discard """
|
||||
cmd: '''nim c --newruntime $file'''
|
||||
output: '''OK 3
|
||||
5 1'''
|
||||
5 2'''
|
||||
"""
|
||||
|
||||
import strutils, math
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue