# HG changeset patch # User Matthias Grimmer # Date 1364577703 -3600 # Node ID 77970b4f131c805a36e2602348380d134bdd2ca7 # Parent 142fe2016d0bd4494c886b6c91040b0d94ceb6f4# Parent 916a1f1a96f04d2290e9cb9fbc58cfcd9a90d7cc Merge diff -r 142fe2016d0b -r 77970b4f131c 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 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