diff options
author | Elliott Hughes <enh@google.com> | 2013-06-14 17:41:43 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2013-06-14 17:41:44 +0000 |
commit | 2f0ce6ab114b1036b06c4bd425cd01cb509260bd (patch) | |
tree | 41d1ba35087755ab49bf21551a899aa60216f173 | |
parent | 6529809bd4448a76622a08cf63829cab73d91b9a (diff) | |
parent | c7f2d5edee6fb52a1e72699eec9899f57f38fca2 (diff) | |
download | android_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.txt | 16 | ||||
-rw-r--r-- | tests/031-class-attributes/src/ClassAttrs.java | 40 | ||||
-rw-r--r-- | vm/oo/Array.cpp | 24 |
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)) { /* |