summaryrefslogtreecommitdiff
path: root/src/wasm-interpreter.h
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-11-05 17:12:43 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-11-05 17:12:43 -0800
commit9c14e35d31a91558e2a4efe02d11406665f1f6f0 (patch)
tree7b857ec0b043e85966ba28dc8fa6ef38014116da /src/wasm-interpreter.h
parentbe88a262864f1bb3fa0f36be20030546451a2735 (diff)
downloadbinaryen-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.h26
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 {