make AllocRef APIs more consistent
This commit is contained in:
parent
c36572c11e
commit
d31cbb5150
2 changed files with 13 additions and 11 deletions
|
@ -857,6 +857,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> std::fmt::Debug for DumpAllocs<'a,
|
||||||
|
|
||||||
/// Reading and writing.
|
/// Reading and writing.
|
||||||
impl<'tcx, 'a, Tag: Provenance, Extra> AllocRefMut<'a, 'tcx, Tag, Extra> {
|
impl<'tcx, 'a, Tag: Provenance, Extra> AllocRefMut<'a, 'tcx, Tag, Extra> {
|
||||||
|
/// `range` is relative to this allocation reference, not the base of the allocation.
|
||||||
pub fn write_scalar(
|
pub fn write_scalar(
|
||||||
&mut self,
|
&mut self,
|
||||||
range: AllocRange,
|
range: AllocRange,
|
||||||
|
@ -870,6 +871,7 @@ impl<'tcx, 'a, Tag: Provenance, Extra> AllocRefMut<'a, 'tcx, Tag, Extra> {
|
||||||
.map_err(|e| e.to_interp_error(self.alloc_id))?)
|
.map_err(|e| e.to_interp_error(self.alloc_id))?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// `offset` is relative to this allocation reference, not the base of the allocation.
|
||||||
pub fn write_ptr_sized(
|
pub fn write_ptr_sized(
|
||||||
&mut self,
|
&mut self,
|
||||||
offset: Size,
|
offset: Size,
|
||||||
|
@ -888,6 +890,7 @@ impl<'tcx, 'a, Tag: Provenance, Extra> AllocRefMut<'a, 'tcx, Tag, Extra> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx, 'a, Tag: Provenance, Extra> AllocRef<'a, 'tcx, Tag, Extra> {
|
impl<'tcx, 'a, Tag: Provenance, Extra> AllocRef<'a, 'tcx, Tag, Extra> {
|
||||||
|
/// `range` is relative to this allocation reference, not the base of the allocation.
|
||||||
pub fn read_scalar(
|
pub fn read_scalar(
|
||||||
&self,
|
&self,
|
||||||
range: AllocRange,
|
range: AllocRange,
|
||||||
|
@ -902,14 +905,12 @@ impl<'tcx, 'a, Tag: Provenance, Extra> AllocRef<'a, 'tcx, Tag, Extra> {
|
||||||
Ok(res)
|
Ok(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn read_integer(
|
/// `range` is relative to this allocation reference, not the base of the allocation.
|
||||||
&self,
|
pub fn read_integer(&self, range: AllocRange) -> InterpResult<'tcx, ScalarMaybeUninit<Tag>> {
|
||||||
offset: Size,
|
self.read_scalar(range, /*read_provenance*/ false)
|
||||||
size: Size,
|
|
||||||
) -> InterpResult<'tcx, ScalarMaybeUninit<Tag>> {
|
|
||||||
self.read_scalar(alloc_range(offset, size), /*read_provenance*/ false)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// `offset` is relative to this allocation reference, not the base of the allocation.
|
||||||
pub fn read_pointer(&self, offset: Size) -> InterpResult<'tcx, ScalarMaybeUninit<Tag>> {
|
pub fn read_pointer(&self, offset: Size) -> InterpResult<'tcx, ScalarMaybeUninit<Tag>> {
|
||||||
self.read_scalar(
|
self.read_scalar(
|
||||||
alloc_range(offset, self.tcx.data_layout().pointer_size),
|
alloc_range(offset, self.tcx.data_layout().pointer_size),
|
||||||
|
@ -917,6 +918,7 @@ impl<'tcx, 'a, Tag: Provenance, Extra> AllocRef<'a, 'tcx, Tag, Extra> {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// `range` is relative to this allocation reference, not the base of the allocation.
|
||||||
pub fn check_bytes(
|
pub fn check_bytes(
|
||||||
&self,
|
&self,
|
||||||
range: AllocRange,
|
range: AllocRange,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
use rustc_middle::mir::interpret::{InterpResult, Pointer, PointerArithmetic};
|
use rustc_middle::mir::interpret::{alloc_range, InterpResult, Pointer, PointerArithmetic};
|
||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{
|
||||||
self, Ty, TyCtxt, COMMON_VTABLE_ENTRIES_ALIGN, COMMON_VTABLE_ENTRIES_DROPINPLACE,
|
self, Ty, TyCtxt, COMMON_VTABLE_ENTRIES_ALIGN, COMMON_VTABLE_ENTRIES_DROPINPLACE,
|
||||||
COMMON_VTABLE_ENTRIES_SIZE,
|
COMMON_VTABLE_ENTRIES_SIZE,
|
||||||
|
@ -102,18 +102,18 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
)?
|
)?
|
||||||
.expect("cannot be a ZST");
|
.expect("cannot be a ZST");
|
||||||
let size = vtable
|
let size = vtable
|
||||||
.read_integer(
|
.read_integer(alloc_range(
|
||||||
pointer_size * u64::try_from(COMMON_VTABLE_ENTRIES_SIZE).unwrap(),
|
pointer_size * u64::try_from(COMMON_VTABLE_ENTRIES_SIZE).unwrap(),
|
||||||
pointer_size,
|
pointer_size,
|
||||||
)?
|
))?
|
||||||
.check_init()?;
|
.check_init()?;
|
||||||
let size = size.to_machine_usize(self)?;
|
let size = size.to_machine_usize(self)?;
|
||||||
let size = Size::from_bytes(size);
|
let size = Size::from_bytes(size);
|
||||||
let align = vtable
|
let align = vtable
|
||||||
.read_integer(
|
.read_integer(alloc_range(
|
||||||
pointer_size * u64::try_from(COMMON_VTABLE_ENTRIES_ALIGN).unwrap(),
|
pointer_size * u64::try_from(COMMON_VTABLE_ENTRIES_ALIGN).unwrap(),
|
||||||
pointer_size,
|
pointer_size,
|
||||||
)?
|
))?
|
||||||
.check_init()?;
|
.check_init()?;
|
||||||
let align = align.to_machine_usize(self)?;
|
let align = align.to_machine_usize(self)?;
|
||||||
let align = Align::from_bytes(align).map_err(|e| err_ub!(InvalidVtableAlignment(e)))?;
|
let align = Align::from_bytes(align).map_err(|e| err_ub!(InvalidVtableAlignment(e)))?;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue