1 /* 2 Small example of how to serialize compiled wasm module to the disk, 3 and then instantiate it from the compilation artifacts. 4 5 You can build the example using CMake: 6 7 mkdir build && (cd build && cmake .. && \ 8 cmake --build . --target wasmtime-serialize-cpp) 9 10 And then run it: 11 12 build/wasmtime-serialize-cpp 13 */ 14 15 #include <fstream> 16 #include <iostream> 17 #include <sstream> 18 #include <vector> 19 #include <wasmtime.hh> 20 21 using namespace wasmtime; 22 23 std::string readFile(const char *name) { 24 std::ifstream watFile; 25 watFile.open(name); 26 std::stringstream strStream; 27 strStream << watFile.rdbuf(); 28 return strStream.str(); 29 } 30 31 std::vector<uint8_t> serialize() { 32 std::cout << "Initializing...\n"; 33 Engine engine; 34 35 std::cout << "Compiling module...\n"; 36 auto wat = readFile("examples/hello.wat"); 37 Module module = Module::compile(engine, wat).unwrap(); 38 39 auto serialized = module.serialize().unwrap(); 40 41 std::cout << "Serialized.\n"; 42 return serialized; 43 } 44 45 void deserialize(std::vector<uint8_t> buffer) { 46 std::cout << "Initializing...\n"; 47 Engine engine; 48 Store store(engine); 49 50 std::cout << "Deserialize module...\n"; 51 Module module = 52 Module::deserialize(engine, Span<uint8_t>(buffer.data(), buffer.size())) 53 .unwrap(); 54 55 std::cout << "Creating callback...\n"; 56 Func hello_func = Func::wrap(store, []() { 57 std::cout << "Calling back...\n"; 58 std::cout << "> Hello World!\n"; 59 }); 60 61 std::cout << "Instantiating module...\n"; 62 Instance instance = Instance::create(store, module, {hello_func}).unwrap(); 63 64 std::cout << "Extracting export...\n"; 65 Func run = std::get<Func>(*instance.get(store, "run")); 66 67 std::cout << "Calling export...\n"; 68 run.call(store, {}).unwrap(); 69 70 std::cout << "Done.\n"; 71 } 72 73 int main() { 74 auto buffer = serialize(); 75 deserialize(buffer); 76 return 0; 77 } 78