summary refs log tree commit diff stats
path: root/compiler/ccgexprs.nim
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2013-03-07 19:19:40 +0100
committerAraq <rumpf_a@web.de>2013-03-07 19:19:40 +0100
commit296e7c9f40a69958579fd8169ddc38cf0a72730c (patch)
treee17b6534842a2f3452b1fb8073a6e85361a3b861 /compiler/ccgexprs.nim
parentf1b8f834955d40274e017c6f69528eb88e6f0b05 (diff)
downloadNim-296e7c9f40a69958579fd8169ddc38cf0a72730c.tar.gz
next steps for object construction expressions
Diffstat (limited to 'compiler/ccgexprs.nim')
-rwxr-xr-xcompiler/ccgexprs.nim33
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