1
Fork 0

Implement ProjectionElem::ConstantIndex

This commit is contained in:
bjorn3 2018-11-13 18:28:10 +01:00
parent e5ab49e762
commit 127e080f62
2 changed files with 33 additions and 69 deletions

View file

@ -5,7 +5,6 @@ Subject: [PATCH] [alloc] Disable some unsupported stuff
---
src/liballoc/boxed.rs | 6 ------
src/liballoc/str.rs | 4 ++++
src/liballoc/vec.rs | 2 --
3 files changed, 4 insertions(+), 8 deletions(-)
@ -33,42 +32,6 @@ index f989e70..597dd15 100644
fn write_isize(&mut self, i: isize) {
(**self).write_isize(i)
}
diff --git a/src/liballoc/str.rs b/src/liballoc/str.rs
index 2af8956..23dbb79 100644
--- a/src/liballoc/str.rs
+++ b/src/liballoc/str.rs
@@ -361,6 +361,7 @@ impl str {
#[stable(feature = "unicode_case_mapping", since = "1.2.0")]
pub fn to_lowercase(&self) -> String {
let mut s = String::with_capacity(self.len());
+ /*
for (i, c) in self[..].char_indices() {
if c == 'Σ' {
// Σ maps to σ, except at the end of a word where it maps to ς.
@@ -384,6 +385,7 @@ impl str {
}
}
}
+ */
return s;
fn map_uppercase_sigma(from: &str, i: usize, to: &mut String) {
@@ -435,6 +437,7 @@ impl str {
#[stable(feature = "unicode_case_mapping", since = "1.2.0")]
pub fn to_uppercase(&self) -> String {
let mut s = String::with_capacity(self.len());
+ /*
for c in self[..].chars() {
match conversions::to_upper(c) {
[a, '\0', _] => s.push(a),
@@ -449,6 +452,7 @@ impl str {
}
}
}
+ */
return s;
}
diff --git a/src/liballoc/vec.rs b/src/liballoc/vec.rs
index 2bc037e..2fe8894 100644
--- a/src/liballoc/vec.rs
@ -79,14 +42,13 @@ index 2bc037e..2fe8894 100644
impl_is_zero!(i64, |x| x == 0);
-impl_is_zero!(i128, |x| x == 0);
impl_is_zero!(isize, |x| x == 0);
impl_is_zero!(u16, |x| x == 0);
impl_is_zero!(u32, |x| x == 0);
impl_is_zero!(u64, |x| x == 0);
-impl_is_zero!(u128, |x| x == 0);
impl_is_zero!(usize, |x| x == 0);
impl_is_zero!(char, |x| x == '\0');
--
2.17.1 (Apple Git-112)
impl_is_zero!(char, |x| x == '\0');
--
2.17.1 (Apple Git-112)

View file

@ -588,18 +588,7 @@ fn trans_stmt<'a, 'tcx: 'a>(
Rvalue::Len(place) => {
let place = trans_place(fx, place);
let usize_layout = fx.layout_of(fx.tcx.types.usize);
let len = match place.layout().ty.sty {
ty::Array(_elem_ty, len) => {
let len = crate::constant::force_eval_const(fx, len)
.unwrap_usize(fx.tcx) as i64;
fx.bcx.ins().iconst(fx.pointer_type, len)
}
ty::Slice(_elem_ty) => match place {
CPlace::Addr(_, size, _) => size.unwrap(),
CPlace::Var(_, _) => unreachable!(),
},
_ => bug!("Rvalue::Len({:?})", place),
};
let len = codegen_array_len(fx, place);
lval.write_cvalue(fx, CValue::ByVal(len, usize_layout));
}
Rvalue::NullaryOp(NullOp::Box, content_ty) => {
@ -660,6 +649,24 @@ fn trans_stmt<'a, 'tcx: 'a>(
}
}
fn codegen_array_len<'a, 'tcx: 'a>(
fx: &mut FunctionCx<'a, 'tcx, impl Backend>,
place: CPlace<'tcx>,
) -> Value {
match place.layout().ty.sty {
ty::Array(_elem_ty, len) => {
let len = crate::constant::force_eval_const(fx, len)
.unwrap_usize(fx.tcx) as i64;
fx.bcx.ins().iconst(fx.pointer_type, len)
}
ty::Slice(_elem_ty) => match place {
CPlace::Addr(_, size, _) => size.unwrap(),
CPlace::Var(_, _) => unreachable!(),
},
_ => bug!("Rvalue::Len({:?})", place),
}
}
pub fn trans_get_discriminant<'a, 'tcx: 'a>(
fx: &mut FunctionCx<'a, 'tcx, impl Backend>,
value: CValue<'tcx>,
@ -1060,21 +1067,16 @@ pub fn trans_place<'a, 'tcx: 'a>(
ProjectionElem::ConstantIndex {
offset,
min_length: _,
from_end: false,
} => unimpl!(
"projection const index {:?} offset {:?} not from end",
projection.base,
offset
),
ProjectionElem::ConstantIndex {
offset,
min_length: _,
from_end: true,
} => unimpl!(
"projection const index {:?} offset {:?} from end",
projection.base,
offset
),
from_end,
} => {
let index = if !from_end {
fx.bcx.ins().iconst(fx.pointer_type, offset as i64)
} else {
let len = codegen_array_len(fx, base);
fx.bcx.ins().iadd_imm(len, -(offset as i64))
};
base.place_index(fx, index)
},
ProjectionElem::Subslice { from, to } => unimpl!(
"projection subslice {:?} from {} to {}",
projection.base,