2600 |
2600 |
2601 |
2601 |
2602 // Support for java_lang_invoke_MethodTypeForm |
2602 // Support for java_lang_invoke_MethodTypeForm |
2603 |
2603 |
2604 int java_lang_invoke_MethodTypeForm::_vmslots_offset; |
2604 int java_lang_invoke_MethodTypeForm::_vmslots_offset; |
|
2605 int java_lang_invoke_MethodTypeForm::_vmlayout_offset; |
2605 int java_lang_invoke_MethodTypeForm::_erasedType_offset; |
2606 int java_lang_invoke_MethodTypeForm::_erasedType_offset; |
2606 int java_lang_invoke_MethodTypeForm::_genericInvoker_offset; |
2607 int java_lang_invoke_MethodTypeForm::_genericInvoker_offset; |
2607 |
2608 |
2608 void java_lang_invoke_MethodTypeForm::compute_offsets() { |
2609 void java_lang_invoke_MethodTypeForm::compute_offsets() { |
2609 klassOop k = SystemDictionary::MethodTypeForm_klass(); |
2610 klassOop k = SystemDictionary::MethodTypeForm_klass(); |
2610 if (k != NULL) { |
2611 if (k != NULL) { |
2611 compute_optional_offset(_vmslots_offset, k, vmSymbols::vmslots_name(), vmSymbols::int_signature(), true); |
2612 compute_optional_offset(_vmslots_offset, k, vmSymbols::vmslots_name(), vmSymbols::int_signature(), true); |
|
2613 compute_optional_offset(_vmlayout_offset, k, vmSymbols::vmlayout_name(), vmSymbols::object_signature()); |
2612 compute_optional_offset(_erasedType_offset, k, vmSymbols::erasedType_name(), vmSymbols::java_lang_invoke_MethodType_signature(), true); |
2614 compute_optional_offset(_erasedType_offset, k, vmSymbols::erasedType_name(), vmSymbols::java_lang_invoke_MethodType_signature(), true); |
2613 compute_optional_offset(_genericInvoker_offset, k, vmSymbols::genericInvoker_name(), vmSymbols::java_lang_invoke_MethodHandle_signature(), true); |
2615 compute_optional_offset(_genericInvoker_offset, k, vmSymbols::genericInvoker_name(), vmSymbols::java_lang_invoke_MethodHandle_signature(), true); |
2614 if (_genericInvoker_offset == 0) _genericInvoker_offset = -1; // set to explicit "empty" value |
2616 if (_genericInvoker_offset == 0) _genericInvoker_offset = -1; // set to explicit "empty" value |
2615 } |
2617 } |
2616 } |
2618 } |
2617 |
2619 |
2618 int java_lang_invoke_MethodTypeForm::vmslots(oop mtform) { |
2620 int java_lang_invoke_MethodTypeForm::vmslots(oop mtform) { |
2619 assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only"); |
2621 assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only"); |
|
2622 assert(_vmslots_offset > 0, ""); |
2620 return mtform->int_field(_vmslots_offset); |
2623 return mtform->int_field(_vmslots_offset); |
|
2624 } |
|
2625 |
|
2626 oop java_lang_invoke_MethodTypeForm::vmlayout(oop mtform) { |
|
2627 assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only"); |
|
2628 assert(_vmlayout_offset > 0, ""); |
|
2629 return mtform->obj_field(_vmlayout_offset); |
|
2630 } |
|
2631 |
|
2632 oop java_lang_invoke_MethodTypeForm::init_vmlayout(oop mtform, oop cookie) { |
|
2633 assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only"); |
|
2634 oop previous = vmlayout(mtform); |
|
2635 if (previous != NULL) { |
|
2636 return previous; // someone else beat us to it |
|
2637 } |
|
2638 HeapWord* cookie_addr = (HeapWord*) mtform->obj_field_addr<oop>(_vmlayout_offset); |
|
2639 OrderAccess::storestore(); // make sure our copy is fully committed |
|
2640 previous = oopDesc::atomic_compare_exchange_oop(cookie, cookie_addr, previous); |
|
2641 if (previous != NULL) { |
|
2642 return previous; // someone else beat us to it |
|
2643 } |
|
2644 return cookie; |
2621 } |
2645 } |
2622 |
2646 |
2623 oop java_lang_invoke_MethodTypeForm::erasedType(oop mtform) { |
2647 oop java_lang_invoke_MethodTypeForm::erasedType(oop mtform) { |
2624 assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only"); |
2648 assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only"); |
2625 return mtform->obj_field(_erasedType_offset); |
2649 return mtform->obj_field(_erasedType_offset); |