xref: /wasmtime-44.0.1/examples/externref.cc (revision b34556f9)
1 #include <fstream>
2 #include <iostream>
3 #include <sstream>
4 #include <wasmtime.hh>
5 
6 using namespace wasmtime;
7 
readFile(const char * name)8 std::string readFile(const char *name) {
9   std::ifstream watFile;
10   watFile.open(name);
11   std::stringstream strStream;
12   strStream << watFile.rdbuf();
13   return strStream.str();
14 }
15 
main()16 int main() {
17   std::cout << "Initializing...\n";
18   Engine engine;
19   Store store(engine);
20 
21   std::cout << "Compiling module...\n";
22   auto wat = readFile("examples/externref.wat");
23   Module module = Module::compile(engine, wat).unwrap();
24   std::cout << "Instantiating module...\n";
25   Instance instance = Instance::create(store, module, {}).unwrap();
26 
27   ExternRef externref(store, std::string("Hello, world!"));
28   std::any &data = externref.data(store);
29   std::cout << "externref data: " << std::any_cast<std::string>(data) << "\n";
30 
31   std::cout << "Touching `externref` table..\n";
32   Table table = std::get<Table>(*instance.get(store, "table"));
33   table.set(store, 3, externref).unwrap();
34   ExternRef val = *table.get(store, 3)->externref();
35   std::cout << "externref data: " << std::any_cast<std::string>(val.data(store))
36             << "\n";
37 
38   std::cout << "Touching `externref` global..\n";
39   Global global = std::get<Global>(*instance.get(store, "global"));
40   global.set(store, externref).unwrap();
41   val = *global.get(store).externref();
42   std::cout << "externref data: " << std::any_cast<std::string>(val.data(store))
43             << "\n";
44 
45   std::cout << "Calling `externref` func..\n";
46   Func func = std::get<Func>(*instance.get(store, "func"));
47   auto results = func.call(store, {externref}).unwrap();
48   val = *results[0].externref();
49   std::cout << "externref data: " << std::any_cast<std::string>(val.data(store))
50             << "\n";
51 
52   std::cout << "Running a gc..\n";
53   if (!store.context().gc()) {
54     std::cerr << "> Error while collecting garbage\n";
55     return 1;
56   }
57 
58   return 0;
59 }
60