hotspot/src/share/vm/classfile/systemDictionary.cpp
changeset 46271 979ebd346ecf
parent 42876 ff8ff9dcccec
child 46324 8764956ec928
equal deleted inserted replaced
46270:2e7898927798 46271:979ebd346ecf
     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(),