518 if (target_oop->klass() == SystemDictionary::reflect_Field_klass()) { |
518 if (target_oop->klass() == SystemDictionary::reflect_Field_klass()) { |
519 oop clazz = java_lang_reflect_Field::clazz(target_oop); // fd.field_holder() |
519 oop clazz = java_lang_reflect_Field::clazz(target_oop); // fd.field_holder() |
520 int slot = java_lang_reflect_Field::slot(target_oop); // fd.index() |
520 int slot = java_lang_reflect_Field::slot(target_oop); // fd.index() |
521 int mods = java_lang_reflect_Field::modifiers(target_oop); |
521 int mods = java_lang_reflect_Field::modifiers(target_oop); |
522 klassOop k = java_lang_Class::as_klassOop(clazz); |
522 klassOop k = java_lang_Class::as_klassOop(clazz); |
523 int offset = instanceKlass::cast(k)->offset_from_fields(slot); |
523 int offset = instanceKlass::cast(k)->field_offset(slot); |
524 init_MemberName(mname_oop, k, accessFlags_from(mods), offset); |
524 init_MemberName(mname_oop, k, accessFlags_from(mods), offset); |
525 } else { |
525 } else { |
526 KlassHandle receiver_limit; int decode_flags = 0; |
526 KlassHandle receiver_limit; int decode_flags = 0; |
527 methodHandle m = MethodHandles::decode_method(target_oop, receiver_limit, decode_flags); |
527 methodHandle m = MethodHandles::decode_method(target_oop, receiver_limit, decode_flags); |
528 bool do_dispatch = ((decode_flags & MethodHandles::_dmf_does_dispatch) != 0); |
528 bool do_dispatch = ((decode_flags & MethodHandles::_dmf_does_dispatch) != 0); |
1630 if (mh.is_null() || m.is_null() || |
1630 if (mh.is_null() || m.is_null() || |
1631 (!do_dispatch && m->is_abstract())) { |
1631 (!do_dispatch && m->is_abstract())) { |
1632 THROW(vmSymbols::java_lang_InternalError()); |
1632 THROW(vmSymbols::java_lang_InternalError()); |
1633 } |
1633 } |
1634 |
1634 |
1635 java_lang_invoke_MethodHandle::init_vmslots(mh()); |
|
1636 |
|
1637 if (VerifyMethodHandles) { |
1635 if (VerifyMethodHandles) { |
1638 // The privileged code which invokes this routine should not make |
1636 // The privileged code which invokes this routine should not make |
1639 // a mistake about types, but it's better to verify. |
1637 // a mistake about types, but it's better to verify. |
1640 verify_DirectMethodHandle(mh, m, CHECK); |
1638 verify_DirectMethodHandle(mh, m, CHECK); |
1641 } |
1639 } |
1754 receiver_klass, |
1752 receiver_klass, |
1755 CHECK); |
1753 CHECK); |
1756 if (m.is_null()) { THROW(vmSymbols::java_lang_InternalError()); } |
1754 if (m.is_null()) { THROW(vmSymbols::java_lang_InternalError()); } |
1757 if (m->is_abstract()) { THROW(vmSymbols::java_lang_AbstractMethodError()); } |
1755 if (m->is_abstract()) { THROW(vmSymbols::java_lang_AbstractMethodError()); } |
1758 |
1756 |
1759 java_lang_invoke_MethodHandle::init_vmslots(mh()); |
|
1760 int vmargslot = m->size_of_parameters() - 1; |
1757 int vmargslot = m->size_of_parameters() - 1; |
1761 assert(java_lang_invoke_BoundMethodHandle::vmargslot(mh()) == vmargslot, ""); |
1758 assert(java_lang_invoke_BoundMethodHandle::vmargslot(mh()) == vmargslot, ""); |
1762 |
1759 |
1763 if (VerifyMethodHandles) { |
1760 if (VerifyMethodHandles) { |
1764 verify_BoundMethodHandle_with_receiver(mh, m, CHECK); |
1761 verify_BoundMethodHandle_with_receiver(mh, m, CHECK); |
1860 // Check arguments. |
1857 // Check arguments. |
1861 if (mh.is_null() || target.is_null() || !java_lang_invoke_MethodHandle::is_instance(target())) { |
1858 if (mh.is_null() || target.is_null() || !java_lang_invoke_MethodHandle::is_instance(target())) { |
1862 THROW(vmSymbols::java_lang_InternalError()); |
1859 THROW(vmSymbols::java_lang_InternalError()); |
1863 } |
1860 } |
1864 |
1861 |
1865 java_lang_invoke_MethodHandle::init_vmslots(mh()); |
|
1866 int argslot = java_lang_invoke_BoundMethodHandle::vmargslot(mh()); |
1862 int argslot = java_lang_invoke_BoundMethodHandle::vmargslot(mh()); |
1867 |
1863 |
1868 if (VerifyMethodHandles) { |
1864 if (VerifyMethodHandles) { |
1869 int insert_after = argnum - 1; |
1865 int insert_after = argnum - 1; |
1870 verify_vmargslot(mh, insert_after, argslot, CHECK); |
1866 verify_vmargslot(mh, insert_after, argslot, CHECK); |