Skip to content

Commit

Permalink
fix #11354 jsgen not carefully handle genAddr with nkHiddenAddr,nkStm… (
Browse files Browse the repository at this point in the history
#15078)

* fix #11354 jsgen not carefully handle genAddr with nkHiddenAddr,nkStmtListExpr; genAsgn with lvalue tyVar and rvalue tyPtr

* correct logic

* add test for #11354

* handle nkHiddenAddr when n.len == 1

* Update compiler/jsgen.nim

* Update compiler/jsgen.nim

* Apply suggestions from code review

Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
  • Loading branch information
bung87 and Araq authored Jul 27, 2020
1 parent 191c388 commit cac09a4
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 1 deletion.
11 changes: 10 additions & 1 deletion compiler/jsgen.nim
Original file line number Diff line number Diff line change
Expand Up @@ -1069,6 +1069,10 @@ proc genAsgnAux(p: PProc, x, y: PNode, noCopyNeeded: bool) =
elif b.typ == etyNone:
internalAssert p.config, b.address == nil
lineF(p, "$# = [$#, 0];$n", [a.address, b.res])
elif x.typ.kind == tyVar and y.typ.kind == tyPtr:
lineF(p, "$# = [$#, $#];$n", [a.res, b.address, b.res])
lineF(p, "$1 = $2;$n", [a.address, b.res])
lineF(p, "$1 = $2;$n", [a.rdLoc, b.rdLoc])
else:
internalError(p.config, x.info, $("genAsgn", b.typ, a.typ))
else:
Expand Down Expand Up @@ -1318,7 +1322,12 @@ proc genAddr(p: PProc, n: PNode, r: var TCompRes) =
of nkObjDownConv:
gen(p, n[0], r)
of nkHiddenDeref:
gen(p, n[0][0], r)
gen(p, n[0], r)
of nkHiddenAddr:
gen(p, n[0], r)
of nkStmtListExpr:
if n.len == 1: gen(p, n[0], r)
else: internalError(p.config, n[0].info, "genAddr for complex nkStmtListExpr")
else: internalError(p.config, n[0].info, "genAddr: " & $n[0].kind)

proc attachProc(p: PProc; content: Rope; s: PSym) =
Expand Down
20 changes: 20 additions & 0 deletions tests/js/t11354.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
discard """
output: '''
0
@[@[0, 1]]
'''
"""

type
TrackySeq[T] = object
s: seq[T]
pos: int

proc foobar(ls: var TrackySeq[seq[int]], i: int): var seq[int] =
echo ls.pos # removing this, or making the return explicit works
ls.s[i]

var foo: TrackySeq[seq[int]]
foo.s.add(@[0])
foo.foobar(0).add(1)
echo foo.s

0 comments on commit cac09a4

Please sign in to comment.