Skip to content

Commit 3a4714d

Browse files
committed
Renovate field projection expressions
1 parent 40313fb commit 3a4714d

File tree

2 files changed

+17
-14
lines changed

2 files changed

+17
-14
lines changed

src/librustc/middle/trans/datum.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -511,14 +511,13 @@ pub impl Datum {
511511
}
512512
}
513513

514-
fn GEPi(&self, bcx: block,
515-
ixs: &[uint],
516-
ty: ty::t,
517-
source: DatumCleanup)
518-
-> Datum {
514+
fn get_element(&self, bcx: block,
515+
ty: ty::t,
516+
source: DatumCleanup,
517+
gep: fn(ValueRef) -> ValueRef) -> Datum {
519518
let base_val = self.to_ref_llval(bcx);
520519
Datum {
521-
val: GEPi(bcx, base_val, ixs),
520+
val: gep(base_val),
522521
mode: ByRef,
523522
ty: ty,
524523
source: source

src/librustc/middle/trans/expr.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -884,13 +884,15 @@ fn trans_lvalue_unadjusted(bcx: block, expr: @ast::expr) -> DatumBlock {
884884
let _icx = bcx.insn_ctxt("trans_rec_field");
885885

886886
let base_datum = unpack_datum!(bcx, trans_to_datum(bcx, base));
887-
do with_field_tys(bcx.tcx(), base_datum.ty, None) |_disr, field_tys| {
887+
let repr = adt::represent_type(bcx.ccx(), base_datum.ty);
888+
do with_field_tys(bcx.tcx(), base_datum.ty, None) |discr, field_tys| {
888889
let ix = ty::field_idx_strict(bcx.tcx(), field, field_tys);
889890
DatumBlock {
890-
datum: base_datum.GEPi(bcx,
891-
[0u, 0u, ix],
892-
field_tys[ix].mt.ty,
893-
ZeroMem),
891+
datum: do base_datum.get_element(bcx,
892+
field_tys[ix].mt.ty,
893+
ZeroMem) |srcval| {
894+
adt::trans_GEP(bcx, &repr, srcval, discr, ix)
895+
},
894896
bcx: bcx
895897
}
896898
}
@@ -1227,11 +1229,13 @@ fn trans_adt(bcx: block, repr: &adt::Repr, discr: int,
12271229
temp_cleanups.push(dest);
12281230
}
12291231
for optbase.each |base| {
1232+
// XXX is it sound to use the destination's repr on the base?
1233+
// XXX would it ever be reasonable to be here with discr != 0?
12301234
let base_datum = unpack_datum!(bcx, trans_to_datum(bcx, base.expr));
12311235
for base.fields.each |&(i, t)| {
1232-
let datum =
1233-
// XXX convert this to adt
1234-
base_datum.GEPi(bcx, struct_field(i), t, ZeroMem);
1236+
let datum = do base_datum.get_element(bcx, t, ZeroMem) |srcval| {
1237+
adt::trans_GEP(bcx, repr, srcval, discr, i)
1238+
};
12351239
let dest = adt::trans_GEP(bcx, repr, addr, discr, i);
12361240
bcx = datum.store_to(bcx, base.expr.id, INIT, dest);
12371241
}

0 commit comments

Comments
 (0)