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