cleanup destructor building for arrays; still doesn't work
This commit is contained in:
parent
69b32637b1
commit
d634da775d
3 changed files with 15 additions and 27 deletions
|
|
@ -190,7 +190,6 @@ proc resetMemory =
|
||||||
resetRopeCache()
|
resetRopeCache()
|
||||||
resetSysTypes()
|
resetSysTypes()
|
||||||
gOwners = @[]
|
gOwners = @[]
|
||||||
rangeDestructorProc = nil
|
|
||||||
for i in low(buckets)..high(buckets):
|
for i in low(buckets)..high(buckets):
|
||||||
buckets[i] = nil
|
buckets[i] = nil
|
||||||
idAnon = nil
|
idAnon = nil
|
||||||
|
|
@ -237,7 +236,7 @@ proc mainCommand* =
|
||||||
when SimulateCaasMemReset:
|
when SimulateCaasMemReset:
|
||||||
gGlobalOptions.incl(optCaasEnabled)
|
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()
|
clearPasses()
|
||||||
gLastCmdTime = epochTime()
|
gLastCmdTime = epochTime()
|
||||||
appendStr(searchPaths, options.libpath)
|
appendStr(searchPaths, options.libpath)
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,6 @@ var
|
||||||
destructorName = getIdent"destroy_"
|
destructorName = getIdent"destroy_"
|
||||||
destructorParam = getIdent"this_"
|
destructorParam = getIdent"this_"
|
||||||
destructorPragma = newIdentNode(getIdent"destructor", unknownLineInfo())
|
destructorPragma = newIdentNode(getIdent"destructor", unknownLineInfo())
|
||||||
rangeDestructorProc*: PSym
|
|
||||||
|
|
||||||
proc instantiateDestructor(c: PContext, typ: PType): PType
|
proc instantiateDestructor(c: PContext, typ: PType): PType
|
||||||
|
|
||||||
|
|
@ -141,9 +140,7 @@ proc instantiateDestructor(c: PContext, typ: PType): PType =
|
||||||
case t.kind
|
case t.kind
|
||||||
of tySequence, tyArray, tyArrayConstr, tyOpenArray, tyVarargs:
|
of tySequence, tyArray, tyArrayConstr, tyOpenArray, tyVarargs:
|
||||||
if instantiateDestructor(c, t.sons[0]) != nil:
|
if instantiateDestructor(c, t.sons[0]) != nil:
|
||||||
if rangeDestructorProc == nil:
|
t.destructor = getCompilerProc"nimDestroyRange"
|
||||||
rangeDestructorProc = searchInScopes(c, getIdent"nimDestroyRange")
|
|
||||||
t.destructor = rangeDestructorProc
|
|
||||||
return t
|
return t
|
||||||
else:
|
else:
|
||||||
return nil
|
return nil
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ proc genericAssignAux(dest, src: pointer, n: ptr TNimNode,
|
||||||
s = cast[ByteAddress](src)
|
s = cast[ByteAddress](src)
|
||||||
case n.kind
|
case n.kind
|
||||||
of nkSlot:
|
of nkSlot:
|
||||||
genericAssignAux(cast[pointer](d +% n.offset),
|
genericAssignAux(cast[pointer](d +% n.offset),
|
||||||
cast[pointer](s +% n.offset), n.typ, shallow)
|
cast[pointer](s +% n.offset), n.typ, shallow)
|
||||||
of nkList:
|
of nkList:
|
||||||
for i in 0..n.len-1:
|
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)))
|
unsureAsgnRef(x, copyString(cast[NimString](s2)))
|
||||||
of tySequence:
|
of tySequence:
|
||||||
var s2 = cast[PPointer](src)[]
|
var s2 = cast[PPointer](src)[]
|
||||||
var seq = cast[PGenericSeq](s2)
|
var seq = cast[PGenericSeq](s2)
|
||||||
var x = cast[PPointer](dest)
|
var x = cast[PPointer](dest)
|
||||||
if s2 == nil or shallow or (seq.reserved and seqShallowFlag) != 0:
|
if s2 == nil or shallow or (seq.reserved and seqShallowFlag) != 0:
|
||||||
# this can happen! nil sequences are allowed
|
# this can happen! nil sequences are allowed
|
||||||
|
|
@ -100,7 +100,7 @@ proc genericShallowAssign(dest, src: pointer, mt: PNimType) {.compilerProc.} =
|
||||||
|
|
||||||
when false:
|
when false:
|
||||||
proc debugNimType(t: PNimType) =
|
proc debugNimType(t: PNimType) =
|
||||||
if t.isNil:
|
if t.isNil:
|
||||||
cprintf("nil!")
|
cprintf("nil!")
|
||||||
return
|
return
|
||||||
var k: cstring
|
var k: cstring
|
||||||
|
|
@ -170,21 +170,13 @@ proc objectInit(dest: pointer, typ: PNimType) =
|
||||||
for i in 0..(typ.size div typ.base.size)-1:
|
for i in 0..(typ.size div typ.base.size)-1:
|
||||||
objectInit(cast[pointer](d +% i * typ.base.size), typ.base)
|
objectInit(cast[pointer](d +% i * typ.base.size), typ.base)
|
||||||
else: discard # nothing to do
|
else: discard # nothing to do
|
||||||
|
|
||||||
# ---------------------- assign zero -----------------------------------------
|
# ---------------------- assign zero -----------------------------------------
|
||||||
|
|
||||||
when not defined(nimmixin):
|
proc nimDestroyRange[T](r: T) {.compilerProc.} =
|
||||||
proc destroy(x: int) = discard
|
# internal proc used for destroying sequences and arrays
|
||||||
proc nimDestroyRange*[T](r: T) =
|
mixin `=destroy`
|
||||||
# internal proc used for destroying sequences and arrays
|
for i in countup(0, r.len - 1): `=destroy`(r[i])
|
||||||
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 genericReset(dest: pointer, mt: PNimType) {.compilerProc, benign.}
|
proc genericReset(dest: pointer, mt: PNimType) {.compilerProc, benign.}
|
||||||
proc genericResetAux(dest: pointer, n: ptr TNimNode) =
|
proc genericResetAux(dest: pointer, n: ptr TNimNode) =
|
||||||
|
|
@ -198,7 +190,7 @@ proc genericResetAux(dest: pointer, n: ptr TNimNode) =
|
||||||
var m = selectBranch(dest, n)
|
var m = selectBranch(dest, n)
|
||||||
if m != nil: genericResetAux(dest, m)
|
if m != nil: genericResetAux(dest, m)
|
||||||
zeroMem(cast[pointer](d +% n.offset), n.typ.size)
|
zeroMem(cast[pointer](d +% n.offset), n.typ.size)
|
||||||
|
|
||||||
proc genericReset(dest: pointer, mt: PNimType) =
|
proc genericReset(dest: pointer, mt: PNimType) =
|
||||||
var d = cast[ByteAddress](dest)
|
var d = cast[ByteAddress](dest)
|
||||||
sysAssert(mt != nil, "genericReset 2")
|
sysAssert(mt != nil, "genericReset 2")
|
||||||
|
|
@ -218,15 +210,15 @@ proc genericReset(dest: pointer, mt: PNimType) =
|
||||||
else:
|
else:
|
||||||
zeroMem(dest, mt.size) # set raw bits to zero
|
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 =
|
a: ptr array [0..0x7fff, ptr TNimNode]): ptr TNimNode =
|
||||||
result = a[L] # a[L] contains the ``else`` part (but may be nil)
|
result = a[L] # a[L] contains the ``else`` part (but may be nil)
|
||||||
if discVal <% L:
|
if discVal <% L:
|
||||||
var x = a[discVal]
|
var x = a[discVal]
|
||||||
if x != nil: result = x
|
if x != nil: result = x
|
||||||
|
|
||||||
proc FieldDiscriminantCheck(oldDiscVal, newDiscVal: int,
|
proc FieldDiscriminantCheck(oldDiscVal, newDiscVal: int,
|
||||||
a: ptr array [0..0x7fff, ptr TNimNode],
|
a: ptr array [0..0x7fff, ptr TNimNode],
|
||||||
L: int) {.compilerProc.} =
|
L: int) {.compilerProc.} =
|
||||||
var oldBranch = selectBranch(oldDiscVal, L, a)
|
var oldBranch = selectBranch(oldDiscVal, L, a)
|
||||||
var newBranch = selectBranch(newDiscVal, L, a)
|
var newBranch = selectBranch(newDiscVal, L, a)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue