src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/InvokerSignatureMismatchTest.java
changeset 58299 6df94ce3ab2f
parent 55509 d58442b8abc1
child 58679 9c3209ff7550
equal deleted inserted replaced
58298:0152ad7b38b8 58299:6df94ce3ab2f
    25 package org.graalvm.compiler.replacements.test;
    25 package org.graalvm.compiler.replacements.test;
    26 
    26 
    27 import static org.graalvm.compiler.test.SubprocessUtil.getVMCommandLine;
    27 import static org.graalvm.compiler.test.SubprocessUtil.getVMCommandLine;
    28 import static org.graalvm.compiler.test.SubprocessUtil.withoutDebuggerArguments;
    28 import static org.graalvm.compiler.test.SubprocessUtil.withoutDebuggerArguments;
    29 
    29 
       
    30 import java.nio.file.Files;
       
    31 import java.nio.file.Path;
       
    32 import java.nio.file.Paths;
       
    33 import java.util.List;
       
    34 
       
    35 import org.graalvm.compiler.core.test.CustomizedBytecodePatternTest;
       
    36 import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
       
    37 import org.graalvm.compiler.test.SubprocessUtil;
       
    38 import org.graalvm.compiler.test.SubprocessUtil.Subprocess;
    30 import org.junit.Test;
    39 import org.junit.Test;
    31 import org.objectweb.asm.ClassWriter;
    40 import org.objectweb.asm.ClassWriter;
    32 import org.objectweb.asm.MethodVisitor;
    41 import org.objectweb.asm.MethodVisitor;
    33 import org.objectweb.asm.Type;
    42 import org.objectweb.asm.Type;
    34 
    43 
    35 import java.io.File;
    44 public class InvokerSignatureMismatchTest extends CustomizedBytecodePatternTest {
    36 import java.lang.invoke.MethodHandles;
       
    37 import java.util.List;
       
    38 
    45 
    39 import org.graalvm.compiler.core.test.CustomizedBytecodePatternTest;
    46     @SuppressWarnings("try")
    40 import org.graalvm.compiler.test.SubprocessUtil;
       
    41 import org.graalvm.compiler.test.SubprocessUtil.Subprocess;
       
    42 
       
    43 import jdk.vm.ci.meta.ResolvedJavaMethod;
       
    44 
       
    45 public class InvokerSignatureMismatchTest {
       
    46 
       
    47     @Test
    47     @Test
    48     public void test() throws Throwable {
    48     public void test() throws Throwable {
    49         List<String> args = withoutDebuggerArguments(getVMCommandLine());
    49         List<String> args = withoutDebuggerArguments(getVMCommandLine());
    50         String classPath = System.getProperty("java.class.path");
    50         try (TemporaryDirectory temp = new TemporaryDirectory(null, getClass().getSimpleName())) {
    51         classPath = classPath + File.pathSeparator + TestISMBL.class.getProtectionDomain().getCodeSource().getLocation().getPath();
    51             if (JavaVersionUtil.JAVA_SPEC > 8) {
    52         args.add("-Xbootclasspath/a:" + classPath);
    52                 args.add("--class-path=" + temp);
    53         args.add("-XX:-TieredCompilation");
    53                 args.add("--patch-module=java.base=" + temp);
    54         args.add("-XX:+EnableJVMCI");
    54             } else {
    55         args.add("-XX:+UseJVMCICompiler");
    55                 args.add("-Xbootclasspath/a:" + temp);
       
    56             }
       
    57             args.add("-XX:-TieredCompilation");
       
    58             args.add("-XX:+UnlockExperimentalVMOptions");
       
    59             args.add("-XX:+EnableJVMCI");
       
    60             args.add("-XX:+UseJVMCICompiler");
    56 
    61 
    57         args.add(TestISMBL.class.getName());
    62             Path invokeDir = Files.createDirectories(temp.path.resolve(Paths.get("java", "lang", "invoke")));
    58         Subprocess proc = SubprocessUtil.java(args);
    63             Files.write(temp.path.resolve("ISMTest.class"), generateClass("ISMTest"));
    59         if (proc.exitCode != 0) {
    64             Files.write(invokeDir.resolve("MethodHandleHelper.class"), generateClass("java/lang/invoke/MethodHandleHelper"));
    60             System.out.println(proc);
       
    61         }
       
    62     }
       
    63 }
       
    64 
    65 
    65 class TestISMBL extends CustomizedBytecodePatternTest {
    66             args.add("ISMTest");
    66 
    67             Subprocess proc = SubprocessUtil.java(args);
    67     public static void main(String[] args) {
    68             if (proc.exitCode != 0) {
    68         try {
    69                 throw new AssertionError(proc.toString());
    69             new TestISMBL().test();
    70             }
    70         } catch (Throwable e) {
       
    71             e.printStackTrace();
       
    72             System.exit(1);
       
    73         }
       
    74         System.exit(0);
       
    75     }
       
    76 
       
    77     private void test() throws Throwable {
       
    78         getClass("java/lang/invoke/MHHelper");
       
    79         Class<?> testClass = getClass("ISMTest");
       
    80 
       
    81         ResolvedJavaMethod mL = getResolvedJavaMethod(testClass, "mainLink");
       
    82         ResolvedJavaMethod mI = getResolvedJavaMethod(testClass, "mainInvoke");
       
    83         executeActual(mL, null, 100);
       
    84         executeActual(mI, null, 100);
       
    85     }
       
    86 
       
    87     @Override
       
    88     protected Class<?> getClass(String className) throws ClassNotFoundException {
       
    89         if (className.equals("java/lang/invoke/MHHelper")) {
       
    90             return super.getClassBL(className, MethodHandles.lookup());
       
    91         } else {
       
    92             return super.getClass(className);
       
    93         }
    71         }
    94     }
    72     }
    95 
    73 
    96     @Override
    74     @Override
    97     protected byte[] generateClass(String className) {
    75     protected byte[] generateClass(String className) {
    98         String[] exceptions = new String[]{"java/lang/Throwable"};
    76         String[] exceptions = new String[]{"java/lang/Throwable"};
    99         ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
    77         ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
   100         cw.visit(52, ACC_SUPER | ACC_PUBLIC, className, null, "java/lang/Object", null);
    78         cw.visit(52, ACC_SUPER | ACC_PUBLIC, className, null, "java/lang/Object", null);
   101 
    79 
   102         if (className.equals("java/lang/invoke/MHHelper")) {
    80         if (className.equals("java/lang/invoke/MethodHandleHelper")) {
   103             MethodVisitor internalMemberName = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "internalMemberName", "(Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object;", null, exceptions);
    81             MethodVisitor internalMemberName = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "internalMemberName", "(Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object;", null, exceptions);
   104             internalMemberName.visitCode();
    82             internalMemberName.visitCode();
   105             internalMemberName.visitVarInsn(ALOAD, 0);
    83             internalMemberName.visitVarInsn(ALOAD, 0);
   106             internalMemberName.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "internalMemberName", "()Ljava/lang/invoke/MemberName;", false);
    84             internalMemberName.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "internalMemberName", "()Ljava/lang/invoke/MemberName;", false);
   107             internalMemberName.visitInsn(ARETURN);
    85             internalMemberName.visitInsn(ARETURN);
   147             clinit.visitEnd();
   125             clinit.visitEnd();
   148 
   126 
   149             MethodVisitor mainLink = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "mainLink", "(I)I", null, exceptions);
   127             MethodVisitor mainLink = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "mainLink", "(I)I", null, exceptions);
   150             mainLink.visitCode();
   128             mainLink.visitCode();
   151             mainLink.visitFieldInsn(GETSTATIC, className, "INT_MH", "Ljava/lang/invoke/MethodHandle;");
   129             mainLink.visitFieldInsn(GETSTATIC, className, "INT_MH", "Ljava/lang/invoke/MethodHandle;");
   152             mainLink.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MHHelper", "internalMemberName", "(Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object;", false);
   130             mainLink.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandleHelper", "internalMemberName", "(Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object;", false);
   153             mainLink.visitVarInsn(ASTORE, 1);
   131             mainLink.visitVarInsn(ASTORE, 1);
   154             mainLink.visitVarInsn(ILOAD, 0);
   132             mainLink.visitVarInsn(ILOAD, 0);
   155             mainLink.visitInsn(I2F);
   133             mainLink.visitInsn(I2F);
   156             mainLink.visitVarInsn(ALOAD, 1);
   134             mainLink.visitVarInsn(ALOAD, 1);
   157             mainLink.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MHHelper", "linkToStatic", "(FLjava/lang/Object;)I", false);
   135             mainLink.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandleHelper", "linkToStatic", "(FLjava/lang/Object;)I", false);
   158             mainLink.visitInsn(IRETURN);
   136             mainLink.visitInsn(IRETURN);
   159             mainLink.visitMaxs(1, 1);
   137             mainLink.visitMaxs(1, 1);
   160             mainLink.visitEnd();
   138             mainLink.visitEnd();
   161 
   139 
   162             MethodVisitor mainInvoke = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "mainInvoke", "(I)I", null, exceptions);
   140             MethodVisitor mainInvoke = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "mainInvoke", "(I)I", null, exceptions);
   163             mainInvoke.visitCode();
   141             mainInvoke.visitCode();
   164             mainInvoke.visitFieldInsn(GETSTATIC, className, "INT_MH", "Ljava/lang/invoke/MethodHandle;");
   142             mainInvoke.visitFieldInsn(GETSTATIC, className, "INT_MH", "Ljava/lang/invoke/MethodHandle;");
   165             mainInvoke.visitVarInsn(ILOAD, 0);
   143             mainInvoke.visitVarInsn(ILOAD, 0);
   166             mainInvoke.visitInsn(I2F);
   144             mainInvoke.visitInsn(I2F);
   167             mainInvoke.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MHHelper", "invokeBasicI", "(Ljava/lang/invoke/MethodHandle;F)I", false);
   145             mainInvoke.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandleHelper", "invokeBasicI", "(Ljava/lang/invoke/MethodHandle;F)I", false);
   168             mainInvoke.visitInsn(IRETURN);
   146             mainInvoke.visitInsn(IRETURN);
   169             mainInvoke.visitMaxs(1, 1);
   147             mainInvoke.visitMaxs(1, 1);
   170             mainInvoke.visitEnd();
   148             mainInvoke.visitEnd();
   171 
   149 
   172             MethodVisitor bodyI = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "bodyI", "(I)I", null, null);
   150             MethodVisitor bodyI = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "bodyI", "(I)I", null, null);
   175             bodyI.visitIntInsn(SIPUSH, 1023);
   153             bodyI.visitIntInsn(SIPUSH, 1023);
   176             bodyI.visitInsn(IAND);
   154             bodyI.visitInsn(IAND);
   177             bodyI.visitInsn(IRETURN);
   155             bodyI.visitInsn(IRETURN);
   178             bodyI.visitMaxs(1, 1);
   156             bodyI.visitMaxs(1, 1);
   179             bodyI.visitEnd();
   157             bodyI.visitEnd();
       
   158 
       
   159             MethodVisitor main = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "main", "([Ljava/lang/String;)V", null, exceptions);
       
   160             main.visitCode();
       
   161             main.visitIntInsn(SIPUSH, 100);
       
   162             main.visitMethodInsn(INVOKESTATIC, "ISMTest", "mainLink", "(I)I", false);
       
   163             main.visitInsn(POP);
       
   164             main.visitIntInsn(SIPUSH, 100);
       
   165             main.visitMethodInsn(INVOKESTATIC, "ISMTest", "mainInvoke", "(I)I", false);
       
   166             main.visitInsn(POP);
       
   167             main.visitInsn(RETURN);
       
   168             main.visitMaxs(1, 1);
       
   169             main.visitEnd();
       
   170 
   180         }
   171         }
   181         cw.visitEnd();
   172         cw.visitEnd();
   182         return cw.toByteArray();
   173         return cw.toByteArray();
   183     }
   174     }
   184 }
   175 }