diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2019-03-23 00:12:05 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-23 00:12:05 +0100 |
commit | bf592c4e944e9cca8a2bb60f52b5b39388c4ed4c (patch) | |
tree | f5a7eddcae6fca19dd785a975e2f885f88ff8007 /lib/core | |
parent | 25649616ea5b6aba575149df3f9943f48a5ece31 (diff) | |
download | Nim-bf592c4e944e9cca8a2bb60f52b5b39388c4ed4c.tar.gz |
more destructor based changes (#10885)
* mark user defined destructors with sfOverriden to simplify the logic * refactoring in preparation to merge liftings and generic instantiations for destructors * ast: introduce nkHiddenTryStmt for destructor generation in order to be able to optimize better the code later on * renamed 'patterns' switch to 'trmacros' as it was totally misleading before * destructors: introduce tfCheckedForDestructor flag in preparation of strict =destroy checking * test for invalid/too late destructor introductions * liftdestructors: make code robust for nimsuggest * --newruntime works for hello world again * newruntime: code generation for closures
Diffstat (limited to 'lib/core')
-rw-r--r-- | lib/core/macros.nim | 2 | ||||
-rw-r--r-- | lib/core/runtime_v2.nim | 32 |
2 files changed, 26 insertions, 8 deletions
diff --git a/lib/core/macros.nim b/lib/core/macros.nim index e48df38f5..85eb597b2 100644 --- a/lib/core/macros.nim +++ b/lib/core/macros.nim @@ -78,7 +78,7 @@ type nnkEnumTy, nnkEnumFieldDef, nnkArglist, nnkPattern - nnkReturnToken, + nnkHiddenTryStmt, nnkClosure, nnkGotoState, nnkState, diff --git a/lib/core/runtime_v2.nim b/lib/core/runtime_v2.nim index 305a99fd3..6463a5a27 100644 --- a/lib/core/runtime_v2.nim +++ b/lib/core/runtime_v2.nim @@ -1,5 +1,5 @@ #[ -In this new runtime we simply the object layouts a bit: The runtime type +In this new runtime we simplify the object layouts a bit: The runtime type information is only accessed for the objects that have it and it's always at offset 0 then. The ``ref`` object header is independent from the runtime type and only contains a reference count. @@ -48,9 +48,18 @@ template `-!`(p: pointer, s: int): pointer = template head(p: pointer): ptr RefHeader = cast[ptr RefHeader](cast[int](p) -% sizeof(RefHeader)) +var allocs*: int + proc nimNewObj(size: int): pointer {.compilerRtl.} = - result = alloc0(size + sizeof(RefHeader)) +! sizeof(RefHeader) - # XXX Respect defined(useMalloc) here! + let s = size + sizeof(RefHeader) + when defined(nimscript): + discard + elif defined(useMalloc): + result = c_malloc(s) +! sizeof(RefHeader) + nimZeroMem(result, s) + else: + result = alloc0(s) +! sizeof(RefHeader) + inc allocs proc nimDecWeakRef(p: pointer) {.compilerRtl.} = dec head(p).rc @@ -59,10 +68,19 @@ proc nimIncWeakRef(p: pointer) {.compilerRtl.} = inc head(p).rc proc nimRawDispose(p: pointer) {.compilerRtl.} = - if head(p).rc != 0: - cstderr.rawWrite "[FATAL] dangling references exist\n" - quit 1 - dealloc(p -! sizeof(RefHeader)) + when not defined(nimscript): + if head(p).rc != 0: + cstderr.rawWrite "[FATAL] dangling references exist\n" + quit 1 + when defined(useMalloc): + c_free(p -! sizeof(RefHeader)) + else: + dealloc(p -! sizeof(RefHeader)) + if allocs > 0: + dec allocs + else: + cstderr.rawWrite "[FATAL] unpaired dealloc\n" + quit 1 proc nimDestroyAndDispose(p: pointer) {.compilerRtl.} = let d = cast[ptr PNimType](p)[].destructor |