diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-11-05 17:12:43 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-11-05 17:12:43 -0800 |
commit | 9c14e35d31a91558e2a4efe02d11406665f1f6f0 (patch) | |
tree | 7b857ec0b043e85966ba28dc8fa6ef38014116da /src/wasm-interpreter.h | |
parent | be88a262864f1bb3fa0f36be20030546451a2735 (diff) | |
download | binaryen-9c14e35d31a91558e2a4efe02d11406665f1f6f0.tar.gz binaryen-9c14e35d31a91558e2a4efe02d11406665f1f6f0.tar.bz2 binaryen-9c14e35d31a91558e2a4efe02d11406665f1f6f0.zip |
find locals by index
Diffstat (limited to 'src/wasm-interpreter.h')
-rw-r--r-- | src/wasm-interpreter.h | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index c2faa1df4..43efb5c3d 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -54,8 +54,9 @@ public: class FunctionScope { public: std::map<IString, Literal> locals; + Function* function; - FunctionScope(Function* function, LiteralList& arguments) { + FunctionScope(Function* function, LiteralList& arguments) : function(function) { assert(function->params.size() == arguments.size()); for (size_t i = 0; i < arguments.size(); i++) { assert(function->params[i].type == arguments[i].type); @@ -247,17 +248,34 @@ public: return instance.callFunction(name, arguments); } + Name getLocalName(Name name) { + if (scope.locals.find(name) != scope.locals.end()) { + return name; + } + // this is a numeric index + size_t id = std::stoi(name.str); + size_t numParams = scope.function->params.size(); + if (id < numParams) { + return scope.function->params[id].name; + } + id -= numParams; + assert(id < scope.function->locals.size()); + return scope.function->locals[id].name; + } + Flow visitGetLocal(GetLocal *curr) override { NOTE_ENTER("GetLocal"); - NOTE_EVAL1(scope.locals[curr->name]); - return scope.locals[curr->name]; + IString name = getLocalName(curr->name); + NOTE_EVAL1(scope.locals[name]); + return scope.locals[name]; } Flow visitSetLocal(SetLocal *curr) override { NOTE_ENTER("SetLocal"); + IString name = getLocalName(curr->name); Flow flow = visit(curr->value); if (flow.breaking()) return flow; NOTE_EVAL1(flow.value); - scope.locals[curr->name] = flow.value; + scope.locals[name] = flow.value; return flow; } Flow visitLoad(Load *curr) override { |