# HG changeset patch # User Doug Simon # Date 1338541524 -7200 # Node ID b6311d367bd6aa5e9f28a091ef436bd969c0dd39 # Parent fc58f934f9a1317a66f82e99ee7e3289fe282e1c support use of boolean, byte, char and short constant arguments in @NodeIntrinsic methods diff -r fc58f934f9a1 -r b6311d367bd6 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/SnippetIntrinsificationPhase.java --- 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); } }