hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/classfile/RedefineIntrinsicTest.java
changeset 46459 7d4e637d3f21
parent 46344 694c102fd8ed
child 46807 8b2c620d7092
equal deleted inserted replaced
46458:3c12af929e7d 46459:7d4e637d3f21
    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