interpret: add mplace_to_ref helper method
This commit is contained in:
parent
34ccd04859
commit
3345077b42
@ -157,7 +157,6 @@ impl<Prov: Provenance> MemPlace<Prov> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Turn a mplace into a (thin or wide) pointer, as a reference, pointing to the same space.
|
/// Turn a mplace into a (thin or wide) pointer, as a reference, pointing to the same space.
|
||||||
/// This is the inverse of `ref_to_mplace`.
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn to_ref(self, cx: &impl HasDataLayout) -> Immediate<Prov> {
|
pub fn to_ref(self, cx: &impl HasDataLayout) -> Immediate<Prov> {
|
||||||
match self.meta {
|
match self.meta {
|
||||||
@ -415,7 +414,7 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Take a value, which represents a (thin or wide) reference, and make it a place.
|
/// Take a value, which represents a (thin or wide) reference, and make it a place.
|
||||||
/// Alignment is just based on the type. This is the inverse of `MemPlace::to_ref()`.
|
/// Alignment is just based on the type. This is the inverse of `mplace_to_ref()`.
|
||||||
///
|
///
|
||||||
/// Only call this if you are sure the place is "valid" (aligned and inbounds), or do not
|
/// Only call this if you are sure the place is "valid" (aligned and inbounds), or do not
|
||||||
/// want to ever use the place for memory access!
|
/// want to ever use the place for memory access!
|
||||||
@ -438,6 +437,18 @@ where
|
|||||||
Ok(MPlaceTy::from_aligned_ptr_with_meta(ptr.to_pointer(self)?, layout, meta))
|
Ok(MPlaceTy::from_aligned_ptr_with_meta(ptr.to_pointer(self)?, layout, meta))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Turn a mplace into a (thin or wide) mutable raw pointer, pointing to the same space.
|
||||||
|
/// `align` information is lost!
|
||||||
|
/// This is the inverse of `ref_to_mplace`.
|
||||||
|
pub fn mplace_to_ref(
|
||||||
|
&self,
|
||||||
|
mplace: &MPlaceTy<'tcx, M::Provenance>,
|
||||||
|
) -> InterpResult<'tcx, ImmTy<'tcx, M::Provenance>> {
|
||||||
|
let imm = mplace.to_ref(self);
|
||||||
|
let layout = self.layout_of(Ty::new_mut_ptr(self.tcx.tcx, mplace.layout.ty))?;
|
||||||
|
Ok(ImmTy::from_immediate(imm, layout))
|
||||||
|
}
|
||||||
|
|
||||||
/// Take an operand, representing a pointer, and dereference it to a place.
|
/// Take an operand, representing a pointer, and dereference it to a place.
|
||||||
/// Corresponds to the `*` operator in Rust.
|
/// Corresponds to the `*` operator in Rust.
|
||||||
#[instrument(skip(self), level = "debug")]
|
#[instrument(skip(self), level = "debug")]
|
||||||
|
@ -852,10 +852,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||||||
let instance = ty::Instance::resolve_drop_in_place(*self.tcx, place.layout.ty);
|
let instance = ty::Instance::resolve_drop_in_place(*self.tcx, place.layout.ty);
|
||||||
let fn_abi = self.fn_abi_of_instance(instance, ty::List::empty())?;
|
let fn_abi = self.fn_abi_of_instance(instance, ty::List::empty())?;
|
||||||
|
|
||||||
let arg = ImmTy::from_immediate(
|
let arg = self.mplace_to_ref(&place)?;
|
||||||
place.to_ref(self),
|
|
||||||
self.layout_of(Ty::new_mut_ptr(self.tcx.tcx, place.layout.ty))?,
|
|
||||||
);
|
|
||||||
let ret = MPlaceTy::fake_alloc_zst(self.layout_of(self.tcx.types.unit)?);
|
let ret = MPlaceTy::fake_alloc_zst(self.layout_of(self.tcx.types.unit)?);
|
||||||
|
|
||||||
self.eval_fn_call(
|
self.eval_fn_call(
|
||||||
|
@ -15,7 +15,7 @@ use rustc_data_structures::fx::FxHashSet;
|
|||||||
use rustc_middle::mir::{Mutability, RetagKind};
|
use rustc_middle::mir::{Mutability, RetagKind};
|
||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{
|
||||||
self,
|
self,
|
||||||
layout::{HasParamEnv, LayoutOf},
|
layout::HasParamEnv,
|
||||||
Ty,
|
Ty,
|
||||||
};
|
};
|
||||||
use rustc_target::abi::{Abi, Align, Size};
|
use rustc_target::abi::{Abi, Align, Size};
|
||||||
@ -993,8 +993,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||||||
|
|
||||||
// We have to turn the place into a pointer to use the usual retagging logic.
|
// We have to turn the place into a pointer to use the usual retagging logic.
|
||||||
// (The pointer type does not matter, so we use a raw pointer.)
|
// (The pointer type does not matter, so we use a raw pointer.)
|
||||||
let ptr_layout = this.layout_of(Ty::new_mut_ptr(this.tcx.tcx, place.layout.ty))?;
|
let ptr = this.mplace_to_ref(place)?;
|
||||||
let ptr = ImmTy::from_immediate(place.to_ref(this), ptr_layout);
|
|
||||||
// Reborrow it. With protection! That is the entire point.
|
// Reborrow it. With protection! That is the entire point.
|
||||||
let new_perm = NewPermission::Uniform {
|
let new_perm = NewPermission::Uniform {
|
||||||
perm: Permission::Unique,
|
perm: Permission::Unique,
|
||||||
|
@ -7,7 +7,7 @@ use rustc_middle::{
|
|||||||
mir::{Mutability, RetagKind},
|
mir::{Mutability, RetagKind},
|
||||||
ty::{
|
ty::{
|
||||||
self,
|
self,
|
||||||
layout::{HasParamEnv, LayoutOf},
|
layout::HasParamEnv,
|
||||||
Ty,
|
Ty,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -488,8 +488,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||||||
|
|
||||||
// We have to turn the place into a pointer to use the usual retagging logic.
|
// We have to turn the place into a pointer to use the usual retagging logic.
|
||||||
// (The pointer type does not matter, so we use a raw pointer.)
|
// (The pointer type does not matter, so we use a raw pointer.)
|
||||||
let ptr_layout = this.layout_of(Ty::new_mut_ptr(this.tcx.tcx, place.layout.ty))?;
|
let ptr = this.mplace_to_ref(place)?;
|
||||||
let ptr = ImmTy::from_immediate(place.to_ref(this), ptr_layout);
|
|
||||||
// Reborrow it. With protection! That is the entire point.
|
// Reborrow it. With protection! That is the entire point.
|
||||||
let new_perm = NewPermission {
|
let new_perm = NewPermission {
|
||||||
initial_state: Permission::new_active(),
|
initial_state: Permission::new_active(),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user