xref: /wasmtime-44.0.1/examples/serialize.cc (revision eaa01d7b)
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 Schneidereit std::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 Schneidereit std::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 Schneidereit void 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 Schneidereit int main() {
74*eaa01d7bSTill Schneidereit   auto buffer = serialize();
75*eaa01d7bSTill Schneidereit   deserialize(buffer);
76*eaa01d7bSTill Schneidereit   return 0;
77*eaa01d7bSTill Schneidereit }
78