destructors: we are cooking now

This commit is contained in:
Araq 2019-04-06 17:32:33 +02:00
commit 6e6a9a721f
9 changed files with 73 additions and 43 deletions

View file

@ -26,14 +26,6 @@ hash of ``package & "." & module & "." & name`` to save space.
]#
type
TNimNode {.compilerProc.} = object # to keep the code generator simple
DestructorProc = proc (p: pointer) {.nimcall, benign.}
TNimType {.compilerProc.} = object
destructor: pointer
size: int
name: cstring
PNimType = ptr TNimType
RefHeader = object
rc: int # the object header is now a single RC field.
# we could remove it in non-debug builds but this seems

View file

@ -177,17 +177,15 @@ proc nimAsgnStrV2(a: var NimStringV2, b: NimStringV2) {.compilerRtl.} =
frees(a)
a.len = b.len
a.p = b.p
elif isLiteral(a) or a.p.cap < b.len:
let allocator = if a.p != nil and a.p.allocator != nil: a.p.allocator else: getLocalAllocator()
# we have to allocate the 'cap' here, consider
# 'let y = newStringOfCap(); var x = y'
# on the other hand... These get turned into moves now.
a.p = cast[ptr NimStrPayload](allocator.alloc(allocator, contentSize(b.len)))
a.p.allocator = allocator
a.p.cap = b.len
a.len = b.len
copyMem(unsafeAddr a.p.data[0], unsafeAddr b.p.data[0], b.len+1)
else:
if isLiteral(a) or a.p.cap < b.len:
let allocator = if a.p != nil and a.p.allocator != nil: a.p.allocator else: getLocalAllocator()
# we have to allocate the 'cap' here, consider
# 'let y = newStringOfCap(); var x = y'
# on the other hand... These get turned into moves now.
frees(a)
a.p = cast[ptr NimStrPayload](allocator.alloc(allocator, contentSize(b.len)))
a.p.allocator = allocator
a.p.cap = b.len
a.len = b.len
# reuse the storage we already have:
copyMem(unsafeAddr a.p.data[0], unsafeAddr b.p.data[0], b.len+1)

View file

@ -2971,6 +2971,30 @@ proc compiles*(x: untyped): bool {.magic: "Compiles", noSideEffect, compileTime.
when not defined(js) and not defined(nimscript):
include "system/ansi_c"
when not defined(js):
{.push stackTrace:off.}
when hasThreadSupport and hostOS != "standalone":
const insideRLocksModule = false
include "system/syslocks"
include "system/threadlocalstorage"
when defined(nimV2):
type
TNimNode {.compilerProc.} = object # to keep the code generator simple
DestructorProc = proc (p: pointer) {.nimcall, benign.}
TNimType {.compilerProc.} = object
destructor: pointer
size: int
name: cstring
PNimType = ptr TNimType
when defined(gcDestructors) and not defined(nimscript):
include "core/strs"
include "core/seqs"
{.pop.}
when not declared(sysFatal):
include "system/fatal"
@ -3481,15 +3505,6 @@ when not defined(JS): #and not defined(nimscript):
when defined(endb):
proc endbStep()
when hasThreadSupport and hostOS != "standalone":
const insideRLocksModule = false
include "system/syslocks"
include "system/threadlocalstorage"
when defined(gcDestructors) and not defined(nimscript):
include "core/strs"
include "core/seqs"
when declared(newSeq):
proc cstringArrayToSeq*(a: cstringArray, len: Natural): seq[string] =
## Converts a ``cstringArray`` to a ``seq[string]``. `a` is supposed to be