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.op.CoreOp;
  6 import org.testng.Assert;
  7 import org.testng.annotations.Test;
  8 
  9 import java.lang.classfile.ClassFile;
 10 import jdk.internal.classfile.components.ClassPrinter;
 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 testng TestVarArg
 24  *
 25  */
 26 public class TestVarArg {
 27 
 28     @Test
 29     void test() throws Throwable {
 30         var f = getFuncOp("f");
 31         f.writeTo(System.out);
 32 
 33         var lf = f.transform(OpTransformer.LOWERING_TRANSFORMER);
 34         lf.writeTo(System.out);
 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         Assert.assertEquals(mh.invoke(), f());
 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 }