Improve ExternRef API testing

This commit is contained in:
Mark McCaskey
2021-02-17 09:07:48 -08:00
parent 15c3fe6c38
commit 03edab2479
2 changed files with 29 additions and 10 deletions

View File

@@ -1,7 +1,7 @@
use crate::FromToNativeWasmType;
use std::any::Any; use std::any::Any;
use std::marker::PhantomData; use std::marker::PhantomData;
use wasmer_vm::VMExternRef; use wasmer_vm::VMExternRef;
use crate::FromToNativeWasmType;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
#[repr(transparent)] #[repr(transparent)]
@@ -43,7 +43,8 @@ where
} }
unsafe impl<T> FromToNativeWasmType for ExternRef<T> unsafe impl<T> FromToNativeWasmType for ExternRef<T>
where T: Any + Send + Sync + 'static + Sized, where
T: Any + Send + Sync + 'static + Sized,
{ {
type Native = VMExternRef; type Native = VMExternRef;

View File

@@ -57,13 +57,19 @@ fn func_ref_passed_and_returned() -> Result<()> {
fn extern_ref_passed_and_returned() -> Result<()> { fn extern_ref_passed_and_returned() -> Result<()> {
let store = Store::default(); let store = Store::default();
let wat = r#"(module let wat = r#"(module
(import "env" "extern_ref_identity" (func (param externref) (result externref))) (func $extern_ref_identity (import "env" "extern_ref_identity") (param externref) (result externref))
(func $extern_ref_identity_native (import "env" "extern_ref_identity_native") (param externref) (result externref))
(func $get_new_extern_ref (import "env" "get_new_extern_ref") (result externref)) (func $get_new_extern_ref (import "env" "get_new_extern_ref") (result externref))
(func $get_new_extern_ref_native (import "env" "get_new_extern_ref_native") (result externref))
(func (export "run") (param) (result externref) (func (export "run") (param) (result externref)
(call 0 (ref.null extern))) (call $extern_ref_identity (ref.null extern)))
(func (export "run_native") (param) (result externref)
(call $extern_ref_identity_native (ref.null extern)))
(func (export "get_hashmap") (param) (result externref) (func (export "get_hashmap") (param) (result externref)
(call $get_new_extern_ref)) (call $get_new_extern_ref))
(func (export "get_hashmap_native") (param) (result externref)
(call $get_new_extern_ref_native))
)"#; )"#;
let module = Module::new(&store, wat)?; let module = Module::new(&store, wat)?;
let imports = imports! { let imports = imports! {
@@ -71,6 +77,9 @@ fn extern_ref_passed_and_returned() -> Result<()> {
"extern_ref_identity" => Function::new(&store, FunctionType::new([Type::ExternRef], [Type::ExternRef]), |values| -> Result<Vec<_>, _> { "extern_ref_identity" => Function::new(&store, FunctionType::new([Type::ExternRef], [Type::ExternRef]), |values| -> Result<Vec<_>, _> {
Ok(vec![values[0].clone()]) Ok(vec![values[0].clone()])
}), }),
"extern_ref_identity_native" => Function::new_native(&store, |er: ExternRef<usize>| -> ExternRef<usize> {
er
}),
"get_new_extern_ref" => Function::new(&store, FunctionType::new([], [Type::ExternRef]), |_| -> Result<Vec<_>, _> { "get_new_extern_ref" => Function::new(&store, FunctionType::new([], [Type::ExternRef]), |_| -> Result<Vec<_>, _> {
let inner = let inner =
[("hello".to_string(), "world".to_string()), [("hello".to_string(), "world".to_string()),
@@ -80,13 +89,22 @@ fn extern_ref_passed_and_returned() -> Result<()> {
.collect::<HashMap<String, String>>(); .collect::<HashMap<String, String>>();
let new_extern_ref = VMExternRef::new(inner); let new_extern_ref = VMExternRef::new(inner);
Ok(vec![Value::ExternRef(new_extern_ref)]) Ok(vec![Value::ExternRef(new_extern_ref)])
}),
"get_new_extern_ref_native" => Function::new_native(&store, || -> ExternRef<HashMap<String, String>> {
let inner =
[("hello".to_string(), "world".to_string()),
("color".to_string(), "orange".to_string())]
.iter()
.cloned()
.collect::<HashMap<String, String>>();
ExternRef::new(inner)
}) })
}, },
}; };
let instance = Instance::new(&module, &imports)?; let instance = Instance::new(&module, &imports)?;
{ for run in &["run", "run_native"] {
let f: &Function = instance.exports.get_function("run")?; let f: &Function = instance.exports.get_function(run)?;
let results = f.call(&[]).unwrap(); let results = f.call(&[]).unwrap();
if let Value::ExternRef(er) = results[0] { if let Value::ExternRef(er) = results[0] {
assert!(er.is_null()); assert!(er.is_null());
@@ -94,13 +112,13 @@ fn extern_ref_passed_and_returned() -> Result<()> {
panic!("result is not an extern ref!"); panic!("result is not an extern ref!");
} }
let f: NativeFunc<(), ExternRef<usize>> = instance.exports.get_native_function("run")?; let f: NativeFunc<(), ExternRef<usize>> = instance.exports.get_native_function(run)?;
let result: ExternRef<usize> = f.call()?; let result: ExternRef<usize> = f.call()?;
assert!(result.is_null()); assert!(result.is_null());
} }
{ for get_hashmap in &["get_hashmap", "get_hashmap_native"] {
let f: &Function = instance.exports.get_function("get_hashmap")?; let f: &Function = instance.exports.get_function(get_hashmap)?;
let results = f.call(&[]).unwrap(); let results = f.call(&[]).unwrap();
if let Value::ExternRef(er) = results[0] { if let Value::ExternRef(er) = results[0] {
let inner: &HashMap<String, String> = er.downcast().unwrap(); let inner: &HashMap<String, String> = er.downcast().unwrap();
@@ -111,7 +129,7 @@ fn extern_ref_passed_and_returned() -> Result<()> {
} }
let f: NativeFunc<(), ExternRef<HashMap<String, String>>> = let f: NativeFunc<(), ExternRef<HashMap<String, String>>> =
instance.exports.get_native_function("get_hashmap")?; instance.exports.get_native_function(get_hashmap)?;
let result: ExternRef<HashMap<String, String>> = f.call()?; let result: ExternRef<HashMap<String, String>> = f.call()?;
let inner: &HashMap<String, String> = result.downcast().unwrap(); let inner: &HashMap<String, String> = result.downcast().unwrap();