3086 public: |
3086 public: |
3087 virtual void do_oop(oop* p) { VerifyFieldClosure::do_oop_work(p); } |
3087 virtual void do_oop(oop* p) { VerifyFieldClosure::do_oop_work(p); } |
3088 virtual void do_oop(narrowOop* p) { VerifyFieldClosure::do_oop_work(p); } |
3088 virtual void do_oop(narrowOop* p) { VerifyFieldClosure::do_oop_work(p); } |
3089 }; |
3089 }; |
3090 |
3090 |
3091 void InstanceKlass::verify_on(outputStream* st) { |
3091 void InstanceKlass::verify_on(outputStream* st, bool check_dictionary) { |
3092 Klass::verify_on(st); |
|
3093 Thread *thread = Thread::current(); |
|
3094 |
|
3095 #ifndef PRODUCT |
3092 #ifndef PRODUCT |
3096 // Avoid redundant verifies |
3093 // Avoid redundant verifies, this really should be in product. |
3097 if (_verify_count == Universe::verify_count()) return; |
3094 if (_verify_count == Universe::verify_count()) return; |
3098 _verify_count = Universe::verify_count(); |
3095 _verify_count = Universe::verify_count(); |
3099 #endif |
3096 #endif |
3100 // Verify that klass is present in SystemDictionary |
3097 |
3101 if (is_loaded() && !is_anonymous()) { |
3098 // Verify Klass |
|
3099 Klass::verify_on(st, check_dictionary); |
|
3100 |
|
3101 // Verify that klass is present in SystemDictionary if not already |
|
3102 // verifying the SystemDictionary. |
|
3103 if (is_loaded() && !is_anonymous() && check_dictionary) { |
3102 Symbol* h_name = name(); |
3104 Symbol* h_name = name(); |
3103 SystemDictionary::verify_obj_klass_present(h_name, class_loader_data()); |
3105 SystemDictionary::verify_obj_klass_present(h_name, class_loader_data()); |
3104 } |
3106 } |
3105 |
3107 |
3106 // Verify static fields |
|
3107 VerifyFieldClosure blk; |
|
3108 |
|
3109 // Verify vtables |
3108 // Verify vtables |
3110 if (is_linked()) { |
3109 if (is_linked()) { |
3111 ResourceMark rm(thread); |
3110 ResourceMark rm; |
3112 // $$$ This used to be done only for m/s collections. Doing it |
3111 // $$$ This used to be done only for m/s collections. Doing it |
3113 // always seemed a valid generalization. (DLD -- 6/00) |
3112 // always seemed a valid generalization. (DLD -- 6/00) |
3114 vtable()->verify(st); |
3113 vtable()->verify(st); |
3115 } |
3114 } |
3116 |
3115 |
3117 // Verify first subklass |
3116 // Verify first subklass |
3118 if (subklass_oop() != NULL) { |
3117 if (subklass_oop() != NULL) { |
3119 guarantee(subklass_oop()->is_metadata(), "should be in metaspace"); |
|
3120 guarantee(subklass_oop()->is_klass(), "should be klass"); |
3118 guarantee(subklass_oop()->is_klass(), "should be klass"); |
3121 } |
3119 } |
3122 |
3120 |
3123 // Verify siblings |
3121 // Verify siblings |
3124 Klass* super = this->super(); |
3122 Klass* super = this->super(); |
3126 if (sib != NULL) { |
3124 if (sib != NULL) { |
3127 if (sib == this) { |
3125 if (sib == this) { |
3128 fatal(err_msg("subclass points to itself " PTR_FORMAT, sib)); |
3126 fatal(err_msg("subclass points to itself " PTR_FORMAT, sib)); |
3129 } |
3127 } |
3130 |
3128 |
3131 guarantee(sib->is_metadata(), "should be in metaspace"); |
|
3132 guarantee(sib->is_klass(), "should be klass"); |
3129 guarantee(sib->is_klass(), "should be klass"); |
3133 guarantee(sib->super() == super, "siblings should have same superklass"); |
3130 guarantee(sib->super() == super, "siblings should have same superklass"); |
3134 } |
3131 } |
3135 |
3132 |
3136 // Verify implementor fields |
3133 // Verify implementor fields |
3162 |
3159 |
3163 // Verify methods |
3160 // Verify methods |
3164 if (methods() != NULL) { |
3161 if (methods() != NULL) { |
3165 Array<Method*>* methods = this->methods(); |
3162 Array<Method*>* methods = this->methods(); |
3166 for (int j = 0; j < methods->length(); j++) { |
3163 for (int j = 0; j < methods->length(); j++) { |
3167 guarantee(methods->at(j)->is_metadata(), "should be in metaspace"); |
|
3168 guarantee(methods->at(j)->is_method(), "non-method in methods array"); |
3164 guarantee(methods->at(j)->is_method(), "non-method in methods array"); |
3169 } |
3165 } |
3170 for (int j = 0; j < methods->length() - 1; j++) { |
3166 for (int j = 0; j < methods->length() - 1; j++) { |
3171 Method* m1 = methods->at(j); |
3167 Method* m1 = methods->at(j); |
3172 Method* m2 = methods->at(j + 1); |
3168 Method* m2 = methods->at(j + 1); |
3200 jni_ids()->verify(this); |
3196 jni_ids()->verify(this); |
3201 } |
3197 } |
3202 |
3198 |
3203 // Verify other fields |
3199 // Verify other fields |
3204 if (array_klasses() != NULL) { |
3200 if (array_klasses() != NULL) { |
3205 guarantee(array_klasses()->is_metadata(), "should be in metaspace"); |
|
3206 guarantee(array_klasses()->is_klass(), "should be klass"); |
3201 guarantee(array_klasses()->is_klass(), "should be klass"); |
3207 } |
3202 } |
3208 if (constants() != NULL) { |
3203 if (constants() != NULL) { |
3209 guarantee(constants()->is_metadata(), "should be in metaspace"); |
|
3210 guarantee(constants()->is_constantPool(), "should be constant pool"); |
3204 guarantee(constants()->is_constantPool(), "should be constant pool"); |
3211 } |
3205 } |
3212 const Klass* host = host_klass(); |
3206 const Klass* host = host_klass(); |
3213 if (host != NULL) { |
3207 if (host != NULL) { |
3214 guarantee(host->is_metadata(), "should be in metaspace"); |
|
3215 guarantee(host->is_klass(), "should be klass"); |
3208 guarantee(host->is_klass(), "should be klass"); |
3216 } |
3209 } |
3217 } |
3210 } |
3218 |
3211 |
3219 void InstanceKlass::oop_verify_on(oop obj, outputStream* st) { |
3212 void InstanceKlass::oop_verify_on(oop obj, outputStream* st) { |