diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/asm2wasm.h | 1 | ||||
-rw-r--r-- | src/wasm-interpreter.h | 9 | ||||
-rw-r--r-- | src/wasm-s-parser.h | 1 | ||||
-rw-r--r-- | src/wasm.h | 15 |
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 "); |