725 this_oop->set_init_thread(self); |
725 this_oop->set_init_thread(self); |
726 } |
726 } |
727 |
727 |
728 // Step 7 |
728 // Step 7 |
729 Klass* super_klass = this_oop->super(); |
729 Klass* super_klass = this_oop->super(); |
730 if (super_klass != NULL && !this_oop->is_interface() && Klass::cast(super_klass)->should_be_initialized()) { |
730 if (super_klass != NULL && !this_oop->is_interface() && super_klass->should_be_initialized()) { |
731 Klass::cast(super_klass)->initialize(THREAD); |
731 super_klass->initialize(THREAD); |
732 |
732 |
733 if (HAS_PENDING_EXCEPTION) { |
733 if (HAS_PENDING_EXCEPTION) { |
734 Handle e(THREAD, PENDING_EXCEPTION); |
734 Handle e(THREAD, PENDING_EXCEPTION); |
735 CLEAR_PENDING_EXCEPTION; |
735 CLEAR_PENDING_EXCEPTION; |
736 { |
736 { |
922 return secondaries; |
922 return secondaries; |
923 } |
923 } |
924 } |
924 } |
925 |
925 |
926 bool InstanceKlass::compute_is_subtype_of(Klass* k) { |
926 bool InstanceKlass::compute_is_subtype_of(Klass* k) { |
927 if (Klass::cast(k)->is_interface()) { |
927 if (k->is_interface()) { |
928 return implements_interface(k); |
928 return implements_interface(k); |
929 } else { |
929 } else { |
930 return Klass::compute_is_subtype_of(k); |
930 return Klass::compute_is_subtype_of(k); |
931 } |
931 } |
932 } |
932 } |
933 |
933 |
934 bool InstanceKlass::implements_interface(Klass* k) const { |
934 bool InstanceKlass::implements_interface(Klass* k) const { |
935 if (this == k) return true; |
935 if (this == k) return true; |
936 assert(Klass::cast(k)->is_interface(), "should be an interface class"); |
936 assert(k->is_interface(), "should be an interface class"); |
937 for (int i = 0; i < transitive_interfaces()->length(); i++) { |
937 for (int i = 0; i < transitive_interfaces()->length(); i++) { |
938 if (transitive_interfaces()->at(i) == k) { |
938 if (transitive_interfaces()->at(i) == k) { |
939 return true; |
939 return true; |
940 } |
940 } |
941 } |
941 } |
1105 |
1105 |
1106 Klass* InstanceKlass::find_interface_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const { |
1106 Klass* InstanceKlass::find_interface_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const { |
1107 const int n = local_interfaces()->length(); |
1107 const int n = local_interfaces()->length(); |
1108 for (int i = 0; i < n; i++) { |
1108 for (int i = 0; i < n; i++) { |
1109 Klass* intf1 = local_interfaces()->at(i); |
1109 Klass* intf1 = local_interfaces()->at(i); |
1110 assert(Klass::cast(intf1)->is_interface(), "just checking type"); |
1110 assert(intf1->is_interface(), "just checking type"); |
1111 // search for field in current interface |
1111 // search for field in current interface |
1112 if (InstanceKlass::cast(intf1)->find_local_field(name, sig, fd)) { |
1112 if (InstanceKlass::cast(intf1)->find_local_field(name, sig, fd)) { |
1113 assert(fd->is_static(), "interface field must be static"); |
1113 assert(fd->is_static(), "interface field must be static"); |
1114 return intf1; |
1114 return intf1; |
1115 } |
1115 } |
2364 |
2364 |
2365 // different verisons of is_same_class_package |
2365 // different verisons of is_same_class_package |
2366 bool InstanceKlass::is_same_class_package(Klass* class2) { |
2366 bool InstanceKlass::is_same_class_package(Klass* class2) { |
2367 Klass* class1 = this; |
2367 Klass* class1 = this; |
2368 oop classloader1 = InstanceKlass::cast(class1)->class_loader(); |
2368 oop classloader1 = InstanceKlass::cast(class1)->class_loader(); |
2369 Symbol* classname1 = Klass::cast(class1)->name(); |
2369 Symbol* classname1 = class1->name(); |
2370 |
2370 |
2371 if (Klass::cast(class2)->oop_is_objArray()) { |
2371 if (class2->oop_is_objArray()) { |
2372 class2 = ObjArrayKlass::cast(class2)->bottom_klass(); |
2372 class2 = ObjArrayKlass::cast(class2)->bottom_klass(); |
2373 } |
2373 } |
2374 oop classloader2; |
2374 oop classloader2; |
2375 if (Klass::cast(class2)->oop_is_instance()) { |
2375 if (class2->oop_is_instance()) { |
2376 classloader2 = InstanceKlass::cast(class2)->class_loader(); |
2376 classloader2 = InstanceKlass::cast(class2)->class_loader(); |
2377 } else { |
2377 } else { |
2378 assert(Klass::cast(class2)->oop_is_typeArray(), "should be type array"); |
2378 assert(class2->oop_is_typeArray(), "should be type array"); |
2379 classloader2 = NULL; |
2379 classloader2 = NULL; |
2380 } |
2380 } |
2381 Symbol* classname2 = Klass::cast(class2)->name(); |
2381 Symbol* classname2 = class2->name(); |
2382 |
2382 |
2383 return InstanceKlass::is_same_class_package(classloader1, classname1, |
2383 return InstanceKlass::is_same_class_package(classloader1, classname1, |
2384 classloader2, classname2); |
2384 classloader2, classname2); |
2385 } |
2385 } |
2386 |
2386 |
2387 bool InstanceKlass::is_same_class_package(oop classloader2, Symbol* classname2) { |
2387 bool InstanceKlass::is_same_class_package(oop classloader2, Symbol* classname2) { |
2388 Klass* class1 = this; |
2388 Klass* class1 = this; |
2389 oop classloader1 = InstanceKlass::cast(class1)->class_loader(); |
2389 oop classloader1 = InstanceKlass::cast(class1)->class_loader(); |
2390 Symbol* classname1 = Klass::cast(class1)->name(); |
2390 Symbol* classname1 = class1->name(); |
2391 |
2391 |
2392 return InstanceKlass::is_same_class_package(classloader1, classname1, |
2392 return InstanceKlass::is_same_class_package(classloader1, classname1, |
2393 classloader2, classname2); |
2393 classloader2, classname2); |
2394 } |
2394 } |
2395 |
2395 |
2476 |
2476 |
2477 // tell if two classes have the same enclosing class (at package level) |
2477 // tell if two classes have the same enclosing class (at package level) |
2478 bool InstanceKlass::is_same_package_member_impl(instanceKlassHandle class1, |
2478 bool InstanceKlass::is_same_package_member_impl(instanceKlassHandle class1, |
2479 Klass* class2_oop, TRAPS) { |
2479 Klass* class2_oop, TRAPS) { |
2480 if (class2_oop == class1()) return true; |
2480 if (class2_oop == class1()) return true; |
2481 if (!Klass::cast(class2_oop)->oop_is_instance()) return false; |
2481 if (!class2_oop->oop_is_instance()) return false; |
2482 instanceKlassHandle class2(THREAD, class2_oop); |
2482 instanceKlassHandle class2(THREAD, class2_oop); |
2483 |
2483 |
2484 // must be in same package before we try anything else |
2484 // must be in same package before we try anything else |
2485 if (!class1->is_same_class_package(class2->class_loader(), class2->name())) |
2485 if (!class1->is_same_class_package(class2->class_loader(), class2->name())) |
2486 return false; |
2486 return false; |
3009 // Verify implementor fields |
3009 // Verify implementor fields |
3010 Klass* im = implementor(); |
3010 Klass* im = implementor(); |
3011 if (im != NULL) { |
3011 if (im != NULL) { |
3012 guarantee(is_interface(), "only interfaces should have implementor set"); |
3012 guarantee(is_interface(), "only interfaces should have implementor set"); |
3013 guarantee(im->is_klass(), "should be klass"); |
3013 guarantee(im->is_klass(), "should be klass"); |
3014 guarantee(!Klass::cast(im)->is_interface() || im == this, |
3014 guarantee(!im->is_interface() || im == this, |
3015 "implementors cannot be interfaces"); |
3015 "implementors cannot be interfaces"); |
3016 } |
3016 } |
3017 |
3017 |
3018 // Verify local interfaces |
3018 // Verify local interfaces |
3019 if (local_interfaces()) { |
3019 if (local_interfaces()) { |
3020 Array<Klass*>* local_interfaces = this->local_interfaces(); |
3020 Array<Klass*>* local_interfaces = this->local_interfaces(); |
3021 for (int j = 0; j < local_interfaces->length(); j++) { |
3021 for (int j = 0; j < local_interfaces->length(); j++) { |
3022 Klass* e = local_interfaces->at(j); |
3022 Klass* e = local_interfaces->at(j); |
3023 guarantee(e->is_klass() && Klass::cast(e)->is_interface(), "invalid local interface"); |
3023 guarantee(e->is_klass() && e->is_interface(), "invalid local interface"); |
3024 } |
3024 } |
3025 } |
3025 } |
3026 |
3026 |
3027 // Verify transitive interfaces |
3027 // Verify transitive interfaces |
3028 if (transitive_interfaces() != NULL) { |
3028 if (transitive_interfaces() != NULL) { |
3029 Array<Klass*>* transitive_interfaces = this->transitive_interfaces(); |
3029 Array<Klass*>* transitive_interfaces = this->transitive_interfaces(); |
3030 for (int j = 0; j < transitive_interfaces->length(); j++) { |
3030 for (int j = 0; j < transitive_interfaces->length(); j++) { |
3031 Klass* e = transitive_interfaces->at(j); |
3031 Klass* e = transitive_interfaces->at(j); |
3032 guarantee(e->is_klass() && Klass::cast(e)->is_interface(), "invalid transitive interface"); |
3032 guarantee(e->is_klass() && e->is_interface(), "invalid transitive interface"); |
3033 } |
3033 } |
3034 } |
3034 } |
3035 |
3035 |
3036 // Verify methods |
3036 // Verify methods |
3037 if (methods() != NULL) { |
3037 if (methods() != NULL) { |