aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoonas Reynders <joonas.reynders@iki.fi>2012-01-15 20:07:38 +0200
committerPekka Enberg <penberg@kernel.org>2012-01-15 20:33:35 +0200
commitd5286abec659b46b821f682a34ba6ea1e69e1798 (patch)
treec886e2c5e64e89551267343afe0fe4af1fd22d27
parent4387f43e1b383aa2ee509791ef366e2b812edc16 (diff)
downloadjato-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.java19
-rw-r--r--test/functional/jni/jnitest.c20
-rw-r--r--vm/jni-interface.c14
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];