Add From instances for Pointer -> ScalarMaybeUndef and Pointer -> Immediate
This commit is contained in:
parent
a8eea623f5
commit
cde17d9158
@ -471,6 +471,13 @@ impl<Tag> From<Scalar<Tag>> for ScalarMaybeUndef<Tag> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<Tag> From<Pointer<Tag>> for ScalarMaybeUndef<Tag> {
|
||||
#[inline(always)]
|
||||
fn from(s: Pointer<Tag>) -> Self {
|
||||
ScalarMaybeUndef::Scalar(s.into())
|
||||
}
|
||||
}
|
||||
|
||||
impl<Tag: fmt::Debug, Id: fmt::Debug> fmt::Debug for ScalarMaybeUndef<Tag, Id> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
match self {
|
||||
|
@ -55,7 +55,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
).ok_or_else(|| err_inval!(TooGeneric))?;
|
||||
|
||||
let fn_ptr = self.memory.create_fn_alloc(FnVal::Instance(instance));
|
||||
self.write_scalar(Scalar::Ptr(fn_ptr.into()), dest)?;
|
||||
self.write_scalar(fn_ptr, dest)?;
|
||||
}
|
||||
_ => bug!("reify fn pointer on {:?}", src.layout.ty),
|
||||
}
|
||||
@ -88,8 +88,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
ty::ClosureKind::FnOnce,
|
||||
);
|
||||
let fn_ptr = self.memory.create_fn_alloc(FnVal::Instance(instance));
|
||||
let val = Immediate::Scalar(Scalar::Ptr(fn_ptr.into()).into());
|
||||
self.write_immediate(val, dest)?;
|
||||
self.write_scalar(fn_ptr, dest)?;
|
||||
}
|
||||
_ => bug!("closure fn pointer on {:?}", src.layout.ty),
|
||||
}
|
||||
|
@ -350,7 +350,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> {
|
||||
sptr
|
||||
} else {
|
||||
// A "real" access, we must get a pointer.
|
||||
Scalar::Ptr(self.force_ptr(sptr)?)
|
||||
Scalar::from(self.force_ptr(sptr)?)
|
||||
};
|
||||
Ok(match normalized.to_bits_or_ptr(self.pointer_size(), self) {
|
||||
Ok(bits) => {
|
||||
|
@ -47,6 +47,13 @@ impl<Tag> From<Scalar<Tag>> for Immediate<Tag> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<Tag> From<Pointer<Tag>> for Immediate<Tag> {
|
||||
#[inline(always)]
|
||||
fn from(val: Pointer<Tag>) -> Self {
|
||||
Immediate::Scalar(Scalar::from(val).into())
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx, Tag> Immediate<Tag> {
|
||||
pub fn new_slice(
|
||||
val: Scalar<Tag>,
|
||||
@ -60,7 +67,7 @@ impl<'tcx, Tag> Immediate<Tag> {
|
||||
}
|
||||
|
||||
pub fn new_dyn_trait(val: Scalar<Tag>, vtable: Pointer<Tag>) -> Self {
|
||||
Immediate::ScalarPair(val.into(), Scalar::Ptr(vtable).into())
|
||||
Immediate::ScalarPair(val.into(), vtable.into())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
@ -686,6 +686,7 @@ where
|
||||
}
|
||||
|
||||
/// Write a scalar to a place
|
||||
#[inline(always)]
|
||||
pub fn write_scalar(
|
||||
&mut self,
|
||||
val: impl Into<ScalarMaybeUndef<M::PointerTag>>,
|
||||
|
@ -67,7 +67,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
// allocation is correctly aligned as we created it above. Also we're only offsetting by
|
||||
// multiples of `ptr_align`, which means that it will stay aligned to `ptr_align`.
|
||||
let vtable_alloc = self.memory.get_raw_mut(vtable.alloc_id)?;
|
||||
vtable_alloc.write_ptr_sized(tcx, vtable, Scalar::Ptr(drop).into())?;
|
||||
vtable_alloc.write_ptr_sized(tcx, vtable, drop.into())?;
|
||||
|
||||
let size_ptr = vtable.offset(ptr_size, tcx)?;
|
||||
vtable_alloc.write_ptr_sized(tcx, size_ptr, Scalar::from_uint(size, ptr_size).into())?;
|
||||
@ -87,7 +87,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
// We cannot use `vtable_allic` as we are creating fn ptrs in this loop.
|
||||
let method_ptr = vtable.offset(ptr_size * (3 + i as u64), tcx)?;
|
||||
self.memory.get_raw_mut(vtable.alloc_id)?
|
||||
.write_ptr_sized(tcx, method_ptr, Scalar::Ptr(fn_ptr).into())?;
|
||||
.write_ptr_sized(tcx, method_ptr, fn_ptr.into())?;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user