# HG changeset patch # User Doug Simon # Date 1364314565 -3600 # Node ID 8e022657ca0b6d5e1fea50261440f431adadf73e # Parent 391df429b4a08ea025c717de0015dc9590424ecf support for constructors corresponding to node intrinsics to take a leading MetaAccessProvider argument that is automatically filled in during node intrinsification diff -r 391df429b4a0 -r 8e022657ca0b graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPhase.java --- 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);