diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2023-02-01 14:58:12 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-01 07:58:12 +0100 |
commit | cbf3ed9d92b32e9e28f1e4d52300d9b103ee6fa1 (patch) | |
tree | b20a6f8f00dbcb069b7cde764e5ae7fc633f3e05 | |
parent | b5f64f55d02a8ba980244596dcf310dd76b48fd8 (diff) | |
download | Nim-cbf3ed9d92b32e9e28f1e4d52300d9b103ee6fa1.tar.gz |
fixes #21317; 1.6.4 regression; etyBaseIndex should return fat pointers [backport 1.6] (#21320)
fixes #21317; regression; etyBaseIndex should return fat pointers
-rw-r--r-- | compiler/jsgen.nim | 7 | ||||
-rw-r--r-- | tests/system/trefs.nim | 15 |
2 files changed, 19 insertions, 3 deletions
diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index d8fb6d57d..60399d3cd 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -2484,17 +2484,18 @@ proc genProc(oldProc: PProc, prc: PSym): Rope = if prc.typ[0] != nil and sfPure notin prc.flags: resultSym = prc.ast[resultPos].sym let mname = mangleName(p.module, resultSym) - let returnAddress = not isIndirect(resultSym) and + # otherwise uses "fat pointers" + let useRawPointer = not isIndirect(resultSym) and resultSym.typ.kind in {tyVar, tyPtr, tyLent, tyRef, tyOwned} and mapType(p, resultSym.typ) == etyBaseIndex - if returnAddress: + if useRawPointer: resultAsgn = p.indentLine(("var $# = null;$n") % [mname]) resultAsgn.add p.indentLine("var $#_Idx = 0;$n" % [mname]) else: let resVar = createVar(p, resultSym.typ, isIndirect(resultSym)) resultAsgn = p.indentLine(("var $# = $#;$n") % [mname, resVar]) gen(p, prc.ast[resultPos], a) - if returnAddress: + if mapType(p, resultSym.typ) == etyBaseIndex: returnStmt = "return [$#, $#];$n" % [a.address, a.res] else: returnStmt = "return $#;$n" % [a.res] diff --git a/tests/system/trefs.nim b/tests/system/trefs.nim new file mode 100644 index 000000000..8c36aec52 --- /dev/null +++ b/tests/system/trefs.nim @@ -0,0 +1,15 @@ +discard """ + targets: "c js" +""" + +# bug #21317 +proc parseHook*(v: var ref int) = + var a: ref int + new(a) + a[] = 123 + v = a + +proc fromJson2*(): ref int = + parseHook(result) + +doAssert fromJson2()[] == 123 |