< prev index next >

src/hotspot/share/classfile/classFileParser.cpp

Print this page

*** 920,933 **** assert(stream != NULL, "invariant"); assert(cp != NULL, "invariant"); assert(has_nonstatic_concrete_methods != NULL, "invariant"); if (itfs_len == 0) { ! _local_interfaces = Universe::the_empty_klass_array(); } else { assert(itfs_len > 0, "only called for len>0"); ! _local_interfaces = MetadataFactory::new_array<Klass*>(_loader_data, itfs_len, NULL, CHECK); int index; for (index = 0; index < itfs_len; index++) { const u2 interface_index = stream->get_u2(CHECK); Klass* interf; --- 920,933 ---- assert(stream != NULL, "invariant"); assert(cp != NULL, "invariant"); assert(has_nonstatic_concrete_methods != NULL, "invariant"); if (itfs_len == 0) { ! _local_interfaces = Universe::the_empty_instance_klass_array(); } else { assert(itfs_len > 0, "only called for len>0"); ! _local_interfaces = MetadataFactory::new_array<InstanceKlass*>(_loader_data, itfs_len, NULL, CHECK); int index; for (index = 0; index < itfs_len; index++) { const u2 interface_index = stream->get_u2(CHECK); Klass* interf;
*** 964,974 **** } if (InstanceKlass::cast(interf)->has_nonstatic_concrete_methods()) { *has_nonstatic_concrete_methods = true; } ! _local_interfaces->at_put(index, interf); } if (!_need_verify || itfs_len <= 1) { return; } --- 964,974 ---- } if (InstanceKlass::cast(interf)->has_nonstatic_concrete_methods()) { *has_nonstatic_concrete_methods = true; } ! _local_interfaces->at_put(index, InstanceKlass::cast(interf)); } if (!_need_verify || itfs_len <= 1) { return; }
*** 982,993 **** bool dup = false; const Symbol* name = NULL; { debug_only(NoSafepointVerifier nsv;) for (index = 0; index < itfs_len; index++) { ! const Klass* const k = _local_interfaces->at(index); ! name = InstanceKlass::cast(k)->name(); // If no duplicates, add (name, NULL) in hashtable interface_names. if (!put_after_lookup(name, NULL, interface_names)) { dup = true; break; } --- 982,993 ---- bool dup = false; const Symbol* name = NULL; { debug_only(NoSafepointVerifier nsv;) for (index = 0; index < itfs_len; index++) { ! const InstanceKlass* const k = _local_interfaces->at(index); ! name = k->name(); // If no duplicates, add (name, NULL) in hashtable interface_names. if (!put_after_lookup(name, NULL, interface_names)) { dup = true; break; }
*** 4494,4504 **** if (super != NULL) { defining_loader_data->record_dependency(super); } // add super interface dependencies ! const Array<Klass*>* const local_interfaces = defined_klass->local_interfaces(); if (local_interfaces != NULL) { const int length = local_interfaces->length(); for (int i = 0; i < length; i++) { defining_loader_data->record_dependency(local_interfaces->at(i)); } --- 4494,4504 ---- if (super != NULL) { defining_loader_data->record_dependency(super); } // add super interface dependencies ! const Array<InstanceKlass*>* const local_interfaces = defined_klass->local_interfaces(); if (local_interfaces != NULL) { const int length = local_interfaces->length(); for (int i = 0; i < length; i++) { defining_loader_data->record_dependency(local_interfaces->at(i)); }
*** 4506,4528 **** } } // utility methods for appending an array with check for duplicates ! static void append_interfaces(GrowableArray<Klass*>* result, ! const Array<Klass*>* const ifs) { // iterate over new interfaces for (int i = 0; i < ifs->length(); i++) { ! Klass* const e = ifs->at(i); ! assert(e->is_klass() && InstanceKlass::cast(e)->is_interface(), "just checking"); // add new interface result->append_if_missing(e); } } ! static Array<Klass*>* compute_transitive_interfaces(const InstanceKlass* super, ! Array<Klass*>* local_ifs, ClassLoaderData* loader_data, TRAPS) { assert(local_ifs != NULL, "invariant"); assert(loader_data != NULL, "invariant"); --- 4506,4528 ---- } } // utility methods for appending an array with check for duplicates ! static void append_interfaces(GrowableArray<InstanceKlass*>* result, ! const Array<InstanceKlass*>* const ifs) { // iterate over new interfaces for (int i = 0; i < ifs->length(); i++) { ! InstanceKlass* const e = ifs->at(i); ! assert(e->is_klass() && e->is_interface(), "just checking"); // add new interface result->append_if_missing(e); } } ! static Array<InstanceKlass*>* compute_transitive_interfaces(const InstanceKlass* super, ! Array<InstanceKlass*>* local_ifs, ClassLoaderData* loader_data, TRAPS) { assert(local_ifs != NULL, "invariant"); assert(loader_data != NULL, "invariant");
*** 4535,4583 **** max_transitive_size += super_size; } // Add local interfaces' super interfaces const int local_size = local_ifs->length(); for (int i = 0; i < local_size; i++) { ! Klass* const l = local_ifs->at(i); ! max_transitive_size += InstanceKlass::cast(l)->transitive_interfaces()->length(); } // Finally add local interfaces max_transitive_size += local_size; // Construct array if (max_transitive_size == 0) { // no interfaces, use canonicalized array ! return Universe::the_empty_klass_array(); } else if (max_transitive_size == super_size) { // no new local interfaces added, share superklass' transitive interface array return super->transitive_interfaces(); } else if (max_transitive_size == local_size) { // only local interfaces added, share local interface array return local_ifs; } else { ResourceMark rm; ! GrowableArray<Klass*>* const result = new GrowableArray<Klass*>(max_transitive_size); // Copy down from superclass if (super != NULL) { append_interfaces(result, super->transitive_interfaces()); } // Copy down from local interfaces' superinterfaces for (int i = 0; i < local_size; i++) { ! Klass* const l = local_ifs->at(i); ! append_interfaces(result, InstanceKlass::cast(l)->transitive_interfaces()); } // Finally add local interfaces append_interfaces(result, local_ifs); // length will be less than the max_transitive_size if duplicates were removed const int length = result->length(); assert(length <= max_transitive_size, "just checking"); ! Array<Klass*>* const new_result = ! MetadataFactory::new_array<Klass*>(loader_data, length, CHECK_NULL); for (int i = 0; i < length; i++) { ! Klass* const e = result->at(i); assert(e != NULL, "just checking"); new_result->at_put(i, e); } return new_result; } --- 4535,4583 ---- max_transitive_size += super_size; } // Add local interfaces' super interfaces const int local_size = local_ifs->length(); for (int i = 0; i < local_size; i++) { ! InstanceKlass* const l = local_ifs->at(i); ! max_transitive_size += l->transitive_interfaces()->length(); } // Finally add local interfaces max_transitive_size += local_size; // Construct array if (max_transitive_size == 0) { // no interfaces, use canonicalized array ! return Universe::the_empty_instance_klass_array(); } else if (max_transitive_size == super_size) { // no new local interfaces added, share superklass' transitive interface array return super->transitive_interfaces(); } else if (max_transitive_size == local_size) { // only local interfaces added, share local interface array return local_ifs; } else { ResourceMark rm; ! GrowableArray<InstanceKlass*>* const result = new GrowableArray<InstanceKlass*>(max_transitive_size); // Copy down from superclass if (super != NULL) { append_interfaces(result, super->transitive_interfaces()); } // Copy down from local interfaces' superinterfaces for (int i = 0; i < local_size; i++) { ! InstanceKlass* const l = local_ifs->at(i); ! append_interfaces(result, l->transitive_interfaces()); } // Finally add local interfaces append_interfaces(result, local_ifs); // length will be less than the max_transitive_size if duplicates were removed const int length = result->length(); assert(length <= max_transitive_size, "just checking"); ! Array<InstanceKlass*>* const new_result = ! MetadataFactory::new_array<InstanceKlass*>(loader_data, length, CHECK_NULL); for (int i = 0; i < length; i++) { ! InstanceKlass* const e = result->at(i); assert(e != NULL, "just checking"); new_result->at_put(i, e); } return new_result; }
*** 4641,4661 **** } static void check_super_interface_access(const InstanceKlass* this_klass, TRAPS) { assert(this_klass != NULL, "invariant"); ! const Array<Klass*>* const local_interfaces = this_klass->local_interfaces(); const int lng = local_interfaces->length(); for (int i = lng - 1; i >= 0; i--) { ! Klass* const k = local_interfaces->at(i); assert (k != NULL && k->is_interface(), "invalid interface"); Reflection::VerifyClassAccessResults vca_result = ! Reflection::verify_class_access(this_klass, InstanceKlass::cast(k), false); if (vca_result != Reflection::ACCESS_OK) { ResourceMark rm(THREAD); char* msg = Reflection::verify_class_access_msg(this_klass, ! InstanceKlass::cast(k), vca_result); if (msg == NULL) { bool same_module = (this_klass->module() == k->module()); Exceptions::fthrow( THREAD_AND_LOCATION, --- 4641,4661 ---- } static void check_super_interface_access(const InstanceKlass* this_klass, TRAPS) { assert(this_klass != NULL, "invariant"); ! const Array<InstanceKlass*>* const local_interfaces = this_klass->local_interfaces(); const int lng = local_interfaces->length(); for (int i = lng - 1; i >= 0; i--) { ! InstanceKlass* const k = local_interfaces->at(i); assert (k != NULL && k->is_interface(), "invalid interface"); Reflection::VerifyClassAccessResults vca_result = ! Reflection::verify_class_access(this_klass, k, false); if (vca_result != Reflection::ACCESS_OK) { ResourceMark rm(THREAD); char* msg = Reflection::verify_class_access_msg(this_klass, ! k, vca_result); if (msg == NULL) { bool same_module = (this_klass->module() == k->module()); Exceptions::fthrow( THREAD_AND_LOCATION,
*** 5733,5747 **** log_debug(class, resolve)("%s %s (super)", from, ik->java_super()->external_name()); } // print out each of the interface classes referred to by this class. ! const Array<Klass*>* const local_interfaces = ik->local_interfaces(); if (local_interfaces != NULL) { const int length = local_interfaces->length(); for (int i = 0; i < length; i++) { ! const Klass* const k = local_interfaces->at(i); const char * to = k->external_name(); log_debug(class, resolve)("%s %s (interface)", from, to); } } } --- 5733,5747 ---- log_debug(class, resolve)("%s %s (super)", from, ik->java_super()->external_name()); } // print out each of the interface classes referred to by this class. ! const Array<InstanceKlass*>* const local_interfaces = ik->local_interfaces(); if (local_interfaces != NULL) { const int length = local_interfaces->length(); for (int i = 0; i < length; i++) { ! const InstanceKlass* const k = local_interfaces->at(i); const char * to = k->external_name(); log_debug(class, resolve)("%s %s (interface)", from, to); } } }
*** 6270,6280 **** assert(stream->at_eos(), "invariant"); assert(cp != NULL, "invariant"); assert(_loader_data != NULL, "invariant"); if (_class_name == vmSymbols::java_lang_Object()) { ! check_property(_local_interfaces == Universe::the_empty_klass_array(), "java.lang.Object cannot implement an interface in class file %s", CHECK); } // We check super class after class file is parsed and format is checked if (_super_class_index > 0 && NULL ==_super_klass) { --- 6270,6280 ---- assert(stream->at_eos(), "invariant"); assert(cp != NULL, "invariant"); assert(_loader_data != NULL, "invariant"); if (_class_name == vmSymbols::java_lang_Object()) { ! check_property(_local_interfaces == Universe::the_empty_instance_klass_array(), "java.lang.Object cannot implement an interface in class file %s", CHECK); } // We check super class after class file is parsed and format is checked if (_super_class_index > 0 && NULL ==_super_klass) {
< prev index next >