< prev index next >

src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/abi/SharedUtils.java

Print this page

 28 import jdk.incubator.foreign.ForeignLinker;
 29 import jdk.incubator.foreign.FunctionDescriptor;
 30 import jdk.incubator.foreign.GroupLayout;
 31 import jdk.incubator.foreign.MemoryAddress;
 32 import jdk.incubator.foreign.MemoryHandles;
 33 import jdk.incubator.foreign.MemoryLayout;
 34 import jdk.incubator.foreign.MemorySegment;
 35 import jdk.incubator.foreign.SequenceLayout;
 36 import jdk.incubator.foreign.ValueLayout;
 37 import jdk.internal.foreign.MemoryAddressImpl;
 38 import jdk.internal.foreign.Utils;
 39 import jdk.internal.foreign.abi.aarch64.AArch64Linker;
 40 import jdk.internal.foreign.abi.x64.sysv.SysVVaList;
 41 import jdk.internal.foreign.abi.x64.sysv.SysVx64Linker;
 42 import jdk.internal.foreign.abi.x64.windows.Windowsx64Linker;
 43 
 44 import java.lang.invoke.MethodHandle;
 45 import java.lang.invoke.MethodHandles;
 46 import java.lang.invoke.MethodType;
 47 import java.lang.invoke.VarHandle;

 48 import java.util.List;
 49 import java.util.function.Consumer;
 50 import java.util.stream.IntStream;
 51 
 52 import static java.lang.invoke.MethodHandles.collectArguments;
 53 import static java.lang.invoke.MethodHandles.identity;
 54 import static java.lang.invoke.MethodHandles.insertArguments;
 55 import static java.lang.invoke.MethodHandles.permuteArguments;
 56 import static java.lang.invoke.MethodType.methodType;
 57 import static jdk.incubator.foreign.CSupport.*;
 58 
 59 public class SharedUtils {
 60 
 61     private static final MethodHandle MH_ALLOC_BUFFER;
 62     private static final MethodHandle MH_BASEADDRESS;
 63     private static final MethodHandle MH_BUFFER_COPY;
 64 








 65     static {
 66         try {
 67             var lookup = MethodHandles.lookup();
 68             MH_ALLOC_BUFFER = lookup.findStatic(SharedUtils.class, "allocateNative",
 69                     methodType(MemorySegment.class, MemoryLayout.class));
 70             MH_BASEADDRESS = lookup.findVirtual(MemorySegment.class, "baseAddress",
 71                     methodType(MemoryAddress.class));
 72             MH_BUFFER_COPY = lookup.findStatic(SharedUtils.class, "bufferCopy",
 73                     methodType(MemoryAddress.class, MemoryAddress.class, MemorySegment.class));
 74         } catch (ReflectiveOperationException e) {
 75             throw new BootstrapMethodError(e);
 76         }
 77     }
 78 
 79     // workaround for https://bugs.openjdk.java.net/browse/JDK-8239083
 80     private static MemorySegment allocateNative(MemoryLayout layout) {
 81         return MemorySegment.allocateNative(layout);
 82     }
 83 
 84     /**

375         @Override
376         public boolean isAlive() {
377             return true;
378         }
379 
380         @Override
381         public void close() {
382             throw uoe();
383         }
384 
385         @Override
386         public VaList copy() {
387             return this;
388         }
389 
390         @Override
391         public MemoryAddress address() {
392             return address;
393         }
394     }





























































395 }

 28 import jdk.incubator.foreign.ForeignLinker;
 29 import jdk.incubator.foreign.FunctionDescriptor;
 30 import jdk.incubator.foreign.GroupLayout;
 31 import jdk.incubator.foreign.MemoryAddress;
 32 import jdk.incubator.foreign.MemoryHandles;
 33 import jdk.incubator.foreign.MemoryLayout;
 34 import jdk.incubator.foreign.MemorySegment;
 35 import jdk.incubator.foreign.SequenceLayout;
 36 import jdk.incubator.foreign.ValueLayout;
 37 import jdk.internal.foreign.MemoryAddressImpl;
 38 import jdk.internal.foreign.Utils;
 39 import jdk.internal.foreign.abi.aarch64.AArch64Linker;
 40 import jdk.internal.foreign.abi.x64.sysv.SysVVaList;
 41 import jdk.internal.foreign.abi.x64.sysv.SysVx64Linker;
 42 import jdk.internal.foreign.abi.x64.windows.Windowsx64Linker;
 43 
 44 import java.lang.invoke.MethodHandle;
 45 import java.lang.invoke.MethodHandles;
 46 import java.lang.invoke.MethodType;
 47 import java.lang.invoke.VarHandle;
 48 import java.nio.ByteOrder;
 49 import java.util.List;
 50 import java.util.function.Consumer;
 51 import java.util.stream.IntStream;
 52 
 53 import static java.lang.invoke.MethodHandles.collectArguments;
 54 import static java.lang.invoke.MethodHandles.identity;
 55 import static java.lang.invoke.MethodHandles.insertArguments;
 56 import static java.lang.invoke.MethodHandles.permuteArguments;
 57 import static java.lang.invoke.MethodType.methodType;
 58 import static jdk.incubator.foreign.CSupport.*;
 59 
 60 public class SharedUtils {
 61 
 62     private static final MethodHandle MH_ALLOC_BUFFER;
 63     private static final MethodHandle MH_BASEADDRESS;
 64     private static final MethodHandle MH_BUFFER_COPY;
 65 
 66     private static final VarHandle VH_BYTE = MemoryHandles.varHandle(byte.class, ByteOrder.nativeOrder());
 67     private static final VarHandle VH_CHAR = MemoryHandles.varHandle(char.class, ByteOrder.nativeOrder());
 68     private static final VarHandle VH_SHORT = MemoryHandles.varHandle(short.class, ByteOrder.nativeOrder());
 69     private static final VarHandle VH_INT = MemoryHandles.varHandle(int.class, ByteOrder.nativeOrder());
 70     private static final VarHandle VH_LONG = MemoryHandles.varHandle(long.class, ByteOrder.nativeOrder());
 71     private static final VarHandle VH_FLOAT = MemoryHandles.varHandle(float.class, ByteOrder.nativeOrder());
 72     private static final VarHandle VH_DOUBLE = MemoryHandles.varHandle(double.class, ByteOrder.nativeOrder());
 73 
 74     static {
 75         try {
 76             var lookup = MethodHandles.lookup();
 77             MH_ALLOC_BUFFER = lookup.findStatic(SharedUtils.class, "allocateNative",
 78                     methodType(MemorySegment.class, MemoryLayout.class));
 79             MH_BASEADDRESS = lookup.findVirtual(MemorySegment.class, "baseAddress",
 80                     methodType(MemoryAddress.class));
 81             MH_BUFFER_COPY = lookup.findStatic(SharedUtils.class, "bufferCopy",
 82                     methodType(MemoryAddress.class, MemoryAddress.class, MemorySegment.class));
 83         } catch (ReflectiveOperationException e) {
 84             throw new BootstrapMethodError(e);
 85         }
 86     }
 87 
 88     // workaround for https://bugs.openjdk.java.net/browse/JDK-8239083
 89     private static MemorySegment allocateNative(MemoryLayout layout) {
 90         return MemorySegment.allocateNative(layout);
 91     }
 92 
 93     /**

384         @Override
385         public boolean isAlive() {
386             return true;
387         }
388 
389         @Override
390         public void close() {
391             throw uoe();
392         }
393 
394         @Override
395         public VaList copy() {
396             return this;
397         }
398 
399         @Override
400         public MemoryAddress address() {
401             return address;
402         }
403     }
404 
405     static void writeOverSized(MemoryAddress ptr, Class<?> type, Object o) {
406         // use VH_LONG for integers to zero out the whole register in the process
407         if (type == long.class) {
408             VH_LONG.set(ptr, (long) o);
409         } else if (type == int.class) {
410             VH_LONG.set(ptr, (long) (int) o);
411         } else if (type == short.class) {
412             VH_LONG.set(ptr, (long) (short) o);
413         } else if (type == char.class) {
414             VH_LONG.set(ptr, (long) (char) o);
415         } else if (type == byte.class) {
416             VH_LONG.set(ptr, (long) (byte) o);
417         } else if (type == float.class) {
418             VH_FLOAT.set(ptr, (float) o);
419         } else if (type == double.class) {
420             VH_DOUBLE.set(ptr, (double) o);
421         } else {
422             throw new IllegalArgumentException("Unsupported carrier: " + type);
423         }
424     }
425 
426     static void write(MemoryAddress ptr, Class<?> type, Object o) {
427         if (type == long.class) {
428             VH_LONG.set(ptr, (long) o);
429         } else if (type == int.class) {
430             VH_INT.set(ptr, (int) o);
431         } else if (type == short.class) {
432             VH_SHORT.set(ptr, (short) o);
433         } else if (type == char.class) {
434             VH_CHAR.set(ptr, (char) o);
435         } else if (type == byte.class) {
436             VH_BYTE.set(ptr, (byte) o);
437         } else if (type == float.class) {
438             VH_FLOAT.set(ptr, (float) o);
439         } else if (type == double.class) {
440             VH_DOUBLE.set(ptr, (double) o);
441         } else {
442             throw new IllegalArgumentException("Unsupported carrier: " + type);
443         }
444     }
445 
446     static Object read(MemoryAddress ptr, Class<?> type) {
447         if (type == long.class) {
448             return (long) VH_LONG.get(ptr);
449         } else if (type == int.class) {
450             return (int) VH_INT.get(ptr);
451         } else if (type == short.class) {
452             return (short) VH_SHORT.get(ptr);
453         } else if (type == char.class) {
454             return (char) VH_CHAR.get(ptr);
455         } else if (type == byte.class) {
456             return (byte) VH_BYTE.get(ptr);
457         } else if (type == float.class) {
458             return (float) VH_FLOAT.get(ptr);
459         } else if (type == double.class) {
460             return (double) VH_DOUBLE.get(ptr);
461         } else {
462             throw new IllegalArgumentException("Unsupported carrier: " + type);
463         }
464     }
465 }
< prev index next >