fixes system.add for strict funcs (#15259)

* fixes system.add for strict funcs

* fixes #15248
This commit is contained in:
Andreas Rumpf 2020-09-03 12:59:34 +02:00 • committed by GitHub
commit 48f2997221
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 19 deletions

View file

@ -342,7 +342,7 @@ proc deps(c: var Partitions; dest, src: PNode) =
let destIsComplex = types.searchTypeFor(dest.typ, wrap) let destIsComplex = types.searchTypeFor(dest.typ, wrap)
for t in targets: for t in targets:
if dest.kind != nkSym: if dest.kind != nkSym and c.inNoSideEffectSection == 0:
potentialMutation(c, t, dest.info) potentialMutation(c, t, dest.info)
if destIsComplex: if destIsComplex:

View file

@ -1227,9 +1227,10 @@ proc add*[T](x: var seq[T], y: openArray[T]) {.noSideEffect.} =
## .. code-block:: Nim ## .. code-block:: Nim
## var s: seq[string] = @["test2","test2"] ## var s: seq[string] = @["test2","test2"]
## s.add("test") # s <- @[test2, test2, test] ## s.add("test") # s <- @[test2, test2, test]
let xl = x.len {.noSideEffect.}:
setLen(x, xl + y.len) let xl = x.len
for i in 0..high(y): x[xl+i] = y[i] setLen(x, xl + y.len)
for i in 0..high(y): x[xl+i] = y[i]
when defined(nimSeqsV2): when defined(nimSeqsV2):
template movingCopy(a, b) = template movingCopy(a, b) =
@ -1283,22 +1284,23 @@ proc insert*[T](x: var seq[T], item: sink T, i = 0.Natural) {.noSideEffect.} =
## .. code-block:: Nim ## .. code-block:: Nim
## var i = @[1, 3, 5] ## var i = @[1, 3, 5]
## i.insert(99, 0) # i <- @[99, 1, 3, 5] ## i.insert(99, 0) # i <- @[99, 1, 3, 5]
template defaultImpl = {.noSideEffect.}:
let xl = x.len template defaultImpl =
setLen(x, xl+1) let xl = x.len
var j = xl-1 setLen(x, xl+1)
while j >= i: var j = xl-1
movingCopy(x[j+1], x[j]) while j >= i:
dec(j) movingCopy(x[j+1], x[j])
when nimvm: dec(j)
defaultImpl() when nimvm:
else:
when defined(js):
var it : T
{.emit: "`x` = `x` || []; `x`.splice(`i`, 0, `it`);".}
else:
defaultImpl() defaultImpl()
x[i] = item else:
when defined(js):
var it : T
{.emit: "`x` = `x` || []; `x`.splice(`i`, 0, `it`);".}
else:
defaultImpl()
x[i] = item
when not defined(nimV2): when not defined(nimV2):
proc repr*[T](x: T): string {.magic: "Repr", noSideEffect.} proc repr*[T](x: T): string {.magic: "Repr", noSideEffect.}