pulley_interpreter::interp

Struct Vm

Source
pub struct Vm { /* private fields */ }
Available on crate feature interp only.
Expand description

A virtual machine for interpreting Pulley bytecode.

Implementations§

Source§

impl Vm

Source

pub fn new() -> Self

Create a new virtual machine with the default stack size.

Source

pub fn with_stack(stack: Vec<u8>) -> Self

Create a new virtual machine with the given stack.

Source

pub fn state(&self) -> &MachineState

Get a shared reference to this VM’s machine state.

Source

pub fn state_mut(&mut self) -> &mut MachineState

Get an exclusive reference to this VM’s machine state.

Source

pub fn into_stack(self) -> Vec<u8>

Consumer this VM and return its stack storage.

Source

pub unsafe fn call<'a>( &'a mut self, func: NonNull<u8>, args: &[Val], rets: impl IntoIterator<Item = RegType> + 'a, ) -> DoneReason<impl Iterator<Item = Val> + 'a>

Call a bytecode function.

The given func must point to the beginning of a valid Pulley bytecode function.

The given args must match the number and type of arguments that function expects.

The given rets must match the function’s actual return types.

Returns either the resulting values, or the PC at which a trap was raised.

Source

pub unsafe fn call_start<'a>(&'a mut self, args: &[Val])

Peforms the initial part of Vm::call in setting up the args provided in registers according to Pulley’s ABI.

§Unsafety

All the same unsafety as call and additiionally, you must invoke call_run and then call_end after calling call_start. If you don’t want to wrangle these invocations, use call instead of call_{start,run,end}.

Source

pub unsafe fn call_run(&mut self, pc: NonNull<u8>) -> DoneReason<()>

Peforms the internal part of Vm::call where bytecode is actually executed.

§Unsafety

In addition to all the invariants documented for call, you may only invoke call_run after invoking call_start to initialize this call’s arguments.

Source

pub unsafe fn call_end<'a>( &'a mut self, rets: impl IntoIterator<Item = RegType> + 'a, ) -> impl Iterator<Item = Val> + 'a

Peforms the tail end of Vm::call by returning the values as determined by rets according to Pulley’s ABI.

§Unsafety

In addition to the invariants documented for call, this may only be called after call_run.

Source

pub fn fp(&self) -> *mut u8

Returns the current fp register value.

Source

pub fn lr(&self) -> *mut u8

Returns the current lr register value.

Source

pub unsafe fn set_fp(&mut self, fp: *mut u8)

Sets the current fp register value.

Source

pub unsafe fn set_lr(&mut self, lr: *mut u8)

Sets the current lr register value.

Trait Implementations§

Source§

impl Default for Vm

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Index<FReg> for Vm

Source§

type Output = FRegVal

The returned type after indexing.
Source§

fn index(&self, reg: FReg) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
Source§

impl Index<VReg> for Vm

Source§

type Output = VRegVal

The returned type after indexing.
Source§

fn index(&self, reg: VReg) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
Source§

impl Index<XReg> for Vm

Source§

type Output = XRegVal

The returned type after indexing.
Source§

fn index(&self, reg: XReg) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
Source§

impl IndexMut<FReg> for Vm

Source§

fn index_mut(&mut self, reg: FReg) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
Source§

impl IndexMut<VReg> for Vm

Source§

fn index_mut(&mut self, reg: VReg) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
Source§

impl IndexMut<XReg> for Vm

Source§

fn index_mut(&mut self, reg: XReg) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more

Auto Trait Implementations§

§

impl Freeze for Vm

§

impl RefUnwindSafe for Vm

§

impl Send for Vm

§

impl Sync for Vm

§

impl Unpin for Vm

§

impl UnwindSafe for Vm

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.