mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 17:34:43 +00:00
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:
@@ -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)
|
||||
|
||||
20
tests/js/tobjfieldbyvar.nim
Normal file
20
tests/js/tobjfieldbyvar.nim
Normal 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
|
||||
Reference in New Issue
Block a user