diff options
author | Bung <crc32@qq.com> | 2020-07-28 03:13:49 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-27 21:13:49 +0200 |
commit | cac09a43aea0e8bcc6a7f2634cfcd4274a260b49 (patch) | |
tree | 556c72495802756b0d98fbe7cefd0ae552cda475 | |
parent | 191c388792c1b57c3855e9c3b9c83293be8a6207 (diff) | |
download | Nim-cac09a43aea0e8bcc6a7f2634cfcd4274a260b49.tar.gz |
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>
-rw-r--r-- | compiler/jsgen.nim | 11 | ||||
-rw-r--r-- | tests/js/t11354.nim | 20 |
2 files changed, 30 insertions, 1 deletions
diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 3351d64ae..ede4d14e0 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -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) = diff --git a/tests/js/t11354.nim b/tests/js/t11354.nim new file mode 100644 index 000000000..8dee90de0 --- /dev/null +++ b/tests/js/t11354.nim @@ -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 \ No newline at end of file |