diff options
author | Amjad Ben Hedhili <amjadhedhili@outlook.com> | 2023-09-09 20:11:45 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-09 21:11:45 +0200 |
commit | 8853fb07753756dbe29364e8a32081462367215d (patch) | |
tree | f1a67bd71577e02087f1e4c63bb923af7c51fb4d /lib | |
parent | 5717a4843d648c3ec99e2416b65809ea829c1ab9 (diff) | |
download | Nim-8853fb07753756dbe29364e8a32081462367215d.tar.gz |
Make `newSeqOfCap` not initialize memory. (#21842)
It's used in `newSeqUninitialized`. --------- Co-authored-by: ringabout <43030857+ringabout@users.noreply.github.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/system.nim | 2 | ||||
-rw-r--r-- | lib/system/mm/go.nim | 2 | ||||
-rw-r--r-- | lib/system/seqs_v2.nim | 11 |
3 files changed, 12 insertions, 3 deletions
diff --git a/lib/system.nim b/lib/system.nim index c3cad4f71..4949430a3 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -925,7 +925,7 @@ proc reset*[T](obj: var T) {.noSideEffect.} = obj = default(typeof(obj)) proc setLen*[T](s: var seq[T], newlen: Natural) {. - magic: "SetLengthSeq", noSideEffect.} + magic: "SetLengthSeq", noSideEffect, nodestroy.} ## Sets the length of seq `s` to `newlen`. `T` may be any sequence type. ## ## If the current length is greater than the new length, diff --git a/lib/system/mm/go.nim b/lib/system/mm/go.nim index 9ec25fb65..8f3aeb964 100644 --- a/lib/system/mm/go.nim +++ b/lib/system/mm/go.nim @@ -109,7 +109,7 @@ proc newSeqRC1(typ: PNimType, len: int): pointer {.compilerRtl.} = writebarrierptr(addr(result), newSeq(typ, len)) proc nimNewSeqOfCap(typ: PNimType, cap: int): pointer {.compilerproc.} = - result = newObj(typ, align(GenericSeqSize, typ.base.align) + cap * typ.base.size) + result = newObjNoInit(typ, align(GenericSeqSize, typ.base.align) + cap * typ.base.size) cast[PGenericSeq](result).len = 0 cast[PGenericSeq](result).reserved = cap cast[PGenericSeq](result).elemSize = typ.base.size diff --git a/lib/system/seqs_v2.nim b/lib/system/seqs_v2.nim index b71b81762..81790bfe7 100644 --- a/lib/system/seqs_v2.nim +++ b/lib/system/seqs_v2.nim @@ -50,6 +50,15 @@ proc newSeqPayload(cap, elemSize, elemAlign: int): pointer {.compilerRtl, raises else: result = nil +proc newSeqPayloadUninit(cap, elemSize, elemAlign: int): pointer {.compilerRtl, raises: [].} = + # Used in `newSeqOfCap()`. + if cap > 0: + var p = cast[ptr NimSeqPayloadBase](alignedAlloc(align(sizeof(NimSeqPayloadBase), elemAlign) + cap * elemSize, elemAlign)) + p.cap = cap + result = p + else: + result = nil + template `+!`(p: pointer, s: int): pointer = cast[pointer](cast[int](p) +% s) @@ -125,7 +134,7 @@ proc add*[T](x: var seq[T]; y: sink T) {.magic: "AppendSeqElem", noSideEffect, n # We also save the `wasMoved + destroy` pair for the sink parameter. xu.p.data[oldLen] = y -proc setLen[T](s: var seq[T], newlen: Natural) = +proc setLen[T](s: var seq[T], newlen: Natural) {.nodestroy.} = {.noSideEffect.}: if newlen < s.len: shrink(s, newlen) |