[foreign-abi] Use MethodHandle.linkToStatic to call MemoryAddress.ofLong

Paul Sandoz paul.sandoz at oracle.com
Thu Dec 19 18:01:04 UTC 2019


Here is a small patch to replace the use of MethodHandle.invoke with the trusted MethodHandle.linkToStatic.

Paul.

diff -r 06dbd52de6a3 src/java.base/share/classes/java/lang/invoke/X-VarHandleMemoryAddressView.java.template
--- a/src/java.base/share/classes/java/lang/invoke/X-VarHandleMemoryAddressView.java.template   Thu Dec 19 11:14:10 2019 +0000
+++ b/src/java.base/share/classes/java/lang/invoke/X-VarHandleMemoryAddressView.java.template   Thu Dec 19 09:56:03 2019 -0800
@@ -27,7 +27,6 @@
 import jdk.internal.access.foreign.MemoryAddressProxy;
 import jdk.internal.vm.annotation.ForceInline;
 
-import java.lang.reflect.Field;
 import java.util.Objects;
 
 import static java.lang.invoke.MethodHandleStatics.UNSAFE;
@@ -45,15 +44,15 @@
 #if[MemoryAddressProxy]
     static final int VM_ALIGN = Long.BYTES - 1;
 
-    static final MethodHandle ADDRESS_FACTORY;
     static final MemoryAddressProxy NULL_ADDRESS;
+    static final MemberName MEMORY_ADDRESS_OF_LONG_MEMBER_NAME;
 
     static {
         try {
             Class<?> addrClass = Class.forName("jdk.incubator.foreign.MemoryAddress");
             NULL_ADDRESS = (MemoryAddressProxy)addrClass.getDeclaredField("NULL").get(null);
-            ADDRESS_FACTORY = MethodHandles.Lookup.IMPL_LOOKUP.findStatic(addrClass, "ofLong", MethodType.methodType(addrClass, long.class));
-        } catch (Throwable ex) {
+            MEMORY_ADDRESS_OF_LONG_MEMBER_NAME = new MemberName(addrClass.getMethod("ofLong", long.class));
+        } catch (Exception ex) {
             throw new ExceptionInInitializerError(ex);
         }
     }
@@ -98,7 +97,7 @@
         try {
             return value == 0L ?
                 NULL_ADDRESS :
-                ($type$)ADDRESS_FACTORY.invoke(value);
+                MethodHandle.linkToStatic(value, MEMORY_ADDRESS_OF_LONG_MEMBER_NAME);
         } catch (Throwable ex) {
             throw new IllegalStateException(ex);
         }



More information about the panama-dev mailing list