3493 return CurrentVersion;
3494 JNI_END
3495
3496 extern struct JavaVM_ main_vm;
3497
3498 JNI_LEAF(jint, jni_GetJavaVM(JNIEnv *env, JavaVM **vm))
3499 JNIWrapper("jni_GetJavaVM");
3500 HOTSPOT_JNI_GETJAVAVM_ENTRY(env, (void **) vm);
3501 *vm = (JavaVM *)(&main_vm);
3502 HOTSPOT_JNI_GETJAVAVM_RETURN(JNI_OK);
3503 return JNI_OK;
3504 JNI_END
3505
3506
3507 JNI_ENTRY(jobject, jni_GetModule(JNIEnv* env, jclass clazz))
3508 JNIWrapper("GetModule");
3509 return Modules::get_module(clazz, THREAD);
3510 JNI_END
3511
3512
3513 // Structure containing all jni functions
3514 struct JNINativeInterface_ jni_NativeInterface = {
3515 NULL,
3516 NULL,
3517 NULL,
3518
3519 NULL,
3520
3521 jni_GetVersion,
3522
3523 jni_DefineClass,
3524 jni_FindClass,
3525
3526 jni_FromReflectedMethod,
3527 jni_FromReflectedField,
3528
3529 jni_ToReflectedMethod,
3530
3531 jni_GetSuperclass,
3532 jni_IsAssignableFrom,
3776 jni_ReleasePrimitiveArrayCritical,
3777
3778 jni_GetStringCritical,
3779 jni_ReleaseStringCritical,
3780
3781 jni_NewWeakGlobalRef,
3782 jni_DeleteWeakGlobalRef,
3783
3784 jni_ExceptionCheck,
3785
3786 jni_NewDirectByteBuffer,
3787 jni_GetDirectBufferAddress,
3788 jni_GetDirectBufferCapacity,
3789
3790 // New 1_6 features
3791
3792 jni_GetObjectRefType,
3793
3794 // Module features
3795
3796 jni_GetModule
3797 };
3798
3799
3800 // For jvmti use to modify jni function table.
3801 // Java threads in native contiues to run until it is transitioned
3802 // to VM at safepoint. Before the transition or before it is blocked
3803 // for safepoint it may access jni function table. VM could crash if
3804 // any java thread access the jni function table in the middle of memcpy.
3805 // To avoid this each function pointers are copied automically.
3806 void copy_jni_function_table(const struct JNINativeInterface_ *new_jni_NativeInterface) {
3807 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
3808 intptr_t *a = (intptr_t *) jni_functions();
3809 intptr_t *b = (intptr_t *) new_jni_NativeInterface;
3810 for (uint i=0; i < sizeof(struct JNINativeInterface_)/sizeof(void *); i++) {
3811 Atomic::store(*b++, a++);
3812 }
3813 }
3814
3815 void quicken_jni_functions() {
3816 // Replace Get<Primitive>Field with fast versions
|
3493 return CurrentVersion;
3494 JNI_END
3495
3496 extern struct JavaVM_ main_vm;
3497
3498 JNI_LEAF(jint, jni_GetJavaVM(JNIEnv *env, JavaVM **vm))
3499 JNIWrapper("jni_GetJavaVM");
3500 HOTSPOT_JNI_GETJAVAVM_ENTRY(env, (void **) vm);
3501 *vm = (JavaVM *)(&main_vm);
3502 HOTSPOT_JNI_GETJAVAVM_RETURN(JNI_OK);
3503 return JNI_OK;
3504 JNI_END
3505
3506
3507 JNI_ENTRY(jobject, jni_GetModule(JNIEnv* env, jclass clazz))
3508 JNIWrapper("GetModule");
3509 return Modules::get_module(clazz, THREAD);
3510 JNI_END
3511
3512
3513 JNI_ENTRY(void*, jni_GetFlattenedArrayElements(JNIEnv* env, jarray array, jboolean* isCopy))
3514 JNIWrapper("jni_GetFlattenedArrayElements");
3515 if (isCopy != NULL) {
3516 *isCopy = JNI_FALSE;
3517 }
3518 arrayOop ar = arrayOop(JNIHandles::resolve_non_null(array));
3519 if (!ar->is_array()) {
3520 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Not an array");
3521 }
3522 if (!ar->is_valueArray()) {
3523 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Not a flattened array");
3524 }
3525 ValueArrayKlass* vak = ValueArrayKlass::cast(ar->klass());
3526 if (vak->contains_oops()) {
3527 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Flattened array contains oops");
3528 }
3529 oop a = lock_gc_or_pin_object(thread, array);
3530 valueArrayOop vap = valueArrayOop(a);
3531 void* ret = vap->value_at_addr(0, vak->layout_helper());
3532 return ret;
3533 JNI_END
3534
3535 JNI_ENTRY(void, jni_ReleaseFlattenedArrayElements(JNIEnv* env, jarray array, void* elem, jint mode))
3536 JNIWrapper("jni_ReleaseFlattenedArrayElements");
3537 unlock_gc_or_unpin_object(thread, array);
3538 JNI_END
3539
3540 JNI_ENTRY(jsize, jni_GetFlattenedArrayElementSize(JNIEnv* env, jarray array)) {
3541 JNIWrapper("jni_GetFlattenedElementSize");
3542 arrayOop a = arrayOop(JNIHandles::resolve_non_null(array));
3543 if (!a->is_array()) {
3544 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Not an array");
3545 }
3546 if (!a->is_valueArray()) {
3547 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Not a flattened array");
3548 }
3549 ValueArrayKlass* vak = ValueArrayKlass::cast(a->klass());
3550 jsize ret = vak->element_byte_size();
3551 return ret;
3552 }
3553 JNI_END
3554
3555 JNI_ENTRY(jclass, jni_GetFlattenedArrayElementClass(JNIEnv* env, jarray array))
3556 JNIWrapper("jni_GetArrayElementClass");
3557 arrayOop a = arrayOop(JNIHandles::resolve_non_null(array));
3558 if (!a->is_array()) {
3559 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Not an array");
3560 }
3561 if (!a->is_valueArray()) {
3562 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Not a flattened array");
3563 }
3564 ValueArrayKlass* vak = ValueArrayKlass::cast(a->klass());
3565 ValueKlass* vk = vak->element_klass();
3566 return (jclass) JNIHandles::make_local(vk->java_mirror());
3567 JNI_END
3568
3569 JNI_ENTRY(jsize, jni_GetFieldOffsetInFlattenedLayout(JNIEnv* env, jclass clazz, const char *name, const char *signature, jboolean* isFlattened))
3570 JNIWrapper("jni_GetFieldOffsetInFlattenedLayout");
3571
3572 oop mirror = JNIHandles::resolve_non_null(clazz);
3573 Klass* k = java_lang_Class::as_Klass(mirror);
3574 if (!k->is_value()) {
3575 ResourceMark rm;
3576 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), err_msg("%s has not flattened layout", k->external_name()));
3577 }
3578 ValueKlass* vk = ValueKlass::cast(k);
3579
3580 TempNewSymbol fieldname = SymbolTable::probe(name, (int)strlen(name));
3581 TempNewSymbol signame = SymbolTable::probe(signature, (int)strlen(signature));
3582 if (fieldname == NULL || signame == NULL) {
3583 ResourceMark rm;
3584 THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), err_msg("%s.%s %s", vk->external_name(), name, signature));
3585 }
3586
3587 assert(vk->is_initialized(), "If a flattened array has been created, the element klass must have been initialized");
3588
3589 fieldDescriptor fd;
3590 if (!vk->is_instance_klass() ||
3591 !InstanceKlass::cast(vk)->find_field(fieldname, signame, false, &fd)) {
3592 ResourceMark rm;
3593 THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), err_msg("%s.%s %s", vk->external_name(), name, signature));
3594 }
3595
3596 int offset = fd.offset() - vk->first_field_offset();
3597 if (isFlattened != NULL) {
3598 *isFlattened = fd.is_flattened();
3599 }
3600 return (jsize)offset;
3601 JNI_END
3602
3603 // Structure containing all jni functions
3604 struct JNINativeInterface_ jni_NativeInterface = {
3605 NULL,
3606 NULL,
3607 NULL,
3608
3609 NULL,
3610
3611 jni_GetVersion,
3612
3613 jni_DefineClass,
3614 jni_FindClass,
3615
3616 jni_FromReflectedMethod,
3617 jni_FromReflectedField,
3618
3619 jni_ToReflectedMethod,
3620
3621 jni_GetSuperclass,
3622 jni_IsAssignableFrom,
3866 jni_ReleasePrimitiveArrayCritical,
3867
3868 jni_GetStringCritical,
3869 jni_ReleaseStringCritical,
3870
3871 jni_NewWeakGlobalRef,
3872 jni_DeleteWeakGlobalRef,
3873
3874 jni_ExceptionCheck,
3875
3876 jni_NewDirectByteBuffer,
3877 jni_GetDirectBufferAddress,
3878 jni_GetDirectBufferCapacity,
3879
3880 // New 1_6 features
3881
3882 jni_GetObjectRefType,
3883
3884 // Module features
3885
3886 jni_GetModule,
3887
3888 // Flattened arrays features
3889
3890 jni_GetFlattenedArrayElements,
3891 jni_ReleaseFlattenedArrayElements,
3892 jni_GetFlattenedArrayElementClass,
3893 jni_GetFlattenedArrayElementSize,
3894 jni_GetFieldOffsetInFlattenedLayout
3895 };
3896
3897
3898 // For jvmti use to modify jni function table.
3899 // Java threads in native contiues to run until it is transitioned
3900 // to VM at safepoint. Before the transition or before it is blocked
3901 // for safepoint it may access jni function table. VM could crash if
3902 // any java thread access the jni function table in the middle of memcpy.
3903 // To avoid this each function pointers are copied automically.
3904 void copy_jni_function_table(const struct JNINativeInterface_ *new_jni_NativeInterface) {
3905 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
3906 intptr_t *a = (intptr_t *) jni_functions();
3907 intptr_t *b = (intptr_t *) new_jni_NativeInterface;
3908 for (uint i=0; i < sizeof(struct JNINativeInterface_)/sizeof(void *); i++) {
3909 Atomic::store(*b++, a++);
3910 }
3911 }
3912
3913 void quicken_jni_functions() {
3914 // Replace Get<Primitive>Field with fast versions
|