1
Fork 0

interpreter PointerArithmetic: use new Size helper methods

This commit is contained in:
Ralf Jung 2021-09-11 11:58:08 -04:00
parent 641e02f388
commit 07b64bfd3a

View file

@ -3,7 +3,7 @@ use super::{AllocId, InterpResult};
use rustc_macros::HashStable; use rustc_macros::HashStable;
use rustc_target::abi::{HasDataLayout, Size}; use rustc_target::abi::{HasDataLayout, Size};
use std::convert::TryFrom; use std::convert::{TryFrom, TryInto};
use std::fmt; use std::fmt;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -20,29 +20,27 @@ pub trait PointerArithmetic: HasDataLayout {
#[inline] #[inline]
fn machine_usize_max(&self) -> u64 { fn machine_usize_max(&self) -> u64 {
let max_usize_plus_1 = 1u128 << self.pointer_size().bits(); self.pointer_size().unsigned_int_max().try_into().unwrap()
u64::try_from(max_usize_plus_1 - 1).unwrap()
} }
#[inline] #[inline]
fn machine_isize_min(&self) -> i64 { fn machine_isize_min(&self) -> i64 {
let max_isize_plus_1 = 1i128 << (self.pointer_size().bits() - 1); self.pointer_size().signed_int_min().try_into().unwrap()
i64::try_from(-max_isize_plus_1).unwrap()
} }
#[inline] #[inline]
fn machine_isize_max(&self) -> i64 { fn machine_isize_max(&self) -> i64 {
let max_isize_plus_1 = 1u128 << (self.pointer_size().bits() - 1); self.pointer_size().signed_int_max().try_into().unwrap()
i64::try_from(max_isize_plus_1 - 1).unwrap()
} }
#[inline] #[inline]
fn machine_usize_to_isize(&self, val: u64) -> i64 { fn machine_usize_to_isize(&self, val: u64) -> i64 {
let val = val as i64; let val = val as i64;
// Now clamp into the machine_isize range. // Now wrap-around into the machine_isize range.
if val > self.machine_isize_max() { if val > self.machine_isize_max() {
// This can only happen the the ptr size is < 64, so we know max_usize_plus_1 fits into // This can only happen the the ptr size is < 64, so we know max_usize_plus_1 fits into
// i64. // i64.
debug_assert!(self.pointer_size().bits() < 64);
let max_usize_plus_1 = 1u128 << self.pointer_size().bits(); let max_usize_plus_1 = 1u128 << self.pointer_size().bits();
val - i64::try_from(max_usize_plus_1).unwrap() val - i64::try_from(max_usize_plus_1).unwrap()
} else { } else {