summary refs log tree commit diff stats
path: root/lib/core
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2019-04-06 17:32:33 +0200
committerAraq <rumpf_a@web.de>2019-04-06 17:32:53 +0200
commit6e6a9a721fc039c88851650e4ab989aeff04fc9f (patch)
tree1cbcab26559355e7b7ee4dee87454956661dc5da /lib/core
parentfab75fbaf1a2dd94cedfc0b41173edf49b581c6e (diff)
downloadNim-6e6a9a721fc039c88851650e4ab989aeff04fc9f.tar.gz
destructors: we are cooking now
Diffstat (limited to 'lib/core')
-rw-r--r--lib/core/runtime_v2.nim8
-rw-r--r--lib/core/strs.nim20
2 files changed, 9 insertions, 19 deletions
diff --git a/lib/core/runtime_v2.nim b/lib/core/runtime_v2.nim
index 6463a5a27..f76fd2f3e 100644
--- a/lib/core/runtime_v2.nim
+++ b/lib/core/runtime_v2.nim
@@ -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
diff --git a/lib/core/strs.nim b/lib/core/strs.nim
index 7dd65bdb3..ccc261d95 100644
--- a/lib/core/strs.nim
+++ b/lib/core/strs.nim
@@ -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)