Implement support for Uint8ClampedArray

This commit implements support for binding APIs that take
`Uint8ClampedArray` in JS. This is pretty rare but comes up in a
`web-sys` binding or two, and we're now able to bind these APIs instead
of having to omit the bindings.

The `Uint8ClampedArray` type is bound by using the `Clamped` marker
struct in Rust. For example this is declaring a JS API that takes
`Uint8ClampedArray`:

    use wasm_bindgen::Clamped;

    #[wasm_bindgen]
    extern {
        fn takes_clamped(a: Clamped<&[u8]>);
    }

The `Clamped` type currently only works when wrapping the `&[u8]`, `&mut
[u8]`, and `Vec<u8>` types. Everything else will produce an error at
`wasm-bindgen` time.

Closes #421
This commit is contained in:
Alex Crichton
2018-09-24 13:49:12 -07:00
parent d10ca579e4
commit 7b495468f6
15 changed files with 169 additions and 60 deletions

View File

@ -3,7 +3,7 @@
#![doc(hidden)]
use JsValue;
use {JsValue, Clamped};
macro_rules! tys {
($($a:ident)*) => (tys! { @ ($($a)*) 0 });
@ -40,6 +40,7 @@ tys! {
CHAR
OPTIONAL
UNIT
CLAMPED
}
#[inline(always)] // see `interpret.rs` in the the cli-support crate
@ -202,3 +203,10 @@ impl<T: WasmDescribe> WasmDescribe for Result<T, JsValue> {
T::describe()
}
}
impl<T: WasmDescribe> WasmDescribe for Clamped<T> {
fn describe() {
inform(CLAMPED);
T::describe();
}
}