Version 1.6.51
Cherry-pick: Don't do checksum callbacks if there are no checksums at all
CL: https://r8-review.googlesource.com/c/r8/+/45290
Cherry-pick: Update checksum marker comparison
CL: https://r8-review.googlesource.com/c/r8/+/45289
Change-Id: Ia5c5e636085ea69870af30fbef9e6b07ede932b1
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index ad2811c..e9ad7d9 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.6.50";
+ public static final String LABEL = "1.6.51";
private Version() {
}
diff --git a/src/main/java/com/android/tools/r8/dex/ClassesChecksum.java b/src/main/java/com/android/tools/r8/dex/ClassesChecksum.java
index ffdb9a4..3624975 100644
--- a/src/main/java/com/android/tools/r8/dex/ClassesChecksum.java
+++ b/src/main/java/com/android/tools/r8/dex/ClassesChecksum.java
@@ -83,13 +83,22 @@
assert PREFIX.length() == 3;
char[] prefix = new char[PREFIX.length()];
int prefixLength = string.decodePrefix(prefix);
- return prefixLength == 0
- || (prefixLength == 1 && prefix[0] <= PREFIX_CHAR0)
- || (prefixLength == 2 && prefix[0] == PREFIX_CHAR0 && prefix[1] <= PREFIX_CHAR1)
- || (prefixLength == 3
- && prefix[0] == PREFIX_CHAR0
- && prefix[1] == PREFIX_CHAR1
- && prefix[2] < PREFIX_CHAR2);
+ if (prefixLength == 0) {
+ return true;
+ }
+ if (prefix[0] != PREFIX_CHAR0) {
+ return prefix[0] < PREFIX_CHAR0;
+ }
+ if (prefixLength == 1) {
+ return true;
+ }
+ if (prefix[1] != PREFIX_CHAR1) {
+ return prefix[1] < PREFIX_CHAR1;
+ }
+ if (prefixLength == 2) {
+ return true;
+ }
+ return prefix[2] < PREFIX_CHAR2;
} catch (UTFDataFormatException e) {
throw new RuntimeException("Bad format", e);
}
diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java
index 34244b7..9085e5a 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -715,7 +715,7 @@
AnnotationsDirectory annotationsDirectory = annotationsDirectoryAt(annotationsOffsets[i]);
Long checksum = null;
- if (checksums != null) {
+ if (checksums != null && !checksums.isEmpty()) {
String desc = type.descriptor.toASCIIString();
checksum = checksums.getOrDefault(desc, null);
if (!options.dexClassChecksumFilter.test(desc, checksum)) {
diff --git a/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsHighSortingStrings.java b/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsHighSortingStrings.java
index c5ad260..24601c1 100644
--- a/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsHighSortingStrings.java
+++ b/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsHighSortingStrings.java
@@ -121,6 +121,14 @@
assertTrue(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("~")));
assertTrue(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("}")));
+ assertTrue(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("z")));
+ assertTrue(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("zz")));
+ assertTrue(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("zzz")));
+ assertTrue(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("zzzz")));
+
+ assertTrue(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("this")));
+ assertTrue(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("println")));
+
// False negatives.
assertFalse(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("~~~")));
assertFalse(ClassesChecksum.definitelyPrecedesChecksumMarker(factory.createString("~~~z")));