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; |
1347 |
1351 |
1348 Array<Klass*>* interfaces = ik->local_interfaces(); |
1352 Array<Klass*>* interfaces = ik->local_interfaces(); |
1349 int num_interfaces = interfaces->length(); |
1353 int num_interfaces = interfaces->length(); |
1350 for (int index = 0; index < num_interfaces; index++) { |
1354 for (int index = 0; index < num_interfaces; index++) { |
1351 Klass* k = interfaces->at(index); |
1355 Klass* k = interfaces->at(index); |
1352 |
|
1353 // Note: can not use InstanceKlass::cast here because |
|
1354 // interfaces' InstanceKlass's C++ vtbls haven't been |
|
1355 // reinitialized yet (they will be once the interface classes |
|
1356 // are loaded) |
|
1357 Symbol* name = k->name(); |
1356 Symbol* name = k->name(); |
1358 Klass* i = resolve_super_or_fail(class_name, name, class_loader, protection_domain, false, CHECK_(nh)); |
1357 Klass* i = resolve_super_or_fail(class_name, name, class_loader, protection_domain, false, CHECK_(nh)); |
1359 if (k != i) { |
1358 if (k != i) { |
1360 // The dynamically resolved interface class is not the same as the one we used during dump time, |
1359 // The dynamically resolved interface class is not the same as the one we used during dump time, |
1361 // so we cannot use ik. |
1360 // so we cannot use ik. |
1384 // internal parallel class loaders, so this will never cause a deadlock |
1383 // internal parallel class loaders, so this will never cause a deadlock |
1385 // on a custom class loader lock. |
1384 // on a custom class loader lock. |
1386 |
1385 |
1387 ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(class_loader()); |
1386 ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(class_loader()); |
1388 { |
1387 { |
|
1388 HandleMark hm(THREAD); |
1389 Handle lockObject = compute_loader_lock_object(class_loader, THREAD); |
1389 Handle lockObject = compute_loader_lock_object(class_loader, THREAD); |
1390 check_loader_lock_contention(lockObject, THREAD); |
1390 check_loader_lock_contention(lockObject, THREAD); |
1391 ObjectLocker ol(lockObject, THREAD, true); |
1391 ObjectLocker ol(lockObject, THREAD, true); |
1392 // prohibited package check assumes all classes loaded from archive call |
1392 // prohibited package check assumes all classes loaded from archive call |
1393 // restore_unshareable_info which calls ik->set_package() |
1393 // restore_unshareable_info which calls ik->set_package() |
1612 } |
1612 } |
1613 } |
1613 } |
1614 |
1614 |
1615 void SystemDictionary::define_instance_class(instanceKlassHandle k, TRAPS) { |
1615 void SystemDictionary::define_instance_class(instanceKlassHandle k, TRAPS) { |
1616 |
1616 |
|
1617 HandleMark hm(THREAD); |
1617 ClassLoaderData* loader_data = k->class_loader_data(); |
1618 ClassLoaderData* loader_data = k->class_loader_data(); |
1618 Handle class_loader_h(THREAD, loader_data->class_loader()); |
1619 Handle class_loader_h(THREAD, loader_data->class_loader()); |
1619 |
1620 |
1620 // for bootstrap and other parallel classloaders don't acquire lock, |
1621 // for bootstrap and other parallel classloaders don't acquire lock, |
1621 // use placeholder token |
1622 // use placeholder token |
2619 assert(THREAD->can_call_java() ,""); |
2620 assert(THREAD->can_call_java() ,""); |
2620 Handle method_type = |
2621 Handle method_type = |
2621 SystemDictionary::find_method_handle_type(signature, accessing_klass, CHECK_(empty)); |
2622 SystemDictionary::find_method_handle_type(signature, accessing_klass, CHECK_(empty)); |
2622 |
2623 |
2623 int ref_kind = JVM_REF_invokeVirtual; |
2624 int ref_kind = JVM_REF_invokeVirtual; |
2624 Handle name_str = StringTable::intern(name, CHECK_(empty)); |
2625 oop name_oop = StringTable::intern(name, CHECK_(empty)); |
2625 objArrayHandle appendix_box = oopFactory::new_objArray(SystemDictionary::Object_klass(), 1, CHECK_(empty)); |
2626 Handle name_str (THREAD, name_oop); |
|
2627 objArrayHandle appendix_box = oopFactory::new_objArray_handle(SystemDictionary::Object_klass(), 1, CHECK_(empty)); |
2626 assert(appendix_box->obj_at(0) == NULL, ""); |
2628 assert(appendix_box->obj_at(0) == NULL, ""); |
2627 |
2629 |
2628 // This should not happen. JDK code should take care of that. |
2630 // This should not happen. JDK code should take care of that. |
2629 if (accessing_klass.is_null() || method_type.is_null()) { |
2631 if (accessing_klass.is_null() || method_type.is_null()) { |
2630 THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad invokehandle", empty); |
2632 THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad invokehandle", empty); |
2631 } |
2633 } |
2632 |
2634 |
2633 // call java.lang.invoke.MethodHandleNatives::linkMethod(... String, MethodType) -> MemberName |
2635 // call java.lang.invoke.MethodHandleNatives::linkMethod(... String, MethodType) -> MemberName |
2634 JavaCallArguments args; |
2636 JavaCallArguments args; |
2635 args.push_oop(accessing_klass()->java_mirror()); |
2637 args.push_oop(Handle(THREAD, accessing_klass()->java_mirror())); |
2636 args.push_int(ref_kind); |
2638 args.push_int(ref_kind); |
2637 args.push_oop(klass()->java_mirror()); |
2639 args.push_oop(Handle(THREAD, klass()->java_mirror())); |
2638 args.push_oop(name_str()); |
2640 args.push_oop(name_str); |
2639 args.push_oop(method_type()); |
2641 args.push_oop(method_type); |
2640 args.push_oop(appendix_box()); |
2642 args.push_oop(appendix_box); |
2641 JavaValue result(T_OBJECT); |
2643 JavaValue result(T_OBJECT); |
2642 JavaCalls::call_static(&result, |
2644 JavaCalls::call_static(&result, |
2643 SystemDictionary::MethodHandleNatives_klass(), |
2645 SystemDictionary::MethodHandleNatives_klass(), |
2644 vmSymbols::linkMethod_name(), |
2646 vmSymbols::linkMethod_name(), |
2645 vmSymbols::linkMethod_signature(), |
2647 vmSymbols::linkMethod_signature(), |
2693 class_loader = Handle(THREAD, InstanceKlass::cast(accessing_klass())->class_loader()); |
2695 class_loader = Handle(THREAD, InstanceKlass::cast(accessing_klass())->class_loader()); |
2694 protection_domain = Handle(THREAD, InstanceKlass::cast(accessing_klass())->protection_domain()); |
2696 protection_domain = Handle(THREAD, InstanceKlass::cast(accessing_klass())->protection_domain()); |
2695 } |
2697 } |
2696 bool can_be_cached = true; |
2698 bool can_be_cached = true; |
2697 int npts = ArgumentCount(signature).size(); |
2699 int npts = ArgumentCount(signature).size(); |
2698 objArrayHandle pts = oopFactory::new_objArray(SystemDictionary::Class_klass(), npts, CHECK_(empty)); |
2700 objArrayHandle pts = oopFactory::new_objArray_handle(SystemDictionary::Class_klass(), npts, CHECK_(empty)); |
2699 int arg = 0; |
2701 int arg = 0; |
2700 Handle rt; // the return type from the signature |
2702 Handle rt; // the return type from the signature |
2701 ResourceMark rm(THREAD); |
2703 ResourceMark rm(THREAD); |
2702 for (SignatureStream ss(signature); !ss.is_done(); ss.next()) { |
2704 for (SignatureStream ss(signature); !ss.is_done(); ss.next()) { |
2703 oop mirror = NULL; |
2705 oop mirror = NULL; |
2736 } |
2738 } |
2737 assert(arg == npts, ""); |
2739 assert(arg == npts, ""); |
2738 |
2740 |
2739 // call java.lang.invoke.MethodHandleNatives::findMethodHandleType(Class rt, Class[] pts) -> MethodType |
2741 // call java.lang.invoke.MethodHandleNatives::findMethodHandleType(Class rt, Class[] pts) -> MethodType |
2740 JavaCallArguments args(Handle(THREAD, rt())); |
2742 JavaCallArguments args(Handle(THREAD, rt())); |
2741 args.push_oop(pts()); |
2743 args.push_oop(pts); |
2742 JavaValue result(T_OBJECT); |
2744 JavaValue result(T_OBJECT); |
2743 JavaCalls::call_static(&result, |
2745 JavaCalls::call_static(&result, |
2744 SystemDictionary::MethodHandleNatives_klass(), |
2746 SystemDictionary::MethodHandleNatives_klass(), |
2745 vmSymbols::findMethodHandleType_name(), |
2747 vmSymbols::findMethodHandleType_name(), |
2746 vmSymbols::findMethodHandleType_signature(), |
2748 vmSymbols::findMethodHandleType_signature(), |
2779 THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad MH constant", empty); |
2781 THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad MH constant", empty); |
2780 } else { |
2782 } else { |
2781 ResourceMark rm(THREAD); |
2783 ResourceMark rm(THREAD); |
2782 SignatureStream ss(signature, false); |
2784 SignatureStream ss(signature, false); |
2783 if (!ss.is_done()) { |
2785 if (!ss.is_done()) { |
2784 oop mirror = ss.as_java_mirror(caller->class_loader(), caller->protection_domain(), |
2786 oop mirror = ss.as_java_mirror(Handle(THREAD, caller->class_loader()), |
|
2787 Handle(THREAD, caller->protection_domain()), |
2785 SignatureStream::NCDFError, CHECK_(empty)); |
2788 SignatureStream::NCDFError, CHECK_(empty)); |
2786 type = Handle(THREAD, mirror); |
2789 type = Handle(THREAD, mirror); |
2787 ss.next(); |
2790 ss.next(); |
2788 if (!ss.is_done()) type = Handle(); // error! |
2791 if (!ss.is_done()) type = Handle(); // error! |
2789 } |
2792 } |
2792 THROW_MSG_(vmSymbols::java_lang_LinkageError(), "bad signature", empty); |
2795 THROW_MSG_(vmSymbols::java_lang_LinkageError(), "bad signature", empty); |
2793 } |
2796 } |
2794 |
2797 |
2795 // call java.lang.invoke.MethodHandleNatives::linkMethodHandleConstant(Class caller, int refKind, Class callee, String name, Object type) -> MethodHandle |
2798 // call java.lang.invoke.MethodHandleNatives::linkMethodHandleConstant(Class caller, int refKind, Class callee, String name, Object type) -> MethodHandle |
2796 JavaCallArguments args; |
2799 JavaCallArguments args; |
2797 args.push_oop(caller->java_mirror()); // the referring class |
2800 args.push_oop(Handle(THREAD, caller->java_mirror())); // the referring class |
2798 args.push_int(ref_kind); |
2801 args.push_int(ref_kind); |
2799 args.push_oop(callee->java_mirror()); // the target class |
2802 args.push_oop(Handle(THREAD, callee->java_mirror())); // the target class |
2800 args.push_oop(name()); |
2803 args.push_oop(name); |
2801 args.push_oop(type()); |
2804 args.push_oop(type); |
2802 JavaValue result(T_OBJECT); |
2805 JavaValue result(T_OBJECT); |
2803 JavaCalls::call_static(&result, |
2806 JavaCalls::call_static(&result, |
2804 SystemDictionary::MethodHandleNatives_klass(), |
2807 SystemDictionary::MethodHandleNatives_klass(), |
2805 vmSymbols::linkMethodHandleConstant_name(), |
2808 vmSymbols::linkMethodHandleConstant_name(), |
2806 vmSymbols::linkMethodHandleConstant_signature(), |
2809 vmSymbols::linkMethodHandleConstant_signature(), |
2843 // This should not happen. JDK code should take care of that. |
2846 // This should not happen. JDK code should take care of that. |
2844 if (caller.is_null() || method_type.is_null()) { |
2847 if (caller.is_null() || method_type.is_null()) { |
2845 THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad invokedynamic", empty); |
2848 THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad invokedynamic", empty); |
2846 } |
2849 } |
2847 |
2850 |
2848 objArrayHandle appendix_box = oopFactory::new_objArray(SystemDictionary::Object_klass(), 1, CHECK_(empty)); |
2851 objArrayHandle appendix_box = oopFactory::new_objArray_handle(SystemDictionary::Object_klass(), 1, CHECK_(empty)); |
2849 assert(appendix_box->obj_at(0) == NULL, ""); |
2852 assert(appendix_box->obj_at(0) == NULL, ""); |
2850 |
2853 |
2851 // call java.lang.invoke.MethodHandleNatives::linkCallSite(caller, bsm, name, mtype, info, &appendix) |
2854 // call java.lang.invoke.MethodHandleNatives::linkCallSite(caller, bsm, name, mtype, info, &appendix) |
2852 JavaCallArguments args; |
2855 JavaCallArguments args; |
2853 args.push_oop(caller->java_mirror()); |
2856 args.push_oop(Handle(THREAD, caller->java_mirror())); |
2854 args.push_oop(bsm()); |
2857 args.push_oop(bsm); |
2855 args.push_oop(method_name()); |
2858 args.push_oop(method_name); |
2856 args.push_oop(method_type()); |
2859 args.push_oop(method_type); |
2857 args.push_oop(info()); |
2860 args.push_oop(info); |
2858 args.push_oop(appendix_box); |
2861 args.push_oop(appendix_box); |
2859 JavaValue result(T_OBJECT); |
2862 JavaValue result(T_OBJECT); |
2860 JavaCalls::call_static(&result, |
2863 JavaCalls::call_static(&result, |
2861 SystemDictionary::MethodHandleNatives_klass(), |
2864 SystemDictionary::MethodHandleNatives_klass(), |
2862 vmSymbols::linkCallSite_name(), |
2865 vmSymbols::linkCallSite_name(), |