Version 1.4.85
Cherry pick: Compute max nameCount in NamingState#incrementAndGet()
CL: https://r8-review.googlesource.com/c/r8/+/36942/
Cherry pick: Reproduce collision bug in field name minifier
CL: https://r8-review.googlesource.com/c/r8/+/36012/
Bug: 127932803
Change-Id: I2592c9adb3154643900951964f83ede531a42c1c
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index b1a56a7..f7bc09f 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
// This field is accessed from release scripts using simple pattern matching.
// Therefore, changing this field could break our release scripts.
- public static final String LABEL = "1.4.84";
+ public static final String LABEL = "1.4.85";
private Version() {
}
diff --git a/src/main/java/com/android/tools/r8/naming/NamingState.java b/src/main/java/com/android/tools/r8/naming/NamingState.java
index d414b3b..8e49563 100644
--- a/src/main/java/com/android/tools/r8/naming/NamingState.java
+++ b/src/main/java/com/android/tools/r8/naming/NamingState.java
@@ -193,6 +193,21 @@
reservedNames.add(name);
}
+ public int incrementAndGet() {
+ int parentNameCount = 0;
+ InternalState tmp = parentInternalState;
+ while (tmp != null) {
+ if (tmp.nameCount > parentNameCount) {
+ parentNameCount = tmp.nameCount;
+ }
+ tmp = tmp.parentInternalState;
+ }
+ if (parentNameCount > nameCount) {
+ nameCount = parentNameCount;
+ }
+ return nameCount++;
+ }
+
DexString getAssignedNameFor(DexString original, KeyType proto) {
DexString result = null;
if (renamings != null) {
@@ -240,7 +255,7 @@
if (dictionaryIterator.hasNext()) {
return dictionaryIterator.next();
} else {
- return StringUtils.numberToIdentifier(EMPTY_CHAR_ARRAY, nameCount++, false);
+ return StringUtils.numberToIdentifier(EMPTY_CHAR_ARRAY, incrementAndGet(), false);
}
}
diff --git a/src/test/java/com/android/tools/r8/naming/FieldMinificationCollisionTest.java b/src/test/java/com/android/tools/r8/naming/FieldMinificationCollisionTest.java
new file mode 100644
index 0000000..7b89f71
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/naming/FieldMinificationCollisionTest.java
@@ -0,0 +1,91 @@
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.naming;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertNotEquals;
+
+import com.android.tools.r8.NeverClassInline;
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.NeverMerge;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import org.junit.Test;
+
+/** Regression test for b/127932803. */
+public class FieldMinificationCollisionTest extends TestBase {
+
+ @Test
+ public void test() throws Exception {
+ String expectedOutput = StringUtils.lines("ABC");
+ CodeInspector inspector =
+ testForR8(Backend.DEX)
+ .addInnerClasses(FieldMinificationCollisionTest.class)
+ .addKeepMainRule(TestClass.class)
+ .addKeepRules(
+ "-keep class " + B.class.getTypeName() + " { public java.lang.String f2; }")
+ .enableClassInliningAnnotations()
+ .enableInliningAnnotations()
+ .enableMergeAnnotations()
+ .run(TestClass.class)
+ .assertSuccessWithOutput(expectedOutput)
+ .inspector();
+
+ FieldSubject f1Subject = inspector.clazz(A.class).uniqueFieldWithName("f1");
+ assertThat(f1Subject, isPresent());
+
+ FieldSubject f3Subject = inspector.clazz(C.class).uniqueFieldWithName("f3");
+ assertThat(f3Subject, isPresent());
+
+ assertNotEquals(f1Subject.getFinalName(), f3Subject.getFinalName());
+ }
+
+ static class TestClass {
+
+ public static void main(String[] args) {
+ new C("A", "B", "C").print();
+ }
+ }
+
+ @NeverMerge
+ static class A {
+
+ public String f1;
+
+ public A(String f1) {
+ this.f1 = f1;
+ }
+ }
+
+ @NeverMerge
+ static class B extends A {
+
+ public String f2;
+
+ public B(String f1, String f2) {
+ super(f1);
+ this.f2 = f2;
+ }
+ }
+
+ @NeverClassInline
+ static class C extends B {
+
+ public String f3;
+
+ public C(String f1, String f2, String f3) {
+ super(f1, f2);
+ this.f3 = f3;
+ }
+
+ @NeverInline
+ public void print() {
+ System.out.println(f1 + f2 + f3);
+ }
+ }
+}