Mercurial > hg > truffle
changeset 8584:77970b4f131c
Merge
author | Matthias Grimmer <grimmer@ssw.jku.at> |
---|---|
date | Fri, 29 Mar 2013 18:21:43 +0100 |
parents | 142fe2016d0b (current diff) 916a1f1a96f0 (diff) |
children | 5c58da5b8233 |
files | |
diffstat | 1 files changed, 14 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPhase.java Fri Mar 29 18:21:26 2013 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPhase.java Fri Mar 29 18:21:43 2013 +0100 @@ -62,11 +62,16 @@ } } - public static Class<?>[] signatureToTypes(Signature signature, ResolvedJavaType accessingClass) { - int count = signature.getParameterCount(false); + public static Class<?>[] signatureToTypes(Signature signature, JavaType receiverType, ResolvedJavaType accessingClass) { + int count = signature.getParameterCount(receiverType != null); Class<?>[] result = new Class<?>[count]; - for (int i = 0; i < result.length; ++i) { - result[i] = getMirrorOrFail(signature.getParameterType(i, accessingClass).resolve(accessingClass), Thread.currentThread().getContextClassLoader()); + int j = 0; + if (receiverType != null) { + result[0] = getMirrorOrFail(receiverType.resolve(accessingClass), Thread.currentThread().getContextClassLoader()); + j = 1; + } + for (int i = 0; i + j < result.length; ++i) { + result[i + j] = getMirrorOrFail(signature.getParameterType(i, accessingClass).resolve(accessingClass), Thread.currentThread().getContextClassLoader()); } return result; } @@ -75,10 +80,12 @@ ResolvedJavaMethod target = invoke.methodCallTarget().targetMethod(); NodeIntrinsic intrinsic = target.getAnnotation(Node.NodeIntrinsic.class); ResolvedJavaType declaringClass = target.getDeclaringClass(); + JavaType receiverType = invoke.methodCallTarget().isStatic() ? null : declaringClass; if (intrinsic != null) { assert target.getAnnotation(Fold.class) == null; - Class<?>[] parameterTypes = signatureToTypes(target.getSignature(), declaringClass); + // TODO mjj non-static intrinsic? + Class<?>[] parameterTypes = signatureToTypes(target.getSignature(), null, declaringClass); ResolvedJavaType returnType = target.getSignature().getReturnType(declaringClass).resolve(declaringClass); // Prepare the arguments for the reflective constructor call on the node class. @@ -98,7 +105,7 @@ // Clean up checkcast instructions inserted by javac if the return type is generic. cleanUpReturnCheckCast(newInstance); } else if (target.getAnnotation(Fold.class) != null) { - Class<?>[] parameterTypes = signatureToTypes(target.getSignature(), declaringClass); + Class<?>[] parameterTypes = signatureToTypes(target.getSignature(), receiverType, declaringClass); // Prepare the arguments for the reflective method call Object[] arguments = prepareArguments(invoke, parameterTypes, target, true); @@ -109,6 +116,7 @@ if (!invoke.methodCallTarget().isStatic()) { receiver = arguments[0]; arguments = Arrays.asList(arguments).subList(1, arguments.length).toArray(); + parameterTypes = Arrays.asList(parameterTypes).subList(1, parameterTypes.length).toArray(new Class<?>[parameterTypes.length - 1]); } // Call the method