fixes #21317; 1.6.4 regression; etyBaseIndex should return fat pointers [backport 1.6] (#21320)

fixes #21317; regression; etyBaseIndex should return fat pointers

(cherry picked from commit cbf3ed9d92)
This commit is contained in:
ringabout
2023-02-01 14:58:12 +08:00
committed by narimiran
parent f9b95d1cb4
commit 28985686c0
2 changed files with 19 additions and 3 deletions

View File

@@ -2393,17 +2393,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]

15
tests/system/trefs.nim Normal file
View File

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