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 }