wip
This commit is contained in:
parent
02bbfa1164
commit
afa80092d3
2 changed files with 19 additions and 1 deletions
|
|
@ -730,6 +730,9 @@ proc genTupleElem(p: BProc, e: PNode, d: var TLoc) =
|
||||||
else: internalError(e.info, "genTupleElem")
|
else: internalError(e.info, "genTupleElem")
|
||||||
addf(r, ".Field$1", [rope(i)])
|
addf(r, ".Field$1", [rope(i)])
|
||||||
putIntoDest(p, d, tupType.sons[i], r, a.s)
|
putIntoDest(p, d, tupType.sons[i], r, a.s)
|
||||||
|
if a.s == OnStackShadowDup:
|
||||||
|
d.s = OnStackShadowDup
|
||||||
|
d.dup = ropef("$1[$2]", a.dup, ithRefInTuple(tupType, i))
|
||||||
|
|
||||||
proc lookupFieldAgain(p: BProc, ty: PType; field: PSym; r: var Rope): PSym =
|
proc lookupFieldAgain(p: BProc, ty: PType; field: PSym; r: var Rope): PSym =
|
||||||
var ty = ty
|
var ty = ty
|
||||||
|
|
@ -754,12 +757,18 @@ proc genRecordField(p: BProc, e: PNode, d: var TLoc) =
|
||||||
# so we use Field$i
|
# so we use Field$i
|
||||||
addf(r, ".Field$1", [rope(f.position)])
|
addf(r, ".Field$1", [rope(f.position)])
|
||||||
putIntoDest(p, d, f.typ, r, a.s)
|
putIntoDest(p, d, f.typ, r, a.s)
|
||||||
|
if a.s == OnStackShadowDup:
|
||||||
|
d.s = OnStackShadowDup
|
||||||
|
d.dup = ropef("$1[$2]", a.dup, ithRefInTuple(ty, f.position))
|
||||||
else:
|
else:
|
||||||
let field = lookupFieldAgain(p, ty, f, r)
|
let field = lookupFieldAgain(p, ty, f, r)
|
||||||
if field.loc.r == nil: fillObjectFields(p.module, ty)
|
if field.loc.r == nil: fillObjectFields(p.module, ty)
|
||||||
if field.loc.r == nil: internalError(e.info, "genRecordField 3 " & typeToString(ty))
|
if field.loc.r == nil: internalError(e.info, "genRecordField 3 " & typeToString(ty))
|
||||||
addf(r, ".$1", [field.loc.r])
|
addf(r, ".$1", [field.loc.r])
|
||||||
putIntoDest(p, d, field.typ, r, a.s)
|
putIntoDest(p, d, field.typ, r, a.s)
|
||||||
|
if a.s == OnStackShadowDup and field.loc.dup != nil:
|
||||||
|
d.s = OnStackShadowDup
|
||||||
|
d.dup = ropef("$1.$2", a.dup, field.loc.dup)
|
||||||
#d.s = a.s
|
#d.s = a.s
|
||||||
|
|
||||||
proc genInExprAux(p: BProc, e: PNode, a, b, d: var TLoc)
|
proc genInExprAux(p: BProc, e: PNode, a, b, d: var TLoc)
|
||||||
|
|
@ -811,6 +820,9 @@ proc genCheckedRecordField(p: BProc, e: PNode, d: var TLoc) =
|
||||||
genFieldCheck(p, e, r, field, ty)
|
genFieldCheck(p, e, r, field, ty)
|
||||||
add(r, rfmt(nil, ".$1", field.loc.r))
|
add(r, rfmt(nil, ".$1", field.loc.r))
|
||||||
putIntoDest(p, d, field.typ, r, a.s)
|
putIntoDest(p, d, field.typ, r, a.s)
|
||||||
|
if a.s == OnStackShadowDup and field.loc.dup != nil:
|
||||||
|
d.s = OnStackShadowDup
|
||||||
|
d.dup = ropef("$1.$2", a.dup, field.loc.dup)
|
||||||
else:
|
else:
|
||||||
genRecordField(p, e.sons[0], d)
|
genRecordField(p, e.sons[0], d)
|
||||||
|
|
||||||
|
|
@ -838,6 +850,9 @@ proc genArrayElem(p: BProc, x, y: PNode, d: var TLoc) =
|
||||||
d.inheritLocation(a)
|
d.inheritLocation(a)
|
||||||
putIntoDest(p, d, elemType(skipTypes(ty, abstractVar)),
|
putIntoDest(p, d, elemType(skipTypes(ty, abstractVar)),
|
||||||
rfmt(nil, "$1[($2)- $3]", rdLoc(a), rdCharLoc(b), first), a.s)
|
rfmt(nil, "$1[($2)- $3]", rdLoc(a), rdCharLoc(b), first), a.s)
|
||||||
|
if a.s == OnStackShadowDup:
|
||||||
|
d.s = OnStackShadowDup
|
||||||
|
d.dup = ropef("$1[($2)- $3]", a.dup, rdCharLoc(b), first)
|
||||||
|
|
||||||
proc genCStringElem(p: BProc, x, y: PNode, d: var TLoc) =
|
proc genCStringElem(p: BProc, x, y: PNode, d: var TLoc) =
|
||||||
var a, b: TLoc
|
var a, b: TLoc
|
||||||
|
|
@ -858,6 +873,9 @@ proc genOpenArrayElem(p: BProc, x, y: PNode, d: var TLoc) =
|
||||||
if d.k == locNone: d.s = a.s
|
if d.k == locNone: d.s = a.s
|
||||||
putIntoDest(p, d, elemType(skipTypes(a.t, abstractVar)),
|
putIntoDest(p, d, elemType(skipTypes(a.t, abstractVar)),
|
||||||
rfmt(nil, "$1[$2]", rdLoc(a), rdCharLoc(b)), a.s)
|
rfmt(nil, "$1[$2]", rdLoc(a), rdCharLoc(b)), a.s)
|
||||||
|
if a.s == OnStackShadowDup:
|
||||||
|
d.s = OnStackShadowDup
|
||||||
|
d.dup = ropef("$1[$2]", a.dup, rdCharLoc(b))
|
||||||
|
|
||||||
proc genSeqElem(p: BProc, x, y: PNode, d: var TLoc) =
|
proc genSeqElem(p: BProc, x, y: PNode, d: var TLoc) =
|
||||||
var a, b: TLoc
|
var a, b: TLoc
|
||||||
|
|
|
||||||
|
|
@ -298,7 +298,7 @@ proc resetLoc(p: BProc, loc: var TLoc) =
|
||||||
else:
|
else:
|
||||||
linefmt(p, cpsStmts, "$1 = 0;$n", rdLoc(loc))
|
linefmt(p, cpsStmts, "$1 = 0;$n", rdLoc(loc))
|
||||||
else:
|
else:
|
||||||
XXX use stackPlacement here?
|
# XXX use stackPlacement here?
|
||||||
if optNilCheck in p.options:
|
if optNilCheck in p.options:
|
||||||
linefmt(p, cpsStmts, "#chckNil((void*)$1);$n", addrLoc(loc))
|
linefmt(p, cpsStmts, "#chckNil((void*)$1);$n", addrLoc(loc))
|
||||||
if loc.s != OnStack:
|
if loc.s != OnStack:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue