summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2013-06-14 17:41:43 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2013-06-14 17:41:44 +0000
commit2f0ce6ab114b1036b06c4bd425cd01cb509260bd (patch)
tree41d1ba35087755ab49bf21551a899aa60216f173
parent6529809bd4448a76622a08cf63829cab73d91b9a (diff)
parentc7f2d5edee6fb52a1e72699eec9899f57f38fca2 (diff)
downloadandroid_dalvik-2f0ce6ab114b1036b06c4bd425cd01cb509260bd.tar.gz
android_dalvik-2f0ce6ab114b1036b06c4bd425cd01cb509260bd.tar.bz2
android_dalvik-2f0ce6ab114b1036b06c4bd425cd01cb509260bd.zip
Merge "Fix inner class access flags and array modifiers."
-rw-r--r--tests/031-class-attributes/expected.txt16
-rw-r--r--tests/031-class-attributes/src/ClassAttrs.java40
-rw-r--r--vm/oo/Array.cpp24
3 files changed, 67 insertions, 13 deletions
diff --git a/tests/031-class-attributes/expected.txt b/tests/031-class-attributes/expected.txt
index afa3416e2..849487d4b 100644
--- a/tests/031-class-attributes/expected.txt
+++ b/tests/031-class-attributes/expected.txt
@@ -1,3 +1,15 @@
+public abstract final int
+public abstract final [I
+public java.lang.Object
+public abstract final [Ljava.lang.Object;
+public ClassAttrs$PublicInnerClass
+public abstract final [LClassAttrs$PublicInnerClass;
+protected ClassAttrs$ProtectedInnerClass
+protected abstract final [LClassAttrs$ProtectedInnerClass;
+private ClassAttrs$PrivateInnerClass
+private abstract final [LClassAttrs$PrivateInnerClass;
+ ClassAttrs$PackagePrivateInnerClass
+abstract final [LClassAttrs$PackagePrivateInnerClass;
***** class ClassAttrs:
name: ClassAttrs
canonical: ClassAttrs
@@ -11,8 +23,8 @@
enclosingMeth: null
modifiers: 1
package: null
- declaredClasses: [2] class ClassAttrs$PublicMemberClass, class ClassAttrs$MemberClass
- member classes: [1] class ClassAttrs$PublicMemberClass
+ declaredClasses: [6] class ClassAttrs$PublicMemberClass, class ClassAttrs$MemberClass, class ClassAttrs$PackagePrivateInnerClass, class ClassAttrs$PrivateInnerClass, class ClassAttrs$ProtectedInnerClass, class ClassAttrs$PublicInnerClass
+ member classes: [3] class ClassAttrs$PublicMemberClass, class ClassAttrs$ProtectedInnerClass, class ClassAttrs$PublicInnerClass
isAnnotation: false
isAnonymous: false
isArray: false
diff --git a/tests/031-class-attributes/src/ClassAttrs.java b/tests/031-class-attributes/src/ClassAttrs.java
index d93a9257f..e731c2c42 100644
--- a/tests/031-class-attributes/src/ClassAttrs.java
+++ b/tests/031-class-attributes/src/ClassAttrs.java
@@ -5,6 +5,7 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
@@ -21,7 +22,46 @@ public class ClassAttrs {
cinner.showMe();
}
+ public class PublicInnerClass {
+ }
+
+ protected class ProtectedInnerClass {
+ }
+
+ private class PrivateInnerClass {
+ }
+
+ class PackagePrivateInnerClass {
+ }
+
+ private static void showModifiers(Class<?> c) {
+ System.out.println(Modifier.toString(c.getModifiers()) + " " + c.getName());
+ }
+
+ // https://code.google.com/p/android/issues/detail?id=56267
+ private static void test56267() {
+ // Primitive classes.
+ showModifiers(int.class);
+ showModifiers(int[].class);
+
+ // Regular classes.
+ showModifiers(Object.class);
+ showModifiers(Object[].class);
+
+ // Inner classes.
+ showModifiers(PublicInnerClass.class);
+ showModifiers(PublicInnerClass[].class);
+ showModifiers(ProtectedInnerClass.class);
+ showModifiers(ProtectedInnerClass[].class);
+ showModifiers(PrivateInnerClass.class);
+ showModifiers(PrivateInnerClass[].class);
+ showModifiers(PackagePrivateInnerClass.class);
+ showModifiers(PackagePrivateInnerClass[].class);
+ }
+
public static void main() {
+ test56267();
+
printClassAttrs(ClassAttrs.class);
printClassAttrs(OtherClass.class);
printClassAttrs(OtherPackageClass.class);
diff --git a/vm/oo/Array.cpp b/vm/oo/Array.cpp
index 00ec6d901..a03b29551 100644
--- a/vm/oo/Array.cpp
+++ b/vm/oo/Array.cpp
@@ -436,20 +436,22 @@ static ClassObject* createArrayClass(const char* descriptor, Object* loader)
/*
* Inherit access flags from the element. Arrays can't be used as a
- * superclass or interface, so we want to add "final" and remove
+ * superclass or interface, so we want to add "abstract final" and remove
* "interface".
- *
- * Don't inherit any non-standard flags (e.g., CLASS_FINALIZABLE)
- * from elementClass. We assume that the array class does not
- * override finalize().
*/
- newClass->accessFlags = ((newClass->elementClass->accessFlags &
- ~ACC_INTERFACE) | ACC_FINAL) & JAVA_FLAGS_MASK;
+ int accessFlags = elementClass->accessFlags;
+ if (!gDvm.optimizing) {
+ // If the element class is an inner class, make sure we get the correct access flags.
+ StringObject* className = NULL;
+ dvmGetInnerClass(elementClass, &className, &accessFlags);
+ dvmReleaseTrackedAlloc((Object*) className, NULL);
+ }
+ accessFlags &= JAVA_FLAGS_MASK;
+ accessFlags &= ~ACC_INTERFACE;
+ accessFlags |= ACC_ABSTRACT | ACC_FINAL;
- /* Set the flags we determined above.
- * This must happen after accessFlags is set.
- */
- SET_CLASS_FLAG(newClass, extraFlags);
+ // Set the flags we determined above.
+ SET_CLASS_FLAG(newClass, accessFlags | extraFlags);
if (!dvmAddClassToHash(newClass)) {
/*