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 } |