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.