commit
d2d851a1f3
1 changed files with 11 additions and 14 deletions
|
|
@ -445,6 +445,15 @@ proc gcInvariant*() =
|
||||||
markForDebug(gch)
|
markForDebug(gch)
|
||||||
{.pop.}
|
{.pop.}
|
||||||
|
|
||||||
|
template setFrameInfo(c: PCell) =
|
||||||
|
when leakDetector:
|
||||||
|
if framePtr != nil and framePtr.prev != nil:
|
||||||
|
c.filename = framePtr.prev.filename
|
||||||
|
c.line = framePtr.prev.line
|
||||||
|
else:
|
||||||
|
c.filename = nil
|
||||||
|
c.line = 0
|
||||||
|
|
||||||
proc rawNewObj(typ: PNimType, size: int, gch: var GcHeap): pointer =
|
proc rawNewObj(typ: PNimType, size: int, gch: var GcHeap): pointer =
|
||||||
# generates a new object and sets its reference counter to 0
|
# generates a new object and sets its reference counter to 0
|
||||||
sysAssert(allocInv(gch.region), "rawNewObj begin")
|
sysAssert(allocInv(gch.region), "rawNewObj begin")
|
||||||
|
|
@ -455,13 +464,7 @@ proc rawNewObj(typ: PNimType, size: int, gch: var GcHeap): pointer =
|
||||||
gcAssert((cast[ByteAddress](res) and (MemAlign-1)) == 0, "newObj: 2")
|
gcAssert((cast[ByteAddress](res) and (MemAlign-1)) == 0, "newObj: 2")
|
||||||
# now it is buffered in the ZCT
|
# now it is buffered in the ZCT
|
||||||
res.typ = typ
|
res.typ = typ
|
||||||
when leakDetector:
|
setFrameInfo(res)
|
||||||
res.filename = nil
|
|
||||||
res.line = 0
|
|
||||||
when not hasThreadSupport:
|
|
||||||
if framePtr != nil and framePtr.prev != nil:
|
|
||||||
res.filename = framePtr.prev.filename
|
|
||||||
res.line = framePtr.prev.line
|
|
||||||
# refcount is zero, color is black, but mark it to be in the ZCT
|
# refcount is zero, color is black, but mark it to be in the ZCT
|
||||||
res.refcount = ZctFlag
|
res.refcount = ZctFlag
|
||||||
sysAssert(isAllocatedPtr(gch.region, res), "newObj: 3")
|
sysAssert(isAllocatedPtr(gch.region, res), "newObj: 3")
|
||||||
|
|
@ -510,13 +513,7 @@ proc newObjRC1(typ: PNimType, size: int): pointer {.compilerRtl.} =
|
||||||
sysAssert((cast[ByteAddress](res) and (MemAlign-1)) == 0, "newObj: 2")
|
sysAssert((cast[ByteAddress](res) and (MemAlign-1)) == 0, "newObj: 2")
|
||||||
# now it is buffered in the ZCT
|
# now it is buffered in the ZCT
|
||||||
res.typ = typ
|
res.typ = typ
|
||||||
when leakDetector:
|
setFrameInfo(res)
|
||||||
res.filename = nil
|
|
||||||
res.line = 0
|
|
||||||
when not hasThreadSupport:
|
|
||||||
if framePtr != nil and framePtr.prev != nil:
|
|
||||||
res.filename = framePtr.prev.filename
|
|
||||||
res.line = framePtr.prev.line
|
|
||||||
res.refcount = rcIncrement # refcount is 1
|
res.refcount = rcIncrement # refcount is 1
|
||||||
sysAssert(isAllocatedPtr(gch.region, res), "newObj: 3")
|
sysAssert(isAllocatedPtr(gch.region, res), "newObj: 3")
|
||||||
when logGC: writeCell("new cell", res)
|
when logGC: writeCell("new cell", res)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue