about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAriel Ben-Yehuda <ariel.byd@gmail.com>2015-11-10 22:26:59 +0200
committerAriel Ben-Yehuda <ariel.byd@gmail.com>2015-11-13 22:47:02 +0200
commitc1bfd0ca6b6aedd4fa29e3dddf927f31051f3ea6 (patch)
tree535ecc5758ee24b360390b254bb0f588d01aae10
parentdcb64b52a241406f77d84572c90a71a366fc3c37 (diff)
downloadrust-c1bfd0ca6b6aedd4fa29e3dddf927f31051f3ea6.tar.gz
rust-c1bfd0ca6b6aedd4fa29e3dddf927f31051f3ea6.zip
implement lvalue_len
no tests - sorry
-rw-r--r--src/librustc_trans/trans/mir/lvalue.rs15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/librustc_trans/trans/mir/lvalue.rs b/src/librustc_trans/trans/mir/lvalue.rs
index d846307dc78..f6aa79393d3 100644
--- a/src/librustc_trans/trans/mir/lvalue.rs
+++ b/src/librustc_trans/trans/mir/lvalue.rs
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 use llvm::ValueRef;
-use rustc::middle::ty::Ty;
+use rustc::middle::ty::{self, Ty};
 use rustc_mir::repr as mir;
 use rustc_mir::tcx::LvalueTy;
 use trans::adt;
@@ -52,10 +52,17 @@ impl<'tcx> LvalueRef<'tcx> {
 
 impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
     pub fn lvalue_len(&mut self,
-                      _bcx: Block<'bcx, 'tcx>,
-                      _lvalue: LvalueRef<'tcx>)
+                      bcx: Block<'bcx, 'tcx>,
+                      lvalue: LvalueRef<'tcx>)
                       -> ValueRef {
-        unimplemented!()
+        match lvalue.ty.to_ty(bcx.tcx()).sty {
+            ty::TyArray(_, n) => common::C_uint(bcx.ccx(), n),
+            ty::TySlice(_) | ty::TyStr => {
+                assert!(lvalue.llextra != ptr::null_mut());
+                lvalue.llextra
+            }
+            _ => bcx.sess().bug("unexpected type in get_base_and_len"),
+        }
     }
 
     pub fn trans_lvalue(&mut self,