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() {
|