comparison src/share/vm/classfile/systemDictionary.cpp @ 14422:2b8e28fdf503

Merge
author kvn
date Tue, 05 Nov 2013 17:38:04 -0800
parents 1c90f0072f0d
children 096c224171c4 86e6d691f2e1
comparison
equal deleted inserted replaced
14421:3068270ba476 14422:2b8e28fdf503
1695 } 1695 }
1696 } 1696 }
1697 return newsize; 1697 return newsize;
1698 } 1698 }
1699 1699
1700 #ifdef ASSERT
1701 class VerifySDReachableAndLiveClosure : public OopClosure {
1702 private:
1703 BoolObjectClosure* _is_alive;
1704
1705 template <class T> void do_oop_work(T* p) {
1706 oop obj = oopDesc::load_decode_heap_oop(p);
1707 guarantee(_is_alive->do_object_b(obj), "Oop in system dictionary must be live");
1708 }
1709
1710 public:
1711 VerifySDReachableAndLiveClosure(BoolObjectClosure* is_alive) : OopClosure(), _is_alive(is_alive) { }
1712
1713 virtual void do_oop(oop* p) { do_oop_work(p); }
1714 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
1715 };
1716 #endif
1717
1700 // Assumes classes in the SystemDictionary are only unloaded at a safepoint 1718 // Assumes classes in the SystemDictionary are only unloaded at a safepoint
1701 // Note: anonymous classes are not in the SD. 1719 // Note: anonymous classes are not in the SD.
1702 bool SystemDictionary::do_unloading(BoolObjectClosure* is_alive) { 1720 bool SystemDictionary::do_unloading(BoolObjectClosure* is_alive) {
1703 // First, mark for unload all ClassLoaderData referencing a dead class loader. 1721 // First, mark for unload all ClassLoaderData referencing a dead class loader.
1704 bool has_dead_loaders = ClassLoaderDataGraph::do_unloading(is_alive); 1722 bool has_dead_loaders = ClassLoaderDataGraph::do_unloading(is_alive);
1705 bool unloading_occurred = false; 1723 bool unloading_occurred = false;
1706 if (has_dead_loaders) { 1724 if (has_dead_loaders) {
1707 unloading_occurred = dictionary()->do_unloading(); 1725 unloading_occurred = dictionary()->do_unloading();
1708 constraints()->purge_loader_constraints(); 1726 constraints()->purge_loader_constraints();
1709 resolution_errors()->purge_resolution_errors(); 1727 resolution_errors()->purge_resolution_errors();
1710 } 1728 }
1729 // Oops referenced by the system dictionary may get unreachable independently
1730 // of the class loader (eg. cached protection domain oops). So we need to
1731 // explicitly unlink them here instead of in Dictionary::do_unloading.
1732 dictionary()->unlink(is_alive);
1733 #ifdef ASSERT
1734 VerifySDReachableAndLiveClosure cl(is_alive);
1735 dictionary()->oops_do(&cl);
1736 #endif
1711 return unloading_occurred; 1737 return unloading_occurred;
1712 } 1738 }
1713 1739
1714 void SystemDictionary::oops_do(OopClosure* f) { 1740 void SystemDictionary::oops_do(OopClosure* f) {
1715 f->do_oop(&_java_system_loader); 1741 f->do_oop(&_java_system_loader);
2332 int ref_kind = JVM_REF_invokeVirtual; 2358 int ref_kind = JVM_REF_invokeVirtual;
2333 Handle name_str = StringTable::intern(name, CHECK_(empty)); 2359 Handle name_str = StringTable::intern(name, CHECK_(empty));
2334 objArrayHandle appendix_box = oopFactory::new_objArray(SystemDictionary::Object_klass(), 1, CHECK_(empty)); 2360 objArrayHandle appendix_box = oopFactory::new_objArray(SystemDictionary::Object_klass(), 1, CHECK_(empty));
2335 assert(appendix_box->obj_at(0) == NULL, ""); 2361 assert(appendix_box->obj_at(0) == NULL, "");
2336 2362
2363 // This should not happen. JDK code should take care of that.
2364 if (accessing_klass.is_null() || method_type.is_null()) {
2365 THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad invokehandle", empty);
2366 }
2367
2337 // call java.lang.invoke.MethodHandleNatives::linkMethod(... String, MethodType) -> MemberName 2368 // call java.lang.invoke.MethodHandleNatives::linkMethod(... String, MethodType) -> MemberName
2338 JavaCallArguments args; 2369 JavaCallArguments args;
2339 args.push_oop(accessing_klass()->java_mirror()); 2370 args.push_oop(accessing_klass()->java_mirror());
2340 args.push_int(ref_kind); 2371 args.push_int(ref_kind);
2341 args.push_oop(mh_klass()->java_mirror()); 2372 args.push_oop(mh_klass()->java_mirror());
2457 Handle empty; 2488 Handle empty;
2458 Handle name = java_lang_String::create_from_symbol(name_sym, CHECK_(empty)); 2489 Handle name = java_lang_String::create_from_symbol(name_sym, CHECK_(empty));
2459 Handle type; 2490 Handle type;
2460 if (signature->utf8_length() > 0 && signature->byte_at(0) == '(') { 2491 if (signature->utf8_length() > 0 && signature->byte_at(0) == '(') {
2461 type = find_method_handle_type(signature, caller, CHECK_(empty)); 2492 type = find_method_handle_type(signature, caller, CHECK_(empty));
2493 } else if (caller.is_null()) {
2494 // This should not happen. JDK code should take care of that.
2495 THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad MH constant", empty);
2462 } else { 2496 } else {
2463 ResourceMark rm(THREAD); 2497 ResourceMark rm(THREAD);
2464 SignatureStream ss(signature, false); 2498 SignatureStream ss(signature, false);
2465 if (!ss.is_done()) { 2499 if (!ss.is_done()) {
2466 oop mirror = ss.as_java_mirror(caller->class_loader(), caller->protection_domain(), 2500 oop mirror = ss.as_java_mirror(caller->class_loader(), caller->protection_domain(),
2519 guarantee(java_lang_invoke_MethodHandle::is_instance(bsm()), 2553 guarantee(java_lang_invoke_MethodHandle::is_instance(bsm()),
2520 "caller must supply a valid BSM"); 2554 "caller must supply a valid BSM");
2521 2555
2522 Handle method_name = java_lang_String::create_from_symbol(name, CHECK_(empty)); 2556 Handle method_name = java_lang_String::create_from_symbol(name, CHECK_(empty));
2523 Handle method_type = find_method_handle_type(type, caller, CHECK_(empty)); 2557 Handle method_type = find_method_handle_type(type, caller, CHECK_(empty));
2558
2559 // This should not happen. JDK code should take care of that.
2560 if (caller.is_null() || method_type.is_null()) {
2561 THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad invokedynamic", empty);
2562 }
2524 2563
2525 objArrayHandle appendix_box = oopFactory::new_objArray(SystemDictionary::Object_klass(), 1, CHECK_(empty)); 2564 objArrayHandle appendix_box = oopFactory::new_objArray(SystemDictionary::Object_klass(), 1, CHECK_(empty));
2526 assert(appendix_box->obj_at(0) == NULL, ""); 2565 assert(appendix_box->obj_at(0) == NULL, "");
2527 2566
2528 // call java.lang.invoke.MethodHandleNatives::linkCallSite(caller, bsm, name, mtype, info, &appendix) 2567 // call java.lang.invoke.MethodHandleNatives::linkCallSite(caller, bsm, name, mtype, info, &appendix)