hotspot/src/cpu/arm/vm/methodHandles_arm.cpp
changeset 46505 fd4bc78630b1
parent 46329 53ccc37bda19
child 46560 388aa8d67c80
--- a/hotspot/src/cpu/arm/vm/methodHandles_arm.cpp	Fri May 26 13:47:33 2017 -0700
+++ b/hotspot/src/cpu/arm/vm/methodHandles_arm.cpp	Sat May 27 09:21:01 2017 -0400
@@ -157,8 +157,9 @@
   __ load_heap_oop(tmp, Address(tmp, NONZERO(java_lang_invoke_LambdaForm::vmentry_offset_in_bytes())));
   __ verify_oop(tmp);
 
-  // the following assumes that a Method* is normally compressed in the vmtarget field:
-  __ ldr(Rmethod, Address(tmp, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes())));
+  __ load_heap_oop(Rmethod, Address(tmp, NONZERO(java_lang_invoke_MemberName::method_offset_in_bytes())));
+  __ verify_oop(Rmethod);
+  __ ldr(Rmethod, Address(Rmethod, NONZERO(java_lang_invoke_ResolvedMethodName::vmtarget_offset_in_bytes())));
 
   if (VerifyMethodHandles && !for_compiler_entry) {
     // make sure recv is already on stack
@@ -320,7 +321,8 @@
 
     Address member_clazz(   member_reg, NONZERO(java_lang_invoke_MemberName::clazz_offset_in_bytes()));
     Address member_vmindex( member_reg, NONZERO(java_lang_invoke_MemberName::vmindex_offset_in_bytes()));
-    Address member_vmtarget(member_reg, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes()));
+    Address member_vmtarget(member_reg, NONZERO(java_lang_invoke_MemberName::method_offset_in_bytes()));
+    Address vmtarget_method(Rmethod, NONZERO(java_lang_invoke_ResolvedMethodName::vmtarget_offset_in_bytes()));
 
     Register temp1_recv_klass = temp1;
     if (iid != vmIntrinsics::_linkToStatic) {
@@ -375,14 +377,17 @@
       if (VerifyMethodHandles) {
         verify_ref_kind(_masm, JVM_REF_invokeSpecial, member_reg, temp3);
       }
-      __ ldr(Rmethod, member_vmtarget);
+      __ load_heap_oop(Rmethod, member_vmtarget);
+      __ ldr(Rmethod, vmtarget_method);
       break;
 
     case vmIntrinsics::_linkToStatic:
       if (VerifyMethodHandles) {
         verify_ref_kind(_masm, JVM_REF_invokeStatic, member_reg, temp3);
       }
-      __ ldr(Rmethod, member_vmtarget);
+      __ load_heap_oop(Rmethod, member_vmtarget);
+      __ ldr(Rmethod, vmtarget_method);
+      break;
       break;
 
     case vmIntrinsics::_linkToVirtual: