mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-24 08:15:25 +00:00
* revert #12217 since the root problem seems to have been fixed; fix #15974;fix #12551; fix #19464 * fix #16020; fix #16780 * fix tests and #16613 * fix #14553 * fix #19909; skip skipRegisterAddr * fix #18641
This commit is contained in:
@@ -523,8 +523,7 @@ when not defined(nimHasSinkInference):
|
||||
|
||||
template takeAddress(reg, source) =
|
||||
reg.nodeAddr = addr source
|
||||
when defined(gcDestructors):
|
||||
GC_ref source
|
||||
GC_ref source
|
||||
|
||||
proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
|
||||
var pc = start
|
||||
@@ -1011,6 +1010,12 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
|
||||
decodeBC(rkInt)
|
||||
template getTyp(n): untyped =
|
||||
n.typ.skipTypes(abstractInst)
|
||||
template skipRegisterAddr(n: TFullReg): TFullReg =
|
||||
var tmp = n
|
||||
while tmp.kind == rkRegisterAddr:
|
||||
tmp = tmp.regAddr[]
|
||||
tmp
|
||||
|
||||
proc ptrEquality(n1: ptr PNode, n2: PNode): bool =
|
||||
## true if n2.intVal represents a ptr equal to n1
|
||||
let p1 = cast[int](n1)
|
||||
@@ -1024,16 +1029,19 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
|
||||
return t2.kind in PtrLikeKinds and n2.intVal == p1
|
||||
else: return false
|
||||
|
||||
if regs[rb].kind == rkNodeAddr:
|
||||
if regs[rc].kind == rkNodeAddr:
|
||||
ret = regs[rb].nodeAddr == regs[rc].nodeAddr
|
||||
let rbReg = skipRegisterAddr(regs[rb])
|
||||
let rcReg = skipRegisterAddr(regs[rc])
|
||||
|
||||
if rbReg.kind == rkNodeAddr:
|
||||
if rcReg.kind == rkNodeAddr:
|
||||
ret = rbReg.nodeAddr == rcReg.nodeAddr
|
||||
else:
|
||||
ret = ptrEquality(regs[rb].nodeAddr, regs[rc].node)
|
||||
elif regs[rc].kind == rkNodeAddr:
|
||||
ret = ptrEquality(regs[rc].nodeAddr, regs[rb].node)
|
||||
ret = ptrEquality(rbReg.nodeAddr, rcReg.node)
|
||||
elif rcReg.kind == rkNodeAddr:
|
||||
ret = ptrEquality(rcReg.nodeAddr, rbReg.node)
|
||||
else:
|
||||
let nb = regs[rb].node
|
||||
let nc = regs[rc].node
|
||||
let nb = rbReg.node
|
||||
let nc = rcReg.node
|
||||
if nb.kind != nc.kind: discard
|
||||
elif (nb == nc) or (nb.kind == nkNilLit): ret = true # intentional
|
||||
elif nb.kind in {nkSym, nkTupleConstr, nkClosure} and nb.typ != nil and nb.typ.kind == tyProc and sameConstant(nb, nc):
|
||||
|
||||
@@ -1382,9 +1382,6 @@ proc unneededIndirection(n: PNode): bool =
|
||||
n.typ.skipTypes(abstractInstOwned-{tyTypeDesc}).kind == tyRef
|
||||
|
||||
proc canElimAddr(n: PNode): PNode =
|
||||
if n[0].typ.skipTypes(abstractInst).kind in {tyObject, tyTuple, tyArray}:
|
||||
# objects are reference types in the VM
|
||||
return n[0]
|
||||
case n[0].kind
|
||||
of nkObjUpConv, nkObjDownConv, nkChckRange, nkChckRangeF, nkChckRange64:
|
||||
var m = n[0][0]
|
||||
|
||||
Reference in New Issue
Block a user