1 /* 2 Example of instantiating of the WebAssembly module and invoking its exported 3 function. 4 5 You can build the example using CMake: 6 7 mkdir build && (cd build && cmake .. && \ 8 cmake --build . --target wasmtime-multi-cpp) 9 10 And then run it: 11 12 build/wasmtime-multi-cpp 13 */ 14 15 #include <fstream> 16 #include <iostream> 17 #include <sstream> 18 #include <wasmtime.hh> 19 20 using namespace wasmtime; 21 22 std::string readFile(const char *name) { 23 std::ifstream watFile; 24 watFile.open(name); 25 std::stringstream strStream; 26 strStream << watFile.rdbuf(); 27 return strStream.str(); 28 } 29 30 int main() { 31 std::cout << "Initializing...\n"; 32 Engine engine; 33 Store store(engine); 34 35 std::cout << "Compiling module...\n"; 36 auto wat = readFile("examples/multi.wat"); 37 Module module = Module::compile(engine, wat).unwrap(); 38 39 std::cout << "Creating callback...\n"; 40 Func callback_func = Func::wrap( 41 store, [](int32_t a, int64_t b) -> std::tuple<int64_t, int32_t> { 42 // Rust example adds 1 to each argument but flips order. 43 return std::make_tuple(b + 1, a + 1); 44 }); 45 46 std::cout << "Instantiating module...\n"; 47 Instance instance = Instance::create(store, module, {callback_func}).unwrap(); 48 49 std::cout << "Extracting export...\n"; 50 Func g = std::get<Func>(*instance.get(store, "g")); 51 52 std::cout << "Calling export \"g\"...\n"; 53 // Provide (i32=1, i64=3) like the Rust example 54 auto results = g.call(store, {Val(int32_t(1)), Val(int64_t(3))}).unwrap(); 55 56 std::cout << "Printing result...\n"; 57 std::cout << "> " << results[0].i64() << " " << results[1].i32() << "\n"; 58 59 std::cout << "Calling export \"round_trip_many\"...\n"; 60 Func round_trip_many = 61 std::get<Func>(*instance.get(store, "round_trip_many")); 62 auto many_results = 63 round_trip_many 64 .call(store, {Val(int64_t(0)), Val(int64_t(1)), Val(int64_t(2)), 65 Val(int64_t(3)), Val(int64_t(4)), Val(int64_t(5)), 66 Val(int64_t(6)), Val(int64_t(7)), Val(int64_t(8)), 67 Val(int64_t(9))}) 68 .unwrap(); 69 std::cout << "Printing result...\n"; 70 std::cout << "> ("; 71 for (size_t i = 0; i < many_results.size(); i++) { 72 if (i) 73 std::cout << ", "; 74 std::cout << many_results[i].i64(); 75 } 76 std::cout << ")\n"; 77 return 0; 78 } 79