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