1 import jdk.incubator.code.Reflect;
 2 import jdk.incubator.code.Op;
 3 import jdk.incubator.code.bytecode.BytecodeGenerator;
 4 import jdk.incubator.code.dialect.core.CoreOp;
 5 import jdk.internal.classfile.components.ClassPrinter;
 6 import org.junit.jupiter.api.Assertions;
 7 import org.junit.jupiter.api.Test;
 8 
 9 import java.lang.classfile.ClassFile;
10 import java.lang.invoke.MethodHandle;
11 import java.lang.invoke.MethodHandles;
12 import java.lang.reflect.Method;
13 import java.util.Arrays;
14 import java.util.Optional;
15 import java.util.stream.Stream;
16 
17 /*
18  * @test
19  * @enablePreview
20  * @modules jdk.incubator.code
21  * @modules java.base/jdk.internal.classfile.components
22  * @library ../
23  * @run junit TestVarArg
24  * @run main Unreflect TestVarArg
25  * @run junit TestVarArg
26  *
27  */
28 public class TestVarArg {
29 
30     @Test
31     void test() throws Throwable {
32         var f = getFuncOp("f");
33         System.out.println(f.toText());
34 
35         var bytes = BytecodeGenerator.generateClassData(MethodHandles.lookup(), f);
36         var classModel = ClassFile.of().parse(bytes);
37         ClassPrinter.toYaml(classModel, ClassPrinter.Verbosity.TRACE_ALL, System.out::print);
38 
39         MethodHandle mh = BytecodeGenerator.generate(MethodHandles.lookup(), f);
40         Assertions.assertEquals(f(), mh.invoke());
41     }
42 
43     @Reflect
44     static String f() {
45         String r = "";
46         String ls = System.lineSeparator();
47 
48         r += ls + h(1);
49         r += ls + h(2, 3);
50         r += ls + h(4, (byte) 5);
51 
52         r += ls + k(Byte.MIN_VALUE, Byte.MAX_VALUE);
53 
54         r += ls + j("s1", "s2", "s3");
55 
56         r += ls + w(8, 9);
57 
58         r += k();
59 
60         r += l(11L, 12L);
61 
62         r += d(21.0, 22.0);
63 
64         return r;
65     }
66 
67     static String h(int i, int... s) {
68         return i + ", " + Arrays.toString(s);
69     }
70 
71     static String k(byte... s) {
72         return Arrays.toString(s);
73     }
74 
75     static String j(String i, String... s) {
76         return i + ", " + Arrays.toString(s);
77     }
78 
79     static <T extends Number> String w(T... ts) {
80         return Arrays.toString(ts);
81     }
82 
83     static String l(long... a) {
84         return Arrays.toString(a);
85     }
86 
87     static String d(double... a) {
88         return Arrays.toString(a);
89     }
90 
91     private CoreOp.FuncOp getFuncOp(String name) {
92         Optional<Method> om = Stream.of(this.getClass().getDeclaredMethods())
93                 .filter(m -> m.getName().equals(name))
94                 .findFirst();
95 
96         Method m = om.get();
97         return Op.ofMethod(m).get();
98     }
99 }