Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/examples/multi.cc
2448 views
1
/*
2
Example of instantiating of the WebAssembly module and invoking its exported
3
function.
4
5
You can build the example using CMake:
6
7
mkdir build && (cd build && cmake .. && \
8
cmake --build . --target wasmtime-multi-cpp)
9
10
And then run it:
11
12
build/wasmtime-multi-cpp
13
*/
14
15
#include <fstream>
16
#include <iostream>
17
#include <sstream>
18
#include <wasmtime.hh>
19
20
using namespace wasmtime;
21
22
std::string readFile(const char *name) {
23
std::ifstream watFile;
24
watFile.open(name);
25
std::stringstream strStream;
26
strStream << watFile.rdbuf();
27
return strStream.str();
28
}
29
30
int main() {
31
std::cout << "Initializing...\n";
32
Engine engine;
33
Store store(engine);
34
35
std::cout << "Compiling module...\n";
36
auto wat = readFile("examples/multi.wat");
37
Module module = Module::compile(engine, wat).unwrap();
38
39
std::cout << "Creating callback...\n";
40
Func callback_func = Func::wrap(
41
store, [](int32_t a, int64_t b) -> std::tuple<int64_t, int32_t> {
42
// Rust example adds 1 to each argument but flips order.
43
return std::make_tuple(b + 1, a + 1);
44
});
45
46
std::cout << "Instantiating module...\n";
47
Instance instance = Instance::create(store, module, {callback_func}).unwrap();
48
49
std::cout << "Extracting export...\n";
50
Func g = std::get<Func>(*instance.get(store, "g"));
51
52
std::cout << "Calling export \"g\"...\n";
53
// Provide (i32=1, i64=3) like the Rust example
54
auto results = g.call(store, {Val(int32_t(1)), Val(int64_t(3))}).unwrap();
55
56
std::cout << "Printing result...\n";
57
std::cout << "> " << results[0].i64() << " " << results[1].i32() << "\n";
58
59
std::cout << "Calling export \"round_trip_many\"...\n";
60
Func round_trip_many =
61
std::get<Func>(*instance.get(store, "round_trip_many"));
62
auto many_results =
63
round_trip_many
64
.call(store, {Val(int64_t(0)), Val(int64_t(1)), Val(int64_t(2)),
65
Val(int64_t(3)), Val(int64_t(4)), Val(int64_t(5)),
66
Val(int64_t(6)), Val(int64_t(7)), Val(int64_t(8)),
67
Val(int64_t(9))})
68
.unwrap();
69
std::cout << "Printing result...\n";
70
std::cout << "> (";
71
for (size_t i = 0; i < many_results.size(); i++) {
72
if (i)
73
std::cout << ", ";
74
std::cout << many_results[i].i64();
75
}
76
std::cout << ")\n";
77
return 0;
78
}
79
80