fixes #22554; makes newSeqWith use newSeqUninit (#22771)

fixes #22554
This commit is contained in:
ringabout
2023-09-30 12:32:27 +08:00
committed by GitHub
parent a38e3dcb1f
commit 7146307823
2 changed files with 13 additions and 7 deletions

View File

@@ -83,6 +83,7 @@ runnableExamples:
import std/private/since
import macros
from typetraits import supportsCopyMem
when defined(nimPreviewSlimSystem):
import std/assertions
@@ -1114,8 +1115,12 @@ template newSeqWith*(len: int, init: untyped): untyped =
import std/random
var seqRand = newSeqWith(20, rand(1.0))
assert seqRand[0] != seqRand[1]
type T = typeof(init)
let newLen = len
var result = newSeq[typeof(init)](newLen)
when supportsCopyMem(T) and declared(newSeqUninit):
var result = newSeqUninit[T](newLen)
else: # TODO: use `newSeqUnsafe` when that's available
var result = newSeq[T](newLen)
for i in 0 ..< newLen:
result[i] = init
move(result) # refs bug #7295

View File

@@ -1615,11 +1615,12 @@ when notJSnotNims and defined(nimSeqsV2):
when not defined(js):
template newSeqImpl(T, len) =
result = newSeqOfCap[T](len)
when defined(nimSeqsV2):
cast[ptr int](addr result)[] = len
else:
var s = cast[PGenericSeq](result)
s.len = len
{.cast(noSideEffect).}:
when defined(nimSeqsV2):
cast[ptr int](addr result)[] = len
else:
var s = cast[PGenericSeq](result)
s.len = len
proc newSeqUninitialized*[T: SomeNumber](len: Natural): seq[T] {.deprecated: "Use `newSeqUninit` instead".} =
## Creates a new sequence of type `seq[T]` with length `len`.
@@ -1640,7 +1641,7 @@ when not defined(js):
var s = cast[PGenericSeq](result)
s.len = len
proc newSeqUninit*[T](len: Natural): seq[T] =
func newSeqUninit*[T](len: Natural): seq[T] =
## Creates a new sequence of type `seq[T]` with length `len`.
##
## Only available for types, which don't contain