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 }
|