< prev index next >
src/hotspot/share/prims/jni.cpp
Print this page
*** 1226,1242 ****
HOTSPOT_JNI_NEWOBJECTA_ENTRY(env, clazz, (uintptr_t) methodID);
jobject obj = NULL;
DT_RETURN_MARK(NewObjectA, jobject, (const jobject)obj);
instanceOop i = alloc_object(clazz, CHECK_NULL);
obj = JNIHandles::make_local(env, i);
JavaValue jvalue(T_VOID);
JNI_ArgumentPusherArray ap(methodID, args);
jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
return obj;
! JNI_END
DT_RETURN_MARK_DECL(NewObjectV, jobject
, HOTSPOT_JNI_NEWOBJECTV_RETURN(_ret_ref));
--- 1226,1255 ----
HOTSPOT_JNI_NEWOBJECTA_ENTRY(env, clazz, (uintptr_t) methodID);
jobject obj = NULL;
DT_RETURN_MARK(NewObjectA, jobject, (const jobject)obj);
+ Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
+ if (k == NULL) {
+ ResourceMark rm(THREAD);
+ THROW_(vmSymbols::java_lang_InstantiationException(), NULL);
+ }
+
+ if (!k->is_value()) {
instanceOop i = alloc_object(clazz, CHECK_NULL);
obj = JNIHandles::make_local(env, i);
JavaValue jvalue(T_VOID);
JNI_ArgumentPusherArray ap(methodID, args);
jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
+ } else {
+ JavaValue jvalue(T_VALUETYPE);
+ JNI_ArgumentPusherArray ap(methodID, args);
+ jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_NULL);
+ obj = jvalue.get_jobject();
+ }
return obj;
! JNI_END
DT_RETURN_MARK_DECL(NewObjectV, jobject
, HOTSPOT_JNI_NEWOBJECTV_RETURN(_ret_ref));
*** 1246,1260 ****
--- 1259,1286 ----
HOTSPOT_JNI_NEWOBJECTV_ENTRY(env, clazz, (uintptr_t) methodID);
jobject obj = NULL;
DT_RETURN_MARK(NewObjectV, jobject, (const jobject&)obj);
+ Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
+ if (k == NULL) {
+ ResourceMark rm(THREAD);
+ THROW_(vmSymbols::java_lang_InstantiationException(), NULL);
+ }
+
+ if (!k->is_value()) {
instanceOop i = alloc_object(clazz, CHECK_NULL);
obj = JNIHandles::make_local(env, i);
JavaValue jvalue(T_VOID);
JNI_ArgumentPusherVaArg ap(methodID, args);
jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
+ } else {
+ JavaValue jvalue(T_VALUETYPE);
+ JNI_ArgumentPusherVaArg ap(methodID, args);
+ jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_NULL);
+ obj = jvalue.get_jobject();
+ }
return obj;
JNI_END
DT_RETURN_MARK_DECL(NewObject, jobject
*** 1266,1283 ****
--- 1292,1325 ----
HOTSPOT_JNI_NEWOBJECT_ENTRY(env, clazz, (uintptr_t) methodID);
jobject obj = NULL;
DT_RETURN_MARK(NewObject, jobject, (const jobject&)obj);
+ Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
+ if (k == NULL) {
+ ResourceMark rm(THREAD);
+ THROW_(vmSymbols::java_lang_InstantiationException(), NULL);
+ }
+
+ if (!k->is_value()) {
instanceOop i = alloc_object(clazz, CHECK_NULL);
obj = JNIHandles::make_local(env, i);
va_list args;
va_start(args, methodID);
JavaValue jvalue(T_VOID);
JNI_ArgumentPusherVaArg ap(methodID, args);
jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
va_end(args);
+ } else {
+ va_list args;
+ va_start(args, methodID);
+ JavaValue jvalue(T_VALUETYPE);
+ JNI_ArgumentPusherVaArg ap(methodID, args);
+ jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_NULL);
+ va_end(args);
+ obj = jvalue.get_jobject();
+ }
return obj;
JNI_END
JNI_ENTRY(jclass, jni_GetObjectClass(JNIEnv *env, jobject obj))
< prev index next >