artichoke_backend::gc::arena

Struct ArenaIndex

Source
pub struct ArenaIndex<'a> { /* private fields */ }
Expand description

Interpreter guard that acts as a GC arena savepoint.

Arena savepoints ensure mruby objects are reaped even when allocated with the C API.

mruby manages objects created via the C API in a memory construct called the arena. The arena is a stack and objects stored there are permanently alive to avoid having to track lifetimes externally to the interpreter.

An ArenaIndex is an index to some position of the stack. When restoring an ArenaIndex, the stack pointer is moved. All objects beyond the pointer are no longer live and are eligible to be collected at the next GC.

ArenaIndex implements Drop, so letting it go out of scope is sufficient to ensure objects get collected eventually.

Implementations§

Source§

impl<'a> ArenaIndex<'a>

Source

pub fn new(interp: &'a mut Artichoke) -> Result<Self, ArenaSavepointError>

Create a new arena savepoint.

Source

pub fn restore(self)

Restore the arena stack pointer to its prior index.

Source

pub fn interp(&mut self) -> &mut Artichoke

Access the inner guarded interpreter.

The interpreter is also accessible via Deref, DerefMut, AsRef, and AsMut.

Methods from Deref<Target = Artichoke>§

Source

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.

Source

pub unsafe fn with_ffi_boundary<F, T>( &mut self, func: F, ) -> Result<T, InterpreterExtractError>
where F: FnOnce(*mut mrb_state) -> T,

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.

Source

pub fn lookup_symbol_with_trailing_nul( &self, symbol: u32, ) -> Result<Option<&[u8]>, Error>

Source

pub fn intern_bytes_with_trailing_nul<T>( &mut self, bytes: T, ) -> Result<u32, Error>
where T: Into<Cow<'static, [u8]>>,

Source

pub fn check_interned_bytes_with_trailing_nul( &self, bytes: &[u8], ) -> Result<Option<u32>, Error>

Trait Implementations§

Source§

impl<'a> Debug for ArenaIndex<'a>

Source§

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

Formats the value using the given formatter. Read more
Source§

impl<'a> Deref for ArenaIndex<'a>

Source§

type Target = Artichoke

The resulting type after dereferencing.
Source§

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

Dereferences the value.
Source§

impl<'a> DerefMut for ArenaIndex<'a>

Source§

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

Mutably dereferences the value.
Source§

impl<'a> Drop for ArenaIndex<'a>

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for ArenaIndex<'a>

§

impl<'a> RefUnwindSafe for ArenaIndex<'a>

§

impl<'a> !Send for ArenaIndex<'a>

§

impl<'a> !Sync for ArenaIndex<'a>

§

impl<'a> Unpin for ArenaIndex<'a>

§

impl<'a> !UnwindSafe for ArenaIndex<'a>

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