diff options
author | Araq <rumpf_a@web.de> | 2018-11-16 00:13:39 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2018-11-16 00:13:49 +0100 |
commit | 4bd9f32f335b43d1cdcfbbd99cbe91bb478a400c (patch) | |
tree | a629a0df2999c02a574b3c4e82ca988e6204f2b2 | |
parent | 2eb14bdd41933d3b1b624e48d7513172be1a1e7a (diff) | |
download | Nim-4bd9f32f335b43d1cdcfbbd99cbe91bb478a400c.tar.gz |
--gc:destructors: hello world example compiles and runs
-rw-r--r-- | compiler/ccgexprs.nim | 10 | ||||
-rw-r--r-- | compiler/ccgliterals.nim | 2 | ||||
-rw-r--r-- | compiler/ccgtypes.nim | 2 | ||||
-rw-r--r-- | lib/core/seqs.nim | 2 |
4 files changed, 13 insertions, 3 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 3aa5e48e8..1633dd3cc 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -1580,8 +1580,17 @@ proc genArrayLen(p: BProc, e: PNode, d: var TLoc, op: TMagic) = else: putIntoDest(p, d, e, rope(lengthOrd(p.config, typ))) else: internalError(p.config, e.info, "genArrayLen()") +proc makePtrType(baseType: PType): PType = + result = newType(tyPtr, baseType.owner) + addSonSkipIntLit(result, baseType) + +proc makeAddr(n: PNode): PNode = + result = newTree(nkHiddenAddr, n) + result.typ = makePtrType(n.typ) + proc genSetLengthSeq(p: BProc, e: PNode, d: var TLoc) = if p.config.selectedGc == gcDestructors: + e.sons[1] = makeAddr(e[1]) genCall(p, e, d) return var a, b, call: TLoc @@ -1963,6 +1972,7 @@ proc genMagicExpr(p: BProc, e: PNode, d: var TLoc, op: TMagic) = of mAppendStrStr: genStrAppend(p, e, d) of mAppendSeqElem: if p.config.selectedGc == gcDestructors: + e.sons[1] = makeAddr(e[1]) genCall(p, e, d) else: genSeqElemAppend(p, e, d) diff --git a/compiler/ccgliterals.nim b/compiler/ccgliterals.nim index 34677ec06..ccfa49a1d 100644 --- a/compiler/ccgliterals.nim +++ b/compiler/ccgliterals.nim @@ -69,7 +69,7 @@ proc genStringLiteralV2(m: BModule; n: PNode): Rope = addf(m.s[cfsData], "static const NimStringV2 $1 = {$2, (NimStrPayload*)&$3};$n", [result, rope(len(n.strVal)), pureLit]) else: - result = m.tmpBase & rope(id) + result = m.tmpBase & rope(id+1) proc genStringLiteralV2Const(m: BModule; n: PNode): Rope = let id = nodeTableTestOrSet(m.dataCache, n, m.labels) diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index 386d7f60c..1264c0b84 100644 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -1213,8 +1213,8 @@ proc genTypeInfo(m: BModule, t: PType; info: TLineInfo): Rope = let x = fakeClosureType(m, t.owner) genTupleInfo(m, x, x, result, info) of tySequence: + genTypeInfoAux(m, t, t, result, info) if m.config.selectedGC != gcDestructors: - genTypeInfoAux(m, t, t, result, info) if m.config.selectedGC >= gcMarkAndSweep: let markerProc = genTraverseProc(m, origType, sig) addf(m.s[cfsTypeInit3], "$1.marker = $2;$n", [result, markerProc]) diff --git a/lib/core/seqs.nim b/lib/core/seqs.nim index 84626c473..fb81a30de 100644 --- a/lib/core/seqs.nim +++ b/lib/core/seqs.nim @@ -125,7 +125,7 @@ proc grow*[T](x: var seq[T]; newLen: Natural; value: T) = if newLen <= oldLen: return var xu = cast[ptr NimSeqV2[T]](addr x) - xu.p = prepareSeqAdd(oldLen, xu.p, newLen - oldLen, sizeof(T)) + xu.p = cast[typeof(xu.p)](prepareSeqAdd(oldLen, xu.p, newLen - oldLen, sizeof(T))) xu.len = newLen for i in oldLen .. newLen-1: x.data[i] = value |