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 }