JS: Fixed ICE on ptr assignment
This commit is contained in:
parent
09651bec5e
commit
82b022ebc6
3 changed files with 29 additions and 6 deletions
|
|
@ -1471,13 +1471,21 @@ proc genVarInit(p: PProc, v: PSym, n: PNode) =
|
||||||
useMagic(p, "nimCopy")
|
useMagic(p, "nimCopy")
|
||||||
s = "nimCopy(null, $1, $2)" % [a.res, genTypeInfo(p, n.typ)]
|
s = "nimCopy(null, $1, $2)" % [a.res, genTypeInfo(p, n.typ)]
|
||||||
of etyBaseIndex:
|
of etyBaseIndex:
|
||||||
if (a.typ != etyBaseIndex): internalError(n.info, "genVarInit")
|
let targetBaseIndex = {sfAddrTaken, sfGlobal} * v.flags == {}
|
||||||
if {sfAddrTaken, sfGlobal} * v.flags != {}:
|
if a.typ == etyBaseIndex:
|
||||||
addf(p.body, "var $1 = [$2, $3];$n",
|
if targetBaseIndex:
|
||||||
[v.loc.r, a.address, a.res])
|
addf(p.body, "var $1 = $2, $1_Idx = $3;$n", [
|
||||||
|
v.loc.r, a.address, a.res])
|
||||||
|
else:
|
||||||
|
addf(p.body, "var $1 = [$2, $3];$n",
|
||||||
|
[v.loc.r, a.address, a.res])
|
||||||
else:
|
else:
|
||||||
addf(p.body, "var $1 = $2; var $1_Idx = $3;$n", [
|
if targetBaseIndex:
|
||||||
v.loc.r, a.address, a.res])
|
let tmp = p.getTemp
|
||||||
|
addf(p.body, "var $1 = $2, $3 = $1[0], $3_Idx = $1[1];$n",
|
||||||
|
[tmp, a.res, v.loc.r])
|
||||||
|
else:
|
||||||
|
addf(p.body, "var $1 = $2;$n", [v.loc.r, a.res])
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
s = a.res
|
s = a.res
|
||||||
|
|
|
||||||
|
|
@ -70,3 +70,10 @@ proc testPtr(p: pointer, a: int) =
|
||||||
var i = 123
|
var i = 123
|
||||||
testPtr(addr i, 5)
|
testPtr(addr i, 5)
|
||||||
doAssert(i == 124)
|
doAssert(i == 124)
|
||||||
|
|
||||||
|
var someGlobal = 5
|
||||||
|
proc getSomeGlobalPtr(): ptr int = addr someGlobal
|
||||||
|
let someGlobalPtr = getSomeGlobalPtr()
|
||||||
|
doAssert(someGlobalPtr[] == 5)
|
||||||
|
someGlobalPtr[] = 10
|
||||||
|
doAssert(someGlobal == 10)
|
||||||
|
|
|
||||||
|
|
@ -41,3 +41,11 @@ proc bar(s: var seq[int], a: int) =
|
||||||
foo(s)
|
foo(s)
|
||||||
s.bar(5)
|
s.bar(5)
|
||||||
doAssert(s == @[123, 1])
|
doAssert(s == @[123, 1])
|
||||||
|
|
||||||
|
import tables
|
||||||
|
block: # Test get addr of byvar return value
|
||||||
|
var t = initTable[string, int]()
|
||||||
|
t["hi"] = 5
|
||||||
|
let a = addr t["hi"]
|
||||||
|
a[] = 10
|
||||||
|
doAssert(t["hi"] == 10)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue