< prev index next > test/jdk/java/foreign/TestVarArgs.java
Print this page
*
*/
/*
* @test
- * @enablePreview
- * @requires jdk.foreign.linker != "UNSUPPORTED"
* @modules java.base/jdk.internal.foreign
* @run testng/othervm --enable-native-access=ALL-UNNAMED -Dgenerator.sample.factor=17 TestVarArgs
*/
import java.lang.foreign.Arena;
import java.lang.foreign.MemorySegment;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
+ import java.lang.foreign.ValueLayout;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.invoke.VarHandle;
import java.util.ArrayList;
import static java.lang.foreign.MemoryLayout.PathElement.*;
public class TestVarArgs extends CallGeneratorHelper {
- static final VarHandle VH_IntArray = C_INT.arrayElementVarHandle();
static final MethodHandle MH_CHECK;
static final Linker LINKER = Linker.nativeLinker();
static {
System.loadLibrary("VarArgs");
CallInfo.writeback(callInfo, writeBack);
CallInfo.argIDs(callInfo, argIDs);
for (int i = 0; i < args.size(); i++) {
! VH_IntArray.set(argIDs, (long) i, args.get(i).id.ordinal());
}
List<MemoryLayout> argLayouts = new ArrayList<>();
argLayouts.add(C_POINTER); // call info
argLayouts.add(C_INT); // size
CallInfo.writeback(callInfo, writeBack);
CallInfo.argIDs(callInfo, argIDs);
for (int i = 0; i < args.size(); i++) {
! argIDs.setAtIndex(ValueLayout.JAVA_INT, i, args.get(i).id.ordinal());
}
List<MemoryLayout> argLayouts = new ArrayList<>();
argLayouts.add(C_POINTER); // call info
argLayouts.add(C_INT); // size
static final VarHandle VH_writeback = LAYOUT.varHandle(groupElement("writeback"));
static final VarHandle VH_argIDs = LAYOUT.varHandle(groupElement("argIDs"));
static void writeback(MemorySegment seg, MemorySegment addr) {
! VH_writeback.set(seg, addr);
}
static void argIDs(MemorySegment seg, MemorySegment addr) {
! VH_argIDs.set(seg, addr);
}
}
private static final class Arg {
private final TestValue value;
static final VarHandle VH_writeback = LAYOUT.varHandle(groupElement("writeback"));
static final VarHandle VH_argIDs = LAYOUT.varHandle(groupElement("argIDs"));
static void writeback(MemorySegment seg, MemorySegment addr) {
! VH_writeback.set(seg, 0L, addr);
}
static void argIDs(MemorySegment seg, MemorySegment addr) {
! VH_argIDs.set(seg, 0L, addr);
}
}
private static final class Arg {
private final TestValue value;
this.value = value;
this.getter = getter;
}
private static Arg primitiveArg(NativeType id, MemoryLayout layout, TestValue value) {
! return new Arg(id, layout, value, layout.varHandle().toMethodHandle(VarHandle.AccessMode.GET));
}
private static Arg structArg(NativeType id, MemoryLayout layout, TestValue value) {
return new Arg(id, layout, value, MethodHandles.identity(MemorySegment.class));
}
this.value = value;
this.getter = getter;
}
private static Arg primitiveArg(NativeType id, MemoryLayout layout, TestValue value) {
! MethodHandle getterHandle = layout.varHandle().toMethodHandle(VarHandle.AccessMode.GET);
+ getterHandle = MethodHandles.insertArguments(getterHandle, 1, 0L); // align signature with getter for structs
+ return new Arg(id, layout, value, getterHandle);
}
private static Arg structArg(NativeType id, MemoryLayout layout, TestValue value) {
return new Arg(id, layout, value, MethodHandles.identity(MemorySegment.class));
}
< prev index next >