diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-03-07 17:03:38 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-03-07 18:27:29 -0800 |
commit | 284ae677cca8794a464f9bf702e3ec6aace6c65b (patch) | |
tree | be323dc8b38ebe8cfe758c7df8ad2865f3f2bd7d /src/wasm-interpreter.h | |
parent | ea3a9db4a071292d4e976ef36f4c197a9e8a5fea (diff) | |
download | binaryen-284ae677cca8794a464f9bf702e3ec6aace6c65b.tar.gz binaryen-284ae677cca8794a464f9bf702e3ec6aace6c65b.tar.bz2 binaryen-284ae677cca8794a464f9bf702e3ec6aace6c65b.zip |
br_table, no more cases
Diffstat (limited to 'src/wasm-interpreter.h')
-rw-r--r-- | src/wasm-interpreter.h | 40 |
1 files changed, 12 insertions, 28 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index a7405e948..223a9e1a5 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -256,40 +256,24 @@ private: } Flow visitSwitch(Switch *curr) { NOTE_ENTER("Switch"); - Flow flow = visit(curr->value); - if (flow.breaking()) { - flow.clearIf(curr->name); - return flow; - } + Flow flow = visit(curr->condition); + if (flow.breaking()) return flow; NOTE_EVAL1(flow.value); int64_t index = flow.value.getInteger(); + + if (curr->value) { + flow = visit(curr->value); + if (flow.breaking()) return flow; + NOTE_EVAL1(flow.value); + } else { + flow = Flow(); + } + Name target = curr->default_; if (index >= 0 && (size_t)index < curr->targets.size()) { target = curr->targets[index]; } - // This is obviously very inefficient. This should be a cached data structure - std::map<Name, size_t> caseMap; // name => index in cases - for (size_t i = 0; i < curr->cases.size(); i++) { - caseMap[curr->cases[i].name] = i; - } - auto iter = caseMap.find(target); - if (iter == caseMap.end()) { - // not in the cases, so this is a break - Flow flow(target); - flow.clearIf(curr->name); - return flow; - } - size_t caseIndex = iter->second; - assert(caseIndex < curr->cases.size()); - while (caseIndex < curr->cases.size()) { - Switch::Case& c = curr->cases[caseIndex]; - flow = visit(c.body); - if (flow.breaking()) { - flow.clearIf(curr->name); - break; - } - caseIndex++; - } + flow.breakTo = target; return flow; } |