3719 JVMWrapper("JVM_SupportsCX8");
3720 return VM_Version::supports_cx8();
3721 JVM_END
3722
3723 JVM_ENTRY(void, JVM_InitializeFromArchive(JNIEnv* env, jclass cls))
3724 JVMWrapper("JVM_InitializeFromArchive");
3725 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
3726 assert(k->is_klass(), "just checking");
3727 HeapShared::initialize_from_archived_subgraph(k);
3728 JVM_END
3729
3730 JVM_ENTRY(void, JVM_RegisterLambdaProxyClassForArchiving(JNIEnv* env,
3731 jclass caller,
3732 jstring invokedName,
3733 jobject invokedType,
3734 jobject methodType,
3735 jobject implMethodMember,
3736 jobject instantiatedMethodType,
3737 jclass lambdaProxyClass))
3738 JVMWrapper("JVM_RegisterLambdaProxyClassForArchiving");
3739 if (!DynamicDumpSharedSpaces) {
3740 return;
3741 }
3742
3743 Klass* caller_k = java_lang_Class::as_Klass(JNIHandles::resolve(caller));
3744 InstanceKlass* caller_ik = InstanceKlass::cast(caller_k);
3745 if (caller_ik->is_hidden() || caller_ik->is_unsafe_anonymous()) {
3746 // VM anonymous classes and hidden classes not of type lambda proxy classes are currently not being archived.
3747 // If the caller_ik is of one of the above types, the corresponding lambda proxy class won't be
3748 // registered for archiving.
3749 return;
3750 }
3751 Klass* lambda_k = java_lang_Class::as_Klass(JNIHandles::resolve(lambdaProxyClass));
3752 InstanceKlass* lambda_ik = InstanceKlass::cast(lambda_k);
3753 assert(lambda_ik->is_hidden(), "must be a hidden class");
3754 assert(!lambda_ik->is_non_strong_hidden(), "expected a strong hidden class");
3755
3756 Symbol* invoked_name = NULL;
3757 if (invokedName != NULL) {
3758 invoked_name = java_lang_String::as_symbol(JNIHandles::resolve_non_null(invokedName));
3759 }
3760 Handle invoked_type_oop(THREAD, JNIHandles::resolve_non_null(invokedType));
3761 Symbol* invoked_type = java_lang_invoke_MethodType::as_signature(invoked_type_oop(), true);
3762
3763 Handle method_type_oop(THREAD, JNIHandles::resolve_non_null(methodType));
3764 Symbol* method_type = java_lang_invoke_MethodType::as_signature(method_type_oop(), true);
3765
3766 Handle impl_method_member_oop(THREAD, JNIHandles::resolve_non_null(implMethodMember));
3767 assert(java_lang_invoke_MemberName::is_method(impl_method_member_oop()), "must be");
3768 Method* m = java_lang_invoke_MemberName::vmtarget(impl_method_member_oop());
3769
3770 Handle instantiated_method_type_oop(THREAD, JNIHandles::resolve_non_null(instantiatedMethodType));
3771 Symbol* instantiated_method_type = java_lang_invoke_MethodType::as_signature(instantiated_method_type_oop(), true);
3772
3773 SystemDictionaryShared::add_lambda_proxy_class(caller_ik, lambda_ik, invoked_name, invoked_type,
3774 method_type, m, instantiated_method_type);
3775
3776 JVM_END
3777
3778 JVM_ENTRY(jclass, JVM_LookupLambdaProxyClassFromArchive(JNIEnv* env,
3779 jclass caller,
3780 jstring invokedName,
3781 jobject invokedType,
3782 jobject methodType,
3783 jobject implMethodMember,
3784 jobject instantiatedMethodType,
3785 jboolean initialize))
3786 JVMWrapper("JVM_LookupLambdaProxyClassFromArchive");
3787 if (!DynamicArchive::is_mapped()) {
3788 return NULL;
3789 }
3790
3791 if (invokedName == NULL || invokedType == NULL || methodType == NULL ||
3792 implMethodMember == NULL || instantiatedMethodType == NULL) {
3793 THROW_(vmSymbols::java_lang_NullPointerException(), NULL);
3794 }
3795
3796 Klass* caller_k = java_lang_Class::as_Klass(JNIHandles::resolve(caller));
3797 InstanceKlass* caller_ik = InstanceKlass::cast(caller_k);
3798 if (!caller_ik->is_shared()) {
3799 // there won't be a shared lambda class if the caller_ik is not in the shared archive.
3800 return NULL;
3801 }
3802
3803 Symbol* invoked_name = java_lang_String::as_symbol(JNIHandles::resolve_non_null(invokedName));
3804 Handle invoked_type_oop(THREAD, JNIHandles::resolve_non_null(invokedType));
3805 Symbol* invoked_type = java_lang_invoke_MethodType::as_signature(invoked_type_oop(), true);
3806
3807 Handle method_type_oop(THREAD, JNIHandles::resolve_non_null(methodType));
3808 Symbol* method_type = java_lang_invoke_MethodType::as_signature(method_type_oop(), true);
3809
3810 Handle impl_method_member_oop(THREAD, JNIHandles::resolve_non_null(implMethodMember));
3811 assert(java_lang_invoke_MemberName::is_method(impl_method_member_oop()), "must be");
3812 Method* m = java_lang_invoke_MemberName::vmtarget(impl_method_member_oop());
3813
3814 Handle instantiated_method_type_oop(THREAD, JNIHandles::resolve_non_null(instantiatedMethodType));
3815 Symbol* instantiated_method_type = java_lang_invoke_MethodType::as_signature(instantiated_method_type_oop(), true);
3816
3817 InstanceKlass* lambda_ik = SystemDictionaryShared::get_shared_lambda_proxy_class(caller_ik, invoked_name, invoked_type,
3818 method_type, m, instantiated_method_type);
3819 jclass jcls = NULL;
3820 if (lambda_ik != NULL) {
3821 InstanceKlass* loaded_lambda = SystemDictionaryShared::prepare_shared_lambda_proxy_class(lambda_ik, caller_ik, initialize, THREAD);
3822 jcls = loaded_lambda == NULL ? NULL : (jclass) JNIHandles::make_local(env, loaded_lambda->java_mirror());
3823 }
3824 return jcls;
3825 JVM_END
3826
3827 JVM_ENTRY(jboolean, JVM_IsCDSDumpingEnabled(JNIEnv* env))
3828 JVMWrapper("JVM_IsCDSDumpingEnable");
3829 return DynamicDumpSharedSpaces;
3830 JVM_END
3831
3832 JVM_ENTRY(jboolean, JVM_IsCDSSharingEnabled(JNIEnv* env))
3833 JVMWrapper("JVM_IsCDSSharingEnable");
3834 return UseSharedSpaces;
3835 JVM_END
3836
3837 JVM_ENTRY_NO_ENV(jlong, JVM_GetRandomSeedForCDSDump())
3838 JVMWrapper("JVM_GetRandomSeedForCDSDump");
3839 if (DumpSharedSpaces) {
3840 const char* release = Abstract_VM_Version::vm_release();
3841 const char* dbg_level = Abstract_VM_Version::jdk_debug_level();
3842 const char* version = VM_Version::internal_vm_info_string();
3843 jlong seed = (jlong)(java_lang_String::hash_code((const jbyte*)release, (int)strlen(release)) ^
3844 java_lang_String::hash_code((const jbyte*)dbg_level, (int)strlen(dbg_level)) ^
|
3719 JVMWrapper("JVM_SupportsCX8");
3720 return VM_Version::supports_cx8();
3721 JVM_END
3722
3723 JVM_ENTRY(void, JVM_InitializeFromArchive(JNIEnv* env, jclass cls))
3724 JVMWrapper("JVM_InitializeFromArchive");
3725 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
3726 assert(k->is_klass(), "just checking");
3727 HeapShared::initialize_from_archived_subgraph(k);
3728 JVM_END
3729
3730 JVM_ENTRY(void, JVM_RegisterLambdaProxyClassForArchiving(JNIEnv* env,
3731 jclass caller,
3732 jstring invokedName,
3733 jobject invokedType,
3734 jobject methodType,
3735 jobject implMethodMember,
3736 jobject instantiatedMethodType,
3737 jclass lambdaProxyClass))
3738 JVMWrapper("JVM_RegisterLambdaProxyClassForArchiving");
3739 #if INCLUDE_CDS
3740 if (!DynamicDumpSharedSpaces) {
3741 return;
3742 }
3743
3744 Klass* caller_k = java_lang_Class::as_Klass(JNIHandles::resolve(caller));
3745 InstanceKlass* caller_ik = InstanceKlass::cast(caller_k);
3746 if (caller_ik->is_hidden() || caller_ik->is_unsafe_anonymous()) {
3747 // VM anonymous classes and hidden classes not of type lambda proxy classes are currently not being archived.
3748 // If the caller_ik is of one of the above types, the corresponding lambda proxy class won't be
3749 // registered for archiving.
3750 return;
3751 }
3752 Klass* lambda_k = java_lang_Class::as_Klass(JNIHandles::resolve(lambdaProxyClass));
3753 InstanceKlass* lambda_ik = InstanceKlass::cast(lambda_k);
3754 assert(lambda_ik->is_hidden(), "must be a hidden class");
3755 assert(!lambda_ik->is_non_strong_hidden(), "expected a strong hidden class");
3756
3757 Symbol* invoked_name = NULL;
3758 if (invokedName != NULL) {
3759 invoked_name = java_lang_String::as_symbol(JNIHandles::resolve_non_null(invokedName));
3760 }
3761 Handle invoked_type_oop(THREAD, JNIHandles::resolve_non_null(invokedType));
3762 Symbol* invoked_type = java_lang_invoke_MethodType::as_signature(invoked_type_oop(), true);
3763
3764 Handle method_type_oop(THREAD, JNIHandles::resolve_non_null(methodType));
3765 Symbol* method_type = java_lang_invoke_MethodType::as_signature(method_type_oop(), true);
3766
3767 Handle impl_method_member_oop(THREAD, JNIHandles::resolve_non_null(implMethodMember));
3768 assert(java_lang_invoke_MemberName::is_method(impl_method_member_oop()), "must be");
3769 Method* m = java_lang_invoke_MemberName::vmtarget(impl_method_member_oop());
3770
3771 Handle instantiated_method_type_oop(THREAD, JNIHandles::resolve_non_null(instantiatedMethodType));
3772 Symbol* instantiated_method_type = java_lang_invoke_MethodType::as_signature(instantiated_method_type_oop(), true);
3773
3774 SystemDictionaryShared::add_lambda_proxy_class(caller_ik, lambda_ik, invoked_name, invoked_type,
3775 method_type, m, instantiated_method_type);
3776 #endif // INCLUDE_CDS
3777 JVM_END
3778
3779 JVM_ENTRY(jclass, JVM_LookupLambdaProxyClassFromArchive(JNIEnv* env,
3780 jclass caller,
3781 jstring invokedName,
3782 jobject invokedType,
3783 jobject methodType,
3784 jobject implMethodMember,
3785 jobject instantiatedMethodType,
3786 jboolean initialize))
3787 JVMWrapper("JVM_LookupLambdaProxyClassFromArchive");
3788 #if INCLUDE_CDS
3789 if (!DynamicArchive::is_mapped()) {
3790 return NULL;
3791 }
3792
3793 if (invokedName == NULL || invokedType == NULL || methodType == NULL ||
3794 implMethodMember == NULL || instantiatedMethodType == NULL) {
3795 THROW_(vmSymbols::java_lang_NullPointerException(), NULL);
3796 }
3797
3798 Klass* caller_k = java_lang_Class::as_Klass(JNIHandles::resolve(caller));
3799 InstanceKlass* caller_ik = InstanceKlass::cast(caller_k);
3800 if (!caller_ik->is_shared()) {
3801 // there won't be a shared lambda class if the caller_ik is not in the shared archive.
3802 return NULL;
3803 }
3804
3805 Symbol* invoked_name = java_lang_String::as_symbol(JNIHandles::resolve_non_null(invokedName));
3806 Handle invoked_type_oop(THREAD, JNIHandles::resolve_non_null(invokedType));
3807 Symbol* invoked_type = java_lang_invoke_MethodType::as_signature(invoked_type_oop(), true);
3808
3809 Handle method_type_oop(THREAD, JNIHandles::resolve_non_null(methodType));
3810 Symbol* method_type = java_lang_invoke_MethodType::as_signature(method_type_oop(), true);
3811
3812 Handle impl_method_member_oop(THREAD, JNIHandles::resolve_non_null(implMethodMember));
3813 assert(java_lang_invoke_MemberName::is_method(impl_method_member_oop()), "must be");
3814 Method* m = java_lang_invoke_MemberName::vmtarget(impl_method_member_oop());
3815
3816 Handle instantiated_method_type_oop(THREAD, JNIHandles::resolve_non_null(instantiatedMethodType));
3817 Symbol* instantiated_method_type = java_lang_invoke_MethodType::as_signature(instantiated_method_type_oop(), true);
3818
3819 InstanceKlass* lambda_ik = SystemDictionaryShared::get_shared_lambda_proxy_class(caller_ik, invoked_name, invoked_type,
3820 method_type, m, instantiated_method_type);
3821 jclass jcls = NULL;
3822 if (lambda_ik != NULL) {
3823 InstanceKlass* loaded_lambda = SystemDictionaryShared::prepare_shared_lambda_proxy_class(lambda_ik, caller_ik, initialize, THREAD);
3824 jcls = loaded_lambda == NULL ? NULL : (jclass) JNIHandles::make_local(env, loaded_lambda->java_mirror());
3825 }
3826 return jcls;
3827 #else
3828 return NULL;
3829 #endif // INCLUDE_CDS
3830 JVM_END
3831
3832 JVM_ENTRY(jboolean, JVM_IsCDSDumpingEnabled(JNIEnv* env))
3833 JVMWrapper("JVM_IsCDSDumpingEnable");
3834 return DynamicDumpSharedSpaces;
3835 JVM_END
3836
3837 JVM_ENTRY(jboolean, JVM_IsCDSSharingEnabled(JNIEnv* env))
3838 JVMWrapper("JVM_IsCDSSharingEnable");
3839 return UseSharedSpaces;
3840 JVM_END
3841
3842 JVM_ENTRY_NO_ENV(jlong, JVM_GetRandomSeedForCDSDump())
3843 JVMWrapper("JVM_GetRandomSeedForCDSDump");
3844 if (DumpSharedSpaces) {
3845 const char* release = Abstract_VM_Version::vm_release();
3846 const char* dbg_level = Abstract_VM_Version::jdk_debug_level();
3847 const char* version = VM_Version::internal_vm_info_string();
3848 jlong seed = (jlong)(java_lang_String::hash_code((const jbyte*)release, (int)strlen(release)) ^
3849 java_lang_String::hash_code((const jbyte*)dbg_level, (int)strlen(dbg_level)) ^
|