Merge pull request #2810 from yglukhov/js-codegen-obj-field-byvar

Fixes #2798. Passing arguments by var in certain cases leads to invalid JS.
This commit is contained in:
Andreas Rumpf
2015-05-26 21:11:32 +02:00
2 changed files with 25 additions and 2 deletions

View File

@@ -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)

View File

@@ -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