message: factor out lvalue field access into its own function
diff: @@ -160,22 +160,19 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
  Ok(lvalue)
  }
  - fn eval_lvalue_projection(
  + fn lvalue_field(
  &mut self,
  - proj: &mir::LvalueProjection<'tcx>,
  + base: Lvalue<'tcx>,
  + field: usize,
  + base_ty: Ty<'tcx>,
  + field_ty: Ty<'tcx>,
  ) -> EvalResult<'tcx, Lvalue<'tcx>> {
  - use rustc::mir::ProjectionElem::*;
  - let (ptr, extra) = match proj.elem {
  - Field(field, field_ty) => {
  - let base = self.eval_lvalue(&proj.base)?;
  - let base_ty = self.lvalue_ty(&proj.base);
  let base_layout = self.type_layout(base_ty)?;
  // FIXME(solson)
  let base = self.force_allocation(base)?;
  let (base_ptr, base_extra) = base.to_ptr_and_extra();
  let field_ty = self.monomorphize(field_ty, self.substs());
  - let field = field.index();
  use rustc::ty::layout::Layout::*;
  let (offset, packed) = match *base_layout {
  @@ -241,7 +238,19 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
  base_extra
  };
  - (ptr, extra)
  + Ok(Lvalue::Ptr { ptr, extra })
  + }
  +
  + fn eval_lvalue_projection(
  + &mut self,
  + proj: &mir::LvalueProjection<'tcx>,
  + ) -> EvalResult<'tcx, Lvalue<'tcx>> {
  + use rustc::mir::ProjectionElem::*;
  + let (ptr, extra) = match proj.elem {
  + Field(field, field_ty) => {
  + let base = self.eval_lvalue(&proj.base)?;
  + let base_ty = self.lvalue_ty(&proj.base);
  + return self.lvalue_field(base, field.index(), base_ty, field_ty);
  }
  Downcast(_, variant) => {
  