Remove the native Class.isInstance, and add tests.
Change-Id: I5e669b71e11a6b794e3434e0406d891edd3fe59d
diff --git a/src/java_lang_Class.cc b/src/java_lang_Class.cc
index d16524b..20af47a 100644
--- a/src/java_lang_Class.cc
+++ b/src/java_lang_Class.cc
@@ -365,15 +365,6 @@
return lhs->IsAssignableFrom(rhs) ? JNI_TRUE : JNI_FALSE;
}
-static jboolean Class_isInstance(JNIEnv* env, jobject javaClass, jobject javaObject) {
- Class* c = DecodeClass(env, javaClass);
- Object* o = Decode<Object*>(env, javaObject);
- if (o == NULL) {
- return JNI_FALSE;
- }
- return o->InstanceOf(c) ? JNI_TRUE : JNI_FALSE;
-}
-
// Validate method/field access.
static bool CheckMemberAccess(const Class* access_from, Class* access_to, uint32_t member_flags) {
// quick accept for public access */
@@ -478,7 +469,6 @@
NATIVE_METHOD(Class, getNameNative, "()Ljava/lang/String;"),
NATIVE_METHOD(Class, getProxyInterfaces, "()[Ljava/lang/Class;"),
NATIVE_METHOD(Class, isAssignableFrom, "(Ljava/lang/Class;)Z"),
- NATIVE_METHOD(Class, isInstance, "(Ljava/lang/Object;)Z"),
NATIVE_METHOD(Class, newInstanceImpl, "()Ljava/lang/Object;"),
};
diff --git a/test/031-class-attributes/src/ClassAttrs.java b/test/031-class-attributes/src/ClassAttrs.java
index c3c61bf..8719e3b 100644
--- a/test/031-class-attributes/src/ClassAttrs.java
+++ b/test/031-class-attributes/src/ClassAttrs.java
@@ -70,6 +70,81 @@
System.err.println("FAILED: " + re);
re.printStackTrace();
}
+
+ test_isAssignableFrom();
+ test_isInstance();
+ }
+
+ private static void test_isAssignableFrom() {
+ // Can always assign to things of the same type.
+ assertTrue(String.class.isAssignableFrom(String.class));
+
+ // Can assign any reference to java.lang.Object.
+ assertTrue(Object.class.isAssignableFrom(Object.class));
+ assertTrue(Object.class.isAssignableFrom(Class.class));
+ assertTrue(Object.class.isAssignableFrom(String.class));
+ assertFalse(Object.class.isAssignableFrom(int.class));
+ assertFalse(Object.class.isAssignableFrom(long.class));
+
+ // Interfaces.
+ assertTrue(CharSequence.class.isAssignableFrom(String.class));
+ assertFalse(CharSequence.class.isAssignableFrom(Object.class));
+
+ // Superclasses.
+ assertTrue(AccessibleObject.class.isAssignableFrom(Method.class));
+ assertFalse(Method.class.isAssignableFrom(AccessibleObject.class));
+
+ // Arrays.
+ assertTrue(int[].class.isAssignableFrom(int[].class));
+ assertFalse(int[].class.isAssignableFrom(char[].class));
+ assertFalse(char[].class.isAssignableFrom(int[].class));
+ assertTrue(Object.class.isAssignableFrom(int[].class));
+ assertFalse(int[].class.isAssignableFrom(Object.class));
+
+ try {
+ assertFalse(Object.class.isAssignableFrom(null));
+ fail();
+ } catch (NullPointerException expected) {
+ }
+ }
+
+ private static void test_isInstance() {
+ // Can always assign to things of the same type.
+ assertTrue(String.class.isInstance("hello"));
+
+ // Can assign any reference to java.lang.Object.
+ assertTrue(Object.class.isInstance(new Object()));
+ assertTrue(Object.class.isInstance(Class.class));
+ assertTrue(Object.class.isInstance("hello"));
+
+ // Interfaces.
+ assertTrue(CharSequence.class.isInstance("hello"));
+ assertFalse(CharSequence.class.isInstance(new Object()));
+
+ // Superclasses.
+ assertTrue(AccessibleObject.class.isInstance(Method.class.getDeclaredMethods()[0]));
+ assertFalse(Method.class.isInstance(Method.class.getDeclaredFields()[0]));
+
+ // Arrays.
+ assertTrue(int[].class.isInstance(new int[0]));
+ assertFalse(int[].class.isInstance(new char[0]));
+ assertFalse(char[].class.isInstance(new int[0]));
+ assertTrue(Object.class.isInstance(new int[0]));
+ assertFalse(int[].class.isInstance(new Object()));
+
+ assertFalse(Object.class.isInstance(null));
+ }
+
+ private static void assertTrue(boolean b) {
+ if (!b) throw new RuntimeException();
+ }
+
+ private static void assertFalse(boolean b) {
+ if (b) throw new RuntimeException();
+ }
+
+ private static void fail() {
+ throw new RuntimeException();
}
/* to call the (out-of-scope) <code>getSignatureAttribute</code> methods */