Skip to content

Commit a947536

Browse files
bors[bot]YaronWittensteinsyrusakbary
authored
Merge #865
865: adding tests for `state_creator` of `import_object` r=syrusakbary a=YaronWittenstein Part of the PR #807 changes was adding support for shared import objects between threads. https://github.com/wasmerio/wasmer/pull/807/files#diff-d20cb4c5a883566b85be4cc046f45aa9R49 I've added tests/examples on how to create an `import object` with a state_creator (function or closure) Co-authored-by: Yaron Wittenstein <yaron.wittenstein@gmail.com> Co-authored-by: Syrus Akbary <me@syrusakbary.com>
2 parents 3639ef6 + 0015e84 commit a947536

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed

lib/runtime-core/src/import.rs

+48
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,54 @@ mod test {
273273
use crate::export::Export;
274274
use crate::global::Global;
275275
use crate::types::Value;
276+
use std::ffi::c_void;
277+
use std::sync::Arc;
278+
279+
struct Data {
280+
inner: *const u32,
281+
}
282+
283+
unsafe impl Send for Data {}
284+
unsafe impl Sync for Data {}
285+
286+
fn dummy_state_creator(data: Arc<Data>) -> (*mut c_void, fn(*mut c_void)) {
287+
let data: *mut Data = Arc::into_raw(data) as _;
288+
289+
(data as _, |_| {})
290+
}
291+
292+
#[test]
293+
fn state_creator_fn() {
294+
let ptr = &0xAABBCCDDu32 as *const u32;
295+
let data = Arc::new(Data { inner: ptr });
296+
297+
let imports = imports! {
298+
move || dummy_state_creator(Arc::clone(&data)),
299+
};
300+
301+
let (state, _dtor) = imports.call_state_creator().unwrap();
302+
let data: &mut Data = unsafe { &mut *(state as *mut Data) };
303+
304+
assert_eq!(ptr, data.inner);
305+
}
306+
307+
#[test]
308+
fn state_creator_closure() {
309+
let ptr = &0xAABBCCDDu32 as *const u32;
310+
let data = Arc::new(Data { inner: ptr });
311+
312+
let imports = imports! {
313+
move || {
314+
let data: *mut Data = Arc::into_raw(Arc::clone(&data)) as _;
315+
(data as _, |_| {})
316+
},
317+
};
318+
319+
let (state, _dtor) = imports.call_state_creator().unwrap();
320+
let data: &mut Data = unsafe { &mut *(state as *mut Data) };
321+
322+
assert_eq!(ptr, data.inner);
323+
}
276324

277325
#[test]
278326
fn extending_works() {

0 commit comments

Comments
 (0)