diff options
author | Mads Ager <ager@google.com> | 2017-10-23 12:41:55 +0200 |
---|---|---|
committer | Mads Ager <ager@google.com> | 2017-10-23 12:41:55 +0200 |
commit | 185a5d25e9f482aad886f5f07182753fc1cc05cc (patch) | |
tree | 3f8dd70212e7a071b34d5c5ee2a49bfa5b5a4f05 | |
parent | a12ad03380f7439ebeb2416d4a21034771950d01 (diff) | |
download | r8-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.java | 18 |
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) { |