diff options
Diffstat (limited to 'compiler/ccgexprs.nim')
-rwxr-xr-x | compiler/ccgexprs.nim | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index c957e0aaa..c9be31830 100755 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -1727,6 +1727,23 @@ proc downConv(p: BProc, n: PNode, d: var TLoc) = for i in countup(1, abs(inheritanceDiff(dest, src))): app(r, ".Sup") putIntoDest(p, d, n.typ, r) +proc exprComplexConst(p: BProc, n: PNode, d: var TLoc) = + var t = getUniqueType(n.typ) + discard getTypeDesc(p.module, t) # so that any fields are initialized + var id = NodeTableTestOrSet(p.module.dataCache, n, gBackendId) + var tmp = con("TMP", toRope(id)) + + if id == gBackendId: + # expression not found in the cache: + inc(gBackendId) + appf(p.module.s[cfsData], "NIM_CONST $1 $2 = $3;$n", + [getTypeDesc(p.module, t), tmp, genConstExpr(p, n)]) + + if d.k == locNone: + fillLoc(d, locData, t, tmp, OnHeap) + else: + putIntoDest(p, d, t, tmp) + proc genBlock(p: BProc, t: PNode, d: var TLoc) proc expr(p: BProc, e: PNode, d: var TLoc) = case e.kind @@ -1791,13 +1808,23 @@ proc expr(p: BProc, e: PNode, d: var TLoc) = genNamedParamCall(p, e, d) else: genCall(p, e, d) - of nkCurly: genSetConstr(p, e, d) + of nkCurly: + if isDeepConstExpr(e) and e.len != 0: + putIntoDest(p, d, e.typ, genSetNode(p, e)) + else: + genSetConstr(p, e, d) of nkBracket: - if skipTypes(e.typ, abstractVarRange).kind == tySequence: + if isDeepConstExpr(e) and e.len != 0: + exprComplexConst(p, e, d) + elif skipTypes(e.typ, abstractVarRange).kind == tySequence: genSeqConstr(p, e, d) else: genArrayConstr(p, e, d) - of nkPar: genTupleConstr(p, e, d) + of nkPar: + if isDeepConstExpr(e) and e.len != 0: + exprComplexConst(p, e, d) + else: + genTupleConstr(p, e, d) of nkCast: genCast(p, e, d) of nkHiddenStdConv, nkHiddenSubConv, nkConv: genConv(p, e, d) of nkHiddenAddr, nkAddr: genAddr(p, e, d) @@ -1851,8 +1878,8 @@ proc genConstSeq(p: BProc, n: PNode, t: PType): PRope = appf(data, ",$1$n", [genConstExpr(p, n.sons[i])]) data.app("}") - inc(p.labels) - result = con("CNSTSEQ", p.labels.toRope) + inc(gBackendId) + result = con("CNSTSEQ", gBackendId.toRope) appcg(p.module, cfsData, "NIM_CONST struct {$n" & @@ -1872,7 +1899,6 @@ proc genConstExpr(p: BProc, n: PNode): PRope = toBitSet(n, cs) result = genRawSetData(cs, int(getSize(n.typ))) of nkBracket, nkPar: - # XXX: tySequence! var t = skipTypes(n.typ, abstractInst) if t.kind == tySequence: result = genConstSeq(p, n, t) |