diff options
author | Araq <rumpf_a@web.de> | 2013-03-07 19:19:40 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2013-03-07 19:19:40 +0100 |
commit | 296e7c9f40a69958579fd8169ddc38cf0a72730c (patch) | |
tree | e17b6534842a2f3452b1fb8073a6e85361a3b861 /compiler/ccgexprs.nim | |
parent | f1b8f834955d40274e017c6f69528eb88e6f0b05 (diff) | |
download | Nim-296e7c9f40a69958579fd8169ddc38cf0a72730c.tar.gz |
next steps for object construction expressions
Diffstat (limited to 'compiler/ccgexprs.nim')
-rwxr-xr-x | compiler/ccgexprs.nim | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index ccabb3600..b20af0cfc 100755 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -732,7 +732,38 @@ proc genCheckedRecordField(p: BProc, e: PNode, d: var TLoc) = genRecordField(p, e.sons[0], d) proc genObjConstr(p: BProc, e: PNode, d: var TLoc) = - internalError(e.info, "too implement") + var tmp: TLoc + var t = e.typ.skipTypes(abstractInst) + getTemp(p, t, tmp) + let isRef = t.kind == tyRef + var r = rdLoc(tmp) + if isRef: + t = t.sons[0].skipTypes(abstractInst) + r = ropef("(*$1)", r) + # XXX generate 'new' call here + + discard getTypeDesc(p.module, t) + for i in 1 .. <e.len: + let it = e.sons[i] + # XXX field check here + var field: PSym = nil + var ty = t + while ty != nil: + field = lookupInRecord(ty.n, it.sons[0].sym.name) + if field != nil: break + if gCmd != cmdCompileToCpp: app(r, ".Sup") + ty = GetUniqueType(ty.sons[0]) + if field == nil or field.loc.r == nil: InternalError(e.info, "genObjConstr") + app(r, ".") + app(r, field.loc.r) + var tmp2: TLoc + tmp2.r = r + tmp2.k = locTemp + tmp2.t = field.loc.t + tmp2.s = onHeap + tmp2.heapRoot = tmp.r + expr(p, it.sons[1], tmp2) + genAssignment(p, d, tmp, {}) proc genArrayElem(p: BProc, e: PNode, d: var TLoc) = var a, b: TLoc |