From a6228fb57dc481d4a41a06a8dff927eb59b8f165 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Wed, 1 Feb 2023 14:58:12 +0800 Subject: [PATCH] fixes #21317; 1.6.4 regression; etyBaseIndex should return fat pointers [backport 1.6] (#21320) fixes #21317; regression; etyBaseIndex should return fat pointers --- compiler/jsgen.nim | 7 ++++--- tests/system/trefs.nim | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 tests/system/trefs.nim diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index d8fb6d57df4e5..60399d3cd523a 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 0000000000000..8c36aec523b5f --- /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