- pub(crate) fn read_ptr(
- &self,
- ptr: Pointer,
- ptr_align: Align,
- pointee_ty: Ty<'tcx>,
- ) -> EvalResult<'tcx, Value> {
- let ptr_size = self.memory.pointer_size();
- let p: ScalarMaybeUndef = self.memory.read_ptr_sized(ptr, ptr_align)?;
- if self.type_is_sized(pointee_ty) {
- Ok(Value::Scalar(p))
- } else {
- trace!("reading fat pointer extra of type {}", pointee_ty);
- let extra = ptr.offset(ptr_size, self)?;
- match self.tcx.struct_tail(pointee_ty).sty {
- ty::TyDynamic(..) => Ok(Value::ScalarPair(
- p,
- self.memory.read_ptr_sized(extra, ptr_align)?,
- )),
- ty::TySlice(..) | ty::TyStr => {
- let len = self
- .memory
- .read_ptr_sized(extra, ptr_align)?
- .read()?
- .to_bits(ptr_size)?;
- Ok(p.to_value_with_len(len as u64, self.tcx.tcx))
- },
- _ => bug!("unsized scalar ptr read from {:?}", pointee_ty),
- }
- }
- }
-