197 MH_sumStack.invokeExact(longSum.baseAddress(), doubleSum.baseAddress(), 32,
198 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L,
199 1D, 2D, 3D, 4D, 5D, 6D, 7D, 8D, 9D, 10D, 11D, 12D, 13D, 14D, 15D, 16D);
200
201 long lSum = (long) VH_long.get(longSum.baseAddress());
202 double dSum = (double) VH_double.get(doubleSum.baseAddress());
203
204 assertEquals(lSum, 136L);
205 assertEquals(dSum, 136D);
206 }
207 }
208
209 @Test(dataProvider = "upcalls")
210 public void testUpcall(MethodHandle target, MethodHandle callback) throws Throwable {
211 FunctionDescriptor desc = FunctionDescriptor.ofVoid(C_VA_LIST);
212 try (MemorySegment stub = abi.upcallStub(callback, desc)) {
213 target.invokeExact(stub.baseAddress());
214 }
215 }
216
217 @DataProvider
218 public static Object[][] upcalls() {
219 return new Object[][]{
220 { linkVaListCB("upcallBigStruct"), VaListConsumer.mh(vaList -> {
221 try (MemorySegment struct = vaList.vargAsSegment(BigPoint_LAYOUT)) {
222 assertEquals((long) VH_BigPoint_x.get(struct.baseAddress()), 8);
223 assertEquals((long) VH_BigPoint_y.get(struct.baseAddress()), 16);
224 }
225 })},
226 { linkVaListCB("upcallBigStruct"), VaListConsumer.mh(vaList -> {
227 VaList copy = vaList.copy();
228 try (MemorySegment struct = vaList.vargAsSegment(BigPoint_LAYOUT)) {
229 assertEquals((long) VH_BigPoint_x.get(struct.baseAddress()), 8);
230 assertEquals((long) VH_BigPoint_y.get(struct.baseAddress()), 16);
231
232 VH_BigPoint_x.set(struct.baseAddress(), 0);
233 VH_BigPoint_y.set(struct.baseAddress(), 0);
234 }
235
236 // should be independent
|
197 MH_sumStack.invokeExact(longSum.baseAddress(), doubleSum.baseAddress(), 32,
198 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L,
199 1D, 2D, 3D, 4D, 5D, 6D, 7D, 8D, 9D, 10D, 11D, 12D, 13D, 14D, 15D, 16D);
200
201 long lSum = (long) VH_long.get(longSum.baseAddress());
202 double dSum = (double) VH_double.get(doubleSum.baseAddress());
203
204 assertEquals(lSum, 136L);
205 assertEquals(dSum, 136D);
206 }
207 }
208
209 @Test(dataProvider = "upcalls")
210 public void testUpcall(MethodHandle target, MethodHandle callback) throws Throwable {
211 FunctionDescriptor desc = FunctionDescriptor.ofVoid(C_VA_LIST);
212 try (MemorySegment stub = abi.upcallStub(callback, desc)) {
213 target.invokeExact(stub.baseAddress());
214 }
215 }
216
217 @Test(expectedExceptions = UnsupportedOperationException.class,
218 expectedExceptionsMessageRegExp = ".*Empty VaList.*")
219 public void testEmptyNotCloseable() {
220 VaList list = VaList.empty();
221 list.close();
222 }
223
224 @Test(expectedExceptions = UnsupportedOperationException.class,
225 expectedExceptionsMessageRegExp = ".*Empty VaList.*")
226 public void testEmptyVaListFromBuilderNotCloseable() {
227 VaList list = VaList.make(b -> {});
228 list.close();
229 }
230
231 @DataProvider
232 public static Object[][] upcalls() {
233 return new Object[][]{
234 { linkVaListCB("upcallBigStruct"), VaListConsumer.mh(vaList -> {
235 try (MemorySegment struct = vaList.vargAsSegment(BigPoint_LAYOUT)) {
236 assertEquals((long) VH_BigPoint_x.get(struct.baseAddress()), 8);
237 assertEquals((long) VH_BigPoint_y.get(struct.baseAddress()), 16);
238 }
239 })},
240 { linkVaListCB("upcallBigStruct"), VaListConsumer.mh(vaList -> {
241 VaList copy = vaList.copy();
242 try (MemorySegment struct = vaList.vargAsSegment(BigPoint_LAYOUT)) {
243 assertEquals((long) VH_BigPoint_x.get(struct.baseAddress()), 8);
244 assertEquals((long) VH_BigPoint_y.get(struct.baseAddress()), 16);
245
246 VH_BigPoint_x.set(struct.baseAddress(), 0);
247 VH_BigPoint_y.set(struct.baseAddress(), 0);
248 }
249
250 // should be independent
|