1 import jdk.incubator.code.CodeReflection;
2 import jdk.incubator.code.Op;
3 import jdk.incubator.code.OpTransformer;
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 lf = f.transform(OpTransformer.LOWERING_TRANSFORMER);
34 System.out.println(lf.toText());
35
36 var bytes = BytecodeGenerator.generateClassData(MethodHandles.lookup(), f);
37 var classModel = ClassFile.of().parse(bytes);
38 ClassPrinter.toYaml(classModel, ClassPrinter.Verbosity.TRACE_ALL, System.out::print);
39
40 MethodHandle mh = BytecodeGenerator.generate(MethodHandles.lookup(), lf);
41 Assertions.assertEquals(f(), mh.invoke());
42 }
43
44 @CodeReflection
45 static String f() {
46 String r = "";
47 String ls = System.lineSeparator();
48
49 r += ls + h(1);
50 r += ls + h(2, 3);
51 r += ls + h(4, (byte) 5);
52
53 r += ls + k(Byte.MIN_VALUE, Byte.MAX_VALUE);
54
55 r += ls + j("s1", "s2", "s3");
56
57 r += ls + w(8, 9);
58
59 r += k();
60
61 r += l(11L, 12L);
62
63 r += d(21.0, 22.0);
64
65 return r;
66 }
67
68 static String h(int i, int... s) {
69 return i + ", " + Arrays.toString(s);
70 }
71
72 static String k(byte... s) {
73 return Arrays.toString(s);
74 }
75
76 static String j(String i, String... s) {
77 return i + ", " + Arrays.toString(s);
78 }
79
80 static <T extends Number> String w(T... ts) {
81 return Arrays.toString(ts);
82 }
83
84 static String l(long... a) {
85 return Arrays.toString(a);
86 }
87
88 static String d(double... a) {
89 return Arrays.toString(a);
90 }
91
92 private CoreOp.FuncOp getFuncOp(String name) {
93 Optional<Method> om = Stream.of(this.getClass().getDeclaredMethods())
94 .filter(m -> m.getName().equals(name))
95 .findFirst();
96
97 Method m = om.get();
98 return Op.ofMethod(m).get();
99 }
100 }