| 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 | if (!store.context().gc()) { |
| 54 | std::cerr << "> Error while collecting garbage\n"; |
| 55 | return 1; |
| 56 | } |
| 57 | |
| 58 | return 0; |
| 59 | } |