11#![ cfg( arc_try_new) ]
22
3- use wasmtime:: { Config , Engine , Func , Result , Store } ;
3+ use wasmtime:: { Config , Engine , Func , FuncType , Linker , Module , Result , Store , Val , ValType } ;
44use wasmtime_fuzzing:: oom:: OomTest ;
55
66#[ test]
@@ -16,3 +16,99 @@ fn func_new() -> Result<()> {
1616 Ok ( ( ) )
1717 } )
1818}
19+
20+ #[ test]
21+ fn func_new_with_type ( ) -> Result < ( ) > {
22+ let mut config = Config :: new ( ) ;
23+ config. enable_compiler ( false ) ;
24+ config. concurrency_support ( false ) ;
25+ let engine = Engine :: new ( & config) ?;
26+
27+ OomTest :: new ( ) . test ( || {
28+ let mut store = Store :: try_new ( & engine, ( ) ) ?;
29+ let ty = FuncType :: try_new ( & engine, [ ValType :: I32 ] , [ ValType :: I32 ] ) ?;
30+ let _func = Func :: try_new ( & mut store, ty, |_caller, params, results| {
31+ results[ 0 ] = params[ 0 ] . clone ( ) ;
32+ Ok ( ( ) )
33+ } ) ?;
34+ Ok ( ( ) )
35+ } )
36+ }
37+
38+ #[ test]
39+ fn func_call ( ) -> Result < ( ) > {
40+ let module_bytes = {
41+ let mut config = Config :: new ( ) ;
42+ config. concurrency_support ( false ) ;
43+ let engine = Engine :: new ( & config) ?;
44+ Module :: new (
45+ & engine,
46+ r#"(module (func (export "id") (param i32) (result i32) (local.get 0)))"# ,
47+ ) ?
48+ . serialize ( ) ?
49+ } ;
50+ let mut config = Config :: new ( ) ;
51+ config. enable_compiler ( false ) ;
52+ config. concurrency_support ( false ) ;
53+ let engine = Engine :: new ( & config) ?;
54+ let module = unsafe { Module :: deserialize ( & engine, & module_bytes) ? } ;
55+ let linker = Linker :: < ( ) > :: new ( & engine) ;
56+ let instance_pre = linker. instantiate_pre ( & module) ?;
57+
58+ OomTest :: new ( ) . test ( || {
59+ let mut store = Store :: try_new ( & engine, ( ) ) ?;
60+ let instance = instance_pre. instantiate ( & mut store) ?;
61+ let id = instance. get_func ( & mut store, "id" ) . unwrap ( ) ;
62+ let mut results = [ Val :: I32 ( 0 ) ] ;
63+ id. call ( & mut store, & [ Val :: I32 ( 42 ) ] , & mut results) ?;
64+ assert_eq ! ( results[ 0 ] . unwrap_i32( ) , 42 ) ;
65+ Ok ( ( ) )
66+ } )
67+ }
68+
69+ #[ test]
70+ fn func_typed ( ) -> Result < ( ) > {
71+ let module_bytes = {
72+ let mut config = Config :: new ( ) ;
73+ config. concurrency_support ( false ) ;
74+ let engine = Engine :: new ( & config) ?;
75+ Module :: new (
76+ & engine,
77+ r#"(module (func (export "id") (param i32) (result i32) (local.get 0)))"# ,
78+ ) ?
79+ . serialize ( ) ?
80+ } ;
81+ let mut config = Config :: new ( ) ;
82+ config. enable_compiler ( false ) ;
83+ config. concurrency_support ( false ) ;
84+ let engine = Engine :: new ( & config) ?;
85+ let module = unsafe { Module :: deserialize ( & engine, & module_bytes) ? } ;
86+ let linker = Linker :: < ( ) > :: new ( & engine) ;
87+ let instance_pre = linker. instantiate_pre ( & module) ?;
88+
89+ OomTest :: new ( ) . test ( || {
90+ let mut store = Store :: try_new ( & engine, ( ) ) ?;
91+ let instance = instance_pre. instantiate ( & mut store) ?;
92+ let id = instance. get_typed_func :: < i32 , i32 > ( & mut store, "id" ) ?;
93+ let result = id. call ( & mut store, 42 ) ?;
94+ assert_eq ! ( result, 42 ) ;
95+ Ok ( ( ) )
96+ } )
97+ }
98+
99+ #[ test]
100+ fn func_ty ( ) -> Result < ( ) > {
101+ let mut config = Config :: new ( ) ;
102+ config. enable_compiler ( false ) ;
103+ config. concurrency_support ( false ) ;
104+ let engine = Engine :: new ( & config) ?;
105+
106+ OomTest :: new ( ) . test ( || {
107+ let mut store = Store :: try_new ( & engine, ( ) ) ?;
108+ let func = Func :: try_wrap ( & mut store, |x : i32 | x * 2 ) ?;
109+ let ty = func. ty ( & store) ;
110+ assert_eq ! ( ty. params( ) . len( ) , 1 ) ;
111+ assert_eq ! ( ty. results( ) . len( ) , 1 ) ;
112+ Ok ( ( ) )
113+ } )
114+ }
0 commit comments