< prev index next >

src/hotspot/share/classfile/classFileParser.cpp

Print this page




4567   ClassLoaderData* const defining_loader_data = defined_klass->class_loader_data();
4568   if (defining_loader_data->is_the_null_class_loader_data()) {
4569       // Dependencies to null class loader data are implicit.
4570       return;
4571   } else {
4572     // add super class dependency
4573     Klass* const super = defined_klass->super();
4574     if (super != NULL) {
4575       defining_loader_data->record_dependency(super, CHECK);
4576     }
4577 
4578     // add super interface dependencies
4579     const Array<Klass*>* const local_interfaces = defined_klass->local_interfaces();
4580     if (local_interfaces != NULL) {
4581       const int length = local_interfaces->length();
4582       for (int i = 0; i < length; i++) {
4583         defining_loader_data->record_dependency(local_interfaces->at(i), CHECK);
4584       }
4585     }
4586 
4587     for (FieldStream st((InstanceKlass*)defined_klass, false, false); !st.eos(); st.next()) {
4588       Symbol* signature = st.signature();
4589       if (signature->starts_with("Q")) {
4590         Klass* klass = SystemDictionary::resolve_or_fail(signature,
4591                                                          Handle(THREAD, defined_klass->class_loader()),
4592                                                          Handle(THREAD, defined_klass->protection_domain()), true, CHECK);
4593         assert(klass != NULL, "Sanity check");
4594         assert(klass->access_flags().is_value_type(), "Value type expected");
4595         defining_loader_data->record_dependency(klass, CHECK);
4596       }
4597     }
4598   }
4599 }
4600 
4601 // utility methods for appending an array with check for duplicates
4602 
4603 static void append_interfaces(GrowableArray<Klass*>* result,
4604                               const Array<Klass*>* const ifs) {
4605   // iterate over new interfaces
4606   for (int i = 0; i < ifs->length(); i++) {
4607     Klass* const e = ifs->at(i);
4608     assert(e->is_klass() && InstanceKlass::cast(e)->is_interface(), "just checking");
4609     // add new interface
4610     result->append_if_missing(e);


5727 
5728   // Valhalla shady value type conversion
5729   if (_parsed_annotations->is_value_capable_class()) {
5730     ik->create_value_capable_class(Handle(THREAD, _loader_data->class_loader()),
5731                                  _protection_domain, CHECK);
5732   }
5733 
5734   // Add read edges to the unnamed modules of the bootstrap and app class loaders.
5735   if (changed_by_loadhook && !module_handle.is_null() && module_entry->is_named() &&
5736       !module_entry->has_default_read_edges()) {
5737     if (!module_entry->set_has_default_read_edges()) {
5738       // We won a potential race
5739       JvmtiExport::add_default_read_edges(module_handle, THREAD);
5740     }
5741   }
5742 
5743   // Update the loader_data graph.
5744   record_defined_class_dependencies(ik, CHECK);
5745 
5746   for(int i = 0; i < ik->java_fields_count(); i++) {
5747     if (ik->field_signature(i)->starts_with("Q")) {
5748       Klass* klass = SystemDictionary::resolve_or_fail(ik->field_signature(i),
5749                                                        Handle(THREAD, ik->class_loader()),
5750                                                        Handle(THREAD, ik->protection_domain()), true, CHECK);
5751       assert(klass != NULL, "Sanity check");
5752       assert(klass->access_flags().is_value_type(), "Value type expected");
5753       ik->set_value_field_klass(i, klass);
5754     }
5755   }
5756 
5757   ClassLoadingService::notify_class_loaded(ik, false /* not shared class */);
5758 
5759   if (!is_internal()) {
5760     if (log_is_enabled(Info, class, load)) {
5761       ResourceMark rm;
5762       const char* module_name = (module_entry->name() == NULL) ? UNNAMED_MODULE : module_entry->name()->as_C_string();
5763       ik->print_class_load_logging(_loader_data, module_name, _stream);
5764     }
5765 
5766     if (log_is_enabled(Debug, class, resolve))  {
5767       ResourceMark rm;




4567   ClassLoaderData* const defining_loader_data = defined_klass->class_loader_data();
4568   if (defining_loader_data->is_the_null_class_loader_data()) {
4569       // Dependencies to null class loader data are implicit.
4570       return;
4571   } else {
4572     // add super class dependency
4573     Klass* const super = defined_klass->super();
4574     if (super != NULL) {
4575       defining_loader_data->record_dependency(super, CHECK);
4576     }
4577 
4578     // add super interface dependencies
4579     const Array<Klass*>* const local_interfaces = defined_klass->local_interfaces();
4580     if (local_interfaces != NULL) {
4581       const int length = local_interfaces->length();
4582       for (int i = 0; i < length; i++) {
4583         defining_loader_data->record_dependency(local_interfaces->at(i), CHECK);
4584       }
4585     }
4586 
4587     for(int i = 0; i < defined_klass->java_fields_count(); i++) {
4588       if (defined_klass->field_signature(i)->starts_with("Q")  && (((defined_klass->field_access_flags(i) & JVM_ACC_STATIC)) == 0)) {
4589         Klass* klass = SystemDictionary::resolve_or_fail(defined_klass->field_signature(i),

4590                                                          Handle(THREAD, defined_klass->class_loader()),
4591                                                          Handle(THREAD, defined_klass->protection_domain()), true, CHECK);
4592         assert(klass != NULL, "Sanity check");
4593         assert(klass->access_flags().is_value_type(), "Value type expected");
4594         defining_loader_data->record_dependency(klass, CHECK);
4595       }
4596     }
4597   }
4598 }
4599 
4600 // utility methods for appending an array with check for duplicates
4601 
4602 static void append_interfaces(GrowableArray<Klass*>* result,
4603                               const Array<Klass*>* const ifs) {
4604   // iterate over new interfaces
4605   for (int i = 0; i < ifs->length(); i++) {
4606     Klass* const e = ifs->at(i);
4607     assert(e->is_klass() && InstanceKlass::cast(e)->is_interface(), "just checking");
4608     // add new interface
4609     result->append_if_missing(e);


5726 
5727   // Valhalla shady value type conversion
5728   if (_parsed_annotations->is_value_capable_class()) {
5729     ik->create_value_capable_class(Handle(THREAD, _loader_data->class_loader()),
5730                                  _protection_domain, CHECK);
5731   }
5732 
5733   // Add read edges to the unnamed modules of the bootstrap and app class loaders.
5734   if (changed_by_loadhook && !module_handle.is_null() && module_entry->is_named() &&
5735       !module_entry->has_default_read_edges()) {
5736     if (!module_entry->set_has_default_read_edges()) {
5737       // We won a potential race
5738       JvmtiExport::add_default_read_edges(module_handle, THREAD);
5739     }
5740   }
5741 
5742   // Update the loader_data graph.
5743   record_defined_class_dependencies(ik, CHECK);
5744 
5745   for(int i = 0; i < ik->java_fields_count(); i++) {
5746     if (ik->field_signature(i)->starts_with("Q")  && (((ik->field_access_flags(i) & JVM_ACC_STATIC)) == 0)) {
5747       Klass* klass = SystemDictionary::resolve_or_fail(ik->field_signature(i),
5748                                                        Handle(THREAD, ik->class_loader()),
5749                                                        Handle(THREAD, ik->protection_domain()), true, CHECK);
5750       assert(klass != NULL, "Sanity check");
5751       assert(klass->access_flags().is_value_type(), "Value type expected");
5752       ik->set_value_field_klass(i, klass);
5753     }
5754   }
5755 
5756   ClassLoadingService::notify_class_loaded(ik, false /* not shared class */);
5757 
5758   if (!is_internal()) {
5759     if (log_is_enabled(Info, class, load)) {
5760       ResourceMark rm;
5761       const char* module_name = (module_entry->name() == NULL) ? UNNAMED_MODULE : module_entry->name()->as_C_string();
5762       ik->print_class_load_logging(_loader_data, module_name, _stream);
5763     }
5764 
5765     if (log_is_enabled(Debug, class, resolve))  {
5766       ResourceMark rm;


< prev index next >