diff options
author | Araq <rumpf_a@web.de> | 2018-07-30 23:27:01 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2018-07-30 23:27:01 +0200 |
commit | 53566f716501fe906b8b2aa4ce050be5d6eb0364 (patch) | |
tree | 01dfe04aaa07746d1ed005624ae7a100e3634eb7 /compiler/ccgexprs.nim | |
parent | f2ddd995393bc485880d3e56b277bad6448ad0c3 (diff) | |
download | Nim-53566f716501fe906b8b2aa4ce050be5d6eb0364.tar.gz |
fixes #7833; still to-do: fix setLen
Diffstat (limited to 'compiler/ccgexprs.nim')
-rw-r--r-- | compiler/ccgexprs.nim | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 2e9fb2cc2..96f172422 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -1092,17 +1092,20 @@ proc genSeqElemAppend(p: BProc, e: PNode, d: var TLoc) = # seq = (typeof seq) incrSeq(&seq->Sup, sizeof(x)); # seq->data[seq->len-1] = x; let seqAppendPattern = if not p.module.compileToCpp: - "$1 = ($2) #incrSeqV3(&($1)->Sup, $3);$n" + "($2) #incrSeqV3(&($1)->Sup, $3)" else: - "$1 = ($2) #incrSeqV3($1, $3);$n" - var a, b, dest, tmpL: TLoc + "($2) #incrSeqV3($1, $3)" + var a, b, dest, tmpL, call: TLoc initLocExpr(p, e.sons[1], a) initLocExpr(p, e.sons[2], b) let seqType = skipTypes(e.sons[1].typ, {tyVar}) - lineCg(p, cpsStmts, seqAppendPattern, [ - rdLoc(a), - getTypeDesc(p.module, e.sons[1].typ), - genTypeInfo(p.module, seqType, e.info)]) + initLoc(call, locCall, e, OnHeap) + call.r = ropecg(p.module, seqAppendPattern, [rdLoc(a), + getTypeDesc(p.module, e.sons[1].typ), + genTypeInfo(p.module, seqType, e.info)]) + # emit the write barrier if required, but we can always move here, so + # use 'genRefAssign' for the seq. + genRefAssign(p, a, call, {}) #if bt != b.t: # echo "YES ", e.info, " new: ", typeToString(bt), " old: ", typeToString(b.t) initLoc(dest, locExpr, e.sons[2], OnHeap) |