diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2015-05-26 21:11:32 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2015-05-26 21:11:32 +0200 |
commit | aa66dfd5a73c06d7f140fc3bccac350f412e91be (patch) | |
tree | 0306b239b458802d11285acfa6fe53d84ba7d3b2 | |
parent | 11bd7ef5e83a62bae0105afc1528ed6981ca288c (diff) | |
parent | d3c4c7c52feec4d0c9deed0540f849166695ebbb (diff) | |
download | Nim-aa66dfd5a73c06d7f140fc3bccac350f412e91be.tar.gz |
Merge pull request #2810 from yglukhov/js-codegen-obj-field-byvar
Fixes #2798. Passing arguments by var in certain cases leads to invalid JS.
-rw-r--r-- | compiler/jsgen.nim | 7 | ||||
-rw-r--r-- | tests/js/tobjfieldbyvar.nim | 20 |
2 files changed, 25 insertions, 2 deletions
diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 5c7071498..0f6323abc 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -880,7 +880,7 @@ proc genFieldAccess(p: PProc, n: PNode, r: var TCompRes) = if skipTypes(n.sons[0].typ, abstractVarRange).kind == tyTuple: r.res = "$1.Field$2" % [r.res, getFieldPosition(n.sons[1]).rope] else: - if n.sons[1].kind != nkSym: internalError(n.sons[1].info, "genFieldAddr") + if n.sons[1].kind != nkSym: internalError(n.sons[1].info, "genFieldAccess") var f = n.sons[1].sym if f.loc.r == nil: f.loc.r = mangleName(f) r.res = "$1.$2" % [r.res, f.loc.r] @@ -970,7 +970,10 @@ proc genAddr(p: PProc, n: PNode, r: var TCompRes) = of nkCheckedFieldExpr: genCheckedFieldAddr(p, n, r) of nkDotExpr: - genFieldAddr(p, n.sons[0], r) + if mapType(n.typ) == etyBaseIndex: + genFieldAddr(p, n.sons[0], r) + else: + genFieldAccess(p, n.sons[0], r) of nkBracketExpr: var ty = skipTypes(n.sons[0].typ, abstractVarRange) if ty.kind in {tyRef, tyPtr}: ty = skipTypes(ty.lastSon, abstractVarRange) diff --git a/tests/js/tobjfieldbyvar.nim b/tests/js/tobjfieldbyvar.nim new file mode 100644 index 000000000..91a3c1315 --- /dev/null +++ b/tests/js/tobjfieldbyvar.nim @@ -0,0 +1,20 @@ +discard """ + output: '''5 +''' +""" + +# bug #2798 + +type Inner = object + value: int + +type Outer = object + i: Inner + +proc test(i: var Inner) = + i.value += 5 + +var o: Outer +test(o.i) + +echo o.i.value |