hotspot/src/share/vm/classfile/javaClasses.cpp
changeset 9630 d6419e4395e3
parent 9321 c29711c6ae35
child 10008 d84de97ad847
child 9993 63c053ade92d
equal deleted inserted replaced
9629:1f4dc6af5ad8 9630:d6419e4395e3
  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);