fix #11354 jsgen not carefully handle genAddr with nkHiddenAddr,nkStm… (#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>
This commit is contained in:
Bung
2020-07-28 03:13:49 +08:00
committed by GitHub
parent 191c388792
commit cac09a43ae
2 changed files with 30 additions and 1 deletions

View File

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

20
tests/js/t11354.nim Normal file
View File

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