Skip to main content

EvalContextFrameGuard

Struct EvalContextFrameGuard 

Source
pub struct EvalContextFrameGuard<'f, 'a, 's, 'ps, 'g, 'c, 't> { /* private fields */ }
Expand description

A new frame guard for EvalContext, restoring field values upon Drop.

Implementations§

Source§

impl<'t> EvalContextFrameGuard<'_, '_, '_, '_, '_, '_, 't>

Source

pub fn with_new_caching_layer(self) -> Self

Push a new caching layer for function resolution results.

Source

pub fn rewind_scope(self, enable: bool) -> Self

Rewind the scope.

Source

pub fn with_source(self, source: impl Into<ImmutableString>) -> Self

Modify the current source.

Source

pub fn clear_source(self) -> Self

Clear the current source.

Source

pub fn with_tag(self, tag: Dynamic) -> Self

Modify the custom state.

Source

pub fn clear_tag(self) -> Self

Modify the custom state to Dynamic::UNIT.

Methods from Deref<Target = EvalContext<'a, 's, 'ps, 'g, 'c, 't>>§

Source

pub fn engine(&self) -> &'a Engine

The current Engine.

Source

pub fn source(&self) -> Option<&str>

The current source.

Source

pub fn source_mut(&mut self) -> &mut Option<ImmutableString>

Get a mutable reference to the current source.

Source

pub fn scope(&self) -> &Scope<'ps>

The current Scope.

Source

pub fn scope_mut(&mut self) -> &mut Scope<'ps>

Get a mutable reference to the current Scope.

Source

pub fn iter_imports(&self) -> impl Iterator<Item = (&str, &Module)>

Get an iterator over the current set of modules imported via import statements, in reverse order (i.e. modules imported last come first).

Source

pub fn tag(&self) -> &Dynamic

Custom state kept in a Dynamic.

Source

pub fn tag_mut(&mut self) -> &mut Dynamic

Mutable reference to the custom state kept in a Dynamic.

Source

pub fn iter_namespaces(&self) -> impl Iterator<Item = &Module>

Get an iterator over the namespaces containing definition of all script-defined functions.

Not available under no_function.

Source

pub fn this_ptr(&self) -> Option<&Dynamic>

The current bound this pointer, if any.

Source

pub fn this_ptr_mut(&mut self) -> Option<&mut Dynamic>

Mutable reference to the current bound this pointer, if any.

Source

pub fn call_level(&self) -> usize

The current nesting level of function calls.

Source

pub fn eval_expression_tree( &mut self, expr: &Expression<'_>, ) -> Result<Dynamic, Box<EvalAltResult>>

Evaluate an expression tree within this evaluation context.

§WARNING - Low Level API

This function is very low level. It evaluates an expression from an AST.

Source

pub fn eval_expression_tree_raw( &mut self, expr: &Expression<'_>, rewind_scope: bool, ) -> Result<Dynamic, Box<EvalAltResult>>

👎Deprecated:

This API is NOT deprecated, but it is considered volatile and may change in the future.

Evaluate an expression tree within this evaluation context.

The following option is available:

  • whether to rewind the Scope after evaluation if the expression is a [StmtBlock][crate::ast::StmtBlock]
§WARNING - Unstable API

This API is volatile and may change in the future.

§WARNING - Low Level API

This function is extremely low level. It evaluates an expression from an AST.

Source

pub fn call_fn<T: Variant + Clone>( &mut self, fn_name: impl AsRef<str>, args: impl FuncArgs, ) -> Result<T, Box<EvalAltResult>>

Call a function inside the evaluation context with the provided arguments.

Source

pub fn call_native_fn<T: Variant + Clone>( &mut self, fn_name: impl AsRef<str>, args: impl FuncArgs, ) -> Result<T, Box<EvalAltResult>>

Call a registered native Rust function inside the evaluation context with the provided arguments.

This is often useful because Rust functions typically only want to cross-call other registered Rust functions and not have to worry about scripted functions hijacking the process unknowingly (or deliberately).

Source

pub fn call_fn_raw( &mut self, fn_name: impl AsRef<str>, is_ref_mut: bool, is_method_call: bool, args: &mut [&mut Dynamic], ) -> Result<Dynamic, Box<EvalAltResult>>

Call a function (native Rust or scripted) inside the evaluation context.

If is_method_call is true, the first argument is assumed to be the this pointer for a script-defined function (or the object of a method call).

§WARNING - Low Level API

This function is very low level.

§Arguments

All arguments may be consumed, meaning that they may be replaced by (). This is to avoid unnecessarily cloning the arguments.

DO NOT reuse the arguments after this call. If they are needed afterwards, clone them before calling this function.

If is_ref_mut is true, the first argument is assumed to be passed by reference and is not consumed.

Source

pub fn call_native_fn_raw( &mut self, fn_name: impl AsRef<str>, is_ref_mut: bool, args: &mut [&mut Dynamic], ) -> Result<Dynamic, Box<EvalAltResult>>

Call a registered native Rust function inside the evaluation context.

This is often useful because Rust functions typically only want to cross-call other registered Rust functions and not have to worry about scripted functions hijacking the process unknowingly (or deliberately).

§WARNING - Low Level API

This function is very low level.

§Arguments

All arguments may be consumed, meaning that they may be replaced by (). This is to avoid unnecessarily cloning the arguments.

DO NOT reuse the arguments after this call. If they are needed afterwards, clone them before calling this function.

If is_ref_mut is true, the first argument is assumed to be passed by reference and is not consumed.

Source

pub fn new_frame<'f>( &'f mut self, ) -> EvalContextFrameGuard<'f, 'a, 's, 'ps, 'g, 'c, 't>

Create a new isolated runtime frame guard, restoring field values upon Drop.

The frame guard returned derefs to EvalContext.

§Examples
ⓘ
// The following pushes a new, empty, caching layer to make sure that new function resolutions
// do not persist. This is useful if the resolution will be volatile.
let result: i64 = context.new_frame()
                         .with_new_caching_layer()
                         .call_fn("foo", (0_i64,))?;

// In the above example, the resolution to function 'foo' will not be cached outside the frame.
// The next call to 'foo' will be resolved again instead of using the cached resolution,
// even if 'foo' is redefined.

// The following modifies the [`EvalContext`] before using, restoring its state afterwards.
{
    // Modify the context before using...
    let context = context.new_frame()
                         .rewind_scope(true)            // rewinds the scope...
                         .with_source("new source")     // new source...
                         .with_namespace(new_module)    // add new namespace module...
                         .up_call_level();

    // Call a function with the modified context...
    let result: i64 = context.call_fn("foo", (0_i64,))?;

    // ... at end of block, context automatically restored to previous state.
}
§Drop behavior

Upon Drop, the following fields will be automatically restored to the previous values:

Trait Implementations§

Source§

impl<'a, 's, 'ps, 'g, 'c, 't> Deref for EvalContextFrameGuard<'_, 'a, 's, 'ps, 'g, 'c, 't>

Source§

type Target = EvalContext<'a, 's, 'ps, 'g, 'c, 't>

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl<'a, 's, 'ps, 'g, 'c, 't> DerefMut for EvalContextFrameGuard<'_, 'a, 's, 'ps, 'g, 'c, 't>

Source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.
Source§

impl Drop for EvalContextFrameGuard<'_, '_, '_, '_, '_, '_, '_>

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more

Auto Trait Implementations§

§

impl<'f, 'a, 's, 'ps, 'g, 'c, 't> !RefUnwindSafe for EvalContextFrameGuard<'f, 'a, 's, 'ps, 'g, 'c, 't>

§

impl<'f, 'a, 's, 'ps, 'g, 'c, 't> !Send for EvalContextFrameGuard<'f, 'a, 's, 'ps, 'g, 'c, 't>

§

impl<'f, 'a, 's, 'ps, 'g, 'c, 't> !Sync for EvalContextFrameGuard<'f, 'a, 's, 'ps, 'g, 'c, 't>

§

impl<'f, 'a, 's, 'ps, 'g, 'c, 't> !UnwindSafe for EvalContextFrameGuard<'f, 'a, 's, 'ps, 'g, 'c, 't>

§

impl<'f, 'a, 's, 'ps, 'g, 'c, 't> Freeze for EvalContextFrameGuard<'f, 'a, 's, 'ps, 'g, 'c, 't>

§

impl<'f, 'a, 's, 'ps, 'g, 'c, 't> Unpin for EvalContextFrameGuard<'f, 'a, 's, 'ps, 'g, 'c, 't>

§

impl<'f, 'a, 's, 'ps, 'g, 'c, 't> UnsafeUnpin for EvalContextFrameGuard<'f, 'a, 's, 'ps, 'g, 'c, 't>

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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.