Merge "Revert "Enforce class access flags to be valid.""
diff --git a/src/main/java/com/android/tools/r8/dex/Constants.java b/src/main/java/com/android/tools/r8/dex/Constants.java
index 7a3d631..12ae77f 100644
--- a/src/main/java/com/android/tools/r8/dex/Constants.java
+++ b/src/main/java/com/android/tools/r8/dex/Constants.java
@@ -14,9 +14,6 @@
/** vdex file version number for Android O (API level 26) */
public static final int ANDROID_O_VDEX_VERSION = 10;
- // We apply Java 7 class file constraints on DEX files.
- public static final int CORRESPONDING_CLASS_FILE_VERSION = 51;
-
public static final int DEX_MAGIC_SIZE = 8;
public static final int MAGIC_OFFSET = 0;
diff --git a/src/main/java/com/android/tools/r8/dex/DexFileReader.java b/src/main/java/com/android/tools/r8/dex/DexFileReader.java
index 812273b..e3559fe 100644
--- a/src/main/java/com/android/tools/r8/dex/DexFileReader.java
+++ b/src/main/java/com/android/tools/r8/dex/DexFileReader.java
@@ -10,7 +10,6 @@
import com.android.tools.r8.code.Instruction;
import com.android.tools.r8.code.InstructionFactory;
-import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.graph.ClassAccessFlags;
import com.android.tools.r8.graph.ClassKind;
import com.android.tools.r8.graph.Descriptor;
@@ -638,14 +637,10 @@
DexType superclass = superclassIdx == NO_INDEX ? null : indexedItems.getType(superclassIdx);
int srcIdx = sourceFileIndices[i];
DexString source = srcIdx == NO_INDEX ? null : indexedItems.getString(srcIdx);
+ // fix annotations.
DexType type = indexedItems.getType(classIndices[i]);
ClassAccessFlags flags = ClassAccessFlags.fromDexAccessFlags(accessFlags[i]);
- // Check if constraints from
- // https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1 are met.
- if (!flags.areValid(Constants.CORRESPONDING_CLASS_FILE_VERSION)) {
- throw new CompilationError("Class " + type.toSourceString()
- + " has illegal access flags. Found: " + flags, origin);
- }
+ DexClass clazz;
DexEncodedField[] staticFields = DexEncodedField.EMPTY_ARRAY;
DexEncodedField[] instanceFields = DexEncodedField.EMPTY_ARRAY;
DexEncodedMethod[] directMethods = DexEncodedMethod.EMPTY_ARRAY;
@@ -680,21 +675,22 @@
AttributesAndAnnotations attrs =
new AttributesAndAnnotations(type, annotationsDirectory.clazz, dexItemFactory);
- DexClass clazz = classKind.create(
- type,
- Kind.DEX,
- origin,
- flags,
- superclass,
- typeListAt(interfacesOffsets[i]),
- source,
- attrs.getEnclosingMethodAttribute(),
- attrs.getInnerClasses(),
- attrs.getAnnotations(),
- staticFields,
- instanceFields,
- directMethods,
- virtualMethods);
+ clazz =
+ classKind.create(
+ type,
+ Kind.DEX,
+ origin,
+ flags,
+ superclass,
+ typeListAt(interfacesOffsets[i]),
+ source,
+ attrs.getEnclosingMethodAttribute(),
+ attrs.getInnerClasses(),
+ attrs.getAnnotations(),
+ staticFields,
+ instanceFields,
+ directMethods,
+ virtualMethods);
classCollection.accept(clazz); // Update the application object.
}
}
@@ -941,7 +937,7 @@
MethodHandleType type = MethodHandleType.getKind(file.getUshort());
file.getUshort(); // unused
int indexFieldOrMethod = file.getUshort();
- Descriptor<? extends DexItem, ? extends Descriptor<?, ?>> fieldOrMethod;
+ Descriptor<? extends DexItem, ? extends Descriptor<?,?>> fieldOrMethod;
switch (type) {
case INSTANCE_GET:
case INSTANCE_PUT:
diff --git a/src/main/java/com/android/tools/r8/errors/CompilationError.java b/src/main/java/com/android/tools/r8/errors/CompilationError.java
index 4409816..060699e 100644
--- a/src/main/java/com/android/tools/r8/errors/CompilationError.java
+++ b/src/main/java/com/android/tools/r8/errors/CompilationError.java
@@ -3,13 +3,11 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.errors;
-import com.android.tools.r8.origin.Origin;
-
/**
* Exception to signal an compilation error.
- * <p>
- * This is always an expected error and considered a user input issue. A user-understandable message
- * must be provided.
+ *
+ * This is always an expected error and considered a user input issue.
+ * A user-understandable message must be provided.
*/
public class CompilationError extends RuntimeException {
@@ -20,8 +18,4 @@
public CompilationError(String message, Throwable cause) {
super(message, cause);
}
-
- public CompilationError(String message, Origin origin) {
- super(origin + ": " + message);
- }
}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/r8/graph/AccessFlags.java b/src/main/java/com/android/tools/r8/graph/AccessFlags.java
index e2654aa..9f0471e 100644
--- a/src/main/java/com/android/tools/r8/graph/AccessFlags.java
+++ b/src/main/java/com/android/tools/r8/graph/AccessFlags.java
@@ -166,26 +166,20 @@
public String toSmaliString() {
- return toStringInternal(true);
+ return toString();
}
@Override
public String toString() {
- return toStringInternal(false);
- }
-
- private String toStringInternal(boolean ignoreSuper) {
List<String> names = getNames();
List<BooleanSupplier> predicates = getPredicates();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < names.size(); i++) {
if (predicates.get(i).getAsBoolean()) {
- if (!ignoreSuper || !names.get(i).equals("super")) {
- if (builder.length() > 0) {
- builder.append(' ');
- }
- builder.append(names.get(i));
+ if (builder.length() > 0) {
+ builder.append(' ');
}
+ builder.append(names.get(i));
}
}
return builder.toString();
diff --git a/src/main/java/com/android/tools/r8/graph/ClassAccessFlags.java b/src/main/java/com/android/tools/r8/graph/ClassAccessFlags.java
index 2ae041e..6430924 100644
--- a/src/main/java/com/android/tools/r8/graph/ClassAccessFlags.java
+++ b/src/main/java/com/android/tools/r8/graph/ClassAccessFlags.java
@@ -33,7 +33,6 @@
.add("abstract")
.add("annotation")
.add("enum")
- .add("super")
.build();
}
@@ -45,7 +44,6 @@
.add(this::isAbstract)
.add(this::isAnnotation)
.add(this::isEnum)
- .add(this::isSuper)
.build();
}
@@ -82,27 +80,6 @@
return flags;
}
- /**
- * Checks whether the constraints from
- * https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1 are met.
- */
- public boolean areValid(int majorVersion) {
- if (isInterface()) {
- // We ignore the super flags prior to JDK 9, as so did the VM.
- if ((majorVersion >= 53) && isSuper()) {
- return false;
- }
- // We require interfaces to be abstract from JDK 7 onwards. Old versions of javac seem to
- // have produces package-info classes that are interfaces but not abstract.
- if ((majorVersion >= 51) && (!isAbstract())) {
- return false;
- }
- return !isFinal() && !isEnum();
- } else {
- return !isAnnotation() && (!isFinal() || !isAbstract());
- }
- }
-
public boolean isInterface() {
return isSet(Constants.ACC_INTERFACE);
}
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 ba8a672..868ac10 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -8,7 +8,6 @@
import static org.objectweb.asm.Opcodes.ASM6;
import com.android.tools.r8.dex.Constants;
-import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DexValue.DexValueAnnotation;
import com.android.tools.r8.graph.DexValue.DexValueArray;
@@ -32,7 +31,6 @@
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
-import java.util.Objects;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import org.objectweb.asm.AnnotationVisitor;
@@ -102,7 +100,6 @@
}
private static class CreateDexClassVisitor extends ClassVisitor {
-
private final Origin origin;
private final ClassKind classKind;
private final JarApplicationReader application;
@@ -166,21 +163,6 @@
this.version = version;
accessFlags = ClassAccessFlags.fromCfAccessFlags(cleanAccessFlags(access));
type = application.getTypeFromName(name);
- // Check if constraints from
- // https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1 are met.
- if (!accessFlags.areValid(getMajorVersion())) {
- throw new CompilationError("Illegal class file: Class " + name
- + " has invalid access flags. Found: " + accessFlags.toString(), origin);
- }
- if (superName == null && !name.equals(Constants.JAVA_LANG_OBJECT_NAME)) {
- throw new CompilationError("Illegal class file: Class " + name
- + " is missing a super type.", origin);
- }
- if (accessFlags.isInterface()
- && !Objects.equals(superName, Constants.JAVA_LANG_OBJECT_NAME)) {
- throw new CompilationError("Illegal class file: Interface " + name
- + " must extend class java.lang.Object. Found: " + Objects.toString(superName), origin);
- }
assert superName != null || name.equals(Constants.JAVA_LANG_OBJECT_NAME);
superType = superName == null ? null : application.getTypeFromName(superName);
this.interfaces = application.getTypeListFromNames(interfaces);
@@ -196,8 +178,8 @@
}
if (debug != null) {
getAnnotations().add(
- DexAnnotation.createSourceDebugExtensionAnnotation(
- new DexValueString(application.getString(debug)), application.getFactory()));
+ DexAnnotation.createSourceDebugExtensionAnnotation(
+ new DexValueString(application.getString(debug)), application.getFactory()));
}
}
@@ -278,14 +260,6 @@
}
return annotations;
}
-
- private int getMajorVersion() {
- return version & 0xFFFF;
- }
-
- private int getMinorVersion() {
- return ((version >> 16) & 0xFFFF);
- }
}
private static DexAnnotationSet createAnnotationSet(List<DexAnnotation> annotations) {
@@ -295,7 +269,6 @@
}
private static class CreateFieldVisitor extends FieldVisitor {
-
private final CreateDexClassVisitor parent;
private final int access;
private final String name;
@@ -393,7 +366,6 @@
}
private static class CreateMethodVisitor extends MethodVisitor {
-
private final int access;
private final String name;
private final String desc;
@@ -569,7 +541,6 @@
}
private static class CreateAnnotationVisitor extends AnnotationVisitor {
-
private final JarApplicationReader application;
private final BiConsumer<List<DexString>, List<DexValue>> onVisitEnd;
private List<DexString> names = null;
@@ -615,7 +586,7 @@
private void addElement(String name, DexValue value) {
if (name != null) {
- if (names == null) {
+ if (names == null){
names = new ArrayList<>();
}
names.add(application.getString(name));
diff --git a/src/main/java/com/android/tools/r8/utils/DirectoryClassFileProvider.java b/src/main/java/com/android/tools/r8/utils/DirectoryClassFileProvider.java
index e8ee800..eba7f8e 100644
--- a/src/main/java/com/android/tools/r8/utils/DirectoryClassFileProvider.java
+++ b/src/main/java/com/android/tools/r8/utils/DirectoryClassFileProvider.java
@@ -4,7 +4,6 @@
package com.android.tools.r8.utils;
import static com.android.tools.r8.utils.FileUtils.CLASS_EXTENSION;
-import static com.android.tools.r8.utils.FileUtils.isClassFile;
import com.android.tools.r8.ClassFileResourceProvider;
import com.android.tools.r8.Resource;
@@ -42,9 +41,10 @@
if (child.isDirectory()) {
collectClassDescriptors(child.toPath(), result);
} else {
- Path relative = root.relativize(child.toPath());
- if (isClassFile(relative)) {
- result.add(DescriptorUtils.guessTypeDescriptor(relative));
+ String relative = root.relativize(child.toPath()).toString();
+ if (relative.endsWith(CLASS_EXTENSION)) {
+ result.add("L" + relative.substring(
+ 0, relative.length() - CLASS_EXTENSION.length()) + ";");
}
}
}
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index f0967bf..5eb7168 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -855,7 +855,6 @@
.put("960-default-smali", TestCondition.match(TestCondition.R8_COMPILER))
.put("966-default-conflict", TestCondition.match(TestCondition.R8_COMPILER))
.put("972-iface-super-multidex", TestCondition.match(TestCondition.R8_COMPILER))
- .put("161-final-abstract-class", TestCondition.any())
.build();
// Tests that does not have dex input for some toolchains.
diff --git a/src/test/smali/illegal-invokes/Iface.smali b/src/test/smali/illegal-invokes/Iface.smali
index 5f074dce..d66777c 100644
--- a/src/test/smali/illegal-invokes/Iface.smali
+++ b/src/test/smali/illegal-invokes/Iface.smali
@@ -2,7 +2,7 @@
# 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.
-.class interface public abstract LIface;
+.class interface public LIface;
.super Ljava/lang/Object;
.method public abstract bar()V