hotspot/src/share/vm/classfile/systemDictionary.cpp
changeset 14588 8ec26d2d9339
parent 14488 ab48109f7d1b
child 15188 3916ac601e04
equal deleted inserted replaced
14584:bd4290e6d0a5 14588:8ec26d2d9339
   104 
   104 
   105   _java_system_loader = (oop)result.get_jobject();
   105   _java_system_loader = (oop)result.get_jobject();
   106 }
   106 }
   107 
   107 
   108 
   108 
   109 ClassLoaderData* SystemDictionary::register_loader(Handle class_loader) {
   109 ClassLoaderData* SystemDictionary::register_loader(Handle class_loader, TRAPS) {
   110   if (class_loader() == NULL) return ClassLoaderData::the_null_class_loader_data();
   110   if (class_loader() == NULL) return ClassLoaderData::the_null_class_loader_data();
   111   return ClassLoaderDataGraph::find_or_create(class_loader);
   111   return ClassLoaderDataGraph::find_or_create(class_loader, CHECK_NULL);
   112 }
   112 }
   113 
   113 
   114 // ----------------------------------------------------------------------------
   114 // ----------------------------------------------------------------------------
   115 // debugging
   115 // debugging
   116 
   116 
   589          !FieldType::is_obj(name), "invalid class name");
   589          !FieldType::is_obj(name), "invalid class name");
   590 
   590 
   591   // UseNewReflection
   591   // UseNewReflection
   592   // Fix for 4474172; see evaluation for more details
   592   // Fix for 4474172; see evaluation for more details
   593   class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader()));
   593   class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader()));
   594   ClassLoaderData *loader_data = register_loader(class_loader);
   594   ClassLoaderData *loader_data = register_loader(class_loader, CHECK_NULL);
   595 
   595 
   596   // Do lookup to see if class already exist and the protection domain
   596   // Do lookup to see if class already exist and the protection domain
   597   // has the right access
   597   // has the right access
   598   unsigned int d_hash = dictionary()->compute_hash(name, loader_data);
   598   unsigned int d_hash = dictionary()->compute_hash(name, loader_data);
   599   int d_index = dictionary()->hash_to_index(d_hash);
   599   int d_index = dictionary()->hash_to_index(d_hash);
   886   // UseNewReflection
   886   // UseNewReflection
   887   // The result of this call should be consistent with the result
   887   // The result of this call should be consistent with the result
   888   // of the call to resolve_instance_class_or_null().
   888   // of the call to resolve_instance_class_or_null().
   889   // See evaluation 6790209 and 4474172 for more details.
   889   // See evaluation 6790209 and 4474172 for more details.
   890   class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader()));
   890   class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader()));
   891   ClassLoaderData* loader_data = register_loader(class_loader);
   891   ClassLoaderData* loader_data = register_loader(class_loader, CHECK_NULL);
   892 
   892 
   893   unsigned int d_hash = dictionary()->compute_hash(class_name, loader_data);
   893   unsigned int d_hash = dictionary()->compute_hash(class_name, loader_data);
   894   int d_index = dictionary()->hash_to_index(d_hash);
   894   int d_index = dictionary()->hash_to_index(d_hash);
   895 
   895 
   896   {
   896   {
   946                                       KlassHandle host_klass,
   946                                       KlassHandle host_klass,
   947                                       GrowableArray<Handle>* cp_patches,
   947                                       GrowableArray<Handle>* cp_patches,
   948                                       TRAPS) {
   948                                       TRAPS) {
   949   TempNewSymbol parsed_name = NULL;
   949   TempNewSymbol parsed_name = NULL;
   950 
   950 
       
   951   ClassLoaderData* loader_data;
       
   952   if (host_klass.not_null()) {
       
   953     // Create a new CLD for anonymous class, that uses the same class loader
       
   954     // as the host_klass
       
   955     assert(EnableInvokeDynamic, "");
       
   956     guarantee(host_klass->class_loader() == class_loader(), "should be the same");
       
   957     loader_data = ClassLoaderData::anonymous_class_loader_data(class_loader(), CHECK_NULL);
       
   958     loader_data->record_dependency(host_klass(), CHECK_NULL);
       
   959   } else {
       
   960     loader_data = ClassLoaderData::class_loader_data(class_loader());
       
   961   }
       
   962 
   951   // Parse the stream. Note that we do this even though this klass might
   963   // Parse the stream. Note that we do this even though this klass might
   952   // already be present in the SystemDictionary, otherwise we would not
   964   // already be present in the SystemDictionary, otherwise we would not
   953   // throw potential ClassFormatErrors.
   965   // throw potential ClassFormatErrors.
   954   //
   966   //
   955   // Note: "name" is updated.
   967   // Note: "name" is updated.
   957   //   super classes are loaded (resolve_super_or_fail). We expect this
   969   //   super classes are loaded (resolve_super_or_fail). We expect this
   958   //   to be called for all classes but java.lang.Object; and we preload
   970   //   to be called for all classes but java.lang.Object; and we preload
   959   //   java.lang.Object through resolve_or_fail, not this path.
   971   //   java.lang.Object through resolve_or_fail, not this path.
   960 
   972 
   961   instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name,
   973   instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name,
   962                                                              class_loader,
   974                                                              loader_data,
   963                                                              protection_domain,
   975                                                              protection_domain,
   964                                                              host_klass,
   976                                                              host_klass,
   965                                                              cp_patches,
   977                                                              cp_patches,
   966                                                              parsed_name,
   978                                                              parsed_name,
   967                                                              true,
   979                                                              true,
   971   // was an error or not (don't want to modify any system dictionary
   983   // was an error or not (don't want to modify any system dictionary
   972   // data structures).
   984   // data structures).
   973   // Parsed name could be null if we threw an error before we got far
   985   // Parsed name could be null if we threw an error before we got far
   974   // enough along to parse it -- in that case, there is nothing to clean up.
   986   // enough along to parse it -- in that case, there is nothing to clean up.
   975   if (parsed_name != NULL) {
   987   if (parsed_name != NULL) {
   976     ClassLoaderData* loader_data = class_loader_data(class_loader);
       
   977 
       
   978     unsigned int p_hash = placeholders()->compute_hash(parsed_name,
   988     unsigned int p_hash = placeholders()->compute_hash(parsed_name,
   979                                                        loader_data);
   989                                                        loader_data);
   980     int p_index = placeholders()->hash_to_index(p_hash);
   990     int p_index = placeholders()->hash_to_index(p_hash);
   981     {
   991     {
   982     MutexLocker mu(SystemDictionary_lock, THREAD);
   992     MutexLocker mu(SystemDictionary_lock, THREAD);
   985     }
   995     }
   986   }
   996   }
   987 
   997 
   988   if (host_klass.not_null() && k.not_null()) {
   998   if (host_klass.not_null() && k.not_null()) {
   989     assert(EnableInvokeDynamic, "");
   999     assert(EnableInvokeDynamic, "");
       
  1000     k->set_host_klass(host_klass());
   990     // If it's anonymous, initialize it now, since nobody else will.
  1001     // If it's anonymous, initialize it now, since nobody else will.
   991     k->class_loader_data()->record_dependency(host_klass(), CHECK_NULL);
       
   992     k->set_host_klass(host_klass());
       
   993 
  1002 
   994     {
  1003     {
   995       MutexLocker mu_r(Compile_lock, THREAD);
  1004       MutexLocker mu_r(Compile_lock, THREAD);
   996 
  1005 
   997       // Add to class hierarchy, initialize vtables, and do possible
  1006       // Add to class hierarchy, initialize vtables, and do possible
  1000 
  1009 
  1001       // But, do not add to system dictionary.
  1010       // But, do not add to system dictionary.
  1002     }
  1011     }
  1003 
  1012 
  1004     // Rewrite and patch constant pool here.
  1013     // Rewrite and patch constant pool here.
  1005     k->link_class(THREAD);
  1014     k->link_class(CHECK_NULL);
  1006     if (cp_patches != NULL) {
  1015     if (cp_patches != NULL) {
  1007       k->constants()->patch_resolved_references(cp_patches);
  1016       k->constants()->patch_resolved_references(cp_patches);
  1008     }
  1017     }
  1009     k->eager_initialize(THREAD);
  1018     k->eager_initialize(CHECK_NULL);
  1010 
  1019 
  1011     // notify jvmti
  1020     // notify jvmti
  1012     if (JvmtiExport::should_post_class_load()) {
  1021     if (JvmtiExport::should_post_class_load()) {
  1013         assert(THREAD->is_Java_thread(), "thread->is_Java_thread()");
  1022         assert(THREAD->is_Java_thread(), "thread->is_Java_thread()");
  1014         JvmtiExport::post_class_load((JavaThread *) THREAD, k());
  1023         JvmtiExport::post_class_load((JavaThread *) THREAD, k());
  1037   bool DoObjectLock = true;
  1046   bool DoObjectLock = true;
  1038   if (is_parallelCapable(class_loader)) {
  1047   if (is_parallelCapable(class_loader)) {
  1039     DoObjectLock = false;
  1048     DoObjectLock = false;
  1040   }
  1049   }
  1041 
  1050 
  1042   ClassLoaderData* loader_data = register_loader(class_loader);
  1051   ClassLoaderData* loader_data = register_loader(class_loader, CHECK_NULL);
  1043 
  1052 
  1044   // Make sure we are synchronized on the class loader before we proceed
  1053   // Make sure we are synchronized on the class loader before we proceed
  1045   Handle lockObject = compute_loader_lock_object(class_loader, THREAD);
  1054   Handle lockObject = compute_loader_lock_object(class_loader, THREAD);
  1046   check_loader_lock_contention(lockObject, THREAD);
  1055   check_loader_lock_contention(lockObject, THREAD);
  1047   ObjectLocker ol(lockObject, THREAD, DoObjectLock);
  1056   ObjectLocker ol(lockObject, THREAD, DoObjectLock);
  1057   //   super classes are loaded (resolve_super_or_fail). We expect this
  1066   //   super classes are loaded (resolve_super_or_fail). We expect this
  1058   //   to be called for all classes but java.lang.Object; and we preload
  1067   //   to be called for all classes but java.lang.Object; and we preload
  1059   //   java.lang.Object through resolve_or_fail, not this path.
  1068   //   java.lang.Object through resolve_or_fail, not this path.
  1060 
  1069 
  1061   instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name,
  1070   instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name,
  1062                                                              class_loader,
  1071                                                              loader_data,
  1063                                                              protection_domain,
  1072                                                              protection_domain,
  1064                                                              parsed_name,
  1073                                                              parsed_name,
  1065                                                              verify,
  1074                                                              verify,
  1066                                                              THREAD);
  1075                                                              THREAD);
  1067 
  1076 
  2341   return spe->method();
  2350   return spe->method();
  2342 }
  2351 }
  2343 
  2352 
  2344 // Helper for unpacking the return value from linkMethod and linkCallSite.
  2353 // Helper for unpacking the return value from linkMethod and linkCallSite.
  2345 static methodHandle unpack_method_and_appendix(Handle mname,
  2354 static methodHandle unpack_method_and_appendix(Handle mname,
       
  2355                                                KlassHandle accessing_klass,
  2346                                                objArrayHandle appendix_box,
  2356                                                objArrayHandle appendix_box,
  2347                                                Handle* appendix_result,
  2357                                                Handle* appendix_result,
  2348                                                TRAPS) {
  2358                                                TRAPS) {
  2349   methodHandle empty;
  2359   methodHandle empty;
  2350   if (mname.not_null()) {
  2360   if (mname.not_null()) {
  2359         if (appendix != NULL) { tty->print("appendix = "); appendix->print(); }
  2369         if (appendix != NULL) { tty->print("appendix = "); appendix->print(); }
  2360         tty->cr();
  2370         tty->cr();
  2361     #endif //PRODUCT
  2371     #endif //PRODUCT
  2362       }
  2372       }
  2363       (*appendix_result) = Handle(THREAD, appendix);
  2373       (*appendix_result) = Handle(THREAD, appendix);
       
  2374       // the target is stored in the cpCache and if a reference to this
       
  2375       // MethodName is dropped we need a way to make sure the
       
  2376       // class_loader containing this method is kept alive.
       
  2377       // FIXME: the appendix might also preserve this dependency.
       
  2378       ClassLoaderData* this_key = InstanceKlass::cast(accessing_klass())->class_loader_data();
       
  2379       this_key->record_dependency(m->method_holder(), CHECK_NULL); // Can throw OOM
  2364       return methodHandle(THREAD, m);
  2380       return methodHandle(THREAD, m);
  2365     }
  2381     }
  2366   }
  2382   }
  2367   THROW_MSG_(vmSymbols::java_lang_LinkageError(), "bad value from MethodHandleNatives", empty);
  2383   THROW_MSG_(vmSymbols::java_lang_LinkageError(), "bad value from MethodHandleNatives", empty);
  2368   return empty;
  2384   return empty;
  2403                          vmSymbols::linkMethod_name(),
  2419                          vmSymbols::linkMethod_name(),
  2404                          vmSymbols::linkMethod_signature(),
  2420                          vmSymbols::linkMethod_signature(),
  2405                          &args, CHECK_(empty));
  2421                          &args, CHECK_(empty));
  2406   Handle mname(THREAD, (oop) result.get_jobject());
  2422   Handle mname(THREAD, (oop) result.get_jobject());
  2407   (*method_type_result) = method_type;
  2423   (*method_type_result) = method_type;
  2408   return unpack_method_and_appendix(mname, appendix_box, appendix_result, THREAD);
  2424   return unpack_method_and_appendix(mname, accessing_klass, appendix_box, appendix_result, THREAD);
  2409 }
  2425 }
  2410 
  2426 
  2411 
  2427 
  2412 // Ask Java code to find or construct a java.lang.invoke.MethodType for the given
  2428 // Ask Java code to find or construct a java.lang.invoke.MethodType for the given
  2413 // signature, as interpreted relative to the given class loader.
  2429 // signature, as interpreted relative to the given class loader.
  2594                          vmSymbols::linkCallSite_name(),
  2610                          vmSymbols::linkCallSite_name(),
  2595                          vmSymbols::linkCallSite_signature(),
  2611                          vmSymbols::linkCallSite_signature(),
  2596                          &args, CHECK_(empty));
  2612                          &args, CHECK_(empty));
  2597   Handle mname(THREAD, (oop) result.get_jobject());
  2613   Handle mname(THREAD, (oop) result.get_jobject());
  2598   (*method_type_result) = method_type;
  2614   (*method_type_result) = method_type;
  2599   return unpack_method_and_appendix(mname, appendix_box, appendix_result, THREAD);
  2615   return unpack_method_and_appendix(mname, caller, appendix_box, appendix_result, THREAD);
  2600 }
  2616 }
  2601 
  2617 
  2602 // Since the identity hash code for symbols changes when the symbols are
  2618 // Since the identity hash code for symbols changes when the symbols are
  2603 // moved from the regular perm gen (hash in the mark word) to the shared
  2619 // moved from the regular perm gen (hash in the mark word) to the shared
  2604 // spaces (hash is the address), the classes loaded into the dictionary
  2620 // spaces (hash is the address), the classes loaded into the dictionary