2319 |
2319 |
2320 // do array classes also. |
2320 // do array classes also. |
2321 array_klasses_do(remove_unshareable_in_class); |
2321 array_klasses_do(remove_unshareable_in_class); |
2322 } |
2322 } |
2323 |
2323 |
2324 void restore_unshareable_in_class(Klass* k, TRAPS) { |
2324 static void restore_unshareable_in_class(Klass* k, TRAPS) { |
2325 k->restore_unshareable_info(CHECK); |
2325 // Array classes have null protection domain. |
2326 } |
2326 // --> see ArrayKlass::complete_create_array_klass() |
2327 |
2327 k->restore_unshareable_info(ClassLoaderData::the_null_class_loader_data(), Handle(), CHECK); |
2328 void InstanceKlass::restore_unshareable_info(TRAPS) { |
2328 } |
2329 Klass::restore_unshareable_info(CHECK); |
2329 |
|
2330 void InstanceKlass::restore_unshareable_info(ClassLoaderData* loader_data, Handle protection_domain, TRAPS) { |
|
2331 Klass::restore_unshareable_info(loader_data, protection_domain, CHECK); |
2330 instanceKlassHandle ik(THREAD, this); |
2332 instanceKlassHandle ik(THREAD, this); |
2331 |
2333 |
2332 Array<Method*>* methods = ik->methods(); |
2334 Array<Method*>* methods = ik->methods(); |
2333 int num_methods = methods->length(); |
2335 int num_methods = methods->length(); |
2334 for (int index2 = 0; index2 < num_methods; ++index2) { |
2336 for (int index2 = 0; index2 < num_methods; ++index2) { |
2348 |
2350 |
2349 // restore constant pool resolved references |
2351 // restore constant pool resolved references |
2350 ik->constants()->restore_unshareable_info(CHECK); |
2352 ik->constants()->restore_unshareable_info(CHECK); |
2351 |
2353 |
2352 ik->array_klasses_do(restore_unshareable_in_class, CHECK); |
2354 ik->array_klasses_do(restore_unshareable_in_class, CHECK); |
|
2355 } |
|
2356 |
|
2357 // returns true IFF is_in_error_state() has been changed as a result of this call. |
|
2358 bool InstanceKlass::check_sharing_error_state() { |
|
2359 assert(DumpSharedSpaces, "should only be called during dumping"); |
|
2360 bool old_state = is_in_error_state(); |
|
2361 |
|
2362 if (!is_in_error_state()) { |
|
2363 bool bad = false; |
|
2364 for (InstanceKlass* sup = java_super(); sup; sup = sup->java_super()) { |
|
2365 if (sup->is_in_error_state()) { |
|
2366 bad = true; |
|
2367 break; |
|
2368 } |
|
2369 } |
|
2370 if (!bad) { |
|
2371 Array<Klass*>* interfaces = transitive_interfaces(); |
|
2372 for (int i = 0; i < interfaces->length(); i++) { |
|
2373 Klass* iface = interfaces->at(i); |
|
2374 if (InstanceKlass::cast(iface)->is_in_error_state()) { |
|
2375 bad = true; |
|
2376 break; |
|
2377 } |
|
2378 } |
|
2379 } |
|
2380 |
|
2381 if (bad) { |
|
2382 set_in_error_state(); |
|
2383 } |
|
2384 } |
|
2385 |
|
2386 return (old_state != is_in_error_state()); |
2353 } |
2387 } |
2354 |
2388 |
2355 static void clear_all_breakpoints(Method* m) { |
2389 static void clear_all_breakpoints(Method* m) { |
2356 m->clear_all_breakpoints(); |
2390 m->clear_all_breakpoints(); |
2357 } |
2391 } |