diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-10-30 22:13:30 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-10-30 22:13:30 -0700 |
commit | 3067079eec5759fbbbf81872b32a9ae4a2dd99fc (patch) | |
tree | 90c788b31fcf978ade17ee42f0db77b2e403ad18 /src/wasm-interpreter.cpp | |
parent | 51be0e93e50c3717cb8e4dff47000a494e67b29a (diff) | |
download | binaryen-3067079eec5759fbbbf81872b32a9ae4a2dd99fc.tar.gz binaryen-3067079eec5759fbbbf81872b32a9ae4a2dd99fc.tar.bz2 binaryen-3067079eec5759fbbbf81872b32a9ae4a2dd99fc.zip |
function scopes
Diffstat (limited to 'src/wasm-interpreter.cpp')
-rw-r--r-- | src/wasm-interpreter.cpp | 44 |
1 files changed, 37 insertions, 7 deletions
diff --git a/src/wasm-interpreter.cpp b/src/wasm-interpreter.cpp index a055ee17d..84f9b585a 100644 --- a/src/wasm-interpreter.cpp +++ b/src/wasm-interpreter.cpp @@ -18,11 +18,31 @@ public: } } - Literal callFunction(const char *name) { - return callFunction(IString(name)); - } + typedef std::vector<Literal> LiteralList; Literal callFunction(IString name) { + LiteralList empty; + return callFunction(name, empty); + } + + Literal callFunction(IString name, LiteralList& arguments) { + + class FunctionScope { + public: + std::map<IString, Literal> locals; + + FunctionScope(Function* function, LiteralList& arguments) { + assert(function->params.size() == arguments.size()); + for (size_t i = 0; i < arguments.size(); i++) { + assert(function->params[i].type == arguments[i].type); + locals[function->params[i].name] = arguments[i]; + } + for (auto& local : function->locals) { + locals[local.name].type = local.type; + } + } + }; + // Stuff that flows around during executing expressions: a literal, or a change in control flow class Flow { public: @@ -43,10 +63,10 @@ public: // Execute a statement class ExpressionRunner : public WasmVisitor<Flow> { - private: - std::vector<Literal> arguments; // filled in before a call, cleared by the call - + FunctionScope& scope; public: + ExpressionRunner(FunctionScope& scope) : scope(scope) {} + Flow visitBlock(Block *curr) override { Flow flow; for (auto expression : curr->list) { @@ -96,6 +116,14 @@ public: abort(); } Flow visitCall(Call *curr) override { + LiteralList arguments; + arguments.reserve(curr->operands.size()); + for (auto expression : curr->operands) { + Flow flow = visit(expression); + if (flow.breaking()) return flow; + arguments.push_back(flow.value); + } + return callFunction(curr->target, arguments); } Flow visitCallImport(CallImport *curr) override { } @@ -126,7 +154,9 @@ public: } }; - return ExpressionRunner().visit(functions[name]->body).value; + Function *function = functions[name]; + FunctionScope scope(function, arguments); + return ExpressionRunner(scope).visit(function->body).value; } private: |