turn nimIncrSeqV3 into deadcode (#20388)
This commit is contained in:
parent
3dc302662e
commit
4a1bda667c
4 changed files with 50 additions and 92 deletions
|
|
@ -26,7 +26,7 @@
|
||||||
- `shallowCopy` is removed for ARC/ORC. Use `move` when possible or combine assignment and
|
- `shallowCopy` is removed for ARC/ORC. Use `move` when possible or combine assignment and
|
||||||
`sink` for optimization purposes.
|
`sink` for optimization purposes.
|
||||||
|
|
||||||
- `nimPreviewDotLikeOps` is going to be removed or deprecated.
|
- The `nimPreviewDotLikeOps` define is going to be removed or deprecated.
|
||||||
|
|
||||||
- The `{.this.}` pragma, deprecated since 0.19, has been removed.
|
- The `{.this.}` pragma, deprecated since 0.19, has been removed.
|
||||||
- `nil` literals can no longer be directly assigned to variables or fields of `distinct` pointer types. They must be converted instead.
|
- `nil` literals can no longer be directly assigned to variables or fields of `distinct` pointer types. They must be converted instead.
|
||||||
|
|
@ -44,6 +44,8 @@
|
||||||
- [Overloadable enums](https://nim-lang.github.io/Nim/manual_experimental.html#overloadable-enum-value-names)
|
- [Overloadable enums](https://nim-lang.github.io/Nim/manual_experimental.html#overloadable-enum-value-names)
|
||||||
are no longer experimental.
|
are no longer experimental.
|
||||||
|
|
||||||
|
- Removed the `nimIncrSeqV3` define.
|
||||||
|
|
||||||
- Static linking against OpenSSL versions below 1.1, previously done by
|
- Static linking against OpenSSL versions below 1.1, previously done by
|
||||||
setting `-d:openssl10`, is no longer supported.
|
setting `-d:openssl10`, is no longer supported.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,7 @@ proc initDefines*(symbols: StringTableRef) =
|
||||||
defineSymbol("nimVmExportFixed") # deadcode
|
defineSymbol("nimVmExportFixed") # deadcode
|
||||||
defineSymbol("nimHasSymOwnerInMacro") # deadcode
|
defineSymbol("nimHasSymOwnerInMacro") # deadcode
|
||||||
defineSymbol("nimNewRuntime") # deadcode
|
defineSymbol("nimNewRuntime") # deadcode
|
||||||
defineSymbol("nimIncrSeqV3") # xxx: turn this into deadcode
|
defineSymbol("nimIncrSeqV3") # deadcode
|
||||||
defineSymbol("nimAshr") # deadcode
|
defineSymbol("nimAshr") # deadcode
|
||||||
defineSymbol("nimNoNilSeqs") # deadcode
|
defineSymbol("nimNoNilSeqs") # deadcode
|
||||||
defineSymbol("nimNoNilSeqs2") # deadcode
|
defineSymbol("nimNoNilSeqs2") # deadcode
|
||||||
|
|
|
||||||
|
|
@ -561,35 +561,8 @@ proc growObj(old: pointer, newsize: int, gch: var GcHeap): pointer =
|
||||||
gcTrace(res, csAllocated)
|
gcTrace(res, csAllocated)
|
||||||
track("growObj old", ol, 0)
|
track("growObj old", ol, 0)
|
||||||
track("growObj new", res, newsize)
|
track("growObj new", res, newsize)
|
||||||
when defined(nimIncrSeqV3):
|
# since we steal the old seq's contents, we set the old length to 0.
|
||||||
# since we steal the old seq's contents, we set the old length to 0.
|
cast[PGenericSeq](old).len = 0
|
||||||
cast[PGenericSeq](old).len = 0
|
|
||||||
elif reallyDealloc:
|
|
||||||
sysAssert(allocInv(gch.region), "growObj before dealloc")
|
|
||||||
if ol.refcount shr rcShift <=% 1:
|
|
||||||
# free immediately to save space:
|
|
||||||
if (ol.refcount and ZctFlag) != 0:
|
|
||||||
var j = gch.zct.len-1
|
|
||||||
var d = gch.zct.d
|
|
||||||
while j >= 0:
|
|
||||||
if d[j] == ol:
|
|
||||||
d[j] = res
|
|
||||||
break
|
|
||||||
dec(j)
|
|
||||||
beforeDealloc(gch, ol, "growObj stack trash")
|
|
||||||
decTypeSize(ol, ol.typ)
|
|
||||||
rawDealloc(gch.region, ol)
|
|
||||||
else:
|
|
||||||
# we split the old refcount in 2 parts. XXX This is still not entirely
|
|
||||||
# correct if the pointer that receives growObj's result is on the stack.
|
|
||||||
# A better fix would be to emit the location specific write barrier for
|
|
||||||
# 'growObj', but this is lots of more work and who knows what new problems
|
|
||||||
# this would create.
|
|
||||||
res.refcount = rcIncrement
|
|
||||||
decRef(ol)
|
|
||||||
else:
|
|
||||||
sysAssert(ol.typ != nil, "growObj: 5")
|
|
||||||
zeroMem(ol, sizeof(Cell))
|
|
||||||
when useCellIds:
|
when useCellIds:
|
||||||
inc gch.idGenerator
|
inc gch.idGenerator
|
||||||
res.id = gch.idGenerator * 1000_000 + gch.gcThreadId
|
res.id = gch.idGenerator * 1000_000 + gch.gcThreadId
|
||||||
|
|
|
||||||
|
|
@ -160,13 +160,9 @@ proc addChar(s: NimString, c: char): NimString =
|
||||||
result = s
|
result = s
|
||||||
if result.len >= result.space:
|
if result.len >= result.space:
|
||||||
let r = resize(result.space)
|
let r = resize(result.space)
|
||||||
when defined(nimIncrSeqV3):
|
result = rawNewStringNoInit(r)
|
||||||
result = rawNewStringNoInit(r)
|
result.len = s.len
|
||||||
result.len = s.len
|
copyMem(addr result.data[0], unsafeAddr(s.data[0]), s.len+1)
|
||||||
copyMem(addr result.data[0], unsafeAddr(s.data[0]), s.len+1)
|
|
||||||
else:
|
|
||||||
result = cast[NimString](growObj(result,
|
|
||||||
sizeof(TGenericSeq) + r + 1))
|
|
||||||
result.reserved = r
|
result.reserved = r
|
||||||
result.data[result.len] = c
|
result.data[result.len] = c
|
||||||
result.data[result.len+1] = '\0'
|
result.data[result.len+1] = '\0'
|
||||||
|
|
@ -210,12 +206,9 @@ proc resizeString(dest: NimString, addlen: int): NimString {.compilerRtl.} =
|
||||||
result = dest
|
result = dest
|
||||||
else: # slow path:
|
else: # slow path:
|
||||||
let sp = max(resize(dest.space), dest.len + addlen)
|
let sp = max(resize(dest.space), dest.len + addlen)
|
||||||
when defined(nimIncrSeqV3):
|
result = rawNewStringNoInit(sp)
|
||||||
result = rawNewStringNoInit(sp)
|
result.len = dest.len
|
||||||
result.len = dest.len
|
copyMem(addr result.data[0], unsafeAddr(dest.data[0]), dest.len+1)
|
||||||
copyMem(addr result.data[0], unsafeAddr(dest.data[0]), dest.len+1)
|
|
||||||
else:
|
|
||||||
result = cast[NimString](growObj(dest, sizeof(TGenericSeq) + sp + 1))
|
|
||||||
result.reserved = sp
|
result.reserved = sp
|
||||||
#result = rawNewString(sp)
|
#result = rawNewString(sp)
|
||||||
#copyMem(result, dest, dest.len + sizeof(TGenericSeq))
|
#copyMem(result, dest, dest.len + sizeof(TGenericSeq))
|
||||||
|
|
@ -239,14 +232,11 @@ proc setLengthStr(s: NimString, newLen: int): NimString {.compilerRtl.} =
|
||||||
result = s
|
result = s
|
||||||
else:
|
else:
|
||||||
let sp = max(resize(s.space), newLen)
|
let sp = max(resize(s.space), newLen)
|
||||||
when defined(nimIncrSeqV3):
|
result = rawNewStringNoInit(sp)
|
||||||
result = rawNewStringNoInit(sp)
|
result.len = s.len
|
||||||
result.len = s.len
|
copyMem(addr result.data[0], unsafeAddr(s.data[0]), s.len+1)
|
||||||
copyMem(addr result.data[0], unsafeAddr(s.data[0]), s.len+1)
|
zeroMem(addr result.data[s.len], newLen - s.len)
|
||||||
zeroMem(addr result.data[s.len], newLen - s.len)
|
result.reserved = sp
|
||||||
result.reserved = sp
|
|
||||||
else:
|
|
||||||
result = resizeString(s, n)
|
|
||||||
result.len = n
|
result.len = n
|
||||||
result.data[n] = '\0'
|
result.data[n] = '\0'
|
||||||
|
|
||||||
|
|
@ -282,15 +272,11 @@ proc incrSeqV3(s: PGenericSeq, typ: PNimType): PGenericSeq {.compilerproc.} =
|
||||||
result = s
|
result = s
|
||||||
if result.len >= result.space:
|
if result.len >= result.space:
|
||||||
let r = resize(result.space)
|
let r = resize(result.space)
|
||||||
when defined(nimIncrSeqV3):
|
result = cast[PGenericSeq](newSeq(typ, r))
|
||||||
result = cast[PGenericSeq](newSeq(typ, r))
|
result.len = s.len
|
||||||
result.len = s.len
|
copyMem(dataPointer(result, typ.base.align), dataPointer(s, typ.base.align), s.len * typ.base.size)
|
||||||
copyMem(dataPointer(result, typ.base.align), dataPointer(s, typ.base.align), s.len * typ.base.size)
|
# since we steal the content from 's', it's crucial to set s's len to 0.
|
||||||
# since we steal the content from 's', it's crucial to set s's len to 0.
|
s.len = 0
|
||||||
s.len = 0
|
|
||||||
else:
|
|
||||||
result = cast[PGenericSeq](growObj(result, align(GenericSeqSize, typ.base.align) + typ.base.size * r))
|
|
||||||
result.reserved = r
|
|
||||||
|
|
||||||
proc setLengthSeq(seq: PGenericSeq, elemSize, elemAlign, newLen: int): PGenericSeq {.
|
proc setLengthSeq(seq: PGenericSeq, elemSize, elemAlign, newLen: int): PGenericSeq {.
|
||||||
compilerRtl, inl.} =
|
compilerRtl, inl.} =
|
||||||
|
|
@ -324,36 +310,33 @@ proc setLengthSeqV2(s: PGenericSeq, typ: PNimType, newLen: int): PGenericSeq {.
|
||||||
if s == nil:
|
if s == nil:
|
||||||
result = cast[PGenericSeq](newSeq(typ, newLen))
|
result = cast[PGenericSeq](newSeq(typ, newLen))
|
||||||
else:
|
else:
|
||||||
when defined(nimIncrSeqV3):
|
let elemSize = typ.base.size
|
||||||
let elemSize = typ.base.size
|
let elemAlign = typ.base.align
|
||||||
let elemAlign = typ.base.align
|
if s.space < newLen:
|
||||||
if s.space < newLen:
|
let r = max(resize(s.space), newLen)
|
||||||
let r = max(resize(s.space), newLen)
|
result = cast[PGenericSeq](newSeq(typ, r))
|
||||||
result = cast[PGenericSeq](newSeq(typ, r))
|
copyMem(dataPointer(result, elemAlign), dataPointer(s, elemAlign), s.len * elemSize)
|
||||||
copyMem(dataPointer(result, elemAlign), dataPointer(s, elemAlign), s.len * elemSize)
|
# since we steal the content from 's', it's crucial to set s's len to 0.
|
||||||
# since we steal the content from 's', it's crucial to set s's len to 0.
|
s.len = 0
|
||||||
s.len = 0
|
elif newLen < s.len:
|
||||||
elif newLen < s.len:
|
result = s
|
||||||
result = s
|
# we need to decref here, otherwise the GC leaks!
|
||||||
# we need to decref here, otherwise the GC leaks!
|
when not defined(boehmGC) and not defined(nogc) and
|
||||||
when not defined(boehmGC) and not defined(nogc) and
|
not defined(gcMarkAndSweep) and not defined(gogc) and
|
||||||
not defined(gcMarkAndSweep) and not defined(gogc) and
|
not defined(gcRegions):
|
||||||
not defined(gcRegions):
|
if ntfNoRefs notin typ.base.flags:
|
||||||
if ntfNoRefs notin typ.base.flags:
|
for i in newLen..result.len-1:
|
||||||
for i in newLen..result.len-1:
|
forAllChildrenAux(dataPointer(result, elemAlign, elemSize, i),
|
||||||
forAllChildrenAux(dataPointer(result, elemAlign, elemSize, i),
|
extGetCellType(result).base, waZctDecRef)
|
||||||
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).
|
||||||
# This is a tough problem, because even if we don't zeroMem here, in the
|
# This is a tough problem, because even if we don't zeroMem here, in the
|
||||||
# presence of user defined destructors, the user will expect the cell to be
|
# presence of user defined destructors, the user will expect the cell to be
|
||||||
# "destroyed" thus creating the same problem. We can destroy the cell in the
|
# "destroyed" thus creating the same problem. We can destroy the cell in the
|
||||||
# finalizer of the sequence, but this makes destruction non-deterministic.
|
# finalizer of the sequence, but this makes destruction non-deterministic.
|
||||||
zeroMem(dataPointer(result, elemAlign, elemSize, newLen), (result.len-%newLen) *% elemSize)
|
zeroMem(dataPointer(result, elemAlign, elemSize, newLen), (result.len-%newLen) *% elemSize)
|
||||||
else:
|
|
||||||
result = s
|
|
||||||
zeroMem(dataPointer(result, elemAlign, elemSize, result.len), (newLen-%result.len) *% elemSize)
|
|
||||||
result.len = newLen
|
|
||||||
else:
|
else:
|
||||||
result = setLengthSeq(s, typ.base.size, newLen)
|
result = s
|
||||||
|
zeroMem(dataPointer(result, elemAlign, elemSize, result.len), (newLen-%result.len) *% elemSize)
|
||||||
|
result.len = newLen
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue