diff options
Diffstat (limited to 'src/wasm2js.h')
-rw-r--r-- | src/wasm2js.h | 49 |
1 files changed, 24 insertions, 25 deletions
diff --git a/src/wasm2js.h b/src/wasm2js.h index b3a4c7e18..6d3f0682c 100644 --- a/src/wasm2js.h +++ b/src/wasm2js.h @@ -32,6 +32,7 @@ #include "emscripten-optimizer/optimizer.h" #include "ir/branch-utils.h" #include "ir/effects.h" +#include "ir/element-utils.h" #include "ir/find_all.h" #include "ir/import-utils.h" #include "ir/load-utils.h" @@ -325,11 +326,8 @@ Ref Wasm2JSBuilder::processWasm(Module* wasm, Name funcName) { functionsCallableFromOutside.insert(exp->value); } } - for (auto& segment : wasm->elementSegments) { - for (auto name : segment->data) { - functionsCallableFromOutside.insert(name); - } - } + ElementUtils::iterAllElementFunctionNames( + wasm, [&](Name name) { functionsCallableFromOutside.insert(name); }); // Ensure the scratch memory helpers. // If later on they aren't needed, we'll clean them up. @@ -680,26 +678,27 @@ void Wasm2JSBuilder::addTable(Ref ast, Module* wasm) { ModuleUtils::iterTableSegments( *wasm, table->name, [&](ElementSegment* segment) { auto offset = segment->offset; - for (Index i = 0; i < segment->data.size(); i++) { - Ref index; - if (auto* c = offset->dynCast<Const>()) { - index = ValueBuilder::makeInt(c->value.geti32() + i); - } else if (auto* get = offset->dynCast<GlobalGet>()) { - index = - ValueBuilder::makeBinary(ValueBuilder::makeName(stringToIString( - asmangle(get->name.str))), - PLUS, - ValueBuilder::makeNum(i)); - } else { - WASM_UNREACHABLE("unexpected expr type"); - } - ast->push_back(ValueBuilder::makeStatement(ValueBuilder::makeBinary( - ValueBuilder::makeSub(ValueBuilder::makeName(FUNCTION_TABLE), - index), - SET, - ValueBuilder::makeName( - fromName(segment->data[i], NameScope::Top))))); - } + ElementUtils::iterElementSegmentFunctionNames( + segment, [&](Name entry, Index i) { + Ref index; + if (auto* c = offset->dynCast<Const>()) { + index = ValueBuilder::makeInt(c->value.geti32() + i); + } else if (auto* get = offset->dynCast<GlobalGet>()) { + index = ValueBuilder::makeBinary( + ValueBuilder::makeName( + stringToIString(asmangle(get->name.str))), + PLUS, + ValueBuilder::makeNum(i)); + } else { + WASM_UNREACHABLE("unexpected expr type"); + } + ast->push_back( + ValueBuilder::makeStatement(ValueBuilder::makeBinary( + ValueBuilder::makeSub(ValueBuilder::makeName(FUNCTION_TABLE), + index), + SET, + ValueBuilder::makeName(fromName(entry, NameScope::Top))))); + }); }); } } |