src/share/vm/oops/instanceKlass.cpp

changeset 7089
6e0cb14ce59b
parent 6993
870c03421152
child 7097
14b8221771dc
equal deleted inserted replaced
7088:999824269b71 7089:6e0cb14ce59b
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 }

mercurial