Rollup merge of #98688 - RalfJung:from-mplace, r=oli-obk
interpret: add From<&MplaceTy> for PlaceTy We have a similar instance for `&MPlaceTy` to `OpTy`. Also add the same for `&mut`. This avoids having to write `&(*place).into()`, which we have a few times here and at least twice in Miri (and it comes up again in my current patch). r? ```@oli-obk```
This commit is contained in:
commit
9bcf992499
5 changed files with 29 additions and 8 deletions
|
@ -346,7 +346,7 @@ fn valtree_into_mplace<'tcx>(
|
||||||
ty::FnDef(_, _) => {
|
ty::FnDef(_, _) => {
|
||||||
ecx.write_immediate(
|
ecx.write_immediate(
|
||||||
Immediate::Scalar(ScalarMaybeUninit::Scalar(Scalar::ZST)),
|
Immediate::Scalar(ScalarMaybeUninit::Scalar(Scalar::ZST)),
|
||||||
&(*place).into(),
|
&place.into(),
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
@ -355,7 +355,7 @@ fn valtree_into_mplace<'tcx>(
|
||||||
debug!("writing trivial valtree {:?} to place {:?}", scalar_int, place);
|
debug!("writing trivial valtree {:?} to place {:?}", scalar_int, place);
|
||||||
ecx.write_immediate(
|
ecx.write_immediate(
|
||||||
Immediate::Scalar(ScalarMaybeUninit::Scalar(scalar_int.into())),
|
Immediate::Scalar(ScalarMaybeUninit::Scalar(scalar_int.into())),
|
||||||
&(*place).into(),
|
&place.into(),
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
@ -382,7 +382,7 @@ fn valtree_into_mplace<'tcx>(
|
||||||
};
|
};
|
||||||
debug!(?imm);
|
debug!(?imm);
|
||||||
|
|
||||||
ecx.write_immediate(imm, &(*place).into()).unwrap();
|
ecx.write_immediate(imm, &place.into()).unwrap();
|
||||||
}
|
}
|
||||||
ty::Adt(_, _) | ty::Tuple(_) | ty::Array(_, _) | ty::Str | ty::Slice(_) => {
|
ty::Adt(_, _) | ty::Tuple(_) | ty::Array(_, _) | ty::Str | ty::Slice(_) => {
|
||||||
let branches = valtree.unwrap_branch();
|
let branches = valtree.unwrap_branch();
|
||||||
|
@ -464,11 +464,11 @@ fn valtree_into_mplace<'tcx>(
|
||||||
|
|
||||||
if let Some(variant_idx) = variant_idx {
|
if let Some(variant_idx) = variant_idx {
|
||||||
// don't forget filling the place with the discriminant of the enum
|
// don't forget filling the place with the discriminant of the enum
|
||||||
ecx.write_discriminant(variant_idx, &(*place).into()).unwrap();
|
ecx.write_discriminant(variant_idx, &place.into()).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
debug!("dump of place after writing discriminant:");
|
debug!("dump of place after writing discriminant:");
|
||||||
dump_place(ecx, (*place).into());
|
dump_place(ecx, place.into());
|
||||||
}
|
}
|
||||||
_ => bug!("shouldn't have created a ValTree for {:?}", ty),
|
_ => bug!("shouldn't have created a ValTree for {:?}", ty),
|
||||||
}
|
}
|
||||||
|
|
|
@ -195,7 +195,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: CompileTimeMachine<'mir, 'tcx, const_eval::Memory
|
||||||
let tcx = self.ecx.tcx;
|
let tcx = self.ecx.tcx;
|
||||||
let ty = mplace.layout.ty;
|
let ty = mplace.layout.ty;
|
||||||
if let ty::Ref(_, referenced_ty, ref_mutability) = *ty.kind() {
|
if let ty::Ref(_, referenced_ty, ref_mutability) = *ty.kind() {
|
||||||
let value = self.ecx.read_immediate(&(*mplace).into())?;
|
let value = self.ecx.read_immediate(&mplace.into())?;
|
||||||
let mplace = self.ecx.ref_to_mplace(&value)?;
|
let mplace = self.ecx.ref_to_mplace(&value)?;
|
||||||
assert_eq!(mplace.layout.ty, referenced_ty);
|
assert_eq!(mplace.layout.ty, referenced_ty);
|
||||||
// Handle trait object vtables.
|
// Handle trait object vtables.
|
||||||
|
|
|
@ -204,6 +204,13 @@ impl<'tcx, Tag: Provenance> From<&'_ MPlaceTy<'tcx, Tag>> for OpTy<'tcx, Tag> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'tcx, Tag: Provenance> From<&'_ mut MPlaceTy<'tcx, Tag>> for OpTy<'tcx, Tag> {
|
||||||
|
#[inline(always)]
|
||||||
|
fn from(mplace: &mut MPlaceTy<'tcx, Tag>) -> Self {
|
||||||
|
OpTy { op: Operand::Indirect(**mplace), layout: mplace.layout }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'tcx, Tag: Provenance> From<ImmTy<'tcx, Tag>> for OpTy<'tcx, Tag> {
|
impl<'tcx, Tag: Provenance> From<ImmTy<'tcx, Tag>> for OpTy<'tcx, Tag> {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn from(val: ImmTy<'tcx, Tag>) -> Self {
|
fn from(val: ImmTy<'tcx, Tag>) -> Self {
|
||||||
|
|
|
@ -118,7 +118,21 @@ impl<'tcx, Tag: Provenance> std::ops::Deref for MPlaceTy<'tcx, Tag> {
|
||||||
impl<'tcx, Tag: Provenance> From<MPlaceTy<'tcx, Tag>> for PlaceTy<'tcx, Tag> {
|
impl<'tcx, Tag: Provenance> From<MPlaceTy<'tcx, Tag>> for PlaceTy<'tcx, Tag> {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn from(mplace: MPlaceTy<'tcx, Tag>) -> Self {
|
fn from(mplace: MPlaceTy<'tcx, Tag>) -> Self {
|
||||||
PlaceTy { place: Place::Ptr(mplace.mplace), layout: mplace.layout }
|
PlaceTy { place: Place::Ptr(*mplace), layout: mplace.layout }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx, Tag: Provenance> From<&'_ MPlaceTy<'tcx, Tag>> for PlaceTy<'tcx, Tag> {
|
||||||
|
#[inline(always)]
|
||||||
|
fn from(mplace: &MPlaceTy<'tcx, Tag>) -> Self {
|
||||||
|
PlaceTy { place: Place::Ptr(**mplace), layout: mplace.layout }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx, Tag: Provenance> From<&'_ mut MPlaceTy<'tcx, Tag>> for PlaceTy<'tcx, Tag> {
|
||||||
|
#[inline(always)]
|
||||||
|
fn from(mplace: &mut MPlaceTy<'tcx, Tag>) -> Self {
|
||||||
|
PlaceTy { place: Place::Ptr(**mplace), layout: mplace.layout }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> Value<'mir, 'tcx, M>
|
||||||
&self,
|
&self,
|
||||||
_ecx: &InterpCx<'mir, 'tcx, M>,
|
_ecx: &InterpCx<'mir, 'tcx, M>,
|
||||||
) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> {
|
) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> {
|
||||||
Ok((*self).into())
|
Ok(self.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue