[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