diff options
author | Alon Zakai <azakai@google.com> | 2021-02-25 02:46:37 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-24 18:46:37 -0800 |
commit | 95ccf32f3e74bf52d9db161cffc27637f3957820 (patch) | |
tree | 27d3e9d5e6d6abcbaef067397de53bae067d8e4e /src | |
parent | 4311e46cc7ae7dd998698e5d15371b605c663bc0 (diff) | |
download | binaryen-95ccf32f3e74bf52d9db161cffc27637f3957820.tar.gz binaryen-95ccf32f3e74bf52d9db161cffc27637f3957820.tar.bz2 binaryen-95ccf32f3e74bf52d9db161cffc27637f3957820.zip |
Refactor name processing (escaping/deduplication) to a shared place. NFC (#3609)
(not 100% NFC since it also fixes a bug by moving a line out of
a loop)
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 58 |
1 files changed, 29 insertions, 29 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 49d7128dd..0ddc11320 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -2719,6 +2719,27 @@ Name WasmBinaryBuilder::escape(Name name) { return escaped; } +// Performs necessary processing of names from the name section before using +// them. Specifically it escapes and deduplicates them. +class NameProcessor { +public: + Name process(Name name) { + return deduplicate(WasmBinaryBuilder::escape(name)); + } + +private: + std::unordered_set<Name> usedNames; + + Name deduplicate(Name base) { + Name name = base; + // De-duplicate names by appending .1, .2, etc. + for (int i = 1; !usedNames.insert(name).second; ++i) { + name = std::string(base.str) + std::string(".") + std::to_string(i); + } + return name; + } +}; + void WasmBinaryBuilder::readNames(size_t payloadLen) { BYN_TRACE("== readNames\n"); auto sectionPos = pos; @@ -2731,16 +2752,11 @@ void WasmBinaryBuilder::readNames(size_t payloadLen) { } else if (nameType == BinaryConsts::UserSections::Subsection::NameFunction) { auto num = getU32LEB(); - std::unordered_set<Name> usedNames; + NameProcessor processor; for (size_t i = 0; i < num; i++) { auto index = getU32LEB(); auto rawName = getInlineString(); - auto name = escape(rawName); - // De-duplicate names by appending .1, .2, etc. - for (int i = 1; !usedNames.insert(name).second; ++i) { - name = std::string(escape(rawName).str) + std::string(".") + - std::to_string(i); - } + auto name = processor.process(rawName); auto numFunctionImports = functionImports.size(); if (index < numFunctionImports) { functionImports[index]->setExplicitName(name); @@ -2770,19 +2786,14 @@ void WasmBinaryBuilder::readNames(size_t payloadLen) { << std::to_string(funcIndex) << std::endl; } auto numLocals = getU32LEB(); - std::unordered_set<Name> usedNames; + NameProcessor processor; for (size_t j = 0; j < numLocals; j++) { auto localIndex = getU32LEB(); auto rawLocalName = getInlineString(); if (!func) { continue; // read and discard in case of prior error } - auto localName = escape(rawLocalName); - // De-duplicate names by appending .1, .2, etc. - for (int i = 1; !usedNames.insert(localName).second; ++i) { - localName = std::string(escape(rawLocalName).str) + - std::string(".") + std::to_string(i); - } + auto localName = processor.process(rawLocalName); if (localIndex < func->getNumLocals()) { func->localNames[localIndex] = localName; } else { @@ -2796,17 +2807,11 @@ void WasmBinaryBuilder::readNames(size_t payloadLen) { } } else if (nameType == BinaryConsts::UserSections::Subsection::NameTable) { auto num = getU32LEB(); + NameProcessor processor; for (size_t i = 0; i < num; i++) { - std::unordered_set<Name> usedNames; auto index = getU32LEB(); auto rawName = getInlineString(); - auto name = escape(rawName); - // De-duplicate names by appending .1, .2, etc. - for (int i = 1; !usedNames.insert(name).second; ++i) { - name = std::string(escape(rawName).str) + std::string(".") + - std::to_string(i); - } - + auto name = processor.process(rawName); auto numTableImports = tableImports.size(); if (index < numTableImports) { tableImports[index]->setExplicitName(name); @@ -2849,16 +2854,11 @@ void WasmBinaryBuilder::readNames(size_t payloadLen) { } } else if (nameType == BinaryConsts::UserSections::Subsection::NameGlobal) { auto num = getU32LEB(); - std::unordered_set<Name> usedNames; + NameProcessor processor; for (size_t i = 0; i < num; i++) { auto index = getU32LEB(); auto rawName = getInlineString(); - auto name = escape(rawName); - // De-duplicate names by appending .1, .2, etc. - for (int i = 1; !usedNames.insert(name).second; ++i) { - name = std::string(escape(rawName).str) + std::string(".") + - std::to_string(i); - } + auto name = processor.process(rawName); auto numGlobalImports = globalImports.size(); if (index < numGlobalImports) { globalImports[index]->setExplicitName(name); |