1 #include <fstream> 2 #include <iostream> 3 #include <sstream> 4 #include <wasmtime.hh> 5 6 using namespace wasmtime; 7 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 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 store.context().gc(); 54 } 55