diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-01-12 11:53:45 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-01-12 11:54:02 -0800 |
commit | e404e460b93eb8aee8995827dfbe29840315a572 (patch) | |
tree | 47df3f5b37e255193e65fd321bddd66dc6029fa5 /src | |
parent | 944b56ad5d6a0f0df040cac684109a5e3f50f653 (diff) | |
download | binaryen-e404e460b93eb8aee8995827dfbe29840315a572.tar.gz binaryen-e404e460b93eb8aee8995827dfbe29840315a572.tar.bz2 binaryen-e404e460b93eb8aee8995827dfbe29840315a572.zip |
implement switch in wasm-as
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-binary.h | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 16e24fcb8..79742a414 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -554,8 +554,18 @@ public: } void visitSwitch(Switch *curr) { o << int8_t(BinaryConsts::TableSwitch) << int16_t(curr->cases.size()) - << int16_t(curr->targets.size()); - abort(); // WTF + << int16_t(curr->targets.size()); + std::map<Name, int16_t> mapping; // target name => index in cases + for (size_t i = 0; i < curr->cases.size(); i++) { + mapping[curr->cases[i].name] = i; + } + for (auto target : curr->targets) { + o << mapping[target]; + } + visit(curr->value); + for (auto c : curr->cases) { + visit(c.body); + } } void visitCall(Call *curr) { o << int8_t(BinaryConsts::CallFunction) << LEB128(getFunctionIndex(curr->target)); |