about summary refs log tree commit diff
diff options
context:
space:
mode:
authorb-naber <bn263@gmx.de>2022-04-12 16:08:59 +0200
committerb-naber <bn263@gmx.de>2022-04-12 16:08:59 +0200
commit4b126b805bd51d2b7aa335cadd571a319ec0e224 (patch)
tree4cbed16eb1722a54e37cc158389801129ae2ef87
parent8a5273bc995d5ac457eaf70bf3d10c1513277234 (diff)
downloadrust-4b126b805bd51d2b7aa335cadd571a319ec0e224.tar.gz
rust-4b126b805bd51d2b7aa335cadd571a319ec0e224.zip
use len on mplace instead of reading immediate, remove dead code
-rw-r--r--compiler/rustc_const_eval/src/const_eval/mod.rs49
-rw-r--r--compiler/rustc_const_eval/src/interpret/operand.rs2
-rw-r--r--compiler/rustc_const_eval/src/interpret/place.rs2
3 files changed, 14 insertions, 39 deletions
diff --git a/compiler/rustc_const_eval/src/const_eval/mod.rs b/compiler/rustc_const_eval/src/const_eval/mod.rs
index ee763f3b0b7..541462a26d5 100644
--- a/compiler/rustc_const_eval/src/const_eval/mod.rs
+++ b/compiler/rustc_const_eval/src/const_eval/mod.rs
@@ -12,8 +12,8 @@ use rustc_span::{source_map::DUMMY_SP, symbol::Symbol};
 use rustc_target::abi::VariantIdx;
 
 use crate::interpret::{
-    intern_const_alloc_recursive, ConstValue, Immediate, InternKind, InterpCx, InterpResult,
-    MPlaceTy, MemPlaceMeta, Scalar,
+    intern_const_alloc_recursive, ConstValue, InternKind, InterpCx, InterpResult, MPlaceTy,
+    MemPlaceMeta, Scalar,
 };
 
 mod error;
@@ -119,44 +119,19 @@ fn const_to_valtree_inner<'tcx>(
         ty::Ref(_, inner_ty, _)  => {
             match inner_ty.kind() {
                 ty::Slice(_) | ty::Str => {
-                    match ecx.try_read_immediate_from_mplace(&place) {
-                        Ok(Some(imm)) => {
-                            let derefd = ecx.deref_operand(&place.into()).expect(&format!("couldnt deref {:?}", imm));
-                            debug!(?derefd);
-
-                            let len = match *imm {
-                                Immediate::ScalarPair(_, b) => {
-                                    let len = b.to_machine_usize(&ecx.tcx.tcx).unwrap();
-                                    len
-                                }
-                                _ => bug!("expected ScalarPair for &[T] or &str"),
-                            };
-                            debug!(?len);
-
-                            let valtree = slice_branches(ecx, &derefd, len);
-                            debug!(?valtree);
-
-                            valtree
-                        }
-                        _ => {
-                            None
-                        }
-                    }
+                    let derefd = ecx.deref_operand(&place.into()).unwrap();
+                    debug!(?derefd);
+                    let len = derefd.len(&ecx.tcx.tcx).unwrap();
+                    let valtree = slice_branches(ecx, &derefd, len);
+                    debug!(?valtree);
+
+                    valtree
                 }
                 _ => {
-                    let imm = ecx.try_read_immediate_from_mplace(&place).unwrap_or_else(|e| bug!("couldnt read immediate from {:?}, error: {:?}", place, e));
-
-                    match imm {
-                        Some(imm) => {
-                            debug!(?imm);
-
-                            let derefd_place = ecx.deref_operand(&place.into()).unwrap_or_else(|e| bug!("couldn't deref {:?}, error: {:?}", place, e));
-                            debug!(?derefd_place);
+                    let derefd_place = ecx.deref_operand(&place.into()).unwrap_or_else(|e| bug!("couldn't deref {:?}, error: {:?}", place, e));
+                    debug!(?derefd_place);
 
-                            const_to_valtree_inner(ecx, &derefd_place)
-                        }
-                        None => bug!("couldn't read immediate from {:?}", place),
-                    }
+                    const_to_valtree_inner(ecx, &derefd_place)
                 }
             }
         }
diff --git a/compiler/rustc_const_eval/src/interpret/operand.rs b/compiler/rustc_const_eval/src/interpret/operand.rs
index d820bd900a0..9000567558b 100644
--- a/compiler/rustc_const_eval/src/interpret/operand.rs
+++ b/compiler/rustc_const_eval/src/interpret/operand.rs
@@ -248,7 +248,7 @@ impl<'tcx, Tag: Provenance> ImmTy<'tcx, Tag> {
 impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
     /// Try reading an immediate in memory; this is interesting particularly for `ScalarPair`.
     /// Returns `None` if the layout does not permit loading this as a value.
-    pub(crate) fn try_read_immediate_from_mplace(
+    fn try_read_immediate_from_mplace(
         &self,
         mplace: &MPlaceTy<'tcx, M::PointerTag>,
     ) -> InterpResult<'tcx, Option<ImmTy<'tcx, M::PointerTag>>> {
diff --git a/compiler/rustc_const_eval/src/interpret/place.rs b/compiler/rustc_const_eval/src/interpret/place.rs
index b1784b12c65..85f3f3d53d6 100644
--- a/compiler/rustc_const_eval/src/interpret/place.rs
+++ b/compiler/rustc_const_eval/src/interpret/place.rs
@@ -191,7 +191,7 @@ impl<'tcx, Tag: Provenance> MPlaceTy<'tcx, Tag> {
     }
 
     #[inline]
-    pub(super) fn len(&self, cx: &impl HasDataLayout) -> InterpResult<'tcx, u64> {
+    pub(crate) fn len(&self, cx: &impl HasDataLayout) -> InterpResult<'tcx, u64> {
         if self.layout.is_unsized() {
             // We need to consult `meta` metadata
             match self.layout.ty.kind() {