1 /* |
1 /* |
2 * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
158 } |
158 } |
159 |
159 |
160 // Returns true if the passed class loader is the builtin application class loader |
160 // Returns true if the passed class loader is the builtin application class loader |
161 // or a custom system class loader. A customer system class loader can be |
161 // or a custom system class loader. A customer system class loader can be |
162 // specified via -Djava.system.class.loader. |
162 // specified via -Djava.system.class.loader. |
163 bool SystemDictionary::is_system_class_loader(Handle class_loader) { |
163 bool SystemDictionary::is_system_class_loader(oop class_loader) { |
164 if (class_loader.is_null()) { |
164 if (class_loader == NULL) { |
165 return false; |
165 return false; |
166 } |
166 } |
167 return (class_loader->klass() == SystemDictionary::jdk_internal_loader_ClassLoaders_AppClassLoader_klass() || |
167 return (class_loader->klass() == SystemDictionary::jdk_internal_loader_ClassLoaders_AppClassLoader_klass() || |
168 class_loader() == _java_system_loader); |
168 class_loader == _java_system_loader); |
169 } |
169 } |
170 |
170 |
171 // Returns true if the passed class loader is the platform class loader. |
171 // Returns true if the passed class loader is the platform class loader. |
172 bool SystemDictionary::is_platform_class_loader(Handle class_loader) { |
172 bool SystemDictionary::is_platform_class_loader(oop class_loader) { |
173 if (class_loader.is_null()) { |
173 if (class_loader == NULL) { |
174 return false; |
174 return false; |
175 } |
175 } |
176 return (class_loader->klass() == SystemDictionary::jdk_internal_loader_ClassLoaders_PlatformClassLoader_klass()); |
176 return (class_loader->klass() == SystemDictionary::jdk_internal_loader_ClassLoaders_PlatformClassLoader_klass()); |
177 } |
177 } |
178 |
178 |
660 assert(name != NULL && !FieldType::is_array(name) && |
660 assert(name != NULL && !FieldType::is_array(name) && |
661 !FieldType::is_obj(name), "invalid class name"); |
661 !FieldType::is_obj(name), "invalid class name"); |
662 |
662 |
663 Ticks class_load_start_time = Ticks::now(); |
663 Ticks class_load_start_time = Ticks::now(); |
664 |
664 |
|
665 HandleMark hm(THREAD); |
|
666 |
665 // Fix for 4474172; see evaluation for more details |
667 // Fix for 4474172; see evaluation for more details |
666 class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader())); |
668 class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader())); |
667 ClassLoaderData *loader_data = register_loader(class_loader, CHECK_NULL); |
669 ClassLoaderData *loader_data = register_loader(class_loader, CHECK_NULL); |
668 |
670 |
669 // Do lookup to see if class already exist and the protection domain |
671 // Do lookup to see if class already exist and the protection domain |
1101 Handle class_loader, |
1103 Handle class_loader, |
1102 Handle protection_domain, |
1104 Handle protection_domain, |
1103 ClassFileStream* st, |
1105 ClassFileStream* st, |
1104 TRAPS) { |
1106 TRAPS) { |
1105 |
1107 |
|
1108 HandleMark hm(THREAD); |
|
1109 |
1106 // Classloaders that support parallelism, e.g. bootstrap classloader, |
1110 // Classloaders that support parallelism, e.g. bootstrap classloader, |
1107 // or all classloaders with UnsyncloadClass do not acquire lock here |
1111 // or all classloaders with UnsyncloadClass do not acquire lock here |
1108 bool DoObjectLock = true; |
1112 bool DoObjectLock = true; |
1109 if (is_parallelCapable(class_loader)) { |
1113 if (is_parallelCapable(class_loader)) { |
1110 DoObjectLock = false; |
1114 DoObjectLock = false; |
1379 // internal parallel class loaders, so this will never cause a deadlock |
1383 // internal parallel class loaders, so this will never cause a deadlock |
1380 // on a custom class loader lock. |
1384 // on a custom class loader lock. |
1381 |
1385 |
1382 ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(class_loader()); |
1386 ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(class_loader()); |
1383 { |
1387 { |
|
1388 HandleMark hm(THREAD); |
1384 Handle lockObject = compute_loader_lock_object(class_loader, THREAD); |
1389 Handle lockObject = compute_loader_lock_object(class_loader, THREAD); |
1385 check_loader_lock_contention(lockObject, THREAD); |
1390 check_loader_lock_contention(lockObject, THREAD); |
1386 ObjectLocker ol(lockObject, THREAD, true); |
1391 ObjectLocker ol(lockObject, THREAD, true); |
1387 // prohibited package check assumes all classes loaded from archive call |
1392 // prohibited package check assumes all classes loaded from archive call |
1388 // restore_unshareable_info which calls ik->set_package() |
1393 // restore_unshareable_info which calls ik->set_package() |
1599 } |
1604 } |
1600 } |
1605 } |
1601 |
1606 |
1602 void SystemDictionary::define_instance_class(instanceKlassHandle k, TRAPS) { |
1607 void SystemDictionary::define_instance_class(instanceKlassHandle k, TRAPS) { |
1603 |
1608 |
|
1609 HandleMark hm(THREAD); |
1604 ClassLoaderData* loader_data = k->class_loader_data(); |
1610 ClassLoaderData* loader_data = k->class_loader_data(); |
1605 Handle class_loader_h(THREAD, loader_data->class_loader()); |
1611 Handle class_loader_h(THREAD, loader_data->class_loader()); |
1606 |
1612 |
1607 // for bootstrap and other parallel classloaders don't acquire lock, |
1613 // for bootstrap and other parallel classloaders don't acquire lock, |
1608 // use placeholder token |
1614 // use placeholder token |
2606 assert(THREAD->can_call_java() ,""); |
2612 assert(THREAD->can_call_java() ,""); |
2607 Handle method_type = |
2613 Handle method_type = |
2608 SystemDictionary::find_method_handle_type(signature, accessing_klass, CHECK_(empty)); |
2614 SystemDictionary::find_method_handle_type(signature, accessing_klass, CHECK_(empty)); |
2609 |
2615 |
2610 int ref_kind = JVM_REF_invokeVirtual; |
2616 int ref_kind = JVM_REF_invokeVirtual; |
2611 Handle name_str = StringTable::intern(name, CHECK_(empty)); |
2617 oop name_oop = StringTable::intern(name, CHECK_(empty)); |
2612 objArrayHandle appendix_box = oopFactory::new_objArray(SystemDictionary::Object_klass(), 1, CHECK_(empty)); |
2618 Handle name_str (THREAD, name_oop); |
|
2619 objArrayHandle appendix_box = oopFactory::new_objArray_handle(SystemDictionary::Object_klass(), 1, CHECK_(empty)); |
2613 assert(appendix_box->obj_at(0) == NULL, ""); |
2620 assert(appendix_box->obj_at(0) == NULL, ""); |
2614 |
2621 |
2615 // This should not happen. JDK code should take care of that. |
2622 // This should not happen. JDK code should take care of that. |
2616 if (accessing_klass.is_null() || method_type.is_null()) { |
2623 if (accessing_klass.is_null() || method_type.is_null()) { |
2617 THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad invokehandle", empty); |
2624 THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad invokehandle", empty); |
2618 } |
2625 } |
2619 |
2626 |
2620 // call java.lang.invoke.MethodHandleNatives::linkMethod(... String, MethodType) -> MemberName |
2627 // call java.lang.invoke.MethodHandleNatives::linkMethod(... String, MethodType) -> MemberName |
2621 JavaCallArguments args; |
2628 JavaCallArguments args; |
2622 args.push_oop(accessing_klass()->java_mirror()); |
2629 args.push_oop(Handle(THREAD, accessing_klass()->java_mirror())); |
2623 args.push_int(ref_kind); |
2630 args.push_int(ref_kind); |
2624 args.push_oop(klass()->java_mirror()); |
2631 args.push_oop(Handle(THREAD, klass()->java_mirror())); |
2625 args.push_oop(name_str()); |
2632 args.push_oop(name_str); |
2626 args.push_oop(method_type()); |
2633 args.push_oop(method_type); |
2627 args.push_oop(appendix_box()); |
2634 args.push_oop(appendix_box); |
2628 JavaValue result(T_OBJECT); |
2635 JavaValue result(T_OBJECT); |
2629 JavaCalls::call_static(&result, |
2636 JavaCalls::call_static(&result, |
2630 SystemDictionary::MethodHandleNatives_klass(), |
2637 SystemDictionary::MethodHandleNatives_klass(), |
2631 vmSymbols::linkMethod_name(), |
2638 vmSymbols::linkMethod_name(), |
2632 vmSymbols::linkMethod_signature(), |
2639 vmSymbols::linkMethod_signature(), |
2680 class_loader = Handle(THREAD, InstanceKlass::cast(accessing_klass())->class_loader()); |
2687 class_loader = Handle(THREAD, InstanceKlass::cast(accessing_klass())->class_loader()); |
2681 protection_domain = Handle(THREAD, InstanceKlass::cast(accessing_klass())->protection_domain()); |
2688 protection_domain = Handle(THREAD, InstanceKlass::cast(accessing_klass())->protection_domain()); |
2682 } |
2689 } |
2683 bool can_be_cached = true; |
2690 bool can_be_cached = true; |
2684 int npts = ArgumentCount(signature).size(); |
2691 int npts = ArgumentCount(signature).size(); |
2685 objArrayHandle pts = oopFactory::new_objArray(SystemDictionary::Class_klass(), npts, CHECK_(empty)); |
2692 objArrayHandle pts = oopFactory::new_objArray_handle(SystemDictionary::Class_klass(), npts, CHECK_(empty)); |
2686 int arg = 0; |
2693 int arg = 0; |
2687 Handle rt; // the return type from the signature |
2694 Handle rt; // the return type from the signature |
2688 ResourceMark rm(THREAD); |
2695 ResourceMark rm(THREAD); |
2689 for (SignatureStream ss(signature); !ss.is_done(); ss.next()) { |
2696 for (SignatureStream ss(signature); !ss.is_done(); ss.next()) { |
2690 oop mirror = NULL; |
2697 oop mirror = NULL; |
2723 } |
2730 } |
2724 assert(arg == npts, ""); |
2731 assert(arg == npts, ""); |
2725 |
2732 |
2726 // call java.lang.invoke.MethodHandleNatives::findMethodHandleType(Class rt, Class[] pts) -> MethodType |
2733 // call java.lang.invoke.MethodHandleNatives::findMethodHandleType(Class rt, Class[] pts) -> MethodType |
2727 JavaCallArguments args(Handle(THREAD, rt())); |
2734 JavaCallArguments args(Handle(THREAD, rt())); |
2728 args.push_oop(pts()); |
2735 args.push_oop(pts); |
2729 JavaValue result(T_OBJECT); |
2736 JavaValue result(T_OBJECT); |
2730 JavaCalls::call_static(&result, |
2737 JavaCalls::call_static(&result, |
2731 SystemDictionary::MethodHandleNatives_klass(), |
2738 SystemDictionary::MethodHandleNatives_klass(), |
2732 vmSymbols::findMethodHandleType_name(), |
2739 vmSymbols::findMethodHandleType_name(), |
2733 vmSymbols::findMethodHandleType_signature(), |
2740 vmSymbols::findMethodHandleType_signature(), |
2766 THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad MH constant", empty); |
2773 THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad MH constant", empty); |
2767 } else { |
2774 } else { |
2768 ResourceMark rm(THREAD); |
2775 ResourceMark rm(THREAD); |
2769 SignatureStream ss(signature, false); |
2776 SignatureStream ss(signature, false); |
2770 if (!ss.is_done()) { |
2777 if (!ss.is_done()) { |
2771 oop mirror = ss.as_java_mirror(caller->class_loader(), caller->protection_domain(), |
2778 oop mirror = ss.as_java_mirror(Handle(THREAD, caller->class_loader()), |
|
2779 Handle(THREAD, caller->protection_domain()), |
2772 SignatureStream::NCDFError, CHECK_(empty)); |
2780 SignatureStream::NCDFError, CHECK_(empty)); |
2773 type = Handle(THREAD, mirror); |
2781 type = Handle(THREAD, mirror); |
2774 ss.next(); |
2782 ss.next(); |
2775 if (!ss.is_done()) type = Handle(); // error! |
2783 if (!ss.is_done()) type = Handle(); // error! |
2776 } |
2784 } |
2779 THROW_MSG_(vmSymbols::java_lang_LinkageError(), "bad signature", empty); |
2787 THROW_MSG_(vmSymbols::java_lang_LinkageError(), "bad signature", empty); |
2780 } |
2788 } |
2781 |
2789 |
2782 // call java.lang.invoke.MethodHandleNatives::linkMethodHandleConstant(Class caller, int refKind, Class callee, String name, Object type) -> MethodHandle |
2790 // call java.lang.invoke.MethodHandleNatives::linkMethodHandleConstant(Class caller, int refKind, Class callee, String name, Object type) -> MethodHandle |
2783 JavaCallArguments args; |
2791 JavaCallArguments args; |
2784 args.push_oop(caller->java_mirror()); // the referring class |
2792 args.push_oop(Handle(THREAD, caller->java_mirror())); // the referring class |
2785 args.push_int(ref_kind); |
2793 args.push_int(ref_kind); |
2786 args.push_oop(callee->java_mirror()); // the target class |
2794 args.push_oop(Handle(THREAD, callee->java_mirror())); // the target class |
2787 args.push_oop(name()); |
2795 args.push_oop(name); |
2788 args.push_oop(type()); |
2796 args.push_oop(type); |
2789 JavaValue result(T_OBJECT); |
2797 JavaValue result(T_OBJECT); |
2790 JavaCalls::call_static(&result, |
2798 JavaCalls::call_static(&result, |
2791 SystemDictionary::MethodHandleNatives_klass(), |
2799 SystemDictionary::MethodHandleNatives_klass(), |
2792 vmSymbols::linkMethodHandleConstant_name(), |
2800 vmSymbols::linkMethodHandleConstant_name(), |
2793 vmSymbols::linkMethodHandleConstant_signature(), |
2801 vmSymbols::linkMethodHandleConstant_signature(), |
2830 // This should not happen. JDK code should take care of that. |
2838 // This should not happen. JDK code should take care of that. |
2831 if (caller.is_null() || method_type.is_null()) { |
2839 if (caller.is_null() || method_type.is_null()) { |
2832 THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad invokedynamic", empty); |
2840 THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad invokedynamic", empty); |
2833 } |
2841 } |
2834 |
2842 |
2835 objArrayHandle appendix_box = oopFactory::new_objArray(SystemDictionary::Object_klass(), 1, CHECK_(empty)); |
2843 objArrayHandle appendix_box = oopFactory::new_objArray_handle(SystemDictionary::Object_klass(), 1, CHECK_(empty)); |
2836 assert(appendix_box->obj_at(0) == NULL, ""); |
2844 assert(appendix_box->obj_at(0) == NULL, ""); |
2837 |
2845 |
2838 // call java.lang.invoke.MethodHandleNatives::linkCallSite(caller, bsm, name, mtype, info, &appendix) |
2846 // call java.lang.invoke.MethodHandleNatives::linkCallSite(caller, bsm, name, mtype, info, &appendix) |
2839 JavaCallArguments args; |
2847 JavaCallArguments args; |
2840 args.push_oop(caller->java_mirror()); |
2848 args.push_oop(Handle(THREAD, caller->java_mirror())); |
2841 args.push_oop(bsm()); |
2849 args.push_oop(bsm); |
2842 args.push_oop(method_name()); |
2850 args.push_oop(method_name); |
2843 args.push_oop(method_type()); |
2851 args.push_oop(method_type); |
2844 args.push_oop(info()); |
2852 args.push_oop(info); |
2845 args.push_oop(appendix_box); |
2853 args.push_oop(appendix_box); |
2846 JavaValue result(T_OBJECT); |
2854 JavaValue result(T_OBJECT); |
2847 JavaCalls::call_static(&result, |
2855 JavaCalls::call_static(&result, |
2848 SystemDictionary::MethodHandleNatives_klass(), |
2856 SystemDictionary::MethodHandleNatives_klass(), |
2849 vmSymbols::linkCallSite_name(), |
2857 vmSymbols::linkCallSite_name(), |