diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2019-09-06 18:05:58 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2019-09-06 18:06:08 +0200 |
commit | e0f3e8432af6a64d01be089a2247565e1f754b3a (patch) | |
tree | 698b78046a5b513a824ffb8a442d76b05be2e94a | |
parent | 0e01a5f76ccae973666a23ccab77dfcb8745b2d2 (diff) | |
download | Nim-e0f3e8432af6a64d01be089a2247565e1f754b3a.tar.gz |
fixes a critical --gc:boehm regression
-rw-r--r-- | compiler/ccgexprs.nim | 4 | ||||
-rw-r--r-- | lib/system/mmdisp.nim | 8 |
2 files changed, 7 insertions, 5 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 253c67b24..fa3a1fb86 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -1193,6 +1193,8 @@ proc genDefault(p: BProc; n: PNode; d: var TLoc) = if d.k == locNone: getTemp(p, n.typ, d, needsInit=true) else: resetLoc(p, d) +proc trivialDestructor(s: PSym): bool {.inline.} = s.ast[bodyPos].len == 0 + proc rawGenNew(p: BProc, a: TLoc, sizeExpr: Rope) = var sizeExpr = sizeExpr let typ = a.t @@ -1210,7 +1212,7 @@ proc rawGenNew(p: BProc, a: TLoc, sizeExpr: Rope) = genAssignment(p, a, b, {}) else: let ti = genTypeInfo(p.module, typ, a.lode.info) - if bt.destructor != nil: + if bt.destructor != nil and not trivialDestructor(bt.destructor): # the prototype of a destructor is ``=destroy(x: var T)`` and that of a # finalizer is: ``proc (x: ref T) {.nimcall.}``. We need to check the calling # convention at least: diff --git a/lib/system/mmdisp.nim b/lib/system/mmdisp.nim index 47bb400a7..0d1bb1767 100644 --- a/lib/system/mmdisp.nim +++ b/lib/system/mmdisp.nim @@ -112,8 +112,8 @@ when defined(boehmgc): if result == nil: raiseOutOfMem() proc alloc0(size: Natural): pointer = result = alloc(size) - proc realloc(p: pointer, newsize: Natural): pointer = - result = boehmRealloc(p, newsize) + proc realloc(p: pointer, newSize: Natural): pointer = + result = boehmRealloc(p, newSize) if result == nil: raiseOutOfMem() proc dealloc(p: pointer) = boehmDealloc(p) @@ -122,8 +122,8 @@ when defined(boehmgc): if result == nil: raiseOutOfMem() proc allocShared0(size: Natural): pointer = result = allocShared(size) - proc reallocShared(p: pointer, newsize: Natural): pointer = - result = boehmRealloc(p, newsize) + proc reallocShared(p: pointer, newSize: Natural): pointer = + result = boehmRealloc(p, newSize) if result == nil: raiseOutOfMem() proc deallocShared(p: pointer) = boehmDealloc(p) |