11 void wasm_val_print(wasm_val_t val) {
14 printf("%" PRIu32, val.of.i32);
17 printf("%" PRIu64, val.of.i64);
20 printf("%f", val.of.f32);
23 printf("%g", val.of.f64);
27 if (val.of.ref == NULL) {
30 printf("ref(%p)", val.of.ref);
36 // A function to be called from Wasm code.
37 own wasm_trap_t* print_callback(
38 const wasm_val_t args[], wasm_val_t results[]
40 printf("Calling back...\n> ");
41 wasm_val_print(args[0]);
44 wasm_val_copy(&results[0], &args[0]);
49 // A function closure.
50 own wasm_trap_t* closure_callback(
51 void* env, const wasm_val_t args[], wasm_val_t results[]
54 printf("Calling back closure...\n");
57 results[0].kind = WASM_I32;
58 results[0].of.i32 = (int32_t)i;
63 int main(int argc, const char* argv[]) {
65 printf("Initializing...\n");
66 wasm_engine_t* engine = wasm_engine_new();
67 wasm_store_t* store = wasm_store_new(engine);
70 printf("Loading binary...\n");
71 FILE* file = fopen("callback.wasm", "r");
73 printf("> Error loading module!\n");
76 fseek(file, 0L, SEEK_END);
77 size_t file_size = ftell(file);
78 fseek(file, 0L, SEEK_SET);
79 wasm_byte_vec_t binary;
80 wasm_byte_vec_new_uninitialized(&binary, file_size);
81 if (fread(binary.data, file_size, 1, file) != 1) {
82 printf("> Error loading module!\n");
88 printf("Compiling module...\n");
89 own wasm_module_t* module = wasm_module_new(store, &binary);
91 printf("> Error compiling module!\n");
95 wasm_byte_vec_delete(&binary);
97 // Create external print functions.
98 printf("Creating callback...\n");
99 own wasm_functype_t* print_type = wasm_functype_new_1_1(wasm_valtype_new_i32(), wasm_valtype_new_i32());
100 own wasm_func_t* print_func = wasm_func_new(store, print_type, print_callback);
103 own wasm_functype_t* closure_type = wasm_functype_new_0_1(wasm_valtype_new_i32());
104 own wasm_func_t* closure_func = wasm_func_new_with_env(store, closure_type, closure_callback, &i, NULL);
106 wasm_functype_delete(print_type);
107 wasm_functype_delete(closure_type);
110 printf("Instantiating module...\n");
111 const wasm_extern_t* imports[] = {
112 wasm_func_as_extern(print_func), wasm_func_as_extern(closure_func)
114 own wasm_instance_t* instance =
115 wasm_instance_new(store, module, imports, NULL);
117 printf("> Error instantiating module!\n");
121 wasm_func_delete(print_func);
122 wasm_func_delete(closure_func);
125 printf("Extracting export...\n");
126 own wasm_extern_vec_t exports;
127 wasm_instance_exports(instance, &exports);
128 if (exports.size == 0) {
129 printf("> Error accessing exports!\n");
132 const wasm_func_t* run_func = wasm_extern_as_func(exports.data[0]);
133 if (run_func == NULL) {
134 printf("> Error accessing export!\n");
138 wasm_module_delete(module);
139 wasm_instance_delete(instance);
142 printf("Calling export...\n");
144 args[0].kind = WASM_I32;
146 args[1].kind = WASM_I32;
148 wasm_val_t results[1];
149 if (wasm_func_call(run_func, args, results)) {
150 printf("> Error calling function!\n");
154 wasm_extern_vec_delete(&exports);
157 printf("Printing result...\n");
158 printf("> %u\n", results[0].of.i32);
161 printf("Shutting down...\n");
162 wasm_store_delete(store);
163 wasm_engine_delete(engine);