From d634da775db3ee28b075b60c6c898a24167e0ce0 Mon Sep 17 00:00:00 2001 From: Araq Date: Tue, 18 Aug 2015 13:57:37 +0200 Subject: [PATCH] cleanup destructor building for arrays; still doesn't work --- compiler/main.nim | 3 +-- compiler/semdestruct.nim | 5 +---- lib/system/assign.nim | 34 +++++++++++++--------------------- 3 files changed, 15 insertions(+), 27 deletions(-) diff --git a/compiler/main.nim b/compiler/main.nim index 014605cc92..baf1c52089 100644 --- a/compiler/main.nim +++ b/compiler/main.nim @@ -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) diff --git a/compiler/semdestruct.nim b/compiler/semdestruct.nim index af671f6e00..1261dd4607 100644 --- a/compiler/semdestruct.nim +++ b/compiler/semdestruct.nim @@ -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 diff --git a/lib/system/assign.nim b/lib/system/assign.nim index 78995954f7..55d7572e25 100644 --- a/lib/system/assign.nim +++ b/lib/system/assign.nim @@ -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)