155 __ verify_oop(tmp); |
155 __ verify_oop(tmp); |
156 |
156 |
157 __ load_heap_oop(tmp, Address(tmp, NONZERO(java_lang_invoke_LambdaForm::vmentry_offset_in_bytes()))); |
157 __ load_heap_oop(tmp, Address(tmp, NONZERO(java_lang_invoke_LambdaForm::vmentry_offset_in_bytes()))); |
158 __ verify_oop(tmp); |
158 __ verify_oop(tmp); |
159 |
159 |
160 // the following assumes that a Method* is normally compressed in the vmtarget field: |
160 __ load_heap_oop(Rmethod, Address(tmp, NONZERO(java_lang_invoke_MemberName::method_offset_in_bytes()))); |
161 __ ldr(Rmethod, Address(tmp, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes()))); |
161 __ verify_oop(Rmethod); |
|
162 __ ldr(Rmethod, Address(Rmethod, NONZERO(java_lang_invoke_ResolvedMethodName::vmtarget_offset_in_bytes()))); |
162 |
163 |
163 if (VerifyMethodHandles && !for_compiler_entry) { |
164 if (VerifyMethodHandles && !for_compiler_entry) { |
164 // make sure recv is already on stack |
165 // make sure recv is already on stack |
165 __ ldr(tmp, Address(Rmethod, Method::const_offset())); |
166 __ ldr(tmp, Address(Rmethod, Method::const_offset())); |
166 __ load_sized_value(tmp, |
167 __ load_sized_value(tmp, |
318 "MemberName required for invokeVirtual etc."); |
319 "MemberName required for invokeVirtual etc."); |
319 } |
320 } |
320 |
321 |
321 Address member_clazz( member_reg, NONZERO(java_lang_invoke_MemberName::clazz_offset_in_bytes())); |
322 Address member_clazz( member_reg, NONZERO(java_lang_invoke_MemberName::clazz_offset_in_bytes())); |
322 Address member_vmindex( member_reg, NONZERO(java_lang_invoke_MemberName::vmindex_offset_in_bytes())); |
323 Address member_vmindex( member_reg, NONZERO(java_lang_invoke_MemberName::vmindex_offset_in_bytes())); |
323 Address member_vmtarget(member_reg, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes())); |
324 Address member_vmtarget(member_reg, NONZERO(java_lang_invoke_MemberName::method_offset_in_bytes())); |
|
325 Address vmtarget_method(Rmethod, NONZERO(java_lang_invoke_ResolvedMethodName::vmtarget_offset_in_bytes())); |
324 |
326 |
325 Register temp1_recv_klass = temp1; |
327 Register temp1_recv_klass = temp1; |
326 if (iid != vmIntrinsics::_linkToStatic) { |
328 if (iid != vmIntrinsics::_linkToStatic) { |
327 if (iid == vmIntrinsics::_linkToSpecial) { |
329 if (iid == vmIntrinsics::_linkToSpecial) { |
328 // Don't actually load the klass; just null-check the receiver. |
330 // Don't actually load the klass; just null-check the receiver. |
373 switch (iid) { |
375 switch (iid) { |
374 case vmIntrinsics::_linkToSpecial: |
376 case vmIntrinsics::_linkToSpecial: |
375 if (VerifyMethodHandles) { |
377 if (VerifyMethodHandles) { |
376 verify_ref_kind(_masm, JVM_REF_invokeSpecial, member_reg, temp3); |
378 verify_ref_kind(_masm, JVM_REF_invokeSpecial, member_reg, temp3); |
377 } |
379 } |
378 __ ldr(Rmethod, member_vmtarget); |
380 __ load_heap_oop(Rmethod, member_vmtarget); |
|
381 __ ldr(Rmethod, vmtarget_method); |
379 break; |
382 break; |
380 |
383 |
381 case vmIntrinsics::_linkToStatic: |
384 case vmIntrinsics::_linkToStatic: |
382 if (VerifyMethodHandles) { |
385 if (VerifyMethodHandles) { |
383 verify_ref_kind(_masm, JVM_REF_invokeStatic, member_reg, temp3); |
386 verify_ref_kind(_masm, JVM_REF_invokeStatic, member_reg, temp3); |
384 } |
387 } |
385 __ ldr(Rmethod, member_vmtarget); |
388 __ load_heap_oop(Rmethod, member_vmtarget); |
|
389 __ ldr(Rmethod, vmtarget_method); |
|
390 break; |
386 break; |
391 break; |
387 |
392 |
388 case vmIntrinsics::_linkToVirtual: |
393 case vmIntrinsics::_linkToVirtual: |
389 { |
394 { |
390 // same as TemplateTable::invokevirtual, |
395 // same as TemplateTable::invokevirtual, |