hotspot/src/share/vm/classfile/systemDictionary.cpp
changeset 46327 91576389a517
parent 43948 26f3c55e246e
parent 46324 8764956ec928
child 46329 53ccc37bda19
equal deleted inserted replaced
44203:d2d435372329 46327:91576389a517
     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(),