[−][src]Struct rustc_mir::const_eval::machine::CompileTimeInterpreter
Extra machine state for CTFE, and the Machine instance
Fields
steps_remaining: usizeFor now, the number of terminators that can be evaluated before we throw a resource exhuastion error.
Setting this to 0 disables the limit and allows the interpreter to run forever.
stack: Vec<Frame<'mir, 'tcx, (), ()>>The virtual call stack.
Implementations
impl<'mir, 'tcx> CompileTimeInterpreter<'mir, 'tcx>[src]
pub(in const_eval) fn new(
const_eval_limit: Limit
) -> Self[src]
const_eval_limit: Limit
) -> Self
Trait Implementations
impl<'mir, 'tcx> Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir, 'tcx>[src]
type PointerTag = ()
Tag tracked alongside every pointer. This is used to implement "Stacked Borrows"
https://www.ralfj.de/blog/2018/08/07/stacked-borrows.html.
The default() is used for pointers to consts, statics, vtables and functions.
The Debug formatting is used for displaying pointers; we cannot use Display
as () does not implement that, but it should be "nice" output. Read more
type ExtraFnVal = !
Machines can define extra (non-instance) things that represent values of function pointers.
For example, Miri uses this to return a function pointer from dlsym
that can later be called to execute the right thing. Read more
type MemoryKind = !
Additional memory kinds a machine wishes to distinguish from the builtin ones
type MemoryMap = FxHashMap<AllocId, (MemoryKind<!>, Allocation)>
Memory's allocation map
pub const GLOBAL_KIND: Option<!>[src]
type AllocExtra = ()
Extra data stored in every allocation.
type FrameExtra = ()
Extra data stored in every call frame.
pub fn enforce_alignment(_memory_extra: &Self::MemoryExtra) -> bool[src]
pub fn force_int_for_alignment_check(_memory_extra: &Self::MemoryExtra) -> bool[src]
pub fn enforce_validity(_ecx: &InterpCx<'mir, 'tcx, Self>) -> bool[src]
pub fn call_extra_fn(
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
fn_val: !,
_args: &[OpTy<'tcx>],
_ret: Option<(PlaceTy<'tcx>, BasicBlock)>,
_unwind: Option<BasicBlock>
) -> InterpResult<'tcx>[src]
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
fn_val: !,
_args: &[OpTy<'tcx>],
_ret: Option<(PlaceTy<'tcx>, BasicBlock)>,
_unwind: Option<BasicBlock>
) -> InterpResult<'tcx>
pub fn init_allocation_extra<'b>(
_memory_extra: &Self::MemoryExtra,
_id: AllocId,
alloc: Cow<'b, Allocation>,
_kind: Option<MemoryKind<!>>
) -> (Cow<'b, Allocation<Self::PointerTag>>, Self::PointerTag)[src]
_memory_extra: &Self::MemoryExtra,
_id: AllocId,
alloc: Cow<'b, Allocation>,
_kind: Option<MemoryKind<!>>
) -> (Cow<'b, Allocation<Self::PointerTag>>, Self::PointerTag)
pub fn tag_global_base_pointer(
_memory_extra: &Self::MemoryExtra,
_id: AllocId
) -> Self::PointerTag[src]
_memory_extra: &Self::MemoryExtra,
_id: AllocId
) -> Self::PointerTag
type MemoryExtra = MemoryExtra
Extra data stored in memory. A reference to this is available when AllocExtra
gets initialized, so you can e.g., have an Rc here if there is global state you
need access to in the AllocExtra hooks. Read more
pub fn find_mir_or_eval_fn(
ecx: &mut InterpCx<'mir, 'tcx, Self>,
instance: Instance<'tcx>,
args: &[OpTy<'tcx>],
ret: Option<(PlaceTy<'tcx>, BasicBlock)>,
_unwind: Option<BasicBlock>
) -> InterpResult<'tcx, Option<&'mir Body<'tcx>>>[src]
ecx: &mut InterpCx<'mir, 'tcx, Self>,
instance: Instance<'tcx>,
args: &[OpTy<'tcx>],
ret: Option<(PlaceTy<'tcx>, BasicBlock)>,
_unwind: Option<BasicBlock>
) -> InterpResult<'tcx, Option<&'mir Body<'tcx>>>
pub fn call_intrinsic(
ecx: &mut InterpCx<'mir, 'tcx, Self>,
instance: Instance<'tcx>,
args: &[OpTy<'tcx>],
ret: Option<(PlaceTy<'tcx>, BasicBlock)>,
_unwind: Option<BasicBlock>
) -> InterpResult<'tcx>[src]
ecx: &mut InterpCx<'mir, 'tcx, Self>,
instance: Instance<'tcx>,
args: &[OpTy<'tcx>],
ret: Option<(PlaceTy<'tcx>, BasicBlock)>,
_unwind: Option<BasicBlock>
) -> InterpResult<'tcx>
pub fn assert_panic(
ecx: &mut InterpCx<'mir, 'tcx, Self>,
msg: &AssertMessage<'tcx>,
_unwind: Option<BasicBlock>
) -> InterpResult<'tcx>[src]
ecx: &mut InterpCx<'mir, 'tcx, Self>,
msg: &AssertMessage<'tcx>,
_unwind: Option<BasicBlock>
) -> InterpResult<'tcx>
pub fn ptr_to_int(
_mem: &Memory<'mir, 'tcx, Self>,
_ptr: Pointer
) -> InterpResult<'tcx, u64>[src]
_mem: &Memory<'mir, 'tcx, Self>,
_ptr: Pointer
) -> InterpResult<'tcx, u64>
pub fn binary_ptr_op(
_ecx: &InterpCx<'mir, 'tcx, Self>,
_bin_op: BinOp,
_left: ImmTy<'tcx>,
_right: ImmTy<'tcx>
) -> InterpResult<'tcx, (Scalar, bool, Ty<'tcx>)>[src]
_ecx: &InterpCx<'mir, 'tcx, Self>,
_bin_op: BinOp,
_left: ImmTy<'tcx>,
_right: ImmTy<'tcx>
) -> InterpResult<'tcx, (Scalar, bool, Ty<'tcx>)>
pub fn box_alloc(
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
_dest: PlaceTy<'tcx>
) -> InterpResult<'tcx>[src]
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
_dest: PlaceTy<'tcx>
) -> InterpResult<'tcx>
pub fn before_terminator(
ecx: &mut InterpCx<'mir, 'tcx, Self>
) -> InterpResult<'tcx>[src]
ecx: &mut InterpCx<'mir, 'tcx, Self>
) -> InterpResult<'tcx>
pub fn init_frame_extra(
ecx: &mut InterpCx<'mir, 'tcx, Self>,
frame: Frame<'mir, 'tcx>
) -> InterpResult<'tcx, Frame<'mir, 'tcx>>[src]
ecx: &mut InterpCx<'mir, 'tcx, Self>,
frame: Frame<'mir, 'tcx>
) -> InterpResult<'tcx, Frame<'mir, 'tcx>>
pub fn stack<'a>(
ecx: &'a InterpCx<'mir, 'tcx, Self>
) -> &'a [Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>][src]
ecx: &'a InterpCx<'mir, 'tcx, Self>
) -> &'a [Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>]
pub fn stack_mut<'a>(
ecx: &'a mut InterpCx<'mir, 'tcx, Self>
) -> &'a mut Vec<Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>>[src]
ecx: &'a mut InterpCx<'mir, 'tcx, Self>
) -> &'a mut Vec<Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>>
pub fn before_access_global(
memory_extra: &MemoryExtra,
alloc_id: AllocId,
allocation: &Allocation,
static_def_id: Option<DefId>,
is_write: bool
) -> InterpResult<'tcx>[src]
memory_extra: &MemoryExtra,
alloc_id: AllocId,
allocation: &Allocation,
static_def_id: Option<DefId>,
is_write: bool
) -> InterpResult<'tcx>
pub fn abort(_ecx: &mut InterpCx<'mir, 'tcx, Self>) -> InterpResult<'tcx, !>[src]
pub fn access_local(
_ecx: &InterpCx<'mir, 'tcx, Self>,
frame: &Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>,
local: Local
) -> InterpResult<'tcx, Operand<Self::PointerTag>>[src]
_ecx: &InterpCx<'mir, 'tcx, Self>,
frame: &Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>,
local: Local
) -> InterpResult<'tcx, Operand<Self::PointerTag>>
pub fn access_local_mut<'a>(
ecx: &'a mut InterpCx<'mir, 'tcx, Self>,
frame: usize,
local: Local
) -> InterpResult<'tcx, Result<&'a mut LocalValue<Self::PointerTag>, MemPlace<Self::PointerTag>>> where
'tcx: 'mir, [src]
ecx: &'a mut InterpCx<'mir, 'tcx, Self>,
frame: usize,
local: Local
) -> InterpResult<'tcx, Result<&'a mut LocalValue<Self::PointerTag>, MemPlace<Self::PointerTag>>> where
'tcx: 'mir,
pub fn thread_local_static_alloc_id(
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
def_id: DefId
) -> InterpResult<'tcx, AllocId>[src]
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
def_id: DefId
) -> InterpResult<'tcx, AllocId>
pub fn extern_static_alloc_id(
mem: &Memory<'mir, 'tcx, Self>,
def_id: DefId
) -> InterpResult<'tcx, AllocId>[src]
mem: &Memory<'mir, 'tcx, Self>,
def_id: DefId
) -> InterpResult<'tcx, AllocId>
pub fn before_deallocation(
_memory_extra: &mut Self::MemoryExtra,
_id: AllocId
) -> InterpResult<'tcx>[src]
_memory_extra: &mut Self::MemoryExtra,
_id: AllocId
) -> InterpResult<'tcx>
pub fn retag(
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
_kind: RetagKind,
_place: PlaceTy<'tcx, Self::PointerTag>
) -> InterpResult<'tcx>[src]
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
_kind: RetagKind,
_place: PlaceTy<'tcx, Self::PointerTag>
) -> InterpResult<'tcx>
pub fn after_stack_push(
_ecx: &mut InterpCx<'mir, 'tcx, Self>
) -> InterpResult<'tcx>[src]
_ecx: &mut InterpCx<'mir, 'tcx, Self>
) -> InterpResult<'tcx>
pub fn after_stack_pop(
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
_frame: Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>,
_unwinding: bool
) -> InterpResult<'tcx, StackPopJump>[src]
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
_frame: Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>,
_unwinding: bool
) -> InterpResult<'tcx, StackPopJump>
pub fn int_to_ptr(
_mem: &Memory<'mir, 'tcx, Self>,
int: u64
) -> InterpResult<'tcx, Pointer<Self::PointerTag>>[src]
_mem: &Memory<'mir, 'tcx, Self>,
int: u64
) -> InterpResult<'tcx, Pointer<Self::PointerTag>>
Auto Trait Implementations
impl<'mir, 'tcx> !RefUnwindSafe for CompileTimeInterpreter<'mir, 'tcx>
impl<'mir, 'tcx> !Send for CompileTimeInterpreter<'mir, 'tcx>
impl<'mir, 'tcx> !Sync for CompileTimeInterpreter<'mir, 'tcx>
impl<'mir, 'tcx> Unpin for CompileTimeInterpreter<'mir, 'tcx> where
'tcx: 'mir,
'tcx: 'mir,
impl<'mir, 'tcx> !UnwindSafe for CompileTimeInterpreter<'mir, 'tcx>
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized, [src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized, [src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized, [src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T[src]
impl<T> From<T> for T[src]
impl<T, U> Into<U> for T where
U: From<T>, [src]
U: From<T>,
impl<T, U> TryFrom<U> for T where
U: Into<T>, [src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>, [src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.