mirror of
https://github.com/nim-lang/Nim.git
synced 2026-05-01 03:24:41 +00:00
ARC: ported the GC tests over to --gc:arc
This commit is contained in:
@@ -28,7 +28,7 @@ proc test(): auto =
|
||||
var (a, b, _) = test()
|
||||
|
||||
doAssert assign_counter == 0
|
||||
doAssert sink_counter == 12 # + 3 because of the conservative tuple unpacking transformation
|
||||
doAssert sink_counter == 9 # XXX this is still silly and needs to be investigated
|
||||
|
||||
# bug #11510
|
||||
proc main =
|
||||
|
||||
@@ -3,20 +3,28 @@ discard """
|
||||
disabled: "32bit"
|
||||
"""
|
||||
|
||||
from strutils import join
|
||||
|
||||
type
|
||||
TFoo * = object
|
||||
TFoo* = object
|
||||
id: int
|
||||
fn: proc(){.closure.}
|
||||
var foo_counter = 0
|
||||
var alive_foos = newseq[int](0)
|
||||
|
||||
proc free*(some: ref TFoo) =
|
||||
#echo "Tfoo #", some.id, " freed"
|
||||
alive_foos.del alive_foos.find(some.id)
|
||||
when defined(gcDestructors):
|
||||
proc `=destroy`(some: var TFoo) =
|
||||
alive_foos.del alive_foos.find(some.id)
|
||||
`=destroy`(some.fn)
|
||||
|
||||
else:
|
||||
proc free*(some: ref TFoo) =
|
||||
#echo "Tfoo #", some.id, " freed"
|
||||
alive_foos.del alive_foos.find(some.id)
|
||||
|
||||
proc newFoo*(): ref TFoo =
|
||||
new result, free
|
||||
when defined(gcDestructors):
|
||||
new result
|
||||
else:
|
||||
new result, free
|
||||
|
||||
result.id = foo_counter
|
||||
alive_foos.add result.id
|
||||
|
||||
@@ -10,7 +10,7 @@ type
|
||||
PModule = ref Module
|
||||
|
||||
Node = object
|
||||
owner*: PModule
|
||||
owner* {.cursor.}: PModule
|
||||
data*: array[0..200, char] # some fat to drain memory faster
|
||||
id: int
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ when defined(allow_print):
|
||||
else:
|
||||
const print = false
|
||||
|
||||
proc myResult3*(i:int):X {.exportc.} =
|
||||
proc myResult3*(i:int): X {.exportc.} =
|
||||
if print: echo "3"
|
||||
new(result)
|
||||
if print: echo "3-2"
|
||||
|
||||
@@ -2,11 +2,11 @@ discard """
|
||||
outputsub: "no leak: "
|
||||
"""
|
||||
|
||||
when defined(GC_setMaxPause):
|
||||
when declared(GC_setMaxPause):
|
||||
GC_setMaxPause 2_000
|
||||
|
||||
type
|
||||
TExpr = object {.inheritable.} ## abstract base class for an expression
|
||||
TExpr {.inheritable.} = object ## abstract base class for an expression
|
||||
PLiteral = ref TLiteral
|
||||
TLiteral = object of TExpr
|
||||
x: int
|
||||
@@ -15,7 +15,7 @@ type
|
||||
a, b: ref TExpr
|
||||
op2: string
|
||||
|
||||
method eval(e: ref TExpr): int =
|
||||
method eval(e: ref TExpr): int {.base.} =
|
||||
# override this base method
|
||||
quit "to override!"
|
||||
|
||||
@@ -30,7 +30,7 @@ proc newLit(x: int): ref TLiteral =
|
||||
result.x = x
|
||||
result.op1 = $getOccupiedMem()
|
||||
|
||||
proc newPlus(a, b: ref TExpr): ref TPlusExpr =
|
||||
proc newPlus(a, b: sink(ref TExpr)): ref TPlusExpr =
|
||||
new(result)
|
||||
result.a = a
|
||||
result.b = b
|
||||
|
||||
@@ -12,7 +12,8 @@ type
|
||||
proc makePair: PCyclic =
|
||||
new(result)
|
||||
new(result.sibling)
|
||||
result.sibling.sibling = result
|
||||
when not defined(gcDestructors):
|
||||
result.sibling.sibling = result
|
||||
|
||||
proc loop =
|
||||
for i in 0..10000:
|
||||
|
||||
@@ -19,8 +19,15 @@ var
|
||||
proc finalizer(x: StrongObject) =
|
||||
valid.excl(x.id)
|
||||
|
||||
when defined(gcDestructors):
|
||||
proc `=destroy`(x: var TMyObject) =
|
||||
valid.excl(x.id)
|
||||
|
||||
proc create: StrongObject =
|
||||
new(result, finalizer)
|
||||
when defined(gcDestructors):
|
||||
new(result)
|
||||
else:
|
||||
new(result, finalizer)
|
||||
result.id = gid
|
||||
valid.incl(gid)
|
||||
inc gid
|
||||
|
||||
Reference in New Issue
Block a user