20 * or visit www.oracle.com if you need additional information or have any |
20 * or visit www.oracle.com if you need additional information or have any |
21 * questions. |
21 * questions. |
22 */ |
22 */ |
23 package org.graalvm.compiler.replacements.test.classfile; |
23 package org.graalvm.compiler.replacements.test.classfile; |
24 |
24 |
|
25 import static org.graalvm.compiler.test.SubprocessUtil.getVMCommandLine; |
|
26 import static org.graalvm.compiler.test.SubprocessUtil.java; |
|
27 import static org.graalvm.compiler.test.SubprocessUtil.withoutDebuggerArguments; |
25 import static org.junit.Assume.assumeTrue; |
28 import static org.junit.Assume.assumeTrue; |
26 |
29 |
27 import java.io.FileOutputStream; |
30 import java.io.FileOutputStream; |
28 import java.io.IOException; |
31 import java.io.IOException; |
29 import java.io.InputStream; |
32 import java.io.InputStream; |
33 import java.lang.management.ManagementFactory; |
36 import java.lang.management.ManagementFactory; |
34 import java.lang.reflect.Method; |
37 import java.lang.reflect.Method; |
35 import java.nio.file.Files; |
38 import java.nio.file.Files; |
36 import java.nio.file.Path; |
39 import java.nio.file.Path; |
37 import java.security.ProtectionDomain; |
40 import java.security.ProtectionDomain; |
|
41 import java.util.List; |
38 import java.util.jar.Attributes; |
42 import java.util.jar.Attributes; |
39 import java.util.jar.JarEntry; |
43 import java.util.jar.JarEntry; |
40 import java.util.jar.JarOutputStream; |
44 import java.util.jar.JarOutputStream; |
41 import java.util.jar.Manifest; |
45 import java.util.jar.Manifest; |
42 |
46 |
43 import javax.tools.ToolProvider; |
47 import javax.tools.ToolProvider; |
44 |
48 |
45 import org.junit.Assert; |
|
46 import org.junit.Test; |
|
47 |
|
48 import org.graalvm.compiler.api.replacements.ClassSubstitution; |
49 import org.graalvm.compiler.api.replacements.ClassSubstitution; |
49 import org.graalvm.compiler.api.replacements.MethodSubstitution; |
50 import org.graalvm.compiler.api.replacements.MethodSubstitution; |
50 import org.graalvm.compiler.bytecode.BytecodeProvider; |
51 import org.graalvm.compiler.bytecode.BytecodeProvider; |
51 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration; |
|
52 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins; |
52 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins; |
53 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration; |
53 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration; |
54 import org.graalvm.compiler.replacements.test.ReplacementsTest; |
54 import org.graalvm.compiler.replacements.test.ReplacementsTest; |
|
55 import org.graalvm.compiler.test.SubprocessUtil.Subprocess; |
|
56 import org.junit.Assert; |
|
57 import org.junit.Test; |
55 |
58 |
56 import jdk.vm.ci.meta.ResolvedJavaMethod; |
59 import jdk.vm.ci.meta.ResolvedJavaMethod; |
57 |
60 |
58 /** |
61 /** |
59 * Tests that intrinsics (and snippets) are isolated from bytecode instrumentation. |
62 * Tests that intrinsics (and snippets) are isolated from bytecode instrumentation. |
76 return "intrinsic"; |
79 return "intrinsic"; |
77 } |
80 } |
78 } |
81 } |
79 |
82 |
80 @Override |
83 @Override |
81 protected GraphBuilderConfiguration editGraphBuilderConfiguration(GraphBuilderConfiguration conf) { |
84 protected void registerInvocationPlugins(InvocationPlugins invocationPlugins) { |
82 InvocationPlugins invocationPlugins = conf.getPlugins().getInvocationPlugins(); |
|
83 BytecodeProvider replacementBytecodeProvider = getSystemClassLoaderBytecodeProvider(); |
85 BytecodeProvider replacementBytecodeProvider = getSystemClassLoaderBytecodeProvider(); |
84 Registration r = new Registration(invocationPlugins, Original.class, replacementBytecodeProvider); |
86 Registration r = new Registration(invocationPlugins, Original.class, replacementBytecodeProvider); |
85 r.registerMethodSubstitution(Intrinsic.class, "getValue"); |
87 r.registerMethodSubstitution(Intrinsic.class, "getValue"); |
86 return super.editGraphBuilderConfiguration(conf); |
88 super.registerInvocationPlugins(invocationPlugins); |
87 } |
89 } |
88 |
90 |
89 public static String callOriginalGetValue() { |
91 public static String callOriginalGetValue() { |
90 // This call will be intrinsified when compiled by Graal |
92 // This call will be intrinsified when compiled by Graal |
91 return Original.getValue(); |
93 return Original.getValue(); |
96 return Intrinsic.getValue(); |
98 return Intrinsic.getValue(); |
97 } |
99 } |
98 |
100 |
99 @Test |
101 @Test |
100 public void test() throws Throwable { |
102 public void test() throws Throwable { |
|
103 String recursionPropName = getClass().getName() + ".recursion"; |
|
104 if (Java8OrEarlier || Boolean.getBoolean(recursionPropName)) { |
|
105 testHelper(); |
|
106 } else { |
|
107 List<String> vmArgs = withoutDebuggerArguments(getVMCommandLine()); |
|
108 vmArgs.add("-D" + recursionPropName + "=true"); |
|
109 vmArgs.add("-Djdk.attach.allowAttachSelf=true"); |
|
110 Subprocess proc = java(vmArgs, "com.oracle.mxtool.junit.MxJUnitWrapper", getClass().getName()); |
|
111 if (proc.exitCode != 0) { |
|
112 Assert.fail(String.format("non-zero exit code %d for command:%n%s", proc.exitCode, proc)); |
|
113 } |
|
114 } |
|
115 } |
|
116 |
|
117 public void testHelper() throws Throwable { |
|
118 |
101 Object receiver = null; |
119 Object receiver = null; |
102 Object[] args = {}; |
120 Object[] args = {}; |
103 |
121 |
104 // Prior to redefinition, both Original and Intrinsic |
122 // Prior to redefinition, both Original and Intrinsic |
105 // should behave as per their Java source code |
123 // should behave as per their Java source code |