Skip to content

Commit

Permalink
Fix a potential crash when an export is mutated in more than one loca…
Browse files Browse the repository at this point in the history
…tion.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=231698728
  • Loading branch information
johnplaisted authored and blickly committed Jan 31, 2019
1 parent 79bc56b commit 2759c51
Showing 1 changed file with 13 additions and 7 deletions.
20 changes: 13 additions & 7 deletions src/com/google/javascript/jscomp/modules/EsModuleProcessor.java
Expand Up @@ -18,11 +18,11 @@
import static com.google.common.base.Preconditions.checkState;

import com.google.common.base.Strings;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimaps;
import com.google.common.collect.ListMultimap;
import com.google.javascript.jscomp.AbstractCompiler;
import com.google.javascript.jscomp.DiagnosticType;
import com.google.javascript.jscomp.Es6ToEs3Util;
Expand Down Expand Up @@ -136,7 +136,7 @@ final class EsModuleProcessor implements Callback, ModuleProcessor {
*/
private static final class FindMutableExports extends AbstractPostOrderCallback {
final List<Export> exports;
final ImmutableListMultimap<String, Export> exportsByLocalName;
final ListMultimap<String, Export> exportsByLocalName;

FindMutableExports(List<Export> exports) {
// There may be multiple exports with the same local name because you can export a local
Expand All @@ -145,7 +145,10 @@ private static final class FindMutableExports extends AbstractPostOrderCallback
// let x;
// export {x as y, x as z};
this.exports = exports;
exportsByLocalName = Multimaps.index(exports, Export::localName);
exportsByLocalName = ArrayListMultimap.create();
for (Export e : exports) {
exportsByLocalName.put(e.localName(), e);
}
}

@Override
Expand All @@ -159,7 +162,7 @@ public void visit(NodeTraversal t, Node n, Node parent) {
return;
}

ImmutableList<Export> exports = exportsByLocalName.get(n.getString());
List<Export> exports = exportsByLocalName.get(n.getString());
if (exports.isEmpty()) {
return;
}
Expand All @@ -172,9 +175,12 @@ public void visit(NodeTraversal t, Node n, Node parent) {
return;
}

for (Export e : exports) {
for (Export e : new ArrayList<>(exports)) {
int i = this.exports.indexOf(e);
this.exports.set(i, e.mutatedCopy());
Export mutated = e.mutatedCopy();
this.exports.set(i, mutated);
exportsByLocalName.remove(e.localName(), e);
exportsByLocalName.put(e.localName(), mutated);
}
}
}
Expand Down

0 comments on commit 2759c51

Please sign in to comment.