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);