referrerpolicy=no-referrer-when-downgrade
pub struct Rooted<T>
where T: GcRef,
{ /* private fields */ }
Expand description

A scoped, rooted reference to a garbage-collected T.

A Rooted<T> is a strong handle to a garbage-collected T, preventing its referent (and anything else transitively referenced) from being collected by the GC during the scope within which this Rooted<T> was created.

When the context exits this Rooted<T>’s scope, the underlying GC object is automatically unrooted and any further attempts to use access the underlying object will return errors or otherwise fail.

Rooted<T> dereferences to its underlying T, allowing you to call T’s methods.

§Example

let mut store = Store::<()>::default();

// Allocating a GC object returns a `Rooted<T>`.
let hello: Rooted<ExternRef> = ExternRef::new(&mut store, "hello")?;

// Because `Rooted<T>` derefs to `T`, we can call `T` methods on a
// `Rooted<T>`. For example, we can call the `ExternRef::data` method when we
// have a `Rooted<ExternRef>`.
let data = hello
    .data(&store)?
    .ok_or_else(|| Error::msg("externref has no host data"))?
    .downcast_ref::<&str>()
    .ok_or_else(|| Error::msg("not a str"))?;
assert_eq!(*data, "hello");

// A `Rooted<T>` roots its underlying GC object for the duration of the
// scope of the store/caller/context that was passed to the method that created
// it. If we only want to keep a GC reference rooted and alive temporarily, we
// can introduce new scopes with `RootScope`.
{
    let mut scope = RootScope::new(&mut store);

    // This `Rooted<T>` is automatically unrooted after `scope` is dropped,
    // allowing the collector to reclaim its GC object in the next GC.
    let scoped_ref = ExternRef::new(&mut scope, "goodbye");
}

let module = Module::new(store.engine(), r#"
    (module
        (global (export "global") (mut externref) (ref.null extern))
        (table (export "table") 10 externref)
        (func (export "func") (param externref) (result externref)
            local.get 0
        )
    )
"#)?;
let instance = Instance::new(&mut store, &module, &[])?;

// GC references returned from calls into Wasm also return (optional, if the
// Wasm type is nullable) `Rooted<T>`s.
let result: Option<Rooted<_>> = instance
    .get_typed_func::<Option<Rooted<ExternRef>>, Option<Rooted<ExternRef>>>(&mut store, "func")?
    .call(&mut store, Some(hello))?;

// Similarly, getting a GC reference from a Wasm instance's exported global
// or table yields a `Rooted<T>`.

let global = instance
    .get_global(&mut store, "global")
    .ok_or_else(|| Error::msg("missing `global` export"))?;
let global_val = global.get(&mut store);
let global_ref: Option<&Rooted<_>> = global_val
    .externref()
    .ok_or_else(|| Error::msg("not an externref"))?;

let table = instance.get_table(&mut store, "table").unwrap();
let table_elem = table
    .get(&mut store, 3)
    .ok_or_else(|| Error::msg("table out of bounds"))?;
let table_elem_ref: Option<&Rooted<_>> = table_elem
    .as_extern()
    .ok_or_else(|| Error::msg("not an externref"))?;

§Differences Between Rooted<T> and ManuallyRooted<T>

While Rooted<T> is automatically unrooted when its scope is exited, this means that Rooted<T> is only valid for strictly last-in-first-out (LIFO, aka stack order) lifetimes. This is in contrast to ManuallyRooted<T>, which supports rooting GC objects for arbitrary lifetimes, but requires manual unrooting.

TypeSupported LifetimesUnrooting
Rooted<T>Strictly LIFO / stack orderAutomatic
ManuallyRooted<T>ArbitraryManual

Rooted<T> should suffice for most use cases, and provides better ergonomics, but ManuallyRooted<T> exists as a fully-general escape hatch.

§Scopes

Wasmtime automatically creates two kinds of scopes:

  1. A Store is the outermost rooting scope. Creating a Root<T> directly inside a Store permanently roots the underlying object, similar to dropping a ManuallyRooted<T> without unrooting it.

  2. A Caller provides a rooting scope for the duration of a call from Wasm into a host function. Any objects rooted in a Caller will be unrooted after the host function returns. Note that there can be nested Caller scopes in the case where Wasm calls a host function, creating the first Caller and its rooting scope , and then the host function calls a Wasm function which then calls another host function, creating a second Caller and a second rooting scope. This nesting can be arbitrarily deep.

Additionally, if you would like to define finer-grained rooting scopes, Wasmtime provides the RootScope type.

Scopes are always nested in a last-in-first-out (LIFO) order. An outer scope is never exited (and the Rooted<T>s defined within it are never automatically unrooted) while an inner scope is still active. All inner scopes are exited before their outer scopes.

The following diagram illustrates various rooting scopes over time, how they nest, and when their Rooted<T>s are automatically unrooted:

----- new Store
  |
  |
  | let a: Rooted<T> = ...;
  |
  |
  | ----- call into Wasm
  |   |
  |   |
  |   | ----- Wasm calls host function F
  |   |   |
  |   |   |
  |   |   | let b: Rooted<T> = ...;
  |   |   |
  |   |   |
  |   |   | ----- F calls into Wasm
  |   |   |   |
  |   |   |   |
  |   |   |   | ----- Wasm call host function G
  |   |   |   |   |
  |   |   |   |   |
  |   |   |   |   | let c: Rooted<T> = ...;
  |   |   |   |   |
  |   |   |   |   |
  |   |   |   | ----- return to Wasm from host function G (unroots `c`)
  |   |   |   |
  |   |   |   |
  |   |   | ----- Wasm returns to F
  |   |   |
  |   |   |
  |   | ----- return from host function F (unroots `b`)
  |   |
  |   |
  | ----- return from Wasm
  |
  |
  | ----- let scope1 = RootScope::new(...);
  |   |
  |   |
  |   | let d: Rooted<T> = ...;
  |   |
  |   |
  |   | ----- let scope2 = RootScope::new(...);
  |   |   |
  |   |   |
  |   |   | let e: Rooted<T> = ...;
  |   |   |
  |   |   |
  |   | ----- drop `scope2` (unroots `e`)
  |   |
  |   |
  | ----- drop `scope1` (unroots `d`)
  |
  |
----- drop Store (unroots `a`)

A Rooted<T> can be used successfully as long as it is still rooted so, in the above diagram, d is valid inside scope2 because scope2 is wholly contained within the scope d was rooted within (scope1).

See also the documentation for RootScope.

Implementations§

§

impl Rooted<ArrayRef>

pub fn to_anyref(self) -> Rooted<AnyRef>

Upcast this arrayref into an anyref.

pub fn to_eqref(self) -> Rooted<EqRef>

Upcast this arrayref into an eqref.

§

impl Rooted<EqRef>

pub fn to_anyref(self) -> Rooted<AnyRef>

Upcast this eqref into an anyref.

§

impl<T> Rooted<T>
where T: GcRef,

pub fn to_manually_rooted( &self, store: impl AsContextMut, ) -> Result<ManuallyRooted<T>, Error>

Create a ManuallyRooted<T> holding onto the same GC object as self.

Returns None if self is used outside of its scope and has therefore been unrooted.

This does not unroot self, and self remains valid until its associated scope is exited.

§Panics

Panics if this object is not associate with the given store.

§Example
let mut store = Store::<()>::default();

let y: ManuallyRooted<_> = {
    // Create a nested rooting scope.
    let mut scope = RootScope::new(&mut store);

    // `x` is only rooted within this nested scope.
    let x: Rooted<_> = ExternRef::new(&mut scope, "hello!")?;

    // Extend `x`'s rooting past its scope's lifetime by converting it
    // to a `ManuallyRooted`.
    x.to_manually_rooted(&mut scope)?
};

// Now we can still access the reference outside the scope it was
// originally defined within.
let data = y.data(&store)?.expect("should have host data");
let data = data.downcast_ref::<&str>().expect("host data should be str");
assert_eq!(*data, "hello!");

// But we have to manually unroot `y`.
y.unroot(&mut store);

pub fn rooted_eq(a: Rooted<T>, b: Rooted<T>) -> bool

Are these two Rooted<T>s the same GC root?

Note that this function can return false even when a and b are rooting the same underlying GC object, but the object was rooted multiple times (for example in different scopes). Use Rooted::ref_eq to test whether these are references to the same underlying GC object or not.

§Example
let mut store = Store::<()>::default();

let a = ExternRef::new(&mut store, "hello")?;
let b = a;

// `a` and `b` are the same GC root.
assert!(Rooted::rooted_eq(a, b));

{
    let mut scope = RootScope::new(&mut store);

    // `c` is a different GC root, in a different scope, even though it
    // is rooting the same object.
    let c = a.to_manually_rooted(&mut scope)?.into_rooted(&mut scope);
    assert!(!Rooted::rooted_eq(a, c));
}

let x = ExternRef::new(&mut store, "goodbye")?;

// `a` and `x` are different GC roots, rooting different objects.
assert!(!Rooted::rooted_eq(a, x));

pub fn ref_eq( store: impl AsContext, a: &impl RootedGcRef<T>, b: &impl RootedGcRef<T>, ) -> Result<bool, Error>

Are these two GC roots referencing the same underlying GC object?

This function will return true even when a and b are different GC roots (for example because they were rooted in different scopes) if they are rooting the same underlying GC object. To only test whether they are the same GC root, and not whether they are rooting the same GC object, use Rooted::rooted_eq.

Returns an error if either a or b has been unrooted, for example because the scope it was rooted within has been exited.

Because this method takes any impl RootedGcRef<T> arguments, it can be used to compare, for example, a Rooted<T> and a ManuallyRooted<T>.

§Panics

Panics if either a or b is not associated with the given store.

§Example
let mut store = Store::<()>::default();

let a = ExternRef::new(&mut store, "hello")?;
let b = a;

// `a` and `b` are rooting the same object.
assert!(Rooted::ref_eq(&store, &a, &b)?);

{
    let mut scope = RootScope::new(&mut store);

    // `c` is a different GC root, in a different scope, but still
    // rooting the same object.
    let c = a.to_manually_rooted(&mut scope)?.into_rooted(&mut scope);
    assert!(!Rooted::ref_eq(&scope, &a, &c)?);
}

let x = ExternRef::new(&mut store, "goodbye")?;

// `a` and `x` are rooting different objects.
assert!(!Rooted::ref_eq(&store, &a, &x)?);

// You can also compare `Rooted<T>`s and `ManuallyRooted<T>`s with this
// function.
let d = a.to_manually_rooted(&mut store)?;
assert!(Rooted::ref_eq(&store, &a, &d)?);

d.unroot(&mut store);

pub fn rooted_hash<H>(&self, state: &mut H)
where H: Hasher,

Hash this root.

Note that, similar to Rooted::rooted_eq, this only operates on the root and not the underlying GC reference. That means that two different rootings of the same object will hash to different values (modulo hash collisions). If this is undesirable, use the ref_hash method instead.

pub fn ref_hash<H>( &self, store: impl AsContext, state: &mut H, ) -> Result<(), Error>
where H: Hasher,

Hash the underlying rooted object reference.

Note that, similar to Rooted::ref_eq, and operates on the underlying rooted GC object reference, not the root. That means that two different rootings of the same object will hash to the same value. If this is undesirable, use the rooted_hash method instead.

§

impl Rooted<StructRef>

pub fn to_anyref(self) -> Rooted<AnyRef>

Upcast this structref into an anyref.

pub fn to_eqref(self) -> Rooted<EqRef>

Upcast this structref into an eqref.

Trait Implementations§

§

impl<T> Clone for Rooted<T>
where T: GcRef,

§

fn clone(&self) -> Rooted<T>

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
§

impl<T> Debug for Rooted<T>
where T: GcRef,

§

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

Formats the value using the given formatter. Read more
§

impl<T> Deref for Rooted<T>
where T: GcRef,

§

type Target = T

The resulting type after dereferencing.
§

fn deref(&self) -> &<Rooted<T> as Deref>::Target

Dereferences the value.
§

impl From<Rooted<AnyRef>> for Ref

§

fn from(e: Rooted<AnyRef>) -> Ref

Converts to this type from the input type.
§

impl From<Rooted<AnyRef>> for Val

§

fn from(val: Rooted<AnyRef>) -> Val

Converts to this type from the input type.
§

impl From<Rooted<ArrayRef>> for Ref

§

fn from(e: Rooted<ArrayRef>) -> Ref

Converts to this type from the input type.
§

impl From<Rooted<ArrayRef>> for Rooted<AnyRef>

§

fn from(s: Rooted<ArrayRef>) -> Rooted<AnyRef>

Converts to this type from the input type.
§

impl From<Rooted<ArrayRef>> for Rooted<EqRef>

§

fn from(s: Rooted<ArrayRef>) -> Rooted<EqRef>

Converts to this type from the input type.
§

impl From<Rooted<ArrayRef>> for Val

§

fn from(val: Rooted<ArrayRef>) -> Val

Converts to this type from the input type.
§

impl From<Rooted<EqRef>> for Rooted<AnyRef>

§

fn from(e: Rooted<EqRef>) -> Rooted<AnyRef>

Converts to this type from the input type.
§

impl From<Rooted<ExternRef>> for Ref

§

fn from(e: Rooted<ExternRef>) -> Ref

Converts to this type from the input type.
§

impl From<Rooted<ExternRef>> for Val

§

fn from(val: Rooted<ExternRef>) -> Val

Converts to this type from the input type.
§

impl From<Rooted<StructRef>> for Ref

§

fn from(e: Rooted<StructRef>) -> Ref

Converts to this type from the input type.
§

impl From<Rooted<StructRef>> for Rooted<AnyRef>

§

fn from(s: Rooted<StructRef>) -> Rooted<AnyRef>

Converts to this type from the input type.
§

impl From<Rooted<StructRef>> for Rooted<EqRef>

§

fn from(s: Rooted<StructRef>) -> Rooted<EqRef>

Converts to this type from the input type.
§

impl From<Rooted<StructRef>> for Val

§

fn from(val: Rooted<StructRef>) -> Val

Converts to this type from the input type.
§

impl<T> Copy for Rooted<T>
where T: GcRef,

§

impl WasmTy for Rooted<AnyRef>

§

impl WasmTy for Rooted<ArrayRef>

§

impl WasmTy for Rooted<EqRef>

§

impl WasmTy for Rooted<ExternRef>

§

impl WasmTy for Rooted<StructRef>

Auto Trait Implementations§

§

impl<T> Freeze for Rooted<T>

§

impl<T> RefUnwindSafe for Rooted<T>
where T: RefUnwindSafe,

§

impl<T> Send for Rooted<T>
where T: Send,

§

impl<T> Sync for Rooted<T>
where T: Sync,

§

impl<T> Unpin for Rooted<T>
where T: Unpin,

§

impl<T> UnwindSafe for Rooted<T>
where T: UnwindSafe,

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
§

impl<T> Any for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

§

fn type_name(&self) -> &'static str

§

impl<T> AnySync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

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> CheckedConversion for T

Source§

fn checked_from<T>(t: T) -> Option<Self>
where Self: TryFrom<T>,

Convert from a value of T into an equivalent instance of Option<Self>. Read more
Source§

fn checked_into<T>(self) -> Option<T>
where Self: TryInto<T>,

Consume self to return Some equivalent value of Option<T>. Read more
Source§

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

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

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

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T, U> DefensiveTruncateInto<U> for T

Source§

fn defensive_truncate_into(self) -> U

Defensively truncate a value and convert it into its bounded form.
Source§

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

Source§

fn __clone_box(&self, _: Private) -> *mut ()

§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. 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> Instrument for T

Source§

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

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

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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T, U> IntoKey<U> for T
where U: FromKey<T>,

Source§

fn into_key(self) -> U

§

impl<Src, Dest> IntoTuple<Dest> for Src
where Dest: FromTuple<Src>,

§

fn into_tuple(self) -> Dest

Source§

impl<T> IsType<T> for T

Source§

fn from_ref(t: &T) -> &T

Cast reference.
Source§

fn into_ref(&self) -> &T

Cast reference.
Source§

fn from_mut(t: &mut T) -> &mut T

Cast mutable reference.
Source§

fn into_mut(&mut self) -> &mut T

Cast mutable reference.
Source§

impl<T, Outer> IsWrappedBy<Outer> for T
where Outer: AsRef<T> + AsMut<T> + From<T>, T: From<Outer>,

Source§

fn from_ref(outer: &Outer) -> &T

Get a reference to the inner from the outer.

Source§

fn from_mut(outer: &mut Outer) -> &mut T

Get a mutable reference to the inner from the outer.

§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
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> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> SaturatedConversion for T

Source§

fn saturated_from<T>(t: T) -> Self
where Self: UniqueSaturatedFrom<T>,

Convert from a value of T into an equivalent instance of Self. Read more
Source§

fn saturated_into<T>(self) -> T
where Self: UniqueSaturatedInto<T>,

Consume self to return an equivalent value of T. Read more
§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

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

Source§

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
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
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.
Source§

impl<T, U> TryIntoKey<U> for T
where U: TryFromKey<T>,

Source§

type Error = <U as TryFromKey<T>>::Error

Source§

fn try_into_key(self) -> Result<U, <U as TryFromKey<T>>::Error>

Source§

impl<S, T> UncheckedInto<T> for S
where T: UncheckedFrom<S>,

Source§

fn unchecked_into(self) -> T

The counterpart to unchecked_from.
Source§

impl<T, S> UniqueSaturatedInto<T> for S
where T: Bounded, S: TryInto<T>,

Source§

fn unique_saturated_into(self) -> T

Consume self to return an equivalent value of T.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WasmParams for T
where T: WasmTy,

§

type ValRawStorage = <(T,) as WasmParams>::ValRawStorage

§

fn typecheck( engine: &Engine, params: impl ExactSizeIterator<Item = ValType>, position: TypeCheckPosition, ) -> Result<(), Error>

§

fn vmgcref_pointing_to_object_count(&self) -> usize

§

fn store( self, store: &mut AutoAssertNoGc<'_>, func_ty: &FuncType, dst: &mut MaybeUninit<<T as WasmParams>::ValRawStorage>, ) -> Result<(), Error>

§

impl<T> WasmResults for T
where T: WasmTy,

§

unsafe fn load( store: &mut AutoAssertNoGc<'_>, abi: &<T as WasmParams>::ValRawStorage, ) -> T

§

impl<T> WasmRet for T
where T: WasmTy,

§

type Fallible = Result<T, Error>

§

fn compatible_with_store(&self, store: &StoreOpaque) -> bool

§

unsafe fn store( self, store: &mut AutoAssertNoGc<'_>, ptr: &mut [MaybeUninit<ValRaw>], ) -> Result<(), Error>

§

fn may_gc() -> bool

§

fn func_type(engine: &Engine, params: impl Iterator<Item = ValType>) -> FuncType

§

fn into_fallible(self) -> Result<T, Error>

§

fn fallible_from_error(error: Error) -> Result<T, Error>

§

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

impl<T> WithSubscriber for T

Source§

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

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<T> ErasedDestructor for T
where T: 'static,

§

impl<T> Formattable for T
where T: Deref, <T as Deref>::Target: Formattable,

§

impl<T> JsonSchemaMaybe for T

§

impl<T> MaybeDebug for T
where T: Debug,

Source§

impl<T> MaybeRefUnwindSafe for T
where T: RefUnwindSafe,

§

impl<T> MaybeSend for T
where T: Send,

§

impl<T> MaybeSendSync for T

§

impl<T> Parsable for T
where T: Deref, <T as Deref>::Target: Parsable,

§

impl<T, U> RootedGcRef<T> for U
where T: GcRef, U: RootedGcRefImpl<T> + Deref<Target = T>,