changeset 5463:b6311d367bd6

support use of boolean, byte, char and short constant arguments in @NodeIntrinsic methods
author Doug Simon <doug.simon@oracle.com>
date Fri, 01 Jun 2012 11:05:24 +0200
parents fc58f934f9a1
children 1d00c9a1f733
files graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/SnippetIntrinsificationPhase.java
diffstat 1 files changed, 14 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/SnippetIntrinsificationPhase.java	Fri Jun 01 11:03:50 2012 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/SnippetIntrinsificationPhase.java	Fri Jun 01 11:05:24 2012 +0200
@@ -120,12 +120,23 @@
             if (folding || CiUtil.getParameterAnnotation(ConstantNodeParameter.class, parameterIndex, target) != null) {
                 assert argument instanceof ConstantNode : "parameter " + parameterIndex + " must be a compile time constant for calling " + invoke.callTarget().targetMethod() + ": " + argument;
                 ConstantNode constantNode = (ConstantNode) argument;
-                Object o = constantNode.asConstant().boxedValue();
+                CiConstant constant = constantNode.asConstant();
+                Object o = constant.boxedValue();
                 if (o instanceof Class< ? >) {
                     reflectionCallArguments[i] = runtime.getType((Class< ? >) o);
                     parameterTypes[i] = RiResolvedType.class;
                 } else {
-                    reflectionCallArguments[i] = o;
+                    if (parameterTypes[i] == boolean.class) {
+                        reflectionCallArguments[i] = Boolean.valueOf(constant.asInt() != 0);
+                    } else if (parameterTypes[i] == byte.class) {
+                        reflectionCallArguments[i] = Byte.valueOf((byte) constant.asInt());
+                    } else if (parameterTypes[i] == short.class) {
+                        reflectionCallArguments[i] = Short.valueOf((short) constant.asInt());
+                    } else if (parameterTypes[i] == char.class) {
+                        reflectionCallArguments[i] = Character.valueOf((char) constant.asInt());
+                    } else {
+                        reflectionCallArguments[i] = o;
+                    }
                 }
             } else {
                 reflectionCallArguments[i] = argument;
@@ -186,7 +197,6 @@
     }
 
     private static Node createNodeInstance(Class< ? > nodeClass, Class< ? >[] parameterTypes, Object[] nodeConstructorArguments) {
-
         Constructor< ? > constructor;
         try {
             constructor = nodeClass.getDeclaredConstructor(parameterTypes);
@@ -197,7 +207,7 @@
         try {
             return (ValueNode) constructor.newInstance(nodeConstructorArguments);
         } catch (Exception e) {
-            throw new RuntimeException(e);
+            throw new RuntimeException(constructor + Arrays.toString(nodeConstructorArguments), e);
         }
     }