From fa4a37759be06c2b96c133cfc0f85b7cf2ce00b4 Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Wed, 22 Aug 2018 17:58:25 +0200 Subject: [PATCH] Rvalue::Len --- src/base.rs | 10 +++++++++- src/common.rs | 15 ++++++--------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/base.rs b/src/base.rs index 9b44cd2e4b73..c0ea7644f903 100644 --- a/src/base.rs +++ b/src/base.rs @@ -474,7 +474,15 @@ fn trans_stmt<'a, 'tcx: 'a>( to.write_cvalue(fx, operand); } } - Rvalue::Len(lval) => unimpl!("rval len {:?}", lval), + Rvalue::Len(place) => { + let place = trans_place(fx, place); + let size = match place { + CPlace::Addr(_, size, _) => size.unwrap(), + CPlace::Var(_, _) => unreachable!(), + }; + let usize_layout = fx.layout_of(fx.tcx.types.usize); + lval.write_cvalue(fx, CValue::ByVal(size, usize_layout)); + } Rvalue::NullaryOp(NullOp::Box, ty) => unimplemented!("rval box {:?}", ty), Rvalue::NullaryOp(NullOp::SizeOf, ty) => { assert!( diff --git a/src/common.rs b/src/common.rs index b785177251fa..9bd3e823fcb3 100644 --- a/src/common.rs +++ b/src/common.rs @@ -433,23 +433,20 @@ impl<'a, 'tcx: 'a> CPlace<'tcx> { fx: &mut FunctionCx<'a, 'tcx, impl Backend>, index: Value, ) -> CPlace<'tcx> { - let addr = self.expect_addr(); - let layout = self.layout(); - if layout.is_unsized() { - unimpl!("unsized place_field"); - } - - match layout.ty.sty { + match self.layout().ty.sty { ty::Array(elem_ty, _) => { let elem_layout = fx.layout_of(elem_ty); + let offset = fx .bcx .ins() .imul_imm(index, elem_layout.size.bytes() as i64); + + let addr = self.expect_addr(); CPlace::Addr(fx.bcx.ins().iadd(addr, offset), None, elem_layout) } - ty::Slice(_elem_ty) => unimplemented!("place_index(TySlice)"), - _ => bug!("place_index({:?})", layout.ty), + ty::Slice(_elem_ty) => unimpl!("place_index(TySlice)"), + _ => bug!("place_index({:?})", self.layout().ty), } }