Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/examples/linking.cc
1685 views
1
#include <fstream>
2
#include <iostream>
3
#include <sstream>
4
#include <wasmtime.hh>
5
6
using namespace wasmtime;
7
8
template <typename T, typename E> T unwrap(Result<T, E> result) {
9
if (result) {
10
return result.ok();
11
}
12
std::cerr << "error: " << result.err().message() << "\n";
13
std::abort();
14
}
15
16
std::string readFile(const char *name) {
17
std::ifstream watFile;
18
watFile.open(name);
19
std::stringstream strStream;
20
strStream << watFile.rdbuf();
21
return strStream.str();
22
}
23
24
int main() {
25
Engine engine;
26
Store store(engine);
27
28
// Read our input `*.wat` files into `std::string`s
29
std::string linking1_wat = readFile("examples/linking1.wat");
30
std::string linking2_wat = readFile("examples/linking2.wat");
31
32
// Compile our two modules
33
Module linking1_module = Module::compile(engine, linking1_wat).unwrap();
34
Module linking2_module = Module::compile(engine, linking2_wat).unwrap();
35
36
// Configure WASI and store it within our `wasmtime_store_t`
37
WasiConfig wasi;
38
wasi.inherit_argv();
39
wasi.inherit_env();
40
wasi.inherit_stdin();
41
wasi.inherit_stdout();
42
wasi.inherit_stderr();
43
store.context().set_wasi(std::move(wasi)).unwrap();
44
45
// Create our linker which will be linking our modules together, and then add
46
// our WASI instance to it.
47
Linker linker(engine);
48
linker.define_wasi().unwrap();
49
50
// Instantiate our first module which only uses WASI, then register that
51
// instance with the linker since the next linking will use it.
52
Instance linking2 = linker.instantiate(store, linking2_module).unwrap();
53
linker.define_instance(store, "linking2", linking2).unwrap();
54
55
// And with that we can perform the final link and the execute the module.
56
Instance linking1 = linker.instantiate(store, linking1_module).unwrap();
57
Func f = std::get<Func>(*linking1.get(store, "run"));
58
f.call(store, {}).unwrap();
59
}
60
61