mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 08:54:53 +00:00
cleanup destructor building for arrays; still doesn't work
This commit is contained in:
@@ -190,7 +190,6 @@ proc resetMemory =
|
||||
resetRopeCache()
|
||||
resetSysTypes()
|
||||
gOwners = @[]
|
||||
rangeDestructorProc = nil
|
||||
for i in low(buckets)..high(buckets):
|
||||
buckets[i] = nil
|
||||
idAnon = nil
|
||||
@@ -237,7 +236,7 @@ proc mainCommand* =
|
||||
when SimulateCaasMemReset:
|
||||
gGlobalOptions.incl(optCaasEnabled)
|
||||
|
||||
# In "nimrod serve" scenario, each command must reset the registered passes
|
||||
# In "nim serve" scenario, each command must reset the registered passes
|
||||
clearPasses()
|
||||
gLastCmdTime = epochTime()
|
||||
appendStr(searchPaths, options.libpath)
|
||||
|
||||
@@ -24,7 +24,6 @@ var
|
||||
destructorName = getIdent"destroy_"
|
||||
destructorParam = getIdent"this_"
|
||||
destructorPragma = newIdentNode(getIdent"destructor", unknownLineInfo())
|
||||
rangeDestructorProc*: PSym
|
||||
|
||||
proc instantiateDestructor(c: PContext, typ: PType): PType
|
||||
|
||||
@@ -141,9 +140,7 @@ proc instantiateDestructor(c: PContext, typ: PType): PType =
|
||||
case t.kind
|
||||
of tySequence, tyArray, tyArrayConstr, tyOpenArray, tyVarargs:
|
||||
if instantiateDestructor(c, t.sons[0]) != nil:
|
||||
if rangeDestructorProc == nil:
|
||||
rangeDestructorProc = searchInScopes(c, getIdent"nimDestroyRange")
|
||||
t.destructor = rangeDestructorProc
|
||||
t.destructor = getCompilerProc"nimDestroyRange"
|
||||
return t
|
||||
else:
|
||||
return nil
|
||||
|
||||
@@ -17,7 +17,7 @@ proc genericAssignAux(dest, src: pointer, n: ptr TNimNode,
|
||||
s = cast[ByteAddress](src)
|
||||
case n.kind
|
||||
of nkSlot:
|
||||
genericAssignAux(cast[pointer](d +% n.offset),
|
||||
genericAssignAux(cast[pointer](d +% n.offset),
|
||||
cast[pointer](s +% n.offset), n.typ, shallow)
|
||||
of nkList:
|
||||
for i in 0..n.len-1:
|
||||
@@ -54,7 +54,7 @@ proc genericAssignAux(dest, src: pointer, mt: PNimType, shallow: bool) =
|
||||
unsureAsgnRef(x, copyString(cast[NimString](s2)))
|
||||
of tySequence:
|
||||
var s2 = cast[PPointer](src)[]
|
||||
var seq = cast[PGenericSeq](s2)
|
||||
var seq = cast[PGenericSeq](s2)
|
||||
var x = cast[PPointer](dest)
|
||||
if s2 == nil or shallow or (seq.reserved and seqShallowFlag) != 0:
|
||||
# this can happen! nil sequences are allowed
|
||||
@@ -100,7 +100,7 @@ proc genericShallowAssign(dest, src: pointer, mt: PNimType) {.compilerProc.} =
|
||||
|
||||
when false:
|
||||
proc debugNimType(t: PNimType) =
|
||||
if t.isNil:
|
||||
if t.isNil:
|
||||
cprintf("nil!")
|
||||
return
|
||||
var k: cstring
|
||||
@@ -170,21 +170,13 @@ proc objectInit(dest: pointer, typ: PNimType) =
|
||||
for i in 0..(typ.size div typ.base.size)-1:
|
||||
objectInit(cast[pointer](d +% i * typ.base.size), typ.base)
|
||||
else: discard # nothing to do
|
||||
|
||||
|
||||
# ---------------------- assign zero -----------------------------------------
|
||||
|
||||
when not defined(nimmixin):
|
||||
proc destroy(x: int) = discard
|
||||
proc nimDestroyRange*[T](r: T) =
|
||||
# internal proc used for destroying sequences and arrays
|
||||
for i in countup(0, r.len - 1): destroy(r[i])
|
||||
else:
|
||||
# XXX Why is this exported and no compilerproc? -> compilerprocs cannot be
|
||||
# generic for now
|
||||
proc nimDestroyRange*[T](r: T) =
|
||||
# internal proc used for destroying sequences and arrays
|
||||
mixin destroy
|
||||
for i in countup(0, r.len - 1): destroy(r[i])
|
||||
proc nimDestroyRange[T](r: T) {.compilerProc.} =
|
||||
# internal proc used for destroying sequences and arrays
|
||||
mixin `=destroy`
|
||||
for i in countup(0, r.len - 1): `=destroy`(r[i])
|
||||
|
||||
proc genericReset(dest: pointer, mt: PNimType) {.compilerProc, benign.}
|
||||
proc genericResetAux(dest: pointer, n: ptr TNimNode) =
|
||||
@@ -198,7 +190,7 @@ proc genericResetAux(dest: pointer, n: ptr TNimNode) =
|
||||
var m = selectBranch(dest, n)
|
||||
if m != nil: genericResetAux(dest, m)
|
||||
zeroMem(cast[pointer](d +% n.offset), n.typ.size)
|
||||
|
||||
|
||||
proc genericReset(dest: pointer, mt: PNimType) =
|
||||
var d = cast[ByteAddress](dest)
|
||||
sysAssert(mt != nil, "genericReset 2")
|
||||
@@ -218,15 +210,15 @@ proc genericReset(dest: pointer, mt: PNimType) =
|
||||
else:
|
||||
zeroMem(dest, mt.size) # set raw bits to zero
|
||||
|
||||
proc selectBranch(discVal, L: int,
|
||||
proc selectBranch(discVal, L: int,
|
||||
a: ptr array [0..0x7fff, ptr TNimNode]): ptr TNimNode =
|
||||
result = a[L] # a[L] contains the ``else`` part (but may be nil)
|
||||
if discVal <% L:
|
||||
var x = a[discVal]
|
||||
if x != nil: result = x
|
||||
|
||||
proc FieldDiscriminantCheck(oldDiscVal, newDiscVal: int,
|
||||
a: ptr array [0..0x7fff, ptr TNimNode],
|
||||
|
||||
proc FieldDiscriminantCheck(oldDiscVal, newDiscVal: int,
|
||||
a: ptr array [0..0x7fff, ptr TNimNode],
|
||||
L: int) {.compilerProc.} =
|
||||
var oldBranch = selectBranch(oldDiscVal, L, a)
|
||||
var newBranch = selectBranch(newDiscVal, L, a)
|
||||
|
||||
Reference in New Issue
Block a user