hotspot/src/share/vm/oops/instanceKlass.cpp
changeset 26135 82b516c550f7
parent 25500 4d2e06147d1e
child 26316 93f6b40c038b
equal deleted inserted replaced
25956:99be217ac88d 26135:82b516c550f7
  2301 
  2301 
  2302   // do array classes also.
  2302   // do array classes also.
  2303   array_klasses_do(remove_unshareable_in_class);
  2303   array_klasses_do(remove_unshareable_in_class);
  2304 }
  2304 }
  2305 
  2305 
  2306 void restore_unshareable_in_class(Klass* k, TRAPS) {
  2306 static void restore_unshareable_in_class(Klass* k, TRAPS) {
  2307   k->restore_unshareable_info(CHECK);
  2307   // Array classes have null protection domain.
  2308 }
  2308   // --> see ArrayKlass::complete_create_array_klass()
  2309 
  2309   k->restore_unshareable_info(ClassLoaderData::the_null_class_loader_data(), Handle(), CHECK);
  2310 void InstanceKlass::restore_unshareable_info(TRAPS) {
  2310 }
  2311   Klass::restore_unshareable_info(CHECK);
  2311 
       
  2312 void InstanceKlass::restore_unshareable_info(ClassLoaderData* loader_data, Handle protection_domain, TRAPS) {
       
  2313   Klass::restore_unshareable_info(loader_data, protection_domain, CHECK);
  2312   instanceKlassHandle ik(THREAD, this);
  2314   instanceKlassHandle ik(THREAD, this);
  2313 
  2315 
  2314   Array<Method*>* methods = ik->methods();
  2316   Array<Method*>* methods = ik->methods();
  2315   int num_methods = methods->length();
  2317   int num_methods = methods->length();
  2316   for (int index2 = 0; index2 < num_methods; ++index2) {
  2318   for (int index2 = 0; index2 < num_methods; ++index2) {
  2330 
  2332 
  2331   // restore constant pool resolved references
  2333   // restore constant pool resolved references
  2332   ik->constants()->restore_unshareable_info(CHECK);
  2334   ik->constants()->restore_unshareable_info(CHECK);
  2333 
  2335 
  2334   ik->array_klasses_do(restore_unshareable_in_class, CHECK);
  2336   ik->array_klasses_do(restore_unshareable_in_class, CHECK);
       
  2337 }
       
  2338 
       
  2339 // returns true IFF is_in_error_state() has been changed as a result of this call.
       
  2340 bool InstanceKlass::check_sharing_error_state() {
       
  2341   assert(DumpSharedSpaces, "should only be called during dumping");
       
  2342   bool old_state = is_in_error_state();
       
  2343 
       
  2344   if (!is_in_error_state()) {
       
  2345     bool bad = false;
       
  2346     for (InstanceKlass* sup = java_super(); sup; sup = sup->java_super()) {
       
  2347       if (sup->is_in_error_state()) {
       
  2348         bad = true;
       
  2349         break;
       
  2350       }
       
  2351     }
       
  2352     if (!bad) {
       
  2353       Array<Klass*>* interfaces = transitive_interfaces();
       
  2354       for (int i = 0; i < interfaces->length(); i++) {
       
  2355         Klass* iface = interfaces->at(i);
       
  2356         if (InstanceKlass::cast(iface)->is_in_error_state()) {
       
  2357           bad = true;
       
  2358           break;
       
  2359         }
       
  2360       }
       
  2361     }
       
  2362 
       
  2363     if (bad) {
       
  2364       set_in_error_state();
       
  2365     }
       
  2366   }
       
  2367 
       
  2368   return (old_state != is_in_error_state());
  2335 }
  2369 }
  2336 
  2370 
  2337 static void clear_all_breakpoints(Method* m) {
  2371 static void clear_all_breakpoints(Method* m) {
  2338   m->clear_all_breakpoints();
  2372   m->clear_all_breakpoints();
  2339 }
  2373 }