use of jdk.incubator.foreign.FunctionDescriptor in project openj9 by eclipse.
the class StructTests method test_addCharFromPointerAndCharsFromStruct_returnCharPointer.
@Test
public void test_addCharFromPointerAndCharsFromStruct_returnCharPointer() throws Throwable {
GroupLayout structLayout = MemoryLayout.ofStruct(C_SHORT.withName("elem1"), C_SHORT.withName("elem2"));
VarHandle charHandle1 = structLayout.varHandle(char.class, PathElement.groupElement("elem1"));
VarHandle charHandle2 = structLayout.varHandle(char.class, PathElement.groupElement("elem2"));
MethodType mt = MethodType.methodType(MemoryAddress.class, MemoryAddress.class, MemorySegment.class);
FunctionDescriptor fd = FunctionDescriptor.of(C_POINTER, C_POINTER, structLayout);
Symbol functionSymbol = nativeLib.lookup("addCharFromPointerAndCharsFromStruct_returnCharPointer").get();
MethodHandle mh = clinker.downcallHandle(functionSymbol, mt, fd);
MemorySegment charSegmt = MemorySegment.allocateNative(C_SHORT);
MemoryAccess.setChar(charSegmt, 'D');
MemorySegment structSegmt = MemorySegment.allocateNative(structLayout);
charHandle1.set(structSegmt, 'E');
charHandle2.set(structSegmt, 'F');
MemoryAddress resultAddr = (MemoryAddress) mh.invokeExact(charSegmt.address(), structSegmt);
MemorySegment resultSegmt = resultAddr.asSegmentRestricted(C_SHORT.byteSize());
VarHandle charHandle = MemoryHandles.varHandle(char.class, ByteOrder.nativeOrder());
char result = (char) charHandle.get(resultSegmt, 0);
Assert.assertEquals(result, 'M');
Assert.assertEquals(resultSegmt.address().toRawLongValue(), charSegmt.address().toRawLongValue());
charSegmt.close();
structSegmt.close();
resultSegmt.close();
}
use of jdk.incubator.foreign.FunctionDescriptor in project openj9 by eclipse.
the class StructTests method test_addShortFromPointerAndShortsFromStruct_returnShortPointer.
@Test
public void test_addShortFromPointerAndShortsFromStruct_returnShortPointer() throws Throwable {
GroupLayout structLayout = MemoryLayout.ofStruct(C_SHORT.withName("elem1"), C_SHORT.withName("elem2"));
VarHandle shortHandle1 = structLayout.varHandle(short.class, PathElement.groupElement("elem1"));
VarHandle shortHandle2 = structLayout.varHandle(short.class, PathElement.groupElement("elem2"));
MethodType mt = MethodType.methodType(MemoryAddress.class, MemoryAddress.class, MemorySegment.class);
FunctionDescriptor fd = FunctionDescriptor.of(C_POINTER, C_POINTER, structLayout);
Symbol functionSymbol = nativeLib.lookup("addShortFromPointerAndShortsFromStruct_returnShortPointer").get();
MethodHandle mh = clinker.downcallHandle(functionSymbol, mt, fd);
MemorySegment shortSegmt = MemorySegment.allocateNative(C_SHORT);
MemoryAccess.setShort(shortSegmt, (short) 12);
MemorySegment structSegmt = MemorySegment.allocateNative(structLayout);
shortHandle1.set(structSegmt, (short) 18);
shortHandle2.set(structSegmt, (short) 19);
MemoryAddress resultAddr = (MemoryAddress) mh.invokeExact(shortSegmt.address(), structSegmt);
MemorySegment resultSegmt = resultAddr.asSegmentRestricted(C_SHORT.byteSize());
VarHandle shortHandle = MemoryHandles.varHandle(short.class, ByteOrder.nativeOrder());
short result = (short) shortHandle.get(resultSegmt, 0);
Assert.assertEquals(result, 49);
Assert.assertEquals(resultSegmt.address().toRawLongValue(), shortSegmt.address().toRawLongValue());
shortSegmt.close();
structSegmt.close();
resultSegmt.close();
}
use of jdk.incubator.foreign.FunctionDescriptor in project openj9 by eclipse.
the class MultiThreadingTests4 method test_multiThreadsWithMixedFuncDescriptors.
@Test
public void test_multiThreadsWithMixedFuncDescriptors() throws Throwable {
Thread thr1 = new Thread() {
public void run() {
try {
MethodType mt = MethodType.methodType(int.class, int.class, int.class);
FunctionDescriptor fd = FunctionDescriptor.of(C_INT, C_INT, C_INT);
Addressable functionSymbol = nativeLibLookup.lookup("add2Ints").get();
MethodHandle mh = clinker.downcallHandle(functionSymbol, mt, fd);
int result = (int) mh.invokeExact(128, 246);
Assert.assertEquals(result, 374);
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
};
Thread thr2 = new Thread() {
public void run() {
try {
MethodType mt = MethodType.methodType(int.class, int.class, int.class, int.class);
FunctionDescriptor fd = FunctionDescriptor.of(C_INT, C_INT, C_INT, C_INT);
Addressable functionSymbol = nativeLibLookup.lookup("add3Ints").get();
MethodHandle mh = clinker.downcallHandle(functionSymbol, mt, fd);
int result = (int) mh.invokeExact(112, 642, 971);
Assert.assertEquals(result, 1725);
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
};
Thread thr3 = new Thread() {
public void run() {
try {
MethodType mt = MethodType.methodType(boolean.class, boolean.class, boolean.class);
FunctionDescriptor fd = FunctionDescriptor.of(C_CHAR, C_CHAR, C_CHAR);
Addressable functionSymbol = nativeLibLookup.lookup("add2BoolsWithOr").get();
MethodHandle mh = clinker.downcallHandle(functionSymbol, mt, fd);
boolean result = (boolean) mh.invokeExact(true, false);
Assert.assertEquals(result, true);
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
};
Thread thr4 = new Thread() {
public void run() {
try {
MethodType mt = MethodType.methodType(int.class, int.class, int.class);
FunctionDescriptor fd = FunctionDescriptor.of(C_INT, C_INT, C_INT);
Addressable functionSymbol = nativeLibLookup.lookup("add2Ints").get();
MethodHandle mh = clinker.downcallHandle(functionSymbol, mt, fd);
int result = (int) mh.invokeExact(416, 728);
Assert.assertEquals(result, 1144);
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
};
Thread thr5 = new Thread() {
public void run() {
try {
MethodType mt = MethodType.methodType(int.class, int.class, int.class, int.class);
FunctionDescriptor fd = FunctionDescriptor.of(C_INT, C_INT, C_INT, C_INT);
Addressable functionSymbol = nativeLibLookup.lookup("add3Ints").get();
MethodHandle mh = clinker.downcallHandle(functionSymbol, mt, fd);
int result = (int) mh.invokeExact(1012, 1023, 2035);
Assert.assertEquals(result, 4070);
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
};
Thread thr6 = new Thread() {
public void run() {
try {
MethodType mt = MethodType.methodType(boolean.class, boolean.class, boolean.class);
FunctionDescriptor fd = FunctionDescriptor.of(C_CHAR, C_CHAR, C_CHAR);
Addressable functionSymbol = nativeLibLookup.lookup("add2BoolsWithOr").get();
MethodHandle mh = clinker.downcallHandle(functionSymbol, mt, fd);
boolean result = (boolean) mh.invokeExact(false, false);
Assert.assertEquals(result, false);
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
};
thr1.setUncaughtExceptionHandler(this);
thr2.setUncaughtExceptionHandler(this);
thr3.setUncaughtExceptionHandler(this);
thr4.setUncaughtExceptionHandler(this);
thr5.setUncaughtExceptionHandler(this);
thr6.setUncaughtExceptionHandler(this);
thr1.start();
thr2.start();
thr3.start();
thr4.start();
thr5.start();
thr6.start();
thr6.join();
thr5.join();
thr4.join();
thr3.join();
thr2.join();
thr1.join();
if (initException != null) {
throw new RuntimeException(initException);
}
}
use of jdk.incubator.foreign.FunctionDescriptor in project openj9 by eclipse.
the class PrimitiveTypeTests2 method test_addTwoNegtiveInts_2.
@Test
public void test_addTwoNegtiveInts_2() throws Throwable {
MethodType mt = MethodType.methodType(int.class, int.class, int.class);
FunctionDescriptor fd = FunctionDescriptor.of(C_INT, C_INT, C_INT);
Addressable functionSymbol = nativeLibLookup.lookup("add2Ints").get();
MethodHandle mh = clinker.downcallHandle(functionSymbol, allocator, mt, fd);
int result = (int) mh.invokeExact(-112, -123);
Assert.assertEquals(result, -235);
}
use of jdk.incubator.foreign.FunctionDescriptor in project openj9 by eclipse.
the class PrimitiveTypeTests2 method test_printfFromDefaultLibWithMemAddr_fromMemAddr_2.
@Test
public void test_printfFromDefaultLibWithMemAddr_fromMemAddr_2() throws Throwable {
/* Temporarily disable the default library loading on AIX till we figure out a way
* around to handle the case as the official implementation in OpenJDK17 doesn't
* help to load the static libray (libc.a).
*/
if (!isAixOS) {
Addressable functionSymbol = defaultLibLookup.lookup("printf").get();
MemoryAddress memAddr = functionSymbol.address();
MethodType mt = MethodType.methodType(int.class, MemoryAddress.class, int.class, int.class, int.class);
FunctionDescriptor fd = FunctionDescriptor.of(C_INT, C_POINTER, C_INT, C_INT, C_INT);
MethodHandle mh = clinker.downcallHandle(memAddr, allocator, mt, fd);
MemorySegment formatMemSegment = CLinker.toCString("\n%d + %d = %d\n", resourceScope);
mh.invoke(formatMemSegment.address(), 15, 27, 42);
}
}
Aggregations