}
let layout = ecx.layout_of(mir.return_ty().subst(tcx, cid.instance.substs))?;
assert!(!layout.is_unsized());
- let ret = ecx.allocate(layout, MemoryKind::Stack)?;
+ let ret = ecx.allocate(layout, MemoryKind::Stack);
let name = ty::tls::with(|tcx| tcx.item_path_str(cid.instance.def_id()));
let prom = cid.promoted.map_or(String::new(), |p| format!("::promoted[{:?}]", p));
_ecx: &mut EvalContext<'a, 'mir, 'tcx, Self>,
ptr: Pointer,
_kind: MemoryKind<Self::MemoryKinds>,
- ) -> EvalResult<'tcx, Pointer> {
- Ok(ptr)
+ ) -> Pointer {
+ ptr
}
#[inline(always)]
ecx: &mut EvalContext<'a, 'mir, 'tcx, Self>,
ptr: Pointer,
kind: MemoryKind<Self::MemoryKinds>,
- ) -> EvalResult<'tcx, Pointer<Self::PointerTag>>;
+ ) -> Pointer<Self::PointerTag>;
/// Executed when evaluating the `*` operator: Following a reference.
/// This has the chance to adjust the tag. It should not change anything else!
&mut self,
alloc: Allocation<M::PointerTag, M::AllocExtra>,
kind: MemoryKind<M::MemoryKinds>,
- ) -> EvalResult<'tcx, AllocId> {
+ ) -> AllocId {
let id = self.tcx.alloc_map.lock().reserve();
self.alloc_map.insert(id, (kind, alloc));
- Ok(id)
+ id
}
pub fn allocate(
size: Size,
align: Align,
kind: MemoryKind<M::MemoryKinds>,
- ) -> EvalResult<'tcx, Pointer> {
+ ) -> Pointer {
let extra = AllocationExtra::memory_allocated(size, &self.extra);
- Ok(Pointer::from(self.allocate_with(Allocation::undef(size, align, extra), kind)?))
+ Pointer::from(self.allocate_with(Allocation::undef(size, align, extra), kind))
}
pub fn reallocate(
// For simplicities' sake, we implement reallocate as "alloc, copy, dealloc".
// This happens so rarely, the perf advantage is outweighed by the maintenance cost.
- let new_ptr = self.allocate(new_size, new_align, kind)?;
+ let new_ptr = self.allocate(new_size, new_align, kind);
self.copy(
ptr.into(),
old_align,
_ => {
trace!("Forcing allocation for local of type {:?}", layout.ty);
Operand::Indirect(
- *self.allocate(layout, MemoryKind::Stack)?
+ *self.allocate(layout, MemoryKind::Stack)
)
}
})
// that might e.g., be an inner field of a struct with `Scalar` layout,
// that has different alignment than the outer field.
let local_layout = self.layout_of_local(&self.stack[frame], local)?;
- let ptr = self.allocate(local_layout, MemoryKind::Stack)?;
+ let ptr = self.allocate(local_layout, MemoryKind::Stack);
// We don't have to validate as we can assume the local
// was already valid for its type.
self.write_immediate_to_mplace_no_validate(value, ptr)?;
&mut self,
layout: TyLayout<'tcx>,
kind: MemoryKind<M::MemoryKinds>,
- ) -> EvalResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> {
+ ) -> MPlaceTy<'tcx, M::PointerTag> {
if layout.is_unsized() {
assert!(self.tcx.features().unsized_locals, "cannot alloc memory for unsized type");
// FIXME: What should we do here? We should definitely also tag!
- Ok(MPlaceTy::dangling(layout, self))
+ MPlaceTy::dangling(layout, self)
} else {
- let ptr = self.memory.allocate(layout.size, layout.align.abi, kind)?;
- let ptr = M::tag_new_allocation(self, ptr, kind)?;
- Ok(MPlaceTy::from_aligned_ptr(ptr, layout))
+ let ptr = self.memory.allocate(layout.size, layout.align.abi, kind);
+ let ptr = M::tag_new_allocation(self, ptr, kind);
+ MPlaceTy::from_aligned_ptr(ptr, layout)
}
}
ptr_size * (3 + methods.len() as u64),
ptr_align,
MemoryKind::Vtable,
- )?.with_default_tag();
+ ).with_default_tag();
let tcx = &*self.tcx;
let drop = ::monomorphize::resolve_drop_in_place(*tcx, ty);
Rvalue::Cast(kind, ref operand, _) => {
let (op, span) = self.eval_operand(operand, source_info)?;
self.use_ecx(source_info, |this| {
- let dest = this.ecx.allocate(place_layout, MemoryKind::Stack)?;
+ let dest = this.ecx.allocate(place_layout, MemoryKind::Stack);
this.ecx.cast(op, kind, dest.into())?;
Ok((dest.into(), span))
})