optimize setLen (#6816)

inline the call to setLengthSeq and avoid decref for types if ntfNoRefs

closes #6721 and speeds setLen when newLen < len for non reference
types.
This commit is contained in:
Brent Pedersen 2017-12-07 12:25:39 -07:00 • committed by Varriount
commit e016c9253e

View file

@ -259,7 +259,7 @@ proc incrSeqV2(seq: PGenericSeq, elemSize: int): PGenericSeq {.compilerProc.} =
result.reserved = r result.reserved = r
proc setLengthSeq(seq: PGenericSeq, elemSize, newLen: int): PGenericSeq {. proc setLengthSeq(seq: PGenericSeq, elemSize, newLen: int): PGenericSeq {.
compilerRtl.} = compilerRtl, inl.} =
result = seq result = seq
if result.space < newLen: if result.space < newLen:
let r = max(resize(result.space), newLen) let r = max(resize(result.space), newLen)
@ -282,10 +282,11 @@ proc setLengthSeq(seq: PGenericSeq, elemSize, newLen: int): PGenericSeq {.
doDecRef(gch.tempStack.d[i], LocalHeap, MaybeCyclic) doDecRef(gch.tempStack.d[i], LocalHeap, MaybeCyclic)
gch.tempStack.len = len0 gch.tempStack.len = len0
else: else:
for i in newLen..result.len-1: if ntfNoRefs notin extGetCellType(result).base.flags:
forAllChildrenAux(cast[pointer](cast[ByteAddress](result) +% for i in newLen..result.len-1:
GenericSeqSize +% (i*%elemSize)), forAllChildrenAux(cast[pointer](cast[ByteAddress](result) +%
extGetCellType(result).base, waZctDecRef) GenericSeqSize +% (i*%elemSize)),
extGetCellType(result).base, waZctDecRef)
# XXX: zeroing out the memory can still result in crashes if a wiped-out # XXX: zeroing out the memory can still result in crashes if a wiped-out
# cell is aliased by another pointer (ie proc parameter or a let variable). # cell is aliased by another pointer (ie proc parameter or a let variable).