ARC: ported the GC tests over to --gc:arc
This commit is contained in:
parent
879801c639
commit
72237e2bcf
14 changed files with 79 additions and 29 deletions
|
|
@ -135,6 +135,18 @@ proc GC_ref*[T](x: ref T) =
|
|||
## New runtime only supports this operation for 'ref T'.
|
||||
if x != nil: nimIncRef(cast[pointer](x))
|
||||
|
||||
template GC_fullCollect* =
|
||||
## Forces a full garbage collection pass. With ``--gc:arc`` a nop.
|
||||
discard
|
||||
|
||||
template setupForeignThreadGc* =
|
||||
## With ``--gc:arc`` a nop.
|
||||
discard
|
||||
|
||||
template tearDownForeignThreadGc* =
|
||||
## With ``--gc:arc`` a nop.
|
||||
discard
|
||||
|
||||
proc isObj(obj: PNimType, subclass: cstring): bool {.compilerRtl, inl.} =
|
||||
proc strstr(s, sub: cstring): cstring {.header: "<string.h>", importc.}
|
||||
|
||||
|
|
|
|||
|
|
@ -250,18 +250,19 @@ const ThisIsSystem = true
|
|||
proc internalNew*[T](a: var ref T) {.magic: "New", noSideEffect.}
|
||||
## Leaked implementation detail. Do not use.
|
||||
|
||||
proc new*[T](a: var ref T, finalizer: proc (x: ref T) {.nimcall.}) {.
|
||||
magic: "NewFinalize", noSideEffect.}
|
||||
## Creates a new object of type ``T`` and returns a safe (traced)
|
||||
## reference to it in ``a``.
|
||||
##
|
||||
## When the garbage collector frees the object, `finalizer` is called.
|
||||
## The `finalizer` may not keep a reference to the
|
||||
## object pointed to by `x`. The `finalizer` cannot prevent the GC from
|
||||
## freeing the object.
|
||||
##
|
||||
## **Note**: The `finalizer` refers to the type `T`, not to the object!
|
||||
## This means that for each object of type `T` the finalizer will be called!
|
||||
when not defined(gcDestructors):
|
||||
proc new*[T](a: var ref T, finalizer: proc (x: ref T) {.nimcall.}) {.
|
||||
magic: "NewFinalize", noSideEffect.}
|
||||
## Creates a new object of type ``T`` and returns a safe (traced)
|
||||
## reference to it in ``a``.
|
||||
##
|
||||
## When the garbage collector frees the object, `finalizer` is called.
|
||||
## The `finalizer` may not keep a reference to the
|
||||
## object pointed to by `x`. The `finalizer` cannot prevent the GC from
|
||||
## freeing the object.
|
||||
##
|
||||
## **Note**: The `finalizer` refers to the type `T`, not to the object!
|
||||
## This means that for each object of type `T` the finalizer will be called!
|
||||
|
||||
when defined(nimV2):
|
||||
proc reset*[T](obj: var T) {.magic: "Destroy", noSideEffect.}
|
||||
|
|
|
|||
|
|
@ -304,3 +304,12 @@ proc `$`*(x: uint64): string {.noSideEffect, raises: [].} =
|
|||
let half = i div 2
|
||||
# Reverse
|
||||
for t in 0 .. half-1: swap(result[t], result[i-t-1])
|
||||
|
||||
when defined(gcDestructors):
|
||||
proc GC_getStatistics*(): string =
|
||||
result = "[GC] total memory: "
|
||||
result.addInt getTotalMem()
|
||||
result.add "\n[GC] occupied memory: "
|
||||
result.addInt getOccupiedMem()
|
||||
result.add '\n'
|
||||
#"[GC] cycle collections: " & $gch.stat.cycleCollections & "\n" &
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue