# HG changeset patch # User Doug Simon # Date 1422913790 -3600 # Node ID 69f2926cd2ab28daffdf245cd8bf7a08ca8d2865 # Parent 0499dbe2da01f3fdacb9b0e005038e3b838d8684 added GraphBuilderPlugins for standard boxing/unboxing methods diff -r 0499dbe2da01 -r 69f2926cd2ab graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotGraphBuilderPluginsProvider.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotGraphBuilderPluginsProvider.java Mon Feb 02 21:40:08 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotGraphBuilderPluginsProvider.java Mon Feb 02 22:49:50 2015 +0100 @@ -58,10 +58,5 @@ public ResolvedJavaMethod getInvocationTarget(MetaAccessProvider metaAccess) { return GraphBuilderPlugin.resolveTarget(metaAccess, Object.class, name()); } - - @Override - public String toString() { - return Object.class.getName() + "." + name() + "()"; - } } } diff -r 0499dbe2da01 -r 69f2926cd2ab graal/com.oracle.graal.java/src/com/oracle/graal/java/DefaultGraphBuilderPluginsProvider.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/DefaultGraphBuilderPluginsProvider.java Mon Feb 02 21:40:08 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/DefaultGraphBuilderPluginsProvider.java Mon Feb 02 22:49:50 2015 +0100 @@ -25,6 +25,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.api.runtime.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.java.*; /** @@ -34,6 +35,7 @@ public class DefaultGraphBuilderPluginsProvider implements GraphBuilderPluginsProvider { public void registerPlugins(MetaAccessProvider metaAccess, GraphBuilderPlugins plugins) { plugins.register(metaAccess, ObjectPlugin.class); + plugins.register(metaAccess, BoxingPlugin.class); } /** @@ -59,4 +61,50 @@ return Object.class.getName() + "." + name() + "()"; } } + + /** + * Plugins for the standard primitive box classes (e.g., {@link Integer} and friends). + */ + enum BoxingPlugin implements GraphBuilderPlugin { + valueOf$Boolean(Kind.Boolean), + booleanValue$Boolean(Kind.Boolean), + valueOf$Byte(Kind.Byte), + byteValue$Byte(Kind.Byte), + valueOf$Short(Kind.Short), + shortValue$Short(Kind.Short), + valueOf$Char(Kind.Char), + charValue$Char(Kind.Char), + valueOf$Int(Kind.Int), + intValue$Int(Kind.Int), + valueOf$Long(Kind.Long), + longValue$Long(Kind.Long), + valueOf$Float(Kind.Float), + floatValue$Float(Kind.Float), + valueOf$Double(Kind.Double), + doubleValue$Double(Kind.Double); + + BoxingPlugin(Kind kind) { + assert name().startsWith("valueOf$") || name().startsWith(kind.getJavaName() + "Value$"); + this.kind = kind; + this.box = name().charAt(0) == 'v'; + } + + private final Kind kind; + private final boolean box; + + public final boolean handleInvocation(GraphBuilderContext builder, ValueNode[] args) { + if (box) { + ResolvedJavaType resultType = builder.getMetaAccess().lookupJavaType(kind.toBoxedJavaClass()); + builder.push(Kind.Object, builder.append(new BoxNode(args[0], resultType, kind))); + } else { + builder.push(kind, builder.append(new UnboxNode(args[0], kind))); + } + return true; + } + + public ResolvedJavaMethod getInvocationTarget(MetaAccessProvider metaAccess) { + Class[] parameterTypes = box ? new Class[]{kind.toJavaClass()} : new Class[0]; + return GraphBuilderPlugin.resolveTarget(metaAccess, kind.toBoxedJavaClass(), name(), parameterTypes); + } + } } diff -r 0499dbe2da01 -r 69f2926cd2ab graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Mon Feb 02 21:40:08 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Mon Feb 02 22:49:50 2015 +0100 @@ -778,7 +778,7 @@ int beforeStackSize = frameState.stackSize; if (plugin.handleInvocation(this, args)) { // System.out.println("used plugin: " + plugin); - assert beforeStackSize - resultType.getSlotCount() == frameState.stackSize; + assert beforeStackSize + resultType.getSlotCount() == frameState.stackSize; return; } assert beforeStackSize == frameState.stackSize; diff -r 0499dbe2da01 -r 69f2926cd2ab graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugin.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugin.java Mon Feb 02 21:40:08 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugin.java Mon Feb 02 22:49:50 2015 +0100 @@ -42,14 +42,21 @@ boolean handleInvocation(GraphBuilderContext builder, ValueNode[] args); /** - * Gets the target method handled by {@link #handleInvocation(GraphBuilderContext, ValueNode[])} - * . + * Gets the method handled by {@link #handleInvocation(GraphBuilderContext, ValueNode[])} . */ ResolvedJavaMethod getInvocationTarget(MetaAccessProvider metaAccess); - static ResolvedJavaMethod resolveTarget(MetaAccessProvider metaAccess, Class clazz, String methodName, Class... parameterTypes) { + /** + * Looks up a {@link ResolvedJavaMethod}. + * + * @param methodNameBase the name of the method is the prefix of this value up to the first '$' + * character + */ + static ResolvedJavaMethod resolveTarget(MetaAccessProvider metaAccess, Class declaringClass, String methodNameBase, Class... parameterTypes) { + int index = methodNameBase.indexOf('$'); + String methodName = index == -1 ? methodNameBase : methodNameBase.substring(0, index); try { - return metaAccess.lookupJavaMethod(methodName.equals("") ? clazz.getDeclaredConstructor(parameterTypes) : clazz.getDeclaredMethod(methodName, parameterTypes)); + return metaAccess.lookupJavaMethod(methodName.equals("") ? declaringClass.getDeclaredConstructor(parameterTypes) : declaringClass.getDeclaredMethod(methodName, parameterTypes)); } catch (NoSuchMethodException | SecurityException e) { throw new GraalInternalError(e); } diff -r 0499dbe2da01 -r 69f2926cd2ab graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPluginsProvider.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPluginsProvider.java Mon Feb 02 21:40:08 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPluginsProvider.java Mon Feb 02 22:49:50 2015 +0100 @@ -22,9 +22,7 @@ */ package com.oracle.graal.truffle.substitutions; -import java.util.*; import java.util.concurrent.*; -import java.util.stream.*; import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; @@ -130,14 +128,7 @@ private final Class[] parameterTypes; public ResolvedJavaMethod getInvocationTarget(MetaAccessProvider metaAccess) { - int index = name().indexOf('$'); - String methodName = index == -1 ? name() : name().substring(0, index); - return GraphBuilderPlugin.resolveTarget(metaAccess, CompilerDirectives.class, methodName, parameterTypes); - } - - @Override - public String toString() { - return Object.class.getName() + "." + name() + Arrays.asList(parameterTypes).stream().map(t -> t.getSimpleName()).collect(Collectors.joining(", ", "(", ")")); + return GraphBuilderPlugin.resolveTarget(metaAccess, CompilerDirectives.class, name(), parameterTypes); } } }