summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/asm2wasm.h1
-rw-r--r--src/wasm-interpreter.h9
-rw-r--r--src/wasm-s-parser.h1
-rw-r--r--src/wasm.h15
4 files changed, 11 insertions, 15 deletions
diff --git a/src/asm2wasm.h b/src/asm2wasm.h
index 1c1f2e7cc..954bcfb8b 100644
--- a/src/asm2wasm.h
+++ b/src/asm2wasm.h
@@ -1006,7 +1006,6 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) {
if (ret->targets[i].isNull()) ret->targets[i] = ret->default_;
}
// finalize
- ret->updateCaseMap();
breakStack.pop_back();
return ret;
#endif
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index 47a442020..1cdd86387 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -227,8 +227,13 @@ private:
if (index >= 0 && index < curr->targets.size()) {
target = curr->targets[index];
}
- auto iter = curr->caseMap.find(target);
- if (iter == curr->caseMap.end()) {
+ // 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 outside
return Flow(target);
}
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h
index d4ec163cf..a33866af9 100644
--- a/src/wasm-s-parser.h
+++ b/src/wasm-s-parser.h
@@ -1048,7 +1048,6 @@ private:
if (curr.size() < 2) onError();
ret->cases.emplace_back(curr[1]->str(), makeMaybeBlock(curr, 2, curr.size()));
}
- ret->updateCaseMap();
ret->type = ret->cases.size() > 0 ? ret->cases[0].body->type : none;
return ret;
}
diff --git a/src/wasm.h b/src/wasm.h
index 2c879f0e5..09fabc7a0 100644
--- a/src/wasm.h
+++ b/src/wasm.h
@@ -103,12 +103,12 @@ struct Literal {
};
Literal() : type(WasmType::none), f64(0) {}
- Literal(int32_t init) : type(WasmType::i32), i32(init) {}
+ Literal(int32_t init) : type(WasmType::i32), i32(init) {}
Literal(uint32_t init) : type(WasmType::i32), i32(init) {}
- Literal(int64_t init) : type(WasmType::i64), i64(init) {}
+ Literal(int64_t init) : type(WasmType::i64), i64(init) {}
Literal(uint64_t init) : type(WasmType::i64), i64(init) {}
- Literal(float init) : type(WasmType::f32), f32(init) {}
- Literal(double init) : type(WasmType::f64), f64(init) {}
+ Literal(float init) : type(WasmType::f32), f32(init) {}
+ Literal(double init) : type(WasmType::f64), f64(init) {}
int32_t geti32() { assert(type == WasmType::i32); return i32; }
int64_t geti64() { assert(type == WasmType::i64); return i64; }
@@ -400,13 +400,6 @@ public:
std::vector<Name> targets;
Name default_;
std::vector<Case> cases;
- std::map<Name, size_t> caseMap; // name => index in cases
-
- void updateCaseMap() {
- for (size_t i = 0; i < cases.size(); i++) {
- caseMap[cases[i].name] = i;
- }
- }
std::ostream& doPrint(std::ostream &o, unsigned indent) {
printOpening(o, "tableswitch ");