Skip to content

Commit

Permalink
fixes nim-lang#21317; 1.6.4 regression; etyBaseIndex should return fa…
Browse files Browse the repository at this point in the history
…t pointers [backport 1.6] (nim-lang#21320)

fixes nim-lang#21317; regression; etyBaseIndex should return fat pointers
  • Loading branch information
ringabout authored and survivorm committed Feb 28, 2023
1 parent 1c8c6c2 commit 8d7b662
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 3 deletions.
7 changes: 4 additions & 3 deletions compiler/jsgen.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
15 changes: 15 additions & 0 deletions tests/system/trefs.nim
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 8d7b662

Please sign in to comment.