diff options
Diffstat (limited to 'src/passes/MinifyImportsAndExports.cpp')
-rw-r--r-- | src/passes/MinifyImportsAndExports.cpp | 92 |
1 files changed, 3 insertions, 89 deletions
diff --git a/src/passes/MinifyImportsAndExports.cpp b/src/passes/MinifyImportsAndExports.cpp index ca8426e8a..532616851 100644 --- a/src/passes/MinifyImportsAndExports.cpp +++ b/src/passes/MinifyImportsAndExports.cpp @@ -38,6 +38,7 @@ #include <asmjs/shared-constants.h> #include <ir/import-utils.h> #include <ir/module-utils.h> +#include <ir/names.h> #include <pass.h> #include <shared-constants.h> #include <wasm.h> @@ -54,103 +55,16 @@ public: private: // Generates minified names that are valid in JS. // Names are computed lazily. - class MinifiedNames { - public: - MinifiedNames() { - // Reserved words in JS up to size 4 - size 5 and above would mean we use - // an astronomical number of symbols, which is not realistic anyhow. - reserved.insert("do"); - reserved.insert("if"); - reserved.insert("in"); - reserved.insert("for"); - reserved.insert("new"); - reserved.insert("try"); - reserved.insert("var"); - reserved.insert("env"); - reserved.insert("let"); - reserved.insert("case"); - reserved.insert("else"); - reserved.insert("enum"); - reserved.insert("void"); - reserved.insert("this"); - reserved.insert("with"); - - validInitialChars = - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$"; - validLaterChars = validInitialChars + "0123456789"; - - minifiedState.push_back(0); - } - - // Get the n-th minified name. - std::string getName(size_t n) { - ensure(n + 1); - return names[n]; - } - - private: - // Reserved words we must not emit. - std::unordered_set<std::string> reserved; - - // Possible initial letters. - std::string validInitialChars; - - // Possible later letters. - std::string validLaterChars; - - // The minified names we computed so far. - std::vector<std::string> names; - - // Helper state for progressively computing more minified names - - // a stack of the current index. - std::vector<size_t> minifiedState; - - // Make sure we have at least n minified names. - void ensure(size_t n) { - while (names.size() < n) { - // Generate the current name. - std::string name; - auto index = minifiedState[0]; - assert(index < validInitialChars.size()); - name += validInitialChars[index]; - for (size_t i = 1; i < minifiedState.size(); i++) { - auto index = minifiedState[i]; - assert(index < validLaterChars.size()); - name += validLaterChars[index]; - } - if (reserved.count(name) == 0) { - names.push_back(name); - } - // Increment the state. - size_t i = 0; - while (1) { - minifiedState[i]++; - if (minifiedState[i] < - (i == 0 ? validInitialChars : validLaterChars).size()) { - break; - } - // Overflow. - minifiedState[i] = 0; - i++; - if (i == minifiedState.size()) { - // will become 0 after increment in next loop head - minifiedState.push_back(-1); - } - } - } - } - }; void run(PassRunner* runner, Module* module) override { // Minify the imported names. - MinifiedNames names; - size_t soFar = 0; + Names::MinifiedNameGenerator names; std::map<Name, Name> oldToNew; std::map<Name, Name> newToOld; auto process = [&](Name& name) { auto iter = oldToNew.find(name); if (iter == oldToNew.end()) { - auto newName = names.getName(soFar++); + auto newName = names.getName(); oldToNew[name] = newName; newToOld[newName] = name; name = newName; |