diff options
Diffstat (limited to 'src')
-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 { |