Struct muse_lang::vm::Vm

source ·
pub struct Vm { /* private fields */ }
Expand description

A virtual machine that executes compiled Muse Code.

Implementations§

source§

impl Vm

source

pub fn new(guard: &CollectionGuard<'_>) -> Self

Returns a new virtual machine.

Virtual machines are allocated within the [refuse] garbage collector. Each virtual machine acts as a “root” reference to all of the values contained within its stack and registers.

source

pub fn compile_and_execute<'a>( &self, source: impl Into<SourceCode<'a>>, guard: &mut CollectionGuard<'_>, ) -> Result<Value, Error>

Compiles source, executes it, and returns the result.

When building an interactive environment like a REPL, reusing a Compiler and calling execute enables the compiler to remember declarations from previous compilations.

source

pub fn prepare( &self, code: &Code, guard: &mut CollectionGuard<'_>, ) -> Result<(), Fault>

Prepares to execute code.

This function does not actually execute any code. A call to resume/resume_async is needed to begin executing the function call.

source

pub fn prepare_call( &self, function: &Rooted<Function>, arity: Arity, guard: &mut CollectionGuard<'_>, ) -> Result<(), Fault>

Prepares to execute the function body with arity arguments.

This function does not actually execute any code. A call to resume/resume_async is needed to begin executing the function call.

source

pub fn execute( &self, code: &Code, guard: &mut CollectionGuard<'_>, ) -> Result<Value, ExecutionError>

Executes code and returns the result.

source

pub fn execute_for( &self, code: &Code, duration: Duration, guard: &mut CollectionGuard<'_>, ) -> Result<Value, ExecutionError>

Executes code for at most duration before returning a timout.

source

pub fn execute_until( &self, code: &Code, instant: Instant, guard: &mut CollectionGuard<'_>, ) -> Result<Value, ExecutionError>

Executes code for until instant before returning a timout.

source

pub fn resume( &self, guard: &mut CollectionGuard<'_>, ) -> Result<Value, ExecutionError>

Resumes executing the current code.

This should only be called if an ExecutionError::Waiting, ExecutionError::NoBudget, or ExecutionError::Timeout was returned when executing code.

source

pub fn resume_until( &mut self, instant: Instant, guard: &mut CollectionGuard<'_>, ) -> Result<Value, ExecutionError>

Resumes executing the currently executing code until instant.

This should only be called if an ExecutionError::Waiting, ExecutionError::NoBudget, or ExecutionError::Timeout was returned when executing code.

source

pub fn resume_for( &mut self, duration: Duration, guard: &mut CollectionGuard<'_>, ) -> Result<Value, ExecutionError>

Resumes executing the currently executing code until duration as elapsed.

This should only be called if an ExecutionError::Waiting, ExecutionError::NoBudget, or ExecutionError::Timeout was returned when executing code.

source

pub fn execute_async<'context, 'guard>( &'context self, code: &Code, guard: &'context mut CollectionGuard<'guard>, ) -> Result<ExecuteAsync<'static, 'context, 'guard>, Fault>

Returns a future that executes code asynchronously.

source

pub fn resume_async<'context, 'guard>( &'context self, guard: &'context mut CollectionGuard<'guard>, ) -> ExecuteAsync<'static, 'context, 'guard>

Resumes executing the current code asynchronously.

This should only be called if an ExecutionError::Waiting, ExecutionError::NoBudget, or ExecutionError::Timeout was returned when executing code.

source

pub fn resume_for_async<'context, 'guard>( &'context self, duration: Duration, guard: &'context mut CollectionGuard<'guard>, ) -> ExecuteAsync<'static, 'context, 'guard>

Resumes executing the currently executing code until duration as elapsed.

This should only be called if an ExecutionError::Waiting, ExecutionError::NoBudget, or ExecutionError::Timeout was returned when executing code.

source

pub fn resume_until_async<'context, 'guard>( &'context self, instant: Instant, guard: &'context mut CollectionGuard<'guard>, ) -> ExecuteAsync<'static, 'context, 'guard>

Resumes executing the currently executing code until instant.

This should only be called if an ExecutionError::Waiting, ExecutionError::NoBudget, or ExecutionError::Timeout was returned when executing code.

source

pub fn increase_budget(&self, amount: usize)

Increases the current budget by amount.

If the virtual machine currently is unbudgeted, calling this function enables budgeting.

source

pub fn invoke( &self, name: impl Into<SymbolRef>, params: impl InvokeArgs, guard: &mut CollectionGuard<'_>, ) -> Result<Value, ExecutionError>

Invokes a public function at path name with the given parameters.

source

pub fn context<'context, 'guard>( &'context self, guard: &'context mut CollectionGuard<'guard>, ) -> VmContext<'context, 'guard>

Returns an execution context that synchronizes with the garbage collector.

source

pub fn set_steps_per_charge(&self, steps: u16)

Sets the number of virtual machine steps to take per budget being charged.

This also affects how often the virtual machine checks if it should yield to the garbage collector.

source

pub fn register(&self, register: Register) -> Value

Returns the value contained in register.

source

pub fn set_register(&self, register: Register, value: Value) -> Value

Replaces the current value in register with value.

source

pub fn stack(&self, index: Stack) -> Value

Returns the value contained at index on the stack.

§Panics

This function panics if index is out of bounds of the stack.

source

pub fn set_stack(&self, index: Stack, value: Value) -> Value

Replaces the current value at index on the stack with value.

§Panics

This function panics if index is out of bounds of the stack.

source

pub fn declare_variable( &self, name: SymbolRef, mutable: bool, guard: &mut CollectionGuard<'_>, ) -> Result<Stack, Fault>

Allocates a variable declaration.

Returns a stack index that has been allocated. The Muse virtual machine ensures the stack is Nil-initialized.

source

pub fn declare( &self, name: impl Into<SymbolRef>, value: Value, guard: &mut CollectionGuard<'_>, ) -> Result<Option<Value>, Fault>

Declares an immutable variable with name containing value.

source

pub fn declare_mut( &self, name: impl Into<SymbolRef>, value: Value, guard: &mut CollectionGuard<'_>, ) -> Result<Option<Value>, Fault>

Declares an mutable variable with name containing value.

source

pub fn declare_function( &self, function: Function, guard: &mut CollectionGuard<'_>, ) -> Result<Option<Value>, Fault>

Declares a compiled function.

Returns a reference to the function, or None if the function could not be declared because it has no name.

Trait Implementations§

source§

impl Clone for Vm

source§

fn clone(&self) -> Vm

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Vm

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. 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
§

impl<A> Cast for A

§

fn cast<To>(self) -> To
where To: CastFrom<A>,

Casts self to the To type. This may be a lossy operation.
§

impl<A> CastFrom<A> for A

§

fn from_cast(from: A) -> A

Returns from as Self.
§

impl<A, B> CastInto<A> for B
where A: CastFrom<B>,

§

fn cast_into(self) -> A

Returns self as To.
source§

impl<T> CloneToUninit for T
where T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

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

§

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>,

§

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.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more