|
17 | 17 | #ifndef wasm_passes_opt_utils_h |
18 | 18 | #define wasm_passes_opt_utils_h |
19 | 19 |
|
| 20 | +#include <functional> |
20 | 21 | #include <unordered_set> |
21 | 22 |
|
22 | 23 | #include <pass.h> |
@@ -56,51 +57,44 @@ inline void optimizeAfterInlining(std::unordered_set<Function*>& funcs, |
56 | 57 | struct CallTargetReplacer : public WalkerPass<PostWalker<CallTargetReplacer>> { |
57 | 58 | bool isFunctionParallel() override { return true; } |
58 | 59 |
|
59 | | - CallTargetReplacer(std::map<Name, Name>* replacements) |
60 | | - : replacements(replacements) {} |
| 60 | + using MaybeReplace = std::function<void(Name&)>; |
| 61 | + |
| 62 | + CallTargetReplacer(MaybeReplace maybeReplace) : maybeReplace(maybeReplace) {} |
61 | 63 |
|
62 | 64 | CallTargetReplacer* create() override { |
63 | | - return new CallTargetReplacer(replacements); |
| 65 | + return new CallTargetReplacer(maybeReplace); |
64 | 66 | } |
65 | 67 |
|
66 | | - void visitCall(Call* curr) { |
67 | | - auto iter = replacements->find(curr->target); |
68 | | - if (iter != replacements->end()) { |
69 | | - curr->target = iter->second; |
70 | | - } |
71 | | - } |
| 68 | + void visitCall(Call* curr) { maybeReplace(curr->target); } |
72 | 69 |
|
73 | 70 | private: |
74 | | - std::map<Name, Name>* replacements; |
| 71 | + MaybeReplace maybeReplace; |
75 | 72 | }; |
76 | 73 |
|
77 | 74 | inline void replaceFunctions(PassRunner* runner, |
78 | 75 | Module& module, |
79 | | - std::map<Name, Name>& replacements) { |
| 76 | + const std::map<Name, Name>& replacements) { |
| 77 | + auto maybeReplace = [&](Name& name) { |
| 78 | + auto iter = replacements.find(name); |
| 79 | + if (iter != replacements.end()) { |
| 80 | + name = iter->second; |
| 81 | + } |
| 82 | + }; |
80 | 83 | // replace direct calls |
81 | | - CallTargetReplacer(&replacements).run(runner, &module); |
| 84 | + CallTargetReplacer(maybeReplace).run(runner, &module); |
82 | 85 | // replace in table |
83 | 86 | for (auto& segment : module.table.segments) { |
84 | 87 | for (auto& name : segment.data) { |
85 | | - auto iter = replacements.find(name); |
86 | | - if (iter != replacements.end()) { |
87 | | - name = iter->second; |
88 | | - } |
| 88 | + maybeReplace(name); |
89 | 89 | } |
90 | 90 | } |
91 | 91 | // replace in start |
92 | 92 | if (module.start.is()) { |
93 | | - auto iter = replacements.find(module.start); |
94 | | - if (iter != replacements.end()) { |
95 | | - module.start = iter->second; |
96 | | - } |
| 93 | + maybeReplace(module.start); |
97 | 94 | } |
98 | 95 | // replace in exports |
99 | 96 | for (auto& exp : module.exports) { |
100 | | - auto iter = replacements.find(exp->value); |
101 | | - if (iter != replacements.end()) { |
102 | | - exp->value = iter->second; |
103 | | - } |
| 97 | + maybeReplace(exp->value); |
104 | 98 | } |
105 | 99 | } |
106 | 100 |
|
|
0 commit comments