diff options
author | Jeff Hao <jeffhao@google.com> | 2014-03-13 22:38:40 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-03-13 22:38:41 +0000 |
commit | 27d08a924481389a45d5fbca43ffdc72496038d1 (patch) | |
tree | c910a8bf102adcf9499ba90ee411a67c0f18256e | |
parent | 0c6afa40af7b9f097131126d084d5f19c2accaac (diff) | |
parent | 7170092b783c35cf48aaeafe903acad4eee81efc (diff) | |
download | android_art-27d08a924481389a45d5fbca43ffdc72496038d1.tar.gz android_art-27d08a924481389a45d5fbca43ffdc72496038d1.tar.bz2 android_art-27d08a924481389a45d5fbca43ffdc72496038d1.zip |
Merge "Search for miranda methods in virtual methods instead of interface." into klp-dev
-rw-r--r-- | runtime/mirror/class-inl.h | 2 | ||||
-rw-r--r-- | test/040-miranda/expected.txt | 2 | ||||
-rw-r--r-- | test/040-miranda/src/Main.java | 13 | ||||
-rw-r--r-- | test/JniTest/JniTest.java | 22 | ||||
-rw-r--r-- | test/JniTest/jni_test.cc | 8 |
5 files changed, 46 insertions, 1 deletions
diff --git a/runtime/mirror/class-inl.h b/runtime/mirror/class-inl.h index 1e1138745d..998ebe1a8f 100644 --- a/runtime/mirror/class-inl.h +++ b/runtime/mirror/class-inl.h @@ -241,7 +241,7 @@ inline ArtMethod* Class::FindVirtualMethodForVirtualOrInterface(ArtMethod* metho if (method->IsDirect()) { return method; } - if (method->GetDeclaringClass()->IsInterface()) { + if (method->GetDeclaringClass()->IsInterface() && !method->IsMiranda()) { return FindVirtualMethodForInterface(method); } return FindVirtualMethodForVirtual(method); diff --git a/test/040-miranda/expected.txt b/test/040-miranda/expected.txt index e22bbd974c..011be2af86 100644 --- a/test/040-miranda/expected.txt +++ b/test/040-miranda/expected.txt @@ -10,3 +10,5 @@ MirandaAbstract / MirandaClass2: inInterface: true inInterface2: 28 inAbstract: true +Test getting miranda method via reflection: + caught expected NoSuchMethodException diff --git a/test/040-miranda/src/Main.java b/test/040-miranda/src/Main.java index 1fd8287ba0..ff5eba0a17 100644 --- a/test/040-miranda/src/Main.java +++ b/test/040-miranda/src/Main.java @@ -14,6 +14,8 @@ * limitations under the License. */ +import java.lang.reflect.Method; + /** * Miranda testing. */ @@ -37,5 +39,16 @@ public class Main { System.out.println(" inInterface: " + mira2.inInterface()); System.out.println(" inInterface2: " + mira2.inInterface2()); System.out.println(" inAbstract: " + mira2.inAbstract()); + + System.out.println("Test getting miranda method via reflection:"); + try { + Class mirandaClass = Class.forName("MirandaAbstract"); + Method mirandaMethod = mirandaClass.getDeclaredMethod("inInterface", (Class[]) null); + System.out.println(" did not expect to find miranda method"); + } catch (NoSuchMethodException nsme) { + System.out.println(" caught expected NoSuchMethodException"); + } catch (Exception e) { + System.out.println(" caught unexpected exception " + e); + } } } diff --git a/test/JniTest/JniTest.java b/test/JniTest/JniTest.java index 7014ef9334..a1b1f0c69d 100644 --- a/test/JniTest/JniTest.java +++ b/test/JniTest/JniTest.java @@ -14,11 +14,14 @@ * limitations under the License. */ +import java.lang.reflect.Method; + class JniTest { public static void main(String[] args) { System.loadLibrary("arttest"); testFindClassOnAttachedNativeThread(); testCallStaticVoidMethodOnSubClass(); + testGetMirandaMethod(); } private static native void testFindClassOnAttachedNativeThread(); @@ -42,4 +45,23 @@ class JniTest { private static class testCallStaticVoidMethodOnSubClass_SubClass extends testCallStaticVoidMethodOnSubClass_SuperClass { } + + private static native Method testGetMirandaMethodNative(); + + private static void testGetMirandaMethod() { + Method m = testGetMirandaMethodNative(); + if (m.getDeclaringClass() != testGetMirandaMethod_MirandaInterface.class) { + throw new AssertionError(); + } + } + + private static abstract class testGetMirandaMethod_MirandaAbstract implements testGetMirandaMethod_MirandaInterface { + public boolean inAbstract() { + return true; + } + } + + private static interface testGetMirandaMethod_MirandaInterface { + public boolean inInterface(); + } } diff --git a/test/JniTest/jni_test.cc b/test/JniTest/jni_test.cc index 72a3309d9d..cfcbb64f38 100644 --- a/test/JniTest/jni_test.cc +++ b/test/JniTest/jni_test.cc @@ -81,3 +81,11 @@ extern "C" JNIEXPORT void JNICALL Java_JniTest_testCallStaticVoidMethodOnSubClas env->CallStaticVoidMethod(sub_class, execute); } + +extern "C" JNIEXPORT jobject JNICALL Java_JniTest_testGetMirandaMethodNative(JNIEnv* env, jclass) { + jclass abstract_class = env->FindClass("JniTest$testGetMirandaMethod_MirandaAbstract"); + assert(abstract_class != NULL); + jmethodID miranda_method = env->GetMethodID(abstract_class, "inInterface", "()Z"); + assert(miranda_method != NULL); + return env->ToReflectedMethod(abstract_class, miranda_method, JNI_FALSE); +} |