Mercurial > hg > truffle
changeset 19070:69f2926cd2ab
added GraphBuilderPlugins for standard boxing/unboxing methods
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Mon, 02 Feb 2015 22:49:50 +0100 |
parents | 0499dbe2da01 |
children | cc1020cc0599 |
files | graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotGraphBuilderPluginsProvider.java graal/com.oracle.graal.java/src/com/oracle/graal/java/DefaultGraphBuilderPluginsProvider.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugin.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPluginsProvider.java |
diffstat | 5 files changed, 61 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- 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() + "()"; - } } }
--- 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); + } + } }
--- 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;
--- 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("<init>") ? clazz.getDeclaredConstructor(parameterTypes) : clazz.getDeclaredMethod(methodName, parameterTypes)); + return metaAccess.lookupJavaMethod(methodName.equals("<init>") ? declaringClass.getDeclaredConstructor(parameterTypes) : declaringClass.getDeclaredMethod(methodName, parameterTypes)); } catch (NoSuchMethodException | SecurityException e) { throw new GraalInternalError(e); }
--- 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); } } }