Skip to content

Commit a23c511

Browse files
committed
Add support for number slices of type MaybeUninit<T>
1 parent 94b2dc6 commit a23c511

File tree

8 files changed

+250
-88
lines changed

8 files changed

+250
-88
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
* Add support for multi-threading in Node.js.
99
[#4318](https://github.com/rustwasm/wasm-bindgen/pull/4318)
1010

11+
* Add support for number slices of type `MaybeUninit<T>`.
12+
[#4316](https://github.com/rustwasm/wasm-bindgen/pull/4316)
13+
1114
### Changed
1215

1316
* Add clear error message to communicate new feature resolver version requirements.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ wasm-bindgen-macro = { path = "crates/macro", version = "=0.2.97", default-featu
6666
wasm-bindgen-test = { path = 'crates/test' }
6767

6868
[target.'cfg(target_arch = "wasm32")'.dev-dependencies]
69+
paste = "1"
6970
js-sys = { path = 'crates/js-sys' }
7071
serde_derive = "1.0"
7172
wasm-bindgen-futures = { path = 'crates/futures' }

guide/src/reference/types/boxed-number-slices.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Boxed Number Slices: `Box<[u8]>`, `Box<[i8]>`, `Box<[u16]>`, `Box<[i16]>`, `Box<[u32]>`, `Box<[i32]>`, `Box<[u64]>`, `Box<[i64]>`, `Box<[f32]>`, and `Box<[f64]>`
1+
# Boxed Number Slices: `Box<[u8]>`, `Box<[i8]>`, `Box<[u16]>`, `Box<[i16]>`, `Box<[u32]>`, `Box<[i32]>`, `Box<[u64]>`, `Box<[i64]>`, `Box<[f32]>`, `Box<[f64]>`, `Box<[MaybeUninit<u8>]>`, `Box<[MaybeUninit<i8>]>`, `Box<[MaybeUninit<u16>]>`, `Box<[MaybeUninit<i16>]>`, `Box<[MaybeUninit<u32>]>`, `Box<[MaybeUninit<i32>]>`, `Box<[MaybeUninit<u64>]>`, `Box<[MaybeUninit<i64>]>`, `Box<[MaybeUninit<f32>]>`, and `Box<[MaybeUninit<f64>]>`
22

33
| `T` parameter | `&T` parameter | `&mut T` parameter | `T` return value | `Option<T>` parameter | `Option<T>` return value | JavaScript representation |
44
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|

guide/src/reference/types/number-slices.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Number Slices: `[u8]`, `[i8]`, `[u16]`, `[i16]`, `[u32]`, `[i32]`, `[u64]`, `[i64]`, `[f32]`, and `[f64]`
1+
# Number Slices: `[u8]`, `[i8]`, `[u16]`, `[i16]`, `[u32]`, `[i32]`, `[u64]`, `[i64]`, `[f32]`, `[f64]`, `[MaybeUninit<u8>]`, `[MaybeUninit<i8>]`, `[MaybeUninit<u16>]`, `[MaybeUninit<i16>]`, `[MaybeUninit<u32>]`, `[MaybeUninit<i32>]`, `[MaybeUninit<u64>]`, `[MaybeUninit<i64>]`, `[MaybeUninit<f32>]`, and `[MaybeUninit<f64>]`
22

33
| `T` parameter | `&T` parameter | `&mut T` parameter | `T` return value | `Option<&T>` parameter | `Option<T>` return value | JavaScript representation |
44
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|

src/convert/slices.rs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use alloc::boxed::Box;
22
use alloc::string::String;
33
use alloc::vec::Vec;
4-
use core::mem;
4+
use core::mem::{self, MaybeUninit};
55
use core::ops::{Deref, DerefMut};
66
use core::str;
77

@@ -118,12 +118,19 @@ impl<T> DerefMut for MutSlice<T> {
118118
}
119119

120120
macro_rules! vectors {
121-
($($t:ident)*) => ($(
121+
($($t:ty)*) => ($(
122+
vectors_internal!($t);
123+
vectors_internal!(MaybeUninit<$t>);
124+
)*)
125+
}
126+
127+
macro_rules! vectors_internal {
128+
($t:ty) => {
122129
impl WasmDescribeVector for $t {
123130
#[cfg_attr(wasm_bindgen_unstable_test_coverage, coverage(off))]
124131
fn describe_vector() {
125132
inform(VECTOR);
126-
$t::describe();
133+
<$t>::describe();
127134
}
128135
}
129136

@@ -167,7 +174,9 @@ macro_rules! vectors {
167174

168175
impl<'a> OptionIntoWasmAbi for &'a [$t] {
169176
#[inline]
170-
fn none() -> WasmSlice { null_slice() }
177+
fn none() -> WasmSlice {
178+
null_slice()
179+
}
171180
}
172181

173182
impl<'a> IntoWasmAbi for &'a mut [$t] {
@@ -181,7 +190,9 @@ macro_rules! vectors {
181190

182191
impl<'a> OptionIntoWasmAbi for &'a mut [$t] {
183192
#[inline]
184-
fn none() -> WasmSlice { null_slice() }
193+
fn none() -> WasmSlice {
194+
null_slice()
195+
}
185196
}
186197

187198
impl RefFromWasmAbi for [$t] {
@@ -215,7 +226,7 @@ macro_rules! vectors {
215226
Self::ref_from_abi(js)
216227
}
217228
}
218-
)*)
229+
};
219230
}
220231

221232
vectors! {

src/describe.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use alloc::boxed::Box;
77
use alloc::string::String;
88
use alloc::vec::Vec;
9-
use core::ptr::NonNull;
9+
use core::{mem::MaybeUninit, ptr::NonNull};
1010

1111
use crate::{Clamped, JsError, JsObject, JsValue};
1212
use cfg_if::cfg_if;
@@ -229,6 +229,13 @@ impl<T: WasmDescribe, E: Into<JsValue>> WasmDescribe for Result<T, E> {
229229
}
230230
}
231231

232+
impl<T: WasmDescribe> WasmDescribe for MaybeUninit<T> {
233+
#[cfg_attr(wasm_bindgen_unstable_test_coverage, coverage(off))]
234+
fn describe() {
235+
T::describe();
236+
}
237+
}
238+
232239
impl<T: WasmDescribe> WasmDescribe for Clamped<T> {
233240
#[cfg_attr(wasm_bindgen_unstable_test_coverage, coverage(off))]
234241
fn describe() {

tests/wasm/slice.js

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,30 @@ exports.js_export = () => {
77
i8[1] = 2;
88
assert.deepStrictEqual(wasm.export_i8(i8), i8);
99
assert.deepStrictEqual(wasm.export_optional_i8(i8), i8);
10+
assert.deepStrictEqual(wasm.export_uninit_i8(i8), i8);
11+
assert.deepStrictEqual(wasm.export_optional_uninit_i8(i8), i8);
1012
const u8 = new Uint8Array(2);
1113
u8[0] = 1;
1214
u8[1] = 2;
1315
assert.deepStrictEqual(wasm.export_u8(u8), u8);
1416
assert.deepStrictEqual(wasm.export_optional_u8(u8), u8);
17+
assert.deepStrictEqual(wasm.export_uninit_u8(u8), u8);
18+
assert.deepStrictEqual(wasm.export_optional_uninit_u8(u8), u8);
1519

1620
const i16 = new Int16Array(2);
1721
i16[0] = 1;
1822
i16[1] = 2;
1923
assert.deepStrictEqual(wasm.export_i16(i16), i16);
2024
assert.deepStrictEqual(wasm.export_optional_i16(i16), i16);
25+
assert.deepStrictEqual(wasm.export_uninit_i16(i16), i16);
26+
assert.deepStrictEqual(wasm.export_optional_uninit_i16(i16), i16);
2127
const u16 = new Uint16Array(2);
2228
u16[0] = 1;
2329
u16[1] = 2;
2430
assert.deepStrictEqual(wasm.export_u16(u16), u16);
2531
assert.deepStrictEqual(wasm.export_optional_u16(u16), u16);
32+
assert.deepStrictEqual(wasm.export_uninit_u16(u16), u16);
33+
assert.deepStrictEqual(wasm.export_optional_uninit_u16(u16), u16);
2634

2735
const i32 = new Int32Array(2);
2836
i32[0] = 1;
@@ -31,24 +39,36 @@ exports.js_export = () => {
3139
assert.deepStrictEqual(wasm.export_optional_i32(i32), i32);
3240
assert.deepStrictEqual(wasm.export_isize(i32), i32);
3341
assert.deepStrictEqual(wasm.export_optional_isize(i32), i32);
42+
assert.deepStrictEqual(wasm.export_uninit_i32(i32), i32);
43+
assert.deepStrictEqual(wasm.export_optional_uninit_i32(i32), i32);
44+
assert.deepStrictEqual(wasm.export_uninit_isize(i32), i32);
45+
assert.deepStrictEqual(wasm.export_optional_uninit_isize(i32), i32);
3446
const u32 = new Uint32Array(2);
3547
u32[0] = 1;
3648
u32[1] = 2;
3749
assert.deepStrictEqual(wasm.export_u32(u32), u32);
3850
assert.deepStrictEqual(wasm.export_optional_u32(u32), u32);
3951
assert.deepStrictEqual(wasm.export_usize(u32), u32);
4052
assert.deepStrictEqual(wasm.export_optional_usize(u32), u32);
53+
assert.deepStrictEqual(wasm.export_uninit_u32(u32), u32);
54+
assert.deepStrictEqual(wasm.export_optional_uninit_u32(u32), u32);
55+
assert.deepStrictEqual(wasm.export_uninit_usize(u32), u32);
56+
assert.deepStrictEqual(wasm.export_optional_uninit_usize(u32), u32);
4157

4258
const f32 = new Float32Array(2);
4359
f32[0] = 1;
4460
f32[1] = 2;
4561
assert.deepStrictEqual(wasm.export_f32(f32), f32);
4662
assert.deepStrictEqual(wasm.export_optional_f32(f32), f32);
63+
assert.deepStrictEqual(wasm.export_uninit_f32(f32), f32);
64+
assert.deepStrictEqual(wasm.export_optional_uninit_f32(f32), f32);
4765
const f64 = new Float64Array(2);
4866
f64[0] = 1;
4967
f64[1] = 2;
5068
assert.deepStrictEqual(wasm.export_f64(f64), f64);
5169
assert.deepStrictEqual(wasm.export_optional_f64(f64), f64);
70+
assert.deepStrictEqual(wasm.export_uninit_f64(f64), f64);
71+
assert.deepStrictEqual(wasm.export_optional_uninit_f64(f64), f64);
5272

5373
assert.strictEqual(wasm.export_optional_i8(undefined), undefined);
5474
assert.strictEqual(wasm.export_optional_u8(undefined), undefined);
@@ -60,6 +80,17 @@ exports.js_export = () => {
6080
assert.strictEqual(wasm.export_optional_usize(undefined), undefined);
6181
assert.strictEqual(wasm.export_optional_f32(undefined), undefined);
6282
assert.strictEqual(wasm.export_optional_f64(undefined), undefined);
83+
84+
assert.strictEqual(wasm.export_optional_uninit_i8(undefined), undefined);
85+
assert.strictEqual(wasm.export_optional_uninit_u8(undefined), undefined);
86+
assert.strictEqual(wasm.export_optional_uninit_i16(undefined), undefined);
87+
assert.strictEqual(wasm.export_optional_uninit_u16(undefined), undefined);
88+
assert.strictEqual(wasm.export_optional_uninit_i32(undefined), undefined);
89+
assert.strictEqual(wasm.export_optional_uninit_isize(undefined), undefined);
90+
assert.strictEqual(wasm.export_optional_uninit_u32(undefined), undefined);
91+
assert.strictEqual(wasm.export_optional_uninit_usize(undefined), undefined);
92+
assert.strictEqual(wasm.export_optional_uninit_f32(undefined), undefined);
93+
assert.strictEqual(wasm.export_optional_uninit_f64(undefined), undefined);
6394
};
6495

6596
const test_import = (a, b, c) => {
@@ -84,44 +115,65 @@ exports.import_js_usize = test_import;
84115
exports.import_js_f32 = test_import;
85116
exports.import_js_f64 = test_import;
86117

118+
exports.import_js_uninit_i8 = test_import;
119+
exports.import_js_uninit_u8 = test_import;
120+
exports.import_js_uninit_i16 = test_import;
121+
exports.import_js_uninit_u16 = test_import;
122+
exports.import_js_uninit_i32 = test_import;
123+
exports.import_js_uninit_isize = test_import;
124+
exports.import_js_uninit_u32 = test_import;
125+
exports.import_js_uninit_usize = test_import;
126+
exports.import_js_uninit_f32 = test_import;
127+
exports.import_js_uninit_f64 = test_import;
128+
87129
exports.js_import = () => {
88130
const i8 = new Int8Array(2);
89131
i8[0] = 1;
90132
i8[1] = 2;
91133
assert.deepStrictEqual(wasm.import_rust_i8(i8), i8);
134+
assert.deepStrictEqual(wasm.import_rust_uninit_i8(i8), i8);
92135
const u8 = new Uint8Array(2);
93136
u8[0] = 1;
94137
u8[1] = 2;
95138
assert.deepStrictEqual(wasm.import_rust_u8(u8), u8);
139+
assert.deepStrictEqual(wasm.import_rust_uninit_u8(u8), u8);
96140

97141
const i16 = new Int16Array(2);
98142
i16[0] = 1;
99143
i16[1] = 2;
100144
assert.deepStrictEqual(wasm.import_rust_i16(i16), i16);
145+
assert.deepStrictEqual(wasm.import_rust_uninit_i16(i16), i16);
101146
const u16 = new Uint16Array(2);
102147
u16[0] = 1;
103148
u16[1] = 2;
104149
assert.deepStrictEqual(wasm.import_rust_u16(u16), u16);
150+
assert.deepStrictEqual(wasm.import_rust_uninit_u16(u16), u16);
105151

106152
const i32 = new Int32Array(2);
107153
i32[0] = 1;
108154
i32[1] = 2;
109155
assert.deepStrictEqual(wasm.import_rust_i32(i32), i32);
110156
assert.deepStrictEqual(wasm.import_rust_isize(i32), i32);
157+
assert.deepStrictEqual(wasm.import_rust_uninit_i32(i32), i32);
158+
assert.deepStrictEqual(wasm.import_rust_uninit_isize(i32), i32);
111159
const u32 = new Uint32Array(2);
112160
u32[0] = 1;
113161
u32[1] = 2;
114162
assert.deepStrictEqual(wasm.import_rust_u32(u32), u32);
115163
assert.deepStrictEqual(wasm.import_rust_usize(u32), u32);
164+
assert.deepStrictEqual(wasm.import_rust_uninit_u32(u32), u32);
165+
assert.deepStrictEqual(wasm.import_rust_uninit_usize(u32), u32);
116166

117167
const f32 = new Float32Array(2);
118168
f32[0] = 1;
119169
f32[1] = 2;
120170
assert.deepStrictEqual(wasm.import_rust_f32(f32), f32);
171+
assert.deepStrictEqual(wasm.import_rust_uninit_f32(f32), f32);
121172
const f64 = new Float64Array(2);
122173
f64[0] = 1;
123174
f64[1] = 2;
124175
assert.deepStrictEqual(wasm.import_rust_f64(f64), f64);
176+
assert.deepStrictEqual(wasm.import_rust_uninit_f64(f64), f64);
125177
};
126178

127179
exports.js_pass_array = () => {
@@ -135,6 +187,17 @@ exports.js_pass_array = () => {
135187
wasm.pass_array_rust_usize([1, 2]);
136188
wasm.pass_array_rust_f32([1, 2]);
137189
wasm.pass_array_rust_f64([1, 2]);
190+
191+
wasm.pass_array_rust_uninit_i8([1, 2]);
192+
wasm.pass_array_rust_uninit_u8([1, 2]);
193+
wasm.pass_array_rust_uninit_i16([1, 2]);
194+
wasm.pass_array_rust_uninit_u16([1, 2]);
195+
wasm.pass_array_rust_uninit_i32([1, 2]);
196+
wasm.pass_array_rust_uninit_u32([1, 2]);
197+
wasm.pass_array_rust_uninit_isize([1, 2]);
198+
wasm.pass_array_rust_uninit_usize([1, 2]);
199+
wasm.pass_array_rust_uninit_f32([1, 2]);
200+
wasm.pass_array_rust_uninit_f64([1, 2]);
138201
};
139202

140203
const import_mut_foo = (a, b, c) => {
@@ -163,6 +226,17 @@ exports.import_mut_js_usize = import_mut_foo;
163226
exports.import_mut_js_f32 = import_mut_foo;
164227
exports.import_mut_js_f64 = import_mut_foo;
165228

229+
exports.import_mut_js_uninit_i8 = import_mut_foo;
230+
exports.import_mut_js_uninit_u8 = import_mut_foo;
231+
exports.import_mut_js_uninit_i16 = import_mut_foo;
232+
exports.import_mut_js_uninit_u16 = import_mut_foo;
233+
exports.import_mut_js_uninit_i32 = import_mut_foo;
234+
exports.import_mut_js_uninit_u32 = import_mut_foo;
235+
exports.import_mut_js_uninit_isize = import_mut_foo;
236+
exports.import_mut_js_uninit_usize = import_mut_foo;
237+
exports.import_mut_js_uninit_f32 = import_mut_foo;
238+
exports.import_mut_js_uninit_f64 = import_mut_foo;
239+
166240
const export_mut_run = (a, rust) => {
167241
assert.strictEqual(a.length, 3);
168242
a[0] = 1;
@@ -188,6 +262,17 @@ exports.js_export_mut = () => {
188262
export_mut_run(new Uint32Array(3), wasm.export_mut_usize);
189263
export_mut_run(new Float32Array(3), wasm.export_mut_f32);
190264
export_mut_run(new Float64Array(3), wasm.export_mut_f64);
265+
266+
export_mut_run(new Int8Array(3), wasm.export_mut_uninit_i8);
267+
export_mut_run(new Uint8Array(3), wasm.export_mut_uninit_u8);
268+
export_mut_run(new Int16Array(3), wasm.export_mut_uninit_i16);
269+
export_mut_run(new Uint16Array(3), wasm.export_mut_uninit_u16);
270+
export_mut_run(new Int32Array(3), wasm.export_mut_uninit_i32);
271+
export_mut_run(new Uint32Array(3), wasm.export_mut_uninit_u32);
272+
export_mut_run(new Int32Array(3), wasm.export_mut_uninit_isize);
273+
export_mut_run(new Uint32Array(3), wasm.export_mut_uninit_usize);
274+
export_mut_run(new Float32Array(3), wasm.export_mut_uninit_f32);
275+
export_mut_run(new Float64Array(3), wasm.export_mut_uninit_f64);
191276
};
192277

193278
exports.js_return_vec = () => {

0 commit comments

Comments
 (0)