summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/wasm-s-parser.h18
-rw-r--r--src/wasm.h21
2 files changed, 35 insertions, 4 deletions
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h
index fa3d8cb67..f71d65707 100644
--- a/src/wasm-s-parser.h
+++ b/src/wasm-s-parser.h
@@ -36,6 +36,7 @@ IString MODULE("module"),
NAN_("nan"),
NEG_NAN("-nan"),
CASE("case"),
+ BR("br"),
FAKE_RETURN("fake_return_waka123");
int unhex(char c) {
@@ -1019,9 +1020,22 @@ private:
Element& table = *s[i];
i++;
for (size_t j = 1; j < table.size(); j++) {
- ret->targets.push_back((*table[j])[1]->str());
+ Element& curr = *table[j];
+ if (curr[0]->str() == CASE) {
+ ret->targets.push_back(curr[1]->str());
+ } else {
+ assert(curr[0]->str() == BR);
+ assert(curr[1]->str() == ret->name);
+ ret->targets.push_back(Name());
+ }
+ }
+ Element& curr = *s[i];
+ if (curr[0]->str() == CASE) {
+ ret->default_ = curr[1]->str();
+ } else {
+ assert(curr[0]->str() == BR);
+ assert(curr[1]->str() == ret->name);
}
- ret->default_ = (*s[i])[1]->str();
i++;
for (; i < s.size(); i++) {
Element& curr = *s[i];
diff --git a/src/wasm.h b/src/wasm.h
index 68bee7e5a..31abf6cc9 100644
--- a/src/wasm.h
+++ b/src/wasm.h
@@ -412,9 +412,9 @@ public:
printFullLine(o, indent, value);
doIndent(o, indent) << "[ ";
for (auto& t : targets) {
- o << t.str << ' ';
+ o << (t.is() ? t.str : "br-out") << ' ';
}
- o << "] (default " << default_.str << ")\n";
+ o << "] (default " << (default_.is() ? default_.str : "br-out") << ")\n";
for (auto& c : cases) {
doIndent(o, indent);
printMinorOpening(o, "case ") << c.name.str;
@@ -1317,6 +1317,23 @@ bool Module::validateFunction(Function *func) {
void visitStore(Store *curr) override {
if (!validateAlignment(curr->align)) valid = false;
}
+ void visitSwitch(Switch *curr) override {
+std::cerr << "validate switch ";
+curr->doPrint(std::cerr, 0) << "\n";
+ std::set<Name> inTable;
+ for (auto target : curr->targets) {
+ if (target.is()) {
+ inTable.insert(target);
+std::cerr << "in table: " << target << '\n';
+ }
+ }
+ for (auto& c : curr->cases) {
+std::cerr << "chack: " << c.name.is() << " : " << (c.name.is() ? c.name.str : "ASSDAS") << '\n';
+ if (c.name.is() && inTable.find(c.name) == inTable.end()) {
+ valid = false;
+ }
+ }
+ }
bool validateAlignment(size_t align) {
switch (align) {