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