2542 return (Metadata*)mname->address_field(_vmtarget_offset); |
2542 return (Metadata*)mname->address_field(_vmtarget_offset); |
2543 } |
2543 } |
2544 |
2544 |
2545 void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) { |
2545 void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) { |
2546 assert(is_instance(mname), "wrong type"); |
2546 assert(is_instance(mname), "wrong type"); |
2547 #ifdef ASSERT |
|
2548 // check the type of the vmtarget |
2547 // check the type of the vmtarget |
|
2548 oop dependency = NULL; |
2549 if (ref != NULL) { |
2549 if (ref != NULL) { |
2550 switch (flags(mname) & (MN_IS_METHOD | |
2550 switch (flags(mname) & (MN_IS_METHOD | |
2551 MN_IS_CONSTRUCTOR | |
2551 MN_IS_CONSTRUCTOR | |
2552 MN_IS_FIELD)) { |
2552 MN_IS_FIELD)) { |
2553 case MN_IS_METHOD: |
2553 case MN_IS_METHOD: |
2554 case MN_IS_CONSTRUCTOR: |
2554 case MN_IS_CONSTRUCTOR: |
2555 assert(ref->is_method(), "should be a method"); |
2555 assert(ref->is_method(), "should be a method"); |
|
2556 dependency = ((Method*)ref)->method_holder()->java_mirror(); |
2556 break; |
2557 break; |
2557 case MN_IS_FIELD: |
2558 case MN_IS_FIELD: |
2558 assert(ref->is_klass(), "should be a class"); |
2559 assert(ref->is_klass(), "should be a class"); |
|
2560 dependency = ((Klass*)ref)->java_mirror(); |
2559 break; |
2561 break; |
2560 default: |
2562 default: |
2561 ShouldNotReachHere(); |
2563 ShouldNotReachHere(); |
2562 } |
2564 } |
2563 } |
2565 } |
2564 #endif //ASSERT |
|
2565 mname->address_field_put(_vmtarget_offset, (address)ref); |
2566 mname->address_field_put(_vmtarget_offset, (address)ref); |
2566 oop loader = NULL; |
2567 // Add a reference to the loader (actually mirror because anonymous classes will not have |
2567 if (ref != NULL) { |
2568 // distinct loaders) to ensure the metadata is kept alive |
2568 if (ref->is_klass()) { |
2569 // This mirror may be different than the one in clazz field. |
2569 loader = ((Klass*)ref)->class_loader(); |
2570 mname->obj_field_put(_vmloader_offset, dependency); |
2570 } else if (ref->is_method()) { |
|
2571 loader = ((Method*)ref)->method_holder()->class_loader(); |
|
2572 } else { |
|
2573 ShouldNotReachHere(); |
|
2574 } |
|
2575 } |
|
2576 // Add a reference to the loader to ensure the metadata is kept alive |
|
2577 mname->obj_field_put(_vmloader_offset, loader); |
|
2578 } |
2571 } |
2579 |
2572 |
2580 intptr_t java_lang_invoke_MemberName::vmindex(oop mname) { |
2573 intptr_t java_lang_invoke_MemberName::vmindex(oop mname) { |
2581 assert(is_instance(mname), "wrong type"); |
2574 assert(is_instance(mname), "wrong type"); |
2582 return (intptr_t) mname->address_field(_vmindex_offset); |
2575 return (intptr_t) mname->address_field(_vmindex_offset); |
2737 |
2730 |
2738 // Support for java_lang_ClassLoader |
2731 // Support for java_lang_ClassLoader |
2739 |
2732 |
2740 bool java_lang_ClassLoader::offsets_computed = false; |
2733 bool java_lang_ClassLoader::offsets_computed = false; |
2741 int java_lang_ClassLoader::_loader_data_offset = -1; |
2734 int java_lang_ClassLoader::_loader_data_offset = -1; |
2742 int java_lang_ClassLoader::_dependencies_offset = -1; |
|
2743 int java_lang_ClassLoader::parallelCapable_offset = -1; |
2735 int java_lang_ClassLoader::parallelCapable_offset = -1; |
2744 |
2736 |
2745 ClassLoaderData** java_lang_ClassLoader::loader_data_addr(oop loader) { |
2737 ClassLoaderData** java_lang_ClassLoader::loader_data_addr(oop loader) { |
2746 assert(loader != NULL && loader->is_oop(), "loader must be oop"); |
2738 assert(loader != NULL && loader->is_oop(), "loader must be oop"); |
2747 return (ClassLoaderData**) loader->address_field_addr(_loader_data_offset); |
2739 return (ClassLoaderData**) loader->address_field_addr(_loader_data_offset); |
2748 } |
2740 } |
2749 |
2741 |
2750 ClassLoaderData* java_lang_ClassLoader::loader_data(oop loader) { |
2742 ClassLoaderData* java_lang_ClassLoader::loader_data(oop loader) { |
2751 return *java_lang_ClassLoader::loader_data_addr(loader); |
2743 return *java_lang_ClassLoader::loader_data_addr(loader); |
2752 } |
|
2753 |
|
2754 oop java_lang_ClassLoader::dependencies(oop loader) { |
|
2755 return loader->obj_field(_dependencies_offset); |
|
2756 } |
|
2757 |
|
2758 HeapWord* java_lang_ClassLoader::dependencies_addr(oop loader) { |
|
2759 if (UseCompressedOops) { |
|
2760 return (HeapWord*)loader->obj_field_addr<narrowOop>(_dependencies_offset); |
|
2761 } else { |
|
2762 return (HeapWord*)loader->obj_field_addr<oop>(_dependencies_offset); |
|
2763 } |
|
2764 } |
2744 } |
2765 |
2745 |
2766 void java_lang_ClassLoader::compute_offsets() { |
2746 void java_lang_ClassLoader::compute_offsets() { |
2767 assert(!offsets_computed, "offsets should be initialized only once"); |
2747 assert(!offsets_computed, "offsets should be initialized only once"); |
2768 offsets_computed = true; |
2748 offsets_computed = true; |