mirror of
https://github.com/mii443/wasmer.git
synced 2025-12-10 14:48:27 +00:00
Improve ExternRef API testing
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user