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 }