xref: /wasmtime-44.0.1/examples/serialize.cc (revision eaa01d7b)
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 
readFile(const char * name)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 
serialize()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 
deserialize(std::vector<uint8_t> buffer)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 
main()73 int main() {
74   auto buffer = serialize();
75   deserialize(buffer);
76   return 0;
77 }
78