< 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 >