@@ -51,14 +51,78 @@ std::pair<void *, size_t> convert(void *dest, uint32_t dest_byte_len, const void
5151 assert (false );
5252}
5353
54- int main ()
54+ std::vector<wasm_val_t > toWamr (const WasmValVector &values)
55+ {
56+ std::vector<wasm_val_t > result (values.size ());
57+ for (size_t i = 0 ; i < values.size (); i++)
58+ {
59+ switch (values[i].index ())
60+ {
61+ case WASM_I32:
62+ result[i].kind = WASM_I32;
63+ result[i].of .i32 = std::get<int32_t >(values[i]);
64+ break ;
65+ case WASM_I64:
66+ result[i].kind = WASM_I64;
67+ result[i].of .i64 = std::get<int64_t >(values[i]);
68+ break ;
69+ case WASM_F32:
70+ result[i].kind = WASM_F32;
71+ result[i].of .f32 = std::get<float >(values[i]);
72+ break ;
73+ case WASM_F64:
74+ result[i].kind = WASM_F64;
75+ result[i].of .f64 = std::get<double >(values[i]);
76+ break ;
77+ default :
78+ assert (false );
79+ }
80+ }
81+ return result;
82+ }
83+
84+ template <typename T>
85+ WasmValVector fromWamr (size_t count, const wasm_val_t *values)
5586{
56- std::cout << " Hello, World!" << std::endl;
87+ auto size = ValTrait<T>::size;
88+ auto alignment = ValTrait<T>::alignment;
89+ auto target_count = ValTrait<T>::flat_types.size ();
5790
91+ WasmValVector result (count);
92+ for (size_t i = 0 ; i < count; i++)
93+ {
94+ switch (values[i].kind )
95+ {
96+ case WASM_I32:
97+ result[i] = values[i].of .i32 ;
98+ break ;
99+ case WASM_I64:
100+ result[i] = values[i].of .i64 ;
101+ break ;
102+ case WASM_F32:
103+ result[i] = values[i].of .f32 ;
104+ break ;
105+ case WASM_F64:
106+ result[i] = values[i].of .f64 ;
107+ break ;
108+ default :
109+ std::cout << " values[i].kind: " << values[i].kind << std::endl;
110+ assert (false );
111+ }
112+ }
113+ // for (size_t i = count; i < target_count; i++)
114+ // {
115+ // result[i] = (int32_t)(std::get<int32_t>(result[count - 1]) + (i * alignment));
116+ // }
117+ return result;
118+ }
119+
120+ int main ()
121+ {
58122 char *buffer, error_buf[128 ];
59123 wasm_module_t module ;
60124 wasm_module_inst_t module_inst;
61- wasm_function_inst_t cabi_realloc, func ;
125+ wasm_function_inst_t cabi_realloc;
62126 wasm_exec_env_t exec_env;
63127 uint32_t size, stack_size = 8092 , heap_size = 8092 ;
64128
@@ -104,19 +168,101 @@ int main()
104168 .post_return = nullptr ,
105169 };
106170
107- func = wasm_runtime_lookup_function (module_inst, " example:sample/boolean#and" );
171+ using and_func_t = std::function<bool_t (bool_t , bool_t )>;
172+ auto and_func = wasm_runtime_lookup_function (module_inst, " example:sample/booleans#and" );
173+ and_func_t call_and = [&](bool_t a, bool_t b) -> bool_t
174+ {
175+ using inputs_t = ValTrait<and_func_t >::params_t ;
176+ using outputs_t = ValTrait<and_func_t >::result_t ;
177+ auto inputs = toWamr (lower_flat (callContext, inputs_t {a, b}));
178+ auto output_size = 1 ;
179+ wasm_val_t outputs[output_size];
180+ auto call_result = wasm_runtime_call_wasm_a (exec_env, and_func, output_size, outputs, inputs.size (), inputs.data ());
181+ auto result = lift_flat<outputs_t >(callContext, fromWamr<outputs_t >(output_size, outputs));
182+ std::cout << " and_func(" << a << " , " << b << " ): " << result << std::endl;
183+ return result;
184+ };
185+ call_and (false , false );
186+ call_and (false , true );
187+ call_and (true , false );
188+ call_and (true , true );
189+
190+ using add_func_t = std::function<float64_t (float64_t , float64_t )>;
191+ auto add_func = wasm_runtime_lookup_function (module_inst, " example:sample/floats#add" );
192+ add_func_t call_add = [&](float64_t input1, float64_t input2) -> float64_t
193+ {
194+ using inputs_t = ValTrait<add_func_t >::params_t ;
195+ using outputs_t = ValTrait<add_func_t >::result_t ;
196+
197+ auto inputs = toWamr (lower_flat (callContext, inputs_t {input1, input2}));
198+ auto output_size = 1 ;
199+ wasm_val_t outputs[output_size];
200+ auto call_result = wasm_runtime_call_wasm_a (exec_env, add_func, output_size, outputs, inputs.size (), inputs.data ());
201+ auto result = lift_flat<outputs_t >(callContext, fromWamr<outputs_t >(output_size, outputs));
202+ std::cout << " add_func(" << input1 << " , " << input2 << " ): " << result << std::endl;
203+ return result;
204+ };
205+ call_add (3.1 , 0.2 );
206+
207+ using reverse_func_t = std::function<string_t (string_t )>;
208+ auto reverse_func = wasm_runtime_lookup_function (module_inst, " example:sample/strings#reverse" );
209+ auto reverse_cleanup_func = wasm_runtime_lookup_function (module_inst, " cabi_post_example:sample/strings#reverse" );
210+ reverse_func_t call_reverse = [&](string_t input1) -> string_t
211+ {
212+ using inputs_t = ValTrait<reverse_func_t >::params_t ;
213+ using outputs_t = ValTrait<reverse_func_t >::result_t ;
108214
109- // bool_t arg1 = true;
110- // bool_t arg2 = false;
111- // auto args_flat = cmcpp::lower_flat(callContext, args);
112- uint32_t argv[2 ] = {true , false };
215+ auto inputs = toWamr (lower_flat (callContext, inputs_t {input1}));
216+ auto output_size = 1 ;
217+ wasm_val_t outputs[output_size];
218+ auto call_result = wasm_runtime_call_wasm_a (exec_env, reverse_func, output_size, outputs, inputs.size (), inputs.data ());
219+ // auto result = load<outputs_t>(callContext, outputs[0].of.i32);
220+ auto result = lift_flat<outputs_t >(callContext, fromWamr<outputs_t >(output_size, outputs));
221+ std::cout << " reverse_string(" << input1 << " ): " << result << std::endl;
222+ call_result = wasm_runtime_call_wasm_a (exec_env, reverse_cleanup_func, 0 , nullptr , 1 , outputs);
223+ return result;
224+ };
225+ auto call_reverse_result = call_reverse (" Hello World!" );
226+ call_reverse (call_reverse_result);
227+
228+ using reverse_tuple_func_t = std::function<tuple_t <string_t , bool_t >(tuple_t <bool_t , string_t >)>;
229+ auto reverse_tuple_func = wasm_runtime_lookup_function (module_inst, " example:sample/tuples#reverse" );
230+ auto reverse_tuple_cleanup_func = wasm_runtime_lookup_function (module_inst, " cabi_post_example:sample/tuples#reverse" );
231+ reverse_tuple_func_t call_reverse_tuple = [&](tuple_t <bool_t , string_t > a) -> tuple_t <string_t , bool_t >
232+ {
233+ using inputs_t = ValTrait<reverse_tuple_func_t >::params_t ;
234+ using outputs_t = ValTrait<reverse_tuple_func_t >::result_t ;
235+
236+ auto inputs = toWamr (lower_flat (callContext, a));
237+ auto output_size = 1 ;
238+ wasm_val_t outputs[output_size];
239+ auto call_result = wasm_runtime_call_wasm_a (exec_env, reverse_tuple_func, output_size, outputs, inputs.size (), inputs.data ());
240+ auto result = load<outputs_t >(callContext, outputs->of .i32 );
241+ std::cout << " reverse_tuple(" << std::get<0 >(a) << " , " << std::get<1 >(a) << " ): " << std::get<0 >(result) << " , " << std::get<1 >(result) << std::endl;
242+ call_result = wasm_runtime_call_wasm_a (exec_env, reverse_tuple_cleanup_func, 0 , nullptr , 1 , outputs);
243+ return result;
244+ };
245+ auto call_reverse_tuple_result = call_reverse_tuple ({false , " Hello World!" });
246+ // call_reverse_tuple({std::get<1>(call_reverse_tuple_result), std::get<0>(call_reverse_tuple_result}));
247+
248+ using list_filter_bool_func_t = std::function<list_t <string_t >(list_t <variant_t <bool_t , string_t >>)>;
249+ auto list_filter_bool_func = wasm_runtime_lookup_function (module_inst, " example:sample/lists#filter-bool" );
250+ auto list_filter_bool_cleanup_func = wasm_runtime_lookup_function (module_inst, " cabi_post_example:sample/lists#filter-bool" );
251+ auto call_list_filter_bool = [&](list_t <variant_t <bool_t , string_t >> a) -> list_t <string_t >
252+ {
253+ using inputs_t = ValTrait<list_filter_bool_func_t >::params_t ;
254+ using outputs_t = ValTrait<list_filter_bool_func_t >::result_t ;
113255
114- list_t <variant_t <bool_t >> args = {true , false };
115- auto args_flat = cmcpp::lower_flat (callContext, args);
116- auto call_result = wasm_runtime_call_wasm (exec_env, func, 2 , (uint32_t *)args_flat.data ());
117- args_flat.resize (1 );
118- auto result = cmcpp::lift_flat<bool_t >(callContext, args_flat);
119- std::cout << " Result: " << result << std::endl;
256+ auto inputs = toWamr (lower_flat (callContext, a));
257+ auto output_size = 1 ;
258+ wasm_val_t outputs[output_size];
259+ auto call_result = wasm_runtime_call_wasm_a (exec_env, list_filter_bool_func, output_size, outputs, inputs.size (), inputs.data ());
260+ auto result = lift_flat<outputs_t >(callContext, fromWamr<outputs_t >(output_size, outputs));
261+ std::cout << " list_filter_bool(" << a.size () << " ): " << result.size () << std::endl;
262+ call_result = wasm_runtime_call_wasm_a (exec_env, list_filter_bool_cleanup_func, 0 , nullptr , 1 , outputs);
263+ return result;
264+ };
265+ auto call_list_filter_bool_result = call_list_filter_bool ({{false }, {" Hello World!" }});
120266
121267 wasm_runtime_destroy_exec_env (exec_env);
122268 wasm_runtime_deinstantiate (module_inst);
0 commit comments