Don't parse private members on library classes.
Change-Id: I8936e1009a8e875ce38006cdc6be5055404df2bd
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
index 3a1dfc5..1f06ada 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
@@ -92,6 +92,10 @@
return accessFlags.isStatic();
}
+ public boolean isPrivate() {
+ return accessFlags.isPrivate();
+ }
+
@Override
public boolean isStaticMember() {
return isStatic();
diff --git a/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java b/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java
index 2bd517e..759f411 100644
--- a/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java
@@ -47,7 +47,10 @@
annotations,
origin,
skipNameValidationForTesting);
- assert Arrays.stream(directMethods).noneMatch(DexEncodedMethod::isClassInitializer);
+ assert Arrays.stream(directMethods).allMatch(DexLibraryClass::verifyLibraryMethod);
+ assert Arrays.stream(virtualMethods).allMatch(DexLibraryClass::verifyLibraryMethod);
+ assert Arrays.stream(staticFields).allMatch(DexLibraryClass::verifyLibraryField);
+ assert Arrays.stream(instanceFields).allMatch(DexLibraryClass::verifyLibraryField);
// Set all static field values to unknown. We don't want to use the value from the library
// at compile time, as it can be different at runtime.
for (DexEncodedField staticField : staticFields) {
@@ -56,6 +59,19 @@
assert kind == Kind.CF : "Invalid kind " + kind + " for library-path class " + type;
}
+ private static boolean verifyLibraryMethod(DexEncodedMethod method) {
+ assert !method.isClassInitializer();
+ assert !method.isPrivateMethod();
+ assert !method.hasCode();
+ return true;
+ }
+
+ private static boolean verifyLibraryField(DexEncodedField field) {
+ assert !field.isPrivate();
+ assert !field.isStatic() || !field.hasExplicitStaticValue();
+ return true;
+ }
+
@Override
public void collectIndexedItems(IndexedItemCollection indexedItems,
DexMethod method, int instructionOffset) {
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
index eb8d1ce..6a7c0d6 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -134,6 +134,10 @@
return access & ~ACC_SYNTHETIC_ATTRIBUTE & ~ACC_DEPRECATED;
}
+ public static FieldAccessFlags createFieldAccessFlags(int access) {
+ return FieldAccessFlags.fromCfAccessFlags(cleanAccessFlags(access));
+ }
+
public static MethodAccessFlags createMethodAccessFlags(String name, int access) {
boolean isConstructor =
name.equals(Constants.INSTANCE_INITIALIZER_NAME)
@@ -290,7 +294,14 @@
@Override
public FieldVisitor visitField(
int access, String name, String desc, String signature, Object value) {
- return new CreateFieldVisitor(this, access, name, desc, signature, value);
+ if (classKind == ClassKind.LIBRARY) {
+ FieldAccessFlags flags = createFieldAccessFlags(access);
+ if (flags.isPrivate()) {
+ return null;
+ }
+ }
+ return new CreateFieldVisitor(
+ this, access, name, desc, signature, classKind == ClassKind.LIBRARY ? null : value);
}
@Override
@@ -298,7 +309,7 @@
int access, String name, String desc, String signature, String[] exceptions) {
if (classKind == ClassKind.LIBRARY) {
MethodAccessFlags flags = createMethodAccessFlags(name, access);
- if (flags.isStatic() && flags.isConstructor()) {
+ if ((flags.isStatic() && flags.isConstructor()) || flags.isPrivate()) {
return null;
}
}
@@ -462,7 +473,7 @@
@Override
public void visitEnd() {
- FieldAccessFlags flags = FieldAccessFlags.fromCfAccessFlags(cleanAccessFlags(access));
+ FieldAccessFlags flags = createFieldAccessFlags(access);
DexField dexField = parent.application.getField(parent.type, name, desc);
Wrapper<DexField> signature = FieldSignatureEquivalence.get().wrap(dexField);
if (parent.fieldSignatures.add(signature)) {