mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-05-28 21:21:21 +00:00
This was used oh-so-long ago but hasn't been used in a very long time since then. It's served no purpose for a very long time now and I don't think we have a plan for giving it a purpose any time soon, so let's remove it.
128 lines
4.5 KiB
Rust
128 lines
4.5 KiB
Rust
use core::ops::{Deref, DerefMut};
|
|
|
|
use crate::describe::*;
|
|
|
|
/// A trait for anything that can be converted into a type that can cross the
|
|
/// wasm ABI directly, eg `u32` or `f64`.
|
|
///
|
|
/// This is the opposite operation as `FromWasmAbi` and `Ref[Mut]FromWasmAbi`.
|
|
pub trait IntoWasmAbi: WasmDescribe {
|
|
/// The wasm ABI type that this converts into when crossing the ABI
|
|
/// boundary.
|
|
type Abi: WasmAbi;
|
|
|
|
/// Convert `self` into `Self::Abi` so that it can be sent across the wasm
|
|
/// ABI boundary.
|
|
fn into_abi(self) -> Self::Abi;
|
|
}
|
|
|
|
/// A trait for anything that can be recovered by-value from the wasm ABI
|
|
/// boundary, eg a Rust `u8` can be recovered from the wasm ABI `u32` type.
|
|
///
|
|
/// This is the by-value variant of the opposite operation as `IntoWasmAbi`.
|
|
pub trait FromWasmAbi: WasmDescribe {
|
|
/// The wasm ABI type that this converts from when coming back out from the
|
|
/// ABI boundary.
|
|
type Abi: WasmAbi;
|
|
|
|
/// Recover a `Self` from `Self::Abi`.
|
|
///
|
|
/// # Safety
|
|
///
|
|
/// This is only safe to call when -- and implementations may assume that --
|
|
/// the supplied `Self::Abi` was previously generated by a call to `<Self as
|
|
/// IntoWasmAbi>::into_abi()` or the moral equivalent in JS.
|
|
unsafe fn from_abi(js: Self::Abi) -> Self;
|
|
}
|
|
|
|
/// A trait for anything that can be recovered as some sort of shared reference
|
|
/// from the wasm ABI boundary.
|
|
///
|
|
/// This is the shared reference variant of the opposite operation as
|
|
/// `IntoWasmAbi`.
|
|
pub trait RefFromWasmAbi: WasmDescribe {
|
|
/// The wasm ABI type references to `Self` are recovered from.
|
|
type Abi: WasmAbi;
|
|
|
|
/// The type that holds the reference to `Self` for the duration of the
|
|
/// invocation of the function that has an `&Self` parameter. This is
|
|
/// required to ensure that the lifetimes don't persist beyond one function
|
|
/// call, and so that they remain anonymous.
|
|
type Anchor: Deref<Target = Self>;
|
|
|
|
/// Recover a `Self::Anchor` from `Self::Abi`.
|
|
///
|
|
/// # Safety
|
|
///
|
|
/// Same as `FromWasmAbi::from_abi`.
|
|
unsafe fn ref_from_abi(js: Self::Abi) -> Self::Anchor;
|
|
}
|
|
|
|
/// Dual of the `RefFromWasmAbi` trait, except for mutable references.
|
|
pub trait RefMutFromWasmAbi: WasmDescribe {
|
|
/// Same as `RefFromWasmAbi::Abi`
|
|
type Abi: WasmAbi;
|
|
/// Same as `RefFromWasmAbi::Anchor`
|
|
type Anchor: DerefMut<Target = Self>;
|
|
/// Same as `RefFromWasmAbi::ref_from_abi`
|
|
unsafe fn ref_mut_from_abi(js: Self::Abi) -> Self::Anchor;
|
|
}
|
|
|
|
/// Indicates that this type can be passed to JS as `Option<Self>`.
|
|
///
|
|
/// This trait is used when implementing `IntoWasmAbi for Option<T>`.
|
|
pub trait OptionIntoWasmAbi: IntoWasmAbi {
|
|
/// Returns an ABI instance indicating "none", which JS will interpret as
|
|
/// the `None` branch of this option.
|
|
///
|
|
/// It should be guaranteed that the `IntoWasmAbi` can never produce the ABI
|
|
/// value returned here.
|
|
fn none() -> Self::Abi;
|
|
}
|
|
|
|
/// Indicates that this type can be received from JS as `Option<Self>`.
|
|
///
|
|
/// This trait is used when implementing `FromWasmAbi for Option<T>`.
|
|
pub trait OptionFromWasmAbi: FromWasmAbi {
|
|
/// Tests whether the argument is a "none" instance. If so it will be
|
|
/// deserialized as `None`, and otherwise it will be passed to
|
|
/// `FromWasmAbi`.
|
|
fn is_none(abi: &Self::Abi) -> bool;
|
|
}
|
|
|
|
/// An unsafe trait which represents types that are ABI-safe to pass via wasm
|
|
/// arguments.
|
|
///
|
|
/// This is an unsafe trait to implement as there's no guarantee the type is
|
|
/// actually safe to transfer across the was boundary, it's up to you to
|
|
/// guarantee this so codegen works correctly.
|
|
pub unsafe trait WasmAbi {}
|
|
|
|
unsafe impl WasmAbi for u32 {}
|
|
unsafe impl WasmAbi for i32 {}
|
|
unsafe impl WasmAbi for f32 {}
|
|
unsafe impl WasmAbi for f64 {}
|
|
|
|
/// A trait representing how to interepret the return value of a function for
|
|
/// the wasm ABI.
|
|
///
|
|
/// This is very similar to the `IntoWasmAbi` trait and in fact has a blanket
|
|
/// implementation for all implementors of the `IntoWasmAbi`. The primary use
|
|
/// case of this trait is to enable functions to return `Result`, interpreting
|
|
/// an error as "rethrow this to JS"
|
|
pub trait ReturnWasmAbi: WasmDescribe {
|
|
/// Same as `IntoWasmAbi::Abi`
|
|
type Abi: WasmAbi;
|
|
|
|
/// Same as `IntoWasmAbi::into_abi`, except that it may throw and never
|
|
/// return in the case of `Err`.
|
|
fn return_abi(self) -> Self::Abi;
|
|
}
|
|
|
|
impl<T: IntoWasmAbi> ReturnWasmAbi for T {
|
|
type Abi = T::Abi;
|
|
fn return_abi(self) -> Self::Abi {
|
|
self.into_abi()
|
|
}
|
|
}
|