diff options
Diffstat (limited to 'vendor/wasm-bindgen/src/describe.rs')
-rw-r--r-- | vendor/wasm-bindgen/src/describe.rs | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/vendor/wasm-bindgen/src/describe.rs b/vendor/wasm-bindgen/src/describe.rs new file mode 100644 index 000000000..2b7c4b628 --- /dev/null +++ b/vendor/wasm-bindgen/src/describe.rs @@ -0,0 +1,192 @@ +//! This is an internal module, no stability guarantees are provided. Use at +//! your own risk. + +#![doc(hidden)] + +use crate::{Clamped, JsError, JsValue}; +use cfg_if::cfg_if; + +macro_rules! tys { + ($($a:ident)*) => (tys! { @ ($($a)*) 0 }); + (@ () $v:expr) => {}; + (@ ($a:ident $($b:ident)*) $v:expr) => { + pub const $a: u32 = $v; + tys!(@ ($($b)*) $v+1); + } +} + +// NB: this list must be kept in sync with `crates/cli-support/src/descriptor.rs` +tys! { + I8 + U8 + I16 + U16 + I32 + U32 + I64 + U64 + F32 + F64 + BOOLEAN + FUNCTION + CLOSURE + CACHED_STRING + STRING + REF + REFMUT + SLICE + VECTOR + EXTERNREF + NAMED_EXTERNREF + ENUM + RUST_STRUCT + CHAR + OPTIONAL + RESULT + UNIT + CLAMPED +} + +#[inline(always)] // see the wasm-interpreter crate +pub fn inform(a: u32) { + unsafe { super::__wbindgen_describe(a) } +} + +pub trait WasmDescribe { + fn describe(); +} + +macro_rules! simple { + ($($t:ident => $d:ident)*) => ($( + impl WasmDescribe for $t { + fn describe() { inform($d) } + } + )*) +} + +simple! { + i8 => I8 + u8 => U8 + i16 => I16 + u16 => U16 + i32 => I32 + u32 => U32 + i64 => I64 + u64 => U64 + isize => I32 + usize => U32 + f32 => F32 + f64 => F64 + bool => BOOLEAN + char => CHAR + JsValue => EXTERNREF +} + +cfg_if! { + if #[cfg(feature = "enable-interning")] { + simple! { + str => CACHED_STRING + } + + } else { + simple! { + str => STRING + } + } +} + +impl<T> WasmDescribe for *const T { + fn describe() { + inform(I32) + } +} + +impl<T> WasmDescribe for *mut T { + fn describe() { + inform(I32) + } +} + +impl<T: WasmDescribe> WasmDescribe for [T] { + fn describe() { + inform(SLICE); + T::describe(); + } +} + +impl<'a, T: WasmDescribe + ?Sized> WasmDescribe for &'a T { + fn describe() { + inform(REF); + T::describe(); + } +} + +impl<'a, T: WasmDescribe + ?Sized> WasmDescribe for &'a mut T { + fn describe() { + inform(REFMUT); + T::describe(); + } +} + +if_std! { + use std::prelude::v1::*; + + cfg_if! { + if #[cfg(feature = "enable-interning")] { + simple! { + String => CACHED_STRING + } + + } else { + simple! { + String => STRING + } + } + } + + impl<T: WasmDescribe> WasmDescribe for Box<[T]> { + fn describe() { + inform(VECTOR); + T::describe(); + } + } + + impl<T> WasmDescribe for Vec<T> where Box<[T]>: WasmDescribe { + fn describe() { + <Box<[T]>>::describe(); + } + } +} + +impl<T: WasmDescribe> WasmDescribe for Option<T> { + fn describe() { + inform(OPTIONAL); + T::describe(); + } +} + +impl WasmDescribe for () { + fn describe() { + inform(UNIT) + } +} + +impl<T: WasmDescribe, E: Into<JsValue>> WasmDescribe for Result<T, E> { + fn describe() { + inform(RESULT); + T::describe(); + } +} + +impl<T: WasmDescribe> WasmDescribe for Clamped<T> { + fn describe() { + inform(CLAMPED); + T::describe(); + } +} + +impl WasmDescribe for JsError { + fn describe() { + JsValue::describe(); + } +} |