Mercurial > hg > truffle
comparison src/share/vm/classfile/javaClasses.cpp @ 3363:167b70ff3abc
6939861: JVM should handle more conversion operations
Reviewed-by: twisti, jrose
author | never |
---|---|
date | Fri, 06 May 2011 16:33:13 -0700 |
parents | 01147d8aac1d |
children | 81d815b05abb 74cd10898bea |
comparison
equal
deleted
inserted
replaced
3362:d4c1fbc3de95 | 3363:167b70ff3abc |
---|---|
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); |