diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2015-06-18 17:51:06 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2015-06-18 17:51:06 +0200 |
commit | 29b09a3c7d825cda6dad7c5d4030f752de266190 (patch) | |
tree | 6cb3af6c45e39ccd6d28723a0ddf2bcf6010a418 | |
parent | 17cace280ca927a97adc21314141947210fe17b5 (diff) | |
parent | 85d5c86efaa6c03903a7efff9721e8f89c42de89 (diff) | |
download | Nim-29b09a3c7d825cda6dad7c5d4030f752de266190.tar.gz |
Merge pull request #2953 from yglukhov/fix-2617
Fixes #2617, fixes addr of obj downcast.
-rw-r--r-- | compiler/jsgen.nim | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index d84b0f2f9..ede759426 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -968,7 +968,9 @@ proc genAddr(p: PProc, n: PNode, r: var TCompRes) = of tyTuple: genFieldAddr(p, n.sons[0], r) else: internalError(n.sons[0].info, "expr(nkBracketExpr, " & $kindOfIndexedExpr & ')') - else: internalError(n.sons[0].info, "genAddr") + of nkObjDownConv: + gen(p, n.sons[0], r) + else: internalError(n.sons[0].info, "genAddr: " & $n.sons[0].kind) proc genProcForSymIfNeeded(p: PProc, s: PSym) = if not p.g.generatedSyms.containsOrIncl(s.id): @@ -1096,24 +1098,32 @@ proc putToSeq(s: string, indirect: bool): Rope = if indirect: result = "[$1]" % [result] proc createVar(p: PProc, typ: PType, indirect: bool): Rope -proc createRecordVarAux(p: PProc, rec: PNode, c: var int): Rope = - result = nil +proc createRecordVarAux(p: PProc, rec: PNode, excludedFieldIDs: IntSet, output: var Rope) = case rec.kind of nkRecList: for i in countup(0, sonsLen(rec) - 1): - add(result, createRecordVarAux(p, rec.sons[i], c)) + createRecordVarAux(p, rec.sons[i], excludedFieldIDs, output) of nkRecCase: - add(result, createRecordVarAux(p, rec.sons[0], c)) + createRecordVarAux(p, rec.sons[0], excludedFieldIDs, output) for i in countup(1, sonsLen(rec) - 1): - add(result, createRecordVarAux(p, lastSon(rec.sons[i]), c)) + createRecordVarAux(p, lastSon(rec.sons[i]), excludedFieldIDs, output) of nkSym: - if c > 0: add(result, ", ") - add(result, mangleName(rec.sym)) - add(result, ": ") - add(result, createVar(p, rec.sym.typ, false)) - inc(c) + if rec.sym.id notin excludedFieldIDs: + if output.len > 0: output.add(", ") + output.add(mangleName(rec.sym)) + output.add(": ") + output.add(createVar(p, rec.sym.typ, false)) else: internalError(rec.info, "createRecordVarAux") +proc createObjInitList(p: PProc, typ: PType, excludedFieldIDs: IntSet, output: var Rope) = + var t = typ + if tfFinal notin t.flags or t.sons[0] != nil: + if output.len > 0: output.add(", ") + addf(output, "m_type: $1" | "m_type = $#", [genTypeInfo(p, t)]) + while t != nil: + createRecordVarAux(p, t.n, excludedFieldIDs, output) + t = t.sons[0] + proc createVar(p: PProc, typ: PType, indirect: bool): Rope = var t = skipTypes(typ, abstractInst) case t.kind @@ -1154,15 +1164,9 @@ proc createVar(p: PProc, typ: PType, indirect: bool): Rope = add(result, "}") if indirect: result = "[$1]" % [result] of tyObject: - result = rope("{") - var c = 0 - if tfFinal notin t.flags or t.sons[0] != nil: - inc(c) - addf(result, "m_type: $1" | "m_type = $#", [genTypeInfo(p, t)]) - while t != nil: - add(result, createRecordVarAux(p, t.n, c)) - t = t.sons[0] - add(result, "}") + var initList : Rope + createObjInitList(p, t, initIntSet(), initList) + result = "{$1}" % [initList] if indirect: result = "[$1]" % [result] of tyVar, tyPtr, tyRef: if mapType(t) == etyBaseIndex: @@ -1435,6 +1439,7 @@ proc genObjConstr(p: PProc, n: PNode, r: var TCompRes) = var a: TCompRes r.res = rope("{") r.kind = resExpr + var fieldIDs = initIntSet() for i in countup(1, sonsLen(n) - 1): if i > 1: add(r.res, ", ") var it = n.sons[i] @@ -1442,7 +1447,10 @@ proc genObjConstr(p: PProc, n: PNode, r: var TCompRes) = gen(p, it.sons[1], a) var f = it.sons[0].sym if f.loc.r == nil: f.loc.r = mangleName(f) + fieldIDs.incl(f.id) addf(r.res, "$#: $#" | "$# = $#" , [f.loc.r, a.res]) + let t = skipTypes(n.typ, abstractInst + skipPtrs) + createObjInitList(p, t, fieldIDs, r.res) r.res.add("}") proc genConv(p: PProc, n: PNode, r: var TCompRes) = |