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); |