xref: /wasmtime-44.0.1/examples/externref.cc (revision b34556f9)
113ebd6f5SMangoPeachGrape #include <fstream>
213ebd6f5SMangoPeachGrape #include <iostream>
313ebd6f5SMangoPeachGrape #include <sstream>
413ebd6f5SMangoPeachGrape #include <wasmtime.hh>
513ebd6f5SMangoPeachGrape 
613ebd6f5SMangoPeachGrape using namespace wasmtime;
713ebd6f5SMangoPeachGrape 
readFile(const char * name)813ebd6f5SMangoPeachGrape std::string readFile(const char *name) {
913ebd6f5SMangoPeachGrape   std::ifstream watFile;
1013ebd6f5SMangoPeachGrape   watFile.open(name);
1113ebd6f5SMangoPeachGrape   std::stringstream strStream;
1213ebd6f5SMangoPeachGrape   strStream << watFile.rdbuf();
1313ebd6f5SMangoPeachGrape   return strStream.str();
1413ebd6f5SMangoPeachGrape }
1513ebd6f5SMangoPeachGrape 
main()1613ebd6f5SMangoPeachGrape int main() {
1713ebd6f5SMangoPeachGrape   std::cout << "Initializing...\n";
1813ebd6f5SMangoPeachGrape   Engine engine;
1913ebd6f5SMangoPeachGrape   Store store(engine);
2013ebd6f5SMangoPeachGrape 
2113ebd6f5SMangoPeachGrape   std::cout << "Compiling module...\n";
2213ebd6f5SMangoPeachGrape   auto wat = readFile("examples/externref.wat");
2313ebd6f5SMangoPeachGrape   Module module = Module::compile(engine, wat).unwrap();
2413ebd6f5SMangoPeachGrape   std::cout << "Instantiating module...\n";
2513ebd6f5SMangoPeachGrape   Instance instance = Instance::create(store, module, {}).unwrap();
2613ebd6f5SMangoPeachGrape 
2713ebd6f5SMangoPeachGrape   ExternRef externref(store, std::string("Hello, world!"));
2813ebd6f5SMangoPeachGrape   std::any &data = externref.data(store);
2913ebd6f5SMangoPeachGrape   std::cout << "externref data: " << std::any_cast<std::string>(data) << "\n";
3013ebd6f5SMangoPeachGrape 
3113ebd6f5SMangoPeachGrape   std::cout << "Touching `externref` table..\n";
3213ebd6f5SMangoPeachGrape   Table table = std::get<Table>(*instance.get(store, "table"));
3313ebd6f5SMangoPeachGrape   table.set(store, 3, externref).unwrap();
34adff9d9dSAlex Crichton   ExternRef val = *table.get(store, 3)->externref();
3513ebd6f5SMangoPeachGrape   std::cout << "externref data: " << std::any_cast<std::string>(val.data(store))
3613ebd6f5SMangoPeachGrape             << "\n";
3713ebd6f5SMangoPeachGrape 
3813ebd6f5SMangoPeachGrape   std::cout << "Touching `externref` global..\n";
3913ebd6f5SMangoPeachGrape   Global global = std::get<Global>(*instance.get(store, "global"));
4013ebd6f5SMangoPeachGrape   global.set(store, externref).unwrap();
41adff9d9dSAlex Crichton   val = *global.get(store).externref();
4213ebd6f5SMangoPeachGrape   std::cout << "externref data: " << std::any_cast<std::string>(val.data(store))
4313ebd6f5SMangoPeachGrape             << "\n";
4413ebd6f5SMangoPeachGrape 
4513ebd6f5SMangoPeachGrape   std::cout << "Calling `externref` func..\n";
4613ebd6f5SMangoPeachGrape   Func func = std::get<Func>(*instance.get(store, "func"));
4713ebd6f5SMangoPeachGrape   auto results = func.call(store, {externref}).unwrap();
48adff9d9dSAlex Crichton   val = *results[0].externref();
4913ebd6f5SMangoPeachGrape   std::cout << "externref data: " << std::any_cast<std::string>(val.data(store))
5013ebd6f5SMangoPeachGrape             << "\n";
5113ebd6f5SMangoPeachGrape 
5213ebd6f5SMangoPeachGrape   std::cout << "Running a gc..\n";
53*b34556f9SNick Fitzgerald   if (!store.context().gc()) {
54*b34556f9SNick Fitzgerald     std::cerr << "> Error while collecting garbage\n";
55*b34556f9SNick Fitzgerald     return 1;
56*b34556f9SNick Fitzgerald   }
57*b34556f9SNick Fitzgerald 
58*b34556f9SNick Fitzgerald   return 0;
5913ebd6f5SMangoPeachGrape }
60