< prev index next >

test/jdk/java/foreign/StdLibTest.java

Print this page

341             }
342         }
343 
344         static int qsortCompare(MemorySegment base, MemoryAddress addr1, MemoryAddress addr2) {
345             return (int)intHandle.get(addr1.rebase(base)) - (int)intHandle.get(addr2.rebase(base));
346         }
347 
348         int rand() throws Throwable {
349             return (int)rand.invokeExact();
350         }
351 
352         int printf(String format, List<PrintfArg> args) throws Throwable {
353             try (MemorySegment formatStr = toCString(format)) {
354                 return (int)specializedPrintf(args).invokeExact(formatStr.baseAddress(),
355                         args.stream().map(a -> a.nativeValue).toArray());
356             }
357         }
358 
359         int vprintf(String format, List<PrintfArg> args) throws Throwable {
360             try (MemorySegment formatStr = toCString(format)) {
361                 return (int)vprintf.invokeExact(formatStr.baseAddress(),
362                         VaList.make(b -> args.forEach(a -> a.accept(b))));







363             }
364         }
365 
366         private MethodHandle specializedPrintf(List<PrintfArg> args) {
367             //method type
368             MethodType mt = MethodType.methodType(int.class, MemoryAddress.class);
369             FunctionDescriptor fd = printfBase;
370             for (PrintfArg arg : args) {
371                 mt = mt.appendParameterTypes(arg.carrier);
372                 fd = fd.appendArgumentLayouts(arg.layout);
373             }
374             MethodHandle mh = abi.downcallHandle(printfAddr, mt, fd);
375             return mh.asSpreader(1, Object[].class, args.size());
376         }
377     }
378 
379     /*** data providers ***/
380 
381     @DataProvider
382     public static Object[][] ints() {

341             }
342         }
343 
344         static int qsortCompare(MemorySegment base, MemoryAddress addr1, MemoryAddress addr2) {
345             return (int)intHandle.get(addr1.rebase(base)) - (int)intHandle.get(addr2.rebase(base));
346         }
347 
348         int rand() throws Throwable {
349             return (int)rand.invokeExact();
350         }
351 
352         int printf(String format, List<PrintfArg> args) throws Throwable {
353             try (MemorySegment formatStr = toCString(format)) {
354                 return (int)specializedPrintf(args).invokeExact(formatStr.baseAddress(),
355                         args.stream().map(a -> a.nativeValue).toArray());
356             }
357         }
358 
359         int vprintf(String format, List<PrintfArg> args) throws Throwable {
360             try (MemorySegment formatStr = toCString(format)) {
361                 VaList vaList = VaList.make(b -> args.forEach(a -> a.accept(b)));
362                 int result = (int)vprintf.invokeExact(formatStr.baseAddress(), vaList);
363                 try {
364                     vaList.close();
365                 }
366                 catch (UnsupportedOperationException e) {
367                     assertEquals(e.getMessage(), "Empty VaList");
368                 }
369                 return result;
370             }
371         }
372 
373         private MethodHandle specializedPrintf(List<PrintfArg> args) {
374             //method type
375             MethodType mt = MethodType.methodType(int.class, MemoryAddress.class);
376             FunctionDescriptor fd = printfBase;
377             for (PrintfArg arg : args) {
378                 mt = mt.appendParameterTypes(arg.carrier);
379                 fd = fd.appendArgumentLayouts(arg.layout);
380             }
381             MethodHandle mh = abi.downcallHandle(printfAddr, mt, fd);
382             return mh.asSpreader(1, Object[].class, args.size());
383         }
384     }
385 
386     /*** data providers ***/
387 
388     @DataProvider
389     public static Object[][] ints() {
< prev index next >