mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 17:34:43 +00:00
fixes #22883 …eDefault` warnings avoid issues mentioned by https://forum.nim-lang.org namely, it allocated unnecessary stack objects in the loop ```c while (1) { tyObject_N__8DSNqSGSHBKOhI8CqSgAow T5_; nimZeroMem((void *)(&T5_), sizeof(tyObject_N__8DSNqSGSHBKOhI8CqSgAow)); eqsink___test4954_u450((&(*t_p0).data.p->data[i].Field1), T5_); } ``` It might be more efficient in some cases follow up https://github.com/nim-lang/Nim/pull/21821
This commit is contained in:
@@ -87,7 +87,7 @@ proc exclImpl[A](s: var HashSet[A], key: A): bool {.inline.} =
|
||||
var j = i # The correctness of this depends on (h+1) in nextTry,
|
||||
var r = j # though may be adaptable to other simple sequences.
|
||||
s.data[i].hcode = 0 # mark current EMPTY
|
||||
s.data[i].key = default(typeof(s.data[i].key))
|
||||
reset(s.data[i].key)
|
||||
doWhile((i >= r and r > j) or (r > j and j > i) or (j > i and i >= r)):
|
||||
i = (i + 1) and msk # increment mod table size
|
||||
if isEmpty(s.data[i].hcode): # end of collision cluster; So all done
|
||||
|
||||
@@ -382,7 +382,7 @@ proc clear*[A](s: var HashSet[A]) =
|
||||
s.counter = 0
|
||||
for i in 0 ..< s.data.len:
|
||||
s.data[i].hcode = 0
|
||||
s.data[i].key = default(typeof(s.data[i].key))
|
||||
reset(s.data[i].key)
|
||||
|
||||
|
||||
proc union*[A](s1, s2: HashSet[A]): HashSet[A] =
|
||||
@@ -816,7 +816,7 @@ proc clear*[A](s: var OrderedSet[A]) =
|
||||
for i in 0 ..< s.data.len:
|
||||
s.data[i].hcode = 0
|
||||
s.data[i].next = 0
|
||||
s.data[i].key = default(typeof(s.data[i].key))
|
||||
reset(s.data[i].key)
|
||||
|
||||
proc len*[A](s: OrderedSet[A]): int {.inline.} =
|
||||
## Returns the number of elements in `s`.
|
||||
|
||||
@@ -119,8 +119,8 @@ template delImplIdx(t, i, makeEmpty, cellEmpty, cellHash) =
|
||||
var j = i # The correctness of this depends on (h+1) in nextTry
|
||||
var r = j # though may be adaptable to other simple sequences.
|
||||
makeEmpty(i) # mark current EMPTY
|
||||
t.data[i].key = default(typeof(t.data[i].key))
|
||||
t.data[i].val = default(typeof(t.data[i].val))
|
||||
reset(t.data[i].key)
|
||||
reset(t.data[i].val)
|
||||
while true:
|
||||
i = (i + 1) and msk # increment mod table size
|
||||
if cellEmpty(i): # end of collision cluster; So all done
|
||||
@@ -151,8 +151,8 @@ template clearImpl() {.dirty.} =
|
||||
for i in 0 ..< t.dataLen:
|
||||
when compiles(t.data[i].hcode): # CountTable records don't contain a hcode
|
||||
t.data[i].hcode = 0
|
||||
t.data[i].key = default(typeof(t.data[i].key))
|
||||
t.data[i].val = default(typeof(t.data[i].val))
|
||||
reset(t.data[i].key)
|
||||
reset(t.data[i].val)
|
||||
t.counter = 0
|
||||
|
||||
template ctAnd(a, b): bool =
|
||||
|
||||
@@ -911,14 +911,18 @@ proc default*[T](_: typedesc[T]): T {.magic: "Default", noSideEffect.} =
|
||||
proc reset*[T](obj: var T) {.noSideEffect.} =
|
||||
## Resets an object `obj` to its default value.
|
||||
when nimvm:
|
||||
{.push warning[UnsafeDefault]:off.}
|
||||
obj = default(typeof(obj))
|
||||
{.pop.}
|
||||
else:
|
||||
when defined(gcDestructors):
|
||||
{.cast(noSideEffect), cast(raises: []), cast(tags: []).}:
|
||||
`=destroy`(obj)
|
||||
`=wasMoved`(obj)
|
||||
else:
|
||||
{.push warning[UnsafeDefault]:off.}
|
||||
obj = default(typeof(obj))
|
||||
{.pop.}
|
||||
|
||||
proc setLen*[T](s: var seq[T], newlen: Natural) {.
|
||||
magic: "SetLengthSeq", noSideEffect, nodestroy.}
|
||||
|
||||
Reference in New Issue
Block a user