summary refs log tree commit diff stats
path: root/compiler/jsgen.nim
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2021-06-28 17:08:45 +0200
committerGitHub <noreply@github.com>2021-06-28 17:08:45 +0200
commit0be17f5d9c6b66a8f8dda83c9a3c77c61be3844d (patch)
tree7809cc312dbbc3379aefa802dcaa0633389f9493 /compiler/jsgen.nim
parent6e74fecb4275272e5224e2a0ba45df5ca2c40b82 (diff)
downloadNim-0be17f5d9c6b66a8f8dda83c9a3c77c61be3844d.tar.gz
fixes #18319 (#18375)
Diffstat (limited to 'compiler/jsgen.nim')
-rw-r--r--compiler/jsgen.nim14
1 files changed, 12 insertions, 2 deletions
diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim
index 393ac83c2..a9339c7fd 100644
--- a/compiler/jsgen.nim
+++ b/compiler/jsgen.nim
@@ -29,7 +29,7 @@ implements the required case distinction.
 
 
 import
-  ast, trees, magicsys, options,
+  ast, astalgo, trees, magicsys, options,
   nversion, msgs, idents, types,
   ropes, passes, ccgutils, wordrecg, renderer,
   cgmeth, lowerings, sighashes, modulegraphs, lineinfos, rodutils,
@@ -2234,6 +2234,16 @@ proc genTupleConstr(p: PProc, n: PNode, r: var TCompRes) =
       r.res.addf("Field$#: $#", [i.rope, a.res])
   r.res.add("}")
 
+proc lookupFieldAgain(ty: PType; field: PSym): PSym =
+  var ty = ty
+  while ty != nil:
+    ty = ty.skipTypes(skipPtrs)
+    assert(ty.kind in {tyTuple, tyObject})
+    result = lookupInRecord(ty.n, field.name)
+    if result != nil: break
+    ty = ty[0]
+  if result == nil: result = field
+
 proc genObjConstr(p: PProc, n: PNode, r: var TCompRes) =
   var a: TCompRes
   r.kind = resExpr
@@ -2247,7 +2257,7 @@ proc genObjConstr(p: PProc, n: PNode, r: var TCompRes) =
     gen(p, val, a)
     var f = it[0].sym
     if f.loc.r == nil: f.loc.r = mangleName(p.module, f)
-    fieldIDs.incl(f.id)
+    fieldIDs.incl(lookupFieldAgain(n.typ, f).id)
 
     let typ = val.typ.skipTypes(abstractInst)
     if a.typ == etyBaseIndex: