mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-04-01 18:01:06 +00:00
Merge pull request #1147 from alexcrichton/more-slicing
Add conversions between typed arrays and Rust
This commit is contained in:
commit
9dced1d99b
@ -854,6 +854,11 @@ extern "C" {
|
|||||||
/// typed array from the start of its `ArrayBuffer`.
|
/// typed array from the start of its `ArrayBuffer`.
|
||||||
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
||||||
pub fn byte_offset(this: &Float32Array) -> u32;
|
pub fn byte_offset(this: &Float32Array) -> u32;
|
||||||
|
|
||||||
|
/// The `set()` method stores multiple values in the typed array, reading
|
||||||
|
/// input values from a specified array.
|
||||||
|
#[wasm_bindgen(method)]
|
||||||
|
pub fn set(this: &Float32Array, src: &JsValue, offset: u32);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Float64Array
|
// Float64Array
|
||||||
@ -938,6 +943,11 @@ extern "C" {
|
|||||||
/// typed array from the start of its `ArrayBuffer`.
|
/// typed array from the start of its `ArrayBuffer`.
|
||||||
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
||||||
pub fn byte_offset(this: &Float64Array) -> u32;
|
pub fn byte_offset(this: &Float64Array) -> u32;
|
||||||
|
|
||||||
|
/// The `set()` method stores multiple values in the typed array, reading
|
||||||
|
/// input values from a specified array.
|
||||||
|
#[wasm_bindgen(method)]
|
||||||
|
pub fn set(this: &Float64Array, src: &JsValue, offset: u32);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function
|
// Function
|
||||||
@ -1157,6 +1167,11 @@ extern "C" {
|
|||||||
/// typed array from the start of its `ArrayBuffer`.
|
/// typed array from the start of its `ArrayBuffer`.
|
||||||
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
||||||
pub fn byte_offset(this: &Int8Array) -> u32;
|
pub fn byte_offset(this: &Int8Array) -> u32;
|
||||||
|
|
||||||
|
/// The `set()` method stores multiple values in the typed array, reading
|
||||||
|
/// input values from a specified array.
|
||||||
|
#[wasm_bindgen(method)]
|
||||||
|
pub fn set(this: &Int8Array, src: &JsValue, offset: u32);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int16Array
|
// Int16Array
|
||||||
@ -1241,6 +1256,11 @@ extern "C" {
|
|||||||
/// typed array from the start of its `ArrayBuffer`.
|
/// typed array from the start of its `ArrayBuffer`.
|
||||||
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
||||||
pub fn byte_offset(this: &Int16Array) -> u32;
|
pub fn byte_offset(this: &Int16Array) -> u32;
|
||||||
|
|
||||||
|
/// The `set()` method stores multiple values in the typed array, reading
|
||||||
|
/// input values from a specified array.
|
||||||
|
#[wasm_bindgen(method)]
|
||||||
|
pub fn set(this: &Int16Array, src: &JsValue, offset: u32);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int32Array
|
// Int32Array
|
||||||
@ -1325,6 +1345,11 @@ extern "C" {
|
|||||||
/// typed array from the start of its `ArrayBuffer`.
|
/// typed array from the start of its `ArrayBuffer`.
|
||||||
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
||||||
pub fn byte_offset(this: &Int32Array) -> u32;
|
pub fn byte_offset(this: &Int32Array) -> u32;
|
||||||
|
|
||||||
|
/// The `set()` method stores multiple values in the typed array, reading
|
||||||
|
/// input values from a specified array.
|
||||||
|
#[wasm_bindgen(method)]
|
||||||
|
pub fn set(this: &Int32Array, src: &JsValue, offset: u32);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Map
|
// Map
|
||||||
@ -3093,6 +3118,11 @@ extern "C" {
|
|||||||
/// typed array from the start of its `ArrayBuffer`.
|
/// typed array from the start of its `ArrayBuffer`.
|
||||||
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
||||||
pub fn byte_offset(this: &Uint8Array) -> u32;
|
pub fn byte_offset(this: &Uint8Array) -> u32;
|
||||||
|
|
||||||
|
/// The `set()` method stores multiple values in the typed array, reading
|
||||||
|
/// input values from a specified array.
|
||||||
|
#[wasm_bindgen(method)]
|
||||||
|
pub fn set(this: &Uint8Array, src: &JsValue, offset: u32);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint8ClampedArray
|
// Uint8ClampedArray
|
||||||
@ -3179,6 +3209,11 @@ extern "C" {
|
|||||||
/// typed array from the start of its `ArrayBuffer`.
|
/// typed array from the start of its `ArrayBuffer`.
|
||||||
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
||||||
pub fn byte_offset(this: &Uint8ClampedArray) -> u32;
|
pub fn byte_offset(this: &Uint8ClampedArray) -> u32;
|
||||||
|
|
||||||
|
/// The `set()` method stores multiple values in the typed array, reading
|
||||||
|
/// input values from a specified array.
|
||||||
|
#[wasm_bindgen(method)]
|
||||||
|
pub fn set(this: &Uint8ClampedArray, src: &JsValue, offset: u32);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint16Array
|
// Uint16Array
|
||||||
@ -3263,6 +3298,11 @@ extern "C" {
|
|||||||
/// typed array from the start of its `ArrayBuffer`.
|
/// typed array from the start of its `ArrayBuffer`.
|
||||||
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
||||||
pub fn byte_offset(this: &Uint16Array) -> u32;
|
pub fn byte_offset(this: &Uint16Array) -> u32;
|
||||||
|
|
||||||
|
/// The `set()` method stores multiple values in the typed array, reading
|
||||||
|
/// input values from a specified array.
|
||||||
|
#[wasm_bindgen(method)]
|
||||||
|
pub fn set(this: &Uint16Array, src: &JsValue, offset: u32);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint32Array
|
// Uint32Array
|
||||||
@ -3347,6 +3387,11 @@ extern "C" {
|
|||||||
/// typed array from the start of its `ArrayBuffer`.
|
/// typed array from the start of its `ArrayBuffer`.
|
||||||
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
#[wasm_bindgen(method, getter, js_name = byteOffset)]
|
||||||
pub fn byte_offset(this: &Uint32Array) -> u32;
|
pub fn byte_offset(this: &Uint32Array) -> u32;
|
||||||
|
|
||||||
|
/// The `set()` method stores multiple values in the typed array, reading
|
||||||
|
/// input values from a specified array.
|
||||||
|
#[wasm_bindgen(method)]
|
||||||
|
pub fn set(this: &Uint32Array, src: &JsValue, offset: u32);
|
||||||
}
|
}
|
||||||
|
|
||||||
// URIError
|
// URIError
|
||||||
@ -4742,3 +4787,70 @@ pub fn global() -> Object {
|
|||||||
|
|
||||||
GLOBAL.with(|g| g.clone())
|
GLOBAL.with(|g| g.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! arrays {
|
||||||
|
($($name:ident: $ty:ident,)*) => ($(
|
||||||
|
impl $name {
|
||||||
|
/// Creates a JS typed array which is a few into wasm's linear
|
||||||
|
/// memory at the slice specified.
|
||||||
|
///
|
||||||
|
/// This function returns a new typed array which is a view into
|
||||||
|
/// wasm's memory. This view does not copy the underlying data.
|
||||||
|
///
|
||||||
|
/// # Unsafety
|
||||||
|
///
|
||||||
|
/// Views into WebAssembly memory are only valid so long as the
|
||||||
|
/// backing buffer isn't resized in JS. Once this function is called
|
||||||
|
/// any future calls to `Box::new` (or malloc of any form) may cause
|
||||||
|
/// the returned value here to be invalidated. Use with caution!
|
||||||
|
///
|
||||||
|
/// Additionally the returned object can be safely mutated but the
|
||||||
|
/// input slice isn't guaranteed to be mutable.
|
||||||
|
///
|
||||||
|
/// Finally, the returned objet is disconnected from the input
|
||||||
|
/// slice's lifetime, so there's no guarantee that the data is read
|
||||||
|
/// at the right time.
|
||||||
|
pub unsafe fn view(rust: &[$ty]) -> $name {
|
||||||
|
let buf = wasm_bindgen::memory();
|
||||||
|
let mem = buf.unchecked_ref::<WebAssembly::Memory>();
|
||||||
|
$name::new_with_byte_offset_and_length(
|
||||||
|
&mem.buffer(),
|
||||||
|
rust.as_ptr() as u32,
|
||||||
|
rust.len() as u32,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Copy the contents of this JS typed array into the destination
|
||||||
|
/// Rust slice.
|
||||||
|
///
|
||||||
|
/// This function will efficiently copy the memory from a typed
|
||||||
|
/// array into this wasm module's own linear memory, initializing
|
||||||
|
/// the memory destination provided.
|
||||||
|
///
|
||||||
|
/// # Panics
|
||||||
|
///
|
||||||
|
/// This function will panic if this typed array's length is
|
||||||
|
/// different than the length of the provided `dst` array.
|
||||||
|
pub fn copy_to(&self, dst: &mut [$ty]) {
|
||||||
|
assert_eq!(self.length() as usize, dst.len());
|
||||||
|
let buf = wasm_bindgen::memory();
|
||||||
|
let mem = buf.unchecked_ref::<WebAssembly::Memory>();
|
||||||
|
let all_wasm_memory = $name::new(&mem.buffer());
|
||||||
|
let offset = dst.as_ptr() as usize / mem::size_of::<$ty>();
|
||||||
|
all_wasm_memory.set(self, offset as u32);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)*)
|
||||||
|
}
|
||||||
|
|
||||||
|
arrays! {
|
||||||
|
Int8Array: i8,
|
||||||
|
Int16Array: i16,
|
||||||
|
Int32Array: i32,
|
||||||
|
Uint8Array: u8,
|
||||||
|
Uint8ClampedArray: u8,
|
||||||
|
Uint16Array: u16,
|
||||||
|
Uint32Array: u32,
|
||||||
|
Float32Array: f32,
|
||||||
|
Float64Array: f64,
|
||||||
|
}
|
||||||
|
@ -100,3 +100,24 @@ macro_rules! test_slice {
|
|||||||
fn new_slice() {
|
fn new_slice() {
|
||||||
each!(test_slice);
|
each!(test_slice);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen_test]
|
||||||
|
fn view() {
|
||||||
|
let x = [1, 2, 3];
|
||||||
|
let array = unsafe { Int32Array::view(&x) };
|
||||||
|
assert_eq!(array.length(), 3);
|
||||||
|
array.for_each(&mut |x, i, _| {
|
||||||
|
assert_eq!(x, (i + 1) as i32);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen_test]
|
||||||
|
fn copy_to() {
|
||||||
|
let mut x = [0; 10];
|
||||||
|
let array = Int32Array::new(&10.into());
|
||||||
|
array.fill(5, 0, 10);
|
||||||
|
array.copy_to(&mut x);
|
||||||
|
for i in x.iter() {
|
||||||
|
assert_eq!(*i, 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user