summaryrefslogtreecommitdiff
path: root/src/wasm-binary.h
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-01-12 11:53:45 -0800
committerAlon Zakai <alonzakai@gmail.com>2016-01-12 11:54:02 -0800
commite404e460b93eb8aee8995827dfbe29840315a572 (patch)
tree47df3f5b37e255193e65fd321bddd66dc6029fa5 /src/wasm-binary.h
parent944b56ad5d6a0f0df040cac684109a5e3f50f653 (diff)
downloadbinaryen-e404e460b93eb8aee8995827dfbe29840315a572.tar.gz
binaryen-e404e460b93eb8aee8995827dfbe29840315a572.tar.bz2
binaryen-e404e460b93eb8aee8995827dfbe29840315a572.zip
implement switch in wasm-as
Diffstat (limited to 'src/wasm-binary.h')
-rw-r--r--src/wasm-binary.h14
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));