changeset 8487:8e022657ca0b

support for constructors corresponding to node intrinsics to take a leading MetaAccessProvider argument that is automatically filled in during node intrinsification
author Doug Simon <doug.simon@oracle.com>
date Tue, 26 Mar 2013 17:16:05 +0100
parents 391df429b4a0
children cc433555c5a3
files graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPhase.java
diffstat 1 files changed, 16 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPhase.java	Tue Mar 26 17:13:50 2013 +0100
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPhase.java	Tue Mar 26 17:16:05 2013 +0100
@@ -89,7 +89,7 @@
 
             // Create the new node instance.
             Class<?> c = getNodeClass(target, intrinsic);
-            Node newInstance = createNodeInstance(c, parameterTypes, returnType, intrinsic.setStampFromReturnType(), nodeConstructorArguments);
+            Node newInstance = createNodeInstance(runtime, c, parameterTypes, returnType, intrinsic.setStampFromReturnType(), nodeConstructorArguments);
 
             // Replace the invoke with the new node.
             invoke.node().graph().add(newInstance);
@@ -260,11 +260,19 @@
 
     static final int VARARGS = 0x00000080;
 
-    private static Node createNodeInstance(Class<?> nodeClass, Class<?>[] parameterTypes, ResolvedJavaType returnType, boolean setStampFromReturnType, Object[] nodeConstructorArguments) {
+    private static Node createNodeInstance(MetaAccessProvider runtime, Class<?> nodeClass, Class<?>[] parameterTypes, ResolvedJavaType returnType, boolean setStampFromReturnType,
+                    Object[] nodeConstructorArguments) {
         Object[] arguments = null;
         Constructor<?> constructor = null;
+        boolean needsMetaAccessProviderArgument = false;
         nextConstructor: for (Constructor c : nodeClass.getDeclaredConstructors()) {
+            needsMetaAccessProviderArgument = false;
             Class[] signature = c.getParameterTypes();
+            if (signature.length != 0 && signature[0] == MetaAccessProvider.class) {
+                // Chop off the MetaAccessProvider first parameter
+                signature = Arrays.copyOfRange(signature, 1, signature.length);
+                needsMetaAccessProviderArgument = true;
+            }
             if ((c.getModifiers() & VARARGS) != 0) {
                 int fixedArgs = signature.length - 1;
                 if (parameterTypes.length < fixedArgs) {
@@ -285,7 +293,6 @@
                         continue nextConstructor;
                     }
                 }
-
                 arguments = Arrays.copyOf(nodeConstructorArguments, fixedArgs + 1);
                 int varargsLength = nodeConstructorArguments.length - fixedArgs;
                 Object varargs = Array.newInstance(componentType, varargsLength);
@@ -304,6 +311,12 @@
         if (constructor == null) {
             throw new GraalInternalError("Could not find constructor in " + nodeClass + " compatible with signature " + Arrays.toString(parameterTypes));
         }
+        if (needsMetaAccessProviderArgument) {
+            Object[] copy = new Object[arguments.length + 1];
+            System.arraycopy(arguments, 0, copy, 1, arguments.length);
+            copy[0] = runtime;
+            arguments = copy;
+        }
         constructor.setAccessible(true);
         try {
             ValueNode intrinsicNode = (ValueNode) constructor.newInstance(arguments);