pub struct Guard<'a>(/* private fields */);
Expand description
Interpreter guard that prepares an Artichoke
to re-enter an FFI
boundary.
Artichoke integrates with the mruby VM via many extern "C" fn
trampolines
that are invoked by mruby to run some portion of the VM in Rust.
These trampolines typically require an Artichoke
interpreter to do
useful work, so they move the State
out of the
mrb
userdata pointer into an Artichoke
struct.
To ensure safety, the State
must be moved back into the mrb
userdata
pointer before re-entering the FFI boundary. This guard implements Drop
to re-serialize the State
into the mrb
once it goes out of scope.
Guard
is passed directly to error::raise
.
Implementations§
Methods from Deref<Target = Artichoke>§
Sourcepub fn protect(&mut self, value: Value) -> Value
pub fn protect(&mut self, value: Value) -> Value
Prevent the given value from being garbage collected.
Calls sys::mrb_gc_protect
on this value which adds it to the GC
arena. This object will remain in the arena until ArenaIndex::restore
restores the arena to an index before this call to protect.
Sourcepub unsafe fn with_ffi_boundary<F, T>(
&mut self,
func: F,
) -> Result<T, InterpreterExtractError>
pub unsafe fn with_ffi_boundary<F, T>( &mut self, func: F, ) -> Result<T, InterpreterExtractError>
Execute a a closure by moving the State
into the mrb
instance.
This method prepares this interpreter to cross an FFI boundary. When the
Artichoke implementation calls mruby FFI functions, the State
must be
moved into the sys::mrb_state
userdata pointer.
§Safety
This method moves the State
out of this instance into the mrb
instance. During this function’s execution, this instance may be
partially initialized.
This function is only safe to call if the closure only calls FFI
functions that use a raw *mut sys::mrb_state
.