1 #undef NDEBUG 2 3 #include <fstream> 4 #include <iostream> 5 #include <sstream> 6 #include <wasmtime.hh> 7 8 using namespace wasmtime; 9 10 std::string readFile(const char *name) { 11 std::ifstream watFile; 12 watFile.open(name); 13 std::stringstream strStream; 14 strStream << watFile.rdbuf(); 15 return strStream.str(); 16 } 17 18 int main() { 19 // Create our `store` context and then compile a module and create an 20 // instance from the compiled module all in one go. 21 Engine engine; 22 Module module = 23 Module::compile(engine, readFile("examples/memory.wat")).unwrap(); 24 Store store(engine); 25 Instance instance = Instance::create(store, module, {}).unwrap(); 26 27 // load_fn up our exports from the instance 28 auto memory = std::get<Memory>(*instance.get(store, "memory")); 29 auto size = std::get<Func>(*instance.get(store, "size")); 30 auto load_fn = std::get<Func>(*instance.get(store, "load")); 31 auto store_fn = std::get<Func>(*instance.get(store, "store")); 32 33 std::cout << "Checking memory...\n"; 34 assert(memory.size(store) == 2); 35 auto data = memory.data(store); 36 assert(data.size() == 0x20000); 37 assert(data[0] == 0); 38 assert(data[0x1000] == 1); 39 assert(data[0x1003] == 4); 40 41 assert(size.call(store, {}).unwrap()[0].i32() == 2); 42 assert(load_fn.call(store, {0}).unwrap()[0].i32() == 0); 43 assert(load_fn.call(store, {0x1000}).unwrap()[0].i32() == 1); 44 assert(load_fn.call(store, {0x1003}).unwrap()[0].i32() == 4); 45 assert(load_fn.call(store, {0x1ffff}).unwrap()[0].i32() == 0); 46 load_fn.call(store, {0x20000}).err(); // out of bounds trap 47 48 std::cout << "Mutating memory...\n"; 49 memory.data(store)[0x1003] = 5; 50 51 store_fn.call(store, {0x1002, 6}).unwrap(); 52 store_fn.call(store, {0x20000, 0}).err(); // out of bounds trap 53 54 assert(memory.data(store)[0x1002] == 6); 55 assert(memory.data(store)[0x1003] == 5); 56 assert(load_fn.call(store, {0x1002}).unwrap()[0].i32() == 6); 57 assert(load_fn.call(store, {0x1003}).unwrap()[0].i32() == 5); 58 59 // Grow memory. 60 std::cout << "Growing memory...\n"; 61 memory.grow(store, 1).unwrap(); 62 assert(memory.size(store) == 3); 63 assert(memory.data(store).size() == 0x30000); 64 65 assert(load_fn.call(store, {0x20000}).unwrap()[0].i32() == 0); 66 store_fn.call(store, {0x20000, 0}).unwrap(); 67 load_fn.call(store, {0x30000}).err(); 68 store_fn.call(store, {0x30000, 0}).err(); 69 70 memory.grow(store, 1).err(); 71 memory.grow(store, 0).ok(); 72 73 std::cout << "Creating stand-alone memory...\n"; 74 MemoryType ty(5, 5); 75 Memory memory2 = Memory::create(store, ty).unwrap(); 76 assert(memory2.size(store) == 5); 77 memory2.grow(store, 1).err(); 78 memory2.grow(store, 0).ok(); 79 } 80