aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMads Ager <ager@google.com>2017-10-23 12:41:55 +0200
committerMads Ager <ager@google.com>2017-10-23 12:41:55 +0200
commit185a5d25e9f482aad886f5f07182753fc1cc05cc (patch)
tree3f8dd70212e7a071b34d5c5ee2a49bfa5b5a4f05
parenta12ad03380f7439ebeb2416d4a21034771950d01 (diff)
downloadr8-185a5d25e9f482aad886f5f07182753fc1cc05cc.tar.gz
Avoid using HashMap.computeIfAbsent with recursive creation function.
HashMap.computeIfAbsent holds on to an index into the backing across the call to the creation function. Therefore, if the creation function changes the hash map things can go wrong. R=herhut@google.com, jsjeong@google.com Bug: 67889172 Change-Id: I7eb642e13938688e1d69e327b46543361aa0c6e3
-rw-r--r--src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
index 410a47c3f..c5e62e268 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
@@ -282,7 +282,8 @@ class ClassNameMinifier {
}
private Namespace getStateForPackagePrefix(String prefix) {
- return states.computeIfAbsent(prefix, k -> {
+ Namespace state = states.get(prefix);
+ if (state == null) {
// Calculate the parent package prefix, e.g., La/b/c -> La/b
String parentPackage = getParentPackagePrefix(prefix);
// Create a state for parent package prefix, if necessary, in a recursive manner.
@@ -291,13 +292,16 @@ class ClassNameMinifier {
// From the super state, get a renamed package prefix for the current level.
String renamedPackagePrefix = superState.nextPackagePrefix();
// Create a new state, which corresponds to a new name space, for the current level.
- return new Namespace(renamedPackagePrefix);
- });
+ state = new Namespace(renamedPackagePrefix);
+ states.put(prefix, state);
+ }
+ return state;
}
private Namespace getStateForOuterClass(DexType outer) {
String prefix = getClassBinaryNameFromDescriptor(outer.toDescriptorString());
- return states.computeIfAbsent(prefix, k -> {
+ Namespace state = states.get(prefix);
+ if (state == null) {
// Create a naming state with this classes renaming as prefix.
DexString renamed = renaming.get(outer);
if (renamed == null) {
@@ -311,8 +315,10 @@ class ClassNameMinifier {
}
}
String binaryName = getClassBinaryNameFromDescriptor(renamed.toString());
- return new Namespace(binaryName, "$");
- });
+ state = new Namespace(binaryName, "$");
+ states.put(prefix, state);
+ }
+ return state;
}
private void renameArrayTypeIfNeeded(DexType type) {