Skip to content

Commit 93c32b5

Browse files
committed
trans: split trans_consume off from trans_operand.
1 parent 5522e67 commit 93c32b5

File tree

1 file changed

+50
-40
lines changed

1 file changed

+50
-40
lines changed

src/librustc_trans/mir/operand.rs

Lines changed: 50 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -164,56 +164,66 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
164164
OperandRef { val: val, ty: ty }
165165
}
166166

167-
pub fn trans_operand(&mut self,
167+
pub fn trans_consume(&mut self,
168168
bcx: &BlockAndBuilder<'bcx, 'tcx>,
169-
operand: &mir::Operand<'tcx>)
169+
lvalue: &mir::Lvalue<'tcx>)
170170
-> OperandRef<'tcx>
171171
{
172-
debug!("trans_operand(operand={:?})", operand);
172+
debug!("trans_consume(lvalue={:?})", lvalue);
173173

174-
match *operand {
175-
mir::Operand::Consume(ref lvalue) => {
176-
// watch out for temporaries that do not have an
177-
// alloca; they are handled somewhat differently
178-
if let &mir::Lvalue::Temp(index) = lvalue {
179-
match self.temps[index] {
180-
TempRef::Operand(Some(o)) => {
181-
return o;
182-
}
183-
TempRef::Operand(None) => {
184-
bug!("use of {:?} before def", lvalue);
185-
}
186-
TempRef::Lvalue(..) => {
187-
// use path below
188-
}
189-
}
174+
// watch out for temporaries that do not have an
175+
// alloca; they are handled somewhat differently
176+
if let &mir::Lvalue::Temp(index) = lvalue {
177+
match self.temps[index] {
178+
TempRef::Operand(Some(o)) => {
179+
return o;
180+
}
181+
TempRef::Operand(None) => {
182+
bug!("use of {:?} before def", lvalue);
190183
}
184+
TempRef::Lvalue(..) => {
185+
// use path below
186+
}
187+
}
188+
}
191189

192-
// Moves out of pair fields are trivial.
193-
if let &mir::Lvalue::Projection(ref proj) = lvalue {
194-
if let mir::Lvalue::Temp(index) = proj.base {
195-
let temp_ref = &self.temps[index];
196-
if let &TempRef::Operand(Some(o)) = temp_ref {
197-
match (o.val, &proj.elem) {
198-
(OperandValue::Pair(a, b),
199-
&mir::ProjectionElem::Field(ref f, ty)) => {
200-
let llval = [a, b][f.index()];
201-
return OperandRef {
202-
val: OperandValue::Immediate(llval),
203-
ty: bcx.monomorphize(&ty)
204-
};
205-
}
206-
_ => {}
207-
}
190+
// Moves out of pair fields are trivial.
191+
if let &mir::Lvalue::Projection(ref proj) = lvalue {
192+
if let mir::Lvalue::Temp(index) = proj.base {
193+
let temp_ref = &self.temps[index];
194+
if let &TempRef::Operand(Some(o)) = temp_ref {
195+
match (o.val, &proj.elem) {
196+
(OperandValue::Pair(a, b),
197+
&mir::ProjectionElem::Field(ref f, ty)) => {
198+
let llval = [a, b][f.index()];
199+
return OperandRef {
200+
val: OperandValue::Immediate(llval),
201+
ty: bcx.monomorphize(&ty)
202+
};
208203
}
204+
_ => {}
209205
}
210206
}
207+
}
208+
}
209+
210+
// for most lvalues, to consume them we just load them
211+
// out from their home
212+
let tr_lvalue = self.trans_lvalue(bcx, lvalue);
213+
let ty = tr_lvalue.ty.to_ty(bcx.tcx());
214+
self.trans_load(bcx, tr_lvalue.llval, ty)
215+
}
211216

212-
// for most lvalues, to consume them we just load them
213-
// out from their home
214-
let tr_lvalue = self.trans_lvalue(bcx, lvalue);
215-
let ty = tr_lvalue.ty.to_ty(bcx.tcx());
216-
self.trans_load(bcx, tr_lvalue.llval, ty)
217+
pub fn trans_operand(&mut self,
218+
bcx: &BlockAndBuilder<'bcx, 'tcx>,
219+
operand: &mir::Operand<'tcx>)
220+
-> OperandRef<'tcx>
221+
{
222+
debug!("trans_operand(operand={:?})", operand);
223+
224+
match *operand {
225+
mir::Operand::Consume(ref lvalue) => {
226+
self.trans_consume(bcx, lvalue)
217227
}
218228

219229
mir::Operand::Constant(ref constant) => {

0 commit comments

Comments
 (0)