diff options
author | Joonas Reynders <joonas.reynders@iki.fi> | 2012-01-15 20:07:38 +0200 |
---|---|---|
committer | Pekka Enberg <penberg@kernel.org> | 2012-01-15 20:33:35 +0200 |
commit | d5286abec659b46b821f682a34ba6ea1e69e1798 (patch) | |
tree | c886e2c5e64e89551267343afe0fe4af1fd22d27 | |
parent | 4387f43e1b383aa2ee509791ef366e2b812edc16 (diff) | |
download | jato-d5286abec659b46b821f682a34ba6ea1e69e1798.tar.gz |
Add tests for JNI NewObject functions and fix missing checks for Interface and Abstract classes
Signed-off-by: Joonas Reynders <joonas.reynders@iki.fi>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
-rw-r--r-- | test/functional/java/lang/JNITest.java | 19 | ||||
-rw-r--r-- | test/functional/jni/jnitest.c | 20 | ||||
-rw-r--r-- | vm/jni-interface.c | 14 |
3 files changed, 53 insertions, 0 deletions
diff --git a/test/functional/java/lang/JNITest.java b/test/functional/java/lang/JNITest.java index d8f4e0e3..389045ab 100644 --- a/test/functional/java/lang/JNITest.java +++ b/test/functional/java/lang/JNITest.java @@ -95,6 +95,7 @@ public class JNITest extends TestCase { native static public boolean testJniExceptionOccurredAndExceptionClear(Throwable throwable); native static public boolean testIsSameObject(Object obj, Object sameObj, Object differentObj); native static public boolean testAllocObject(Class<?> clazz); + native static public boolean testNewObject(Class<?> clazz); native static public boolean isInstanceOf(Object obj, Class<?> clazz); private static JNITest jniTest = new JNITest(); @@ -310,6 +311,23 @@ public class JNITest extends TestCase { }, InstantiationException.class); } + public static void testNewObject() { + assertTrue(testNewObject(Object.class)); + assertThrows(new Block() { + public void run() throws Throwable { + // NewObject must throw InstantiationException for an Interface + testNewObject(Runnable.class); + } + }, InstantiationException.class); + + assertThrows(new Block() { + public void run() throws Throwable { + // NewObject must throw InstantiationException for an abstract class + testNewObject(ClassLoader.class); + } + }, InstantiationException.class); + } + public static void testIsInstanceOf() { assertTrue(isInstanceOf(jniTest, JNITest.class)); } @@ -338,6 +356,7 @@ public class JNITest extends TestCase { testExceptionOccurredAndExceptionClear(); testIsSameObject(); testAllocObject(); + testNewObject(); testIsInstanceOf(); } } diff --git a/test/functional/jni/jnitest.c b/test/functional/jni/jnitest.c index 331ffd42..cbdea3aa 100644 --- a/test/functional/jni/jnitest.c +++ b/test/functional/jni/jnitest.c @@ -652,6 +652,26 @@ JNIEXPORT jboolean JNICALL Java_java_lang_JNITest_testAllocObject(JNIEnv *env, j /* * Class: java_lang_JNITest + * Method: testNewObject + * Signature: (Ljava/lang/Class;)Z + */ +JNIEXPORT jboolean JNICALL Java_java_lang_JNITest_testNewObject(JNIEnv *env, jclass clazz, jclass clazzToAlloc) +{ + jmethodID methodID = (*env)->GetMethodID(env, clazzToAlloc, "<init>", "()V"); + + if (methodID == NULL) + return false; + + // TODO: Add check for NewObjectV when it is implemented + if (((*env)->NewObject(env, clazzToAlloc, methodID) != NULL) && + ((*env)->NewObjectA(env, clazzToAlloc, methodID, NULL) != NULL)) + return true; + else + return false; +} + +/* + * Class: java_lang_JNITest * Method: isInstanceOf * Signature: (Ljava/lang/Class;)Ljava/lang/Object; */ diff --git a/vm/jni-interface.c b/vm/jni-interface.c index c87a9778..0c2321fc 100644 --- a/vm/jni-interface.c +++ b/vm/jni-interface.c @@ -527,6 +527,13 @@ static jobject JNI_NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...) return NULL; class = vm_class_get_class_from_class_object(clazz); + check_null(class); + + if (vm_class_is_interface(class) || vm_class_is_abstract(class)) { + signal_new_exception(vm_java_lang_InstantiationException, NULL); + return NULL; + } + obj = vm_object_alloc(class); va_start(args, methodID); @@ -550,6 +557,13 @@ static jobject JNI_NewObjectA(JNIEnv *env, jclass clazz, jmethodID methodID, con enter_vm_from_jni(); vmc = vm_class_get_class_from_class_object(clazz); + check_null(vmc); + + if (vm_class_is_interface(vmc) || vm_class_is_abstract(vmc)) { + signal_new_exception(vm_java_lang_InstantiationException, NULL); + return NULL; + } + result = vm_object_alloc(vmc); unsigned long packed_args[methodID->args_count]; |