mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-12 22:33:49 +00:00
gc_regions: cleanup & fixes for deallocation (#11920)
* gc_regions: withRegion nows return the modified MemRegion * gc_regions: make withScratchRegion dealloc correctly * tests/gc: add tregionleak test This test checks if memory within regions are freed properly.
This commit is contained in:
@@ -87,13 +87,13 @@ var
|
||||
tlRegion {.threadVar.}: MemRegion
|
||||
# tempStrRegion {.threadVar.}: MemRegion # not yet used
|
||||
|
||||
template withRegion*(r: MemRegion; body: untyped) =
|
||||
template withRegion*(r: var MemRegion; body: untyped) =
|
||||
let oldRegion = tlRegion
|
||||
tlRegion = r
|
||||
try:
|
||||
body
|
||||
finally:
|
||||
#r = tlRegion
|
||||
r = tlRegion
|
||||
tlRegion = oldRegion
|
||||
|
||||
template inc(p: pointer, s: int) =
|
||||
@@ -262,14 +262,13 @@ when false:
|
||||
setObstackPtr(obs)
|
||||
|
||||
template withScratchRegion*(body: untyped) =
|
||||
var scratch: MemRegion
|
||||
let oldRegion = tlRegion
|
||||
tlRegion = scratch
|
||||
tlRegion = MemRegion()
|
||||
try:
|
||||
body
|
||||
finally:
|
||||
deallocAll()
|
||||
tlRegion = oldRegion
|
||||
deallocAll(scratch)
|
||||
|
||||
when false:
|
||||
proc joinRegion*(dest: var MemRegion; src: MemRegion) =
|
||||
|
||||
23
tests/gc/tregionleak.nim
Normal file
23
tests/gc/tregionleak.nim
Normal file
@@ -0,0 +1,23 @@
|
||||
discard """
|
||||
cmd: '''nim c --gc:regions $file'''
|
||||
output: '''
|
||||
finalized
|
||||
finalized
|
||||
'''
|
||||
"""
|
||||
|
||||
proc finish(o: RootRef) =
|
||||
echo "finalized"
|
||||
|
||||
withScratchRegion:
|
||||
var test: RootRef
|
||||
new(test, finish)
|
||||
|
||||
var
|
||||
mr: MemRegion
|
||||
test: RootRef
|
||||
|
||||
withRegion(mr):
|
||||
new(test, finish)
|
||||
|
||||
deallocAll(mr)
|
||||
Reference in New Issue
Block a user