Mercurial > hg > graal-jvmci-8
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);