summaryrefslogtreecommitdiff
path: root/src/wasm-interpreter.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-10-30 20:51:52 -0700
committerAlon Zakai <alonzakai@gmail.com>2015-10-30 20:52:14 -0700
commit6ebb87ce79d6aed56addfc0d275ee4e93d143469 (patch)
treeae580458359453dab0b20e0759ab03db2c7e8af7 /src/wasm-interpreter.cpp
parenta6701a55871bdccd60445da4a47bcc63840c0115 (diff)
downloadbinaryen-6ebb87ce79d6aed56addfc0d275ee4e93d143469.tar.gz
binaryen-6ebb87ce79d6aed56addfc0d275ee4e93d143469.tar.bz2
binaryen-6ebb87ce79d6aed56addfc0d275ee4e93d143469.zip
refactorings and begin interpreter
Diffstat (limited to 'src/wasm-interpreter.cpp')
-rw-r--r--src/wasm-interpreter.cpp95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/wasm-interpreter.cpp b/src/wasm-interpreter.cpp
new file mode 100644
index 000000000..8e1294624
--- /dev/null
+++ b/src/wasm-interpreter.cpp
@@ -0,0 +1,95 @@
+
+// Simple WebAssembly interpreter, designed to be embeddable in JavaScript, so it
+// can function as a polyfill.
+
+#include "wasm.h"
+
+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
+