summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorEduardo Bart <edub4rt@gmail.com>2017-10-09 17:55:12 -0300
committerAndreas Rumpf <rumpf_a@web.de>2017-10-09 22:55:12 +0200
commitedefe4db21e64d751d503e55e502849ea2bbd6ed (patch)
tree991e3fd845aec3ee69c9a0cf823bc9ac58329214 /lib
parentd8746398c43cae51d80b32ac182ab12a64710286 (diff)
downloadNim-edefe4db21e64d751d503e55e502849ea2bbd6ed.tar.gz
Futher improve seq assingment speed by 2x factor (#6437)
Diffstat (limited to 'lib')
-rw-r--r--lib/system/assign.nim8
1 files changed, 6 insertions, 2 deletions
diff --git a/lib/system/assign.nim b/lib/system/assign.nim
index 115df61a7..f061c89cf 100644
--- a/lib/system/assign.nim
+++ b/lib/system/assign.nim
@@ -61,13 +61,17 @@ proc genericAssignAux(dest, src: pointer, mt: PNimType, shallow: bool) =
       unsureAsgnRef(x, s2)
       return
     sysAssert(dest != nil, "genericAssignAux 3")
-    unsureAsgnRef(x, newSeq(mt, seq.len))
-    var dst = cast[ByteAddress](cast[PPointer](dest)[])
     if ntfNoRefs in mt.base.flags:
+      var ss = nimNewSeqOfCap(mt, seq.len)
+      cast[PGenericSeq](ss).len = seq.len
+      unsureAsgnRef(x, ss)
+      var dst = cast[ByteAddress](cast[PPointer](dest)[])
       copyMem(cast[pointer](dst +% GenericSeqSize),
               cast[pointer](cast[ByteAddress](s2) +% GenericSeqSize),
               seq.len * mt.base.size)
     else:
+      unsureAsgnRef(x, newSeq(mt, seq.len))
+      var dst = cast[ByteAddress](cast[PPointer](dest)[])
       for i in 0..seq.len-1:
         genericAssignAux(
           cast[pointer](dst +% i*% mt.base.size +% GenericSeqSize),