blob: ae7b2e79367b529ef9dba2a549b1f95220ac4f9c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
// Simple WebAssembly interpreter, designed to be embeddable in JavaScript, so it
// can function as a polyfill.
#include "wasm.h"
using namespace cashew;
using namespace wasm;
namespace wasm {
// An instance of a WebAssembly module
class ModuleInstance {
public:
ModuleInstance(Module& wasm) : wasm(wasm) {
for (auto function : wasm.functions) {
functions[function->name] = function;
}
}
Literal callFunction(const char *name) {
return callFunction(IString(name));
}
Literal callFunction(IString name) {
// Stuff that flows around during executing expressions: a literal, or a change in control flow
class Flow : public Literal {
public:
IString breakTo; // if non-null, a break is going on
};
// Execute a statement
class ExpressionRunner : public WasmVisitor<Flow> {
virtual Flow visitBlock(Block *curr) {
Flow flow;
for (auto expression : curr->list) {
flow = visit(expression);
if (flow.breakTo) {
if (flow.breakTo == curr->name) {
flow.breakTo.clear();
}
return flow;
}
}
return flow;
}
virtual Flow visitIf(If *curr) {
}
virtual Flow visitLoop(Loop *curr) {
}
virtual Flow visitLabel(Label *curr) {
}
virtual Flow visitBreak(Break *curr) {
}
virtual Flow visitSwitch(Switch *curr) {
}
virtual Flow visitCall(Call *curr) {
}
virtual Flow visitCallImport(CallImport *curr) {
}
virtual Flow visitCallIndirect(CallIndirect *curr) {
}
virtual Flow visitGetLocal(GetLocal *curr) {
}
virtual Flow visitSetLocal(SetLocal *curr) {
}
virtual Flow visitLoad(Load *curr) {
}
virtual Flow visitStore(Store *curr) {
}
virtual Flow visitConst(Const *curr) {
}
virtual Flow visitUnary(Unary *curr) {
}
virtual Flow visitBinary(Binary *curr) {
}
virtual Flow visitCompare(Compare *curr) {
}
virtual Flow visitConvert(Convert *curr) {
}
virtual Flow visitHost(Host *curr) {
}
virtual Flow visitNop(Nop *curr) {
}
};
return ExpressionRunner().visit(functions[name]->body);
}
private:
Module& wasm;
std::map<IString, Function*> functions;
};
} // namespace wasm
|