Mercurial > hg > truffle
changeset 21929:ae5bee2d61b2
Allow subclasses of DynamicNewArrayNode and DynamicNewInstanceNode
author | Christian Wimmer <christian.wimmer@oracle.com> |
---|---|
date | Thu, 11 Jun 2015 15:14:14 -0700 |
parents | 130e06e34659 |
children | b09503284ac8 |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/DynamicNewArrayNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/DynamicNewInstanceNode.java |
diffstat | 2 files changed, 18 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/DynamicNewArrayNode.java Thu Jun 11 13:03:54 2015 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/DynamicNewArrayNode.java Thu Jun 11 15:14:14 2015 -0700 @@ -79,12 +79,17 @@ if (elementType.isConstant()) { ResolvedJavaType type = tool.getConstantReflection().asJavaType(elementType.asConstant()); if (type != null && !throwsIllegalArgumentException(type)) { - return new NewArrayNode(type, length(), fillContents()); + return createNewArrayNode(type); } } return this; } + /** Hook for subclasses to instantiate a subclass of {@link NewArrayNode}. */ + protected NewArrayNode createNewArrayNode(ResolvedJavaType type) { + return new NewArrayNode(type, length(), fillContents()); + } + public static boolean throwsIllegalArgumentException(Class<?> elementType) { return elementType == void.class; }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/DynamicNewInstanceNode.java Thu Jun 11 13:03:54 2015 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/DynamicNewInstanceNode.java Thu Jun 11 15:14:14 2015 -0700 @@ -32,13 +32,17 @@ import com.oracle.jvmci.meta.*; @NodeInfo -public final class DynamicNewInstanceNode extends AbstractNewObjectNode implements Canonicalizable { +public class DynamicNewInstanceNode extends AbstractNewObjectNode implements Canonicalizable { public static final NodeClass<DynamicNewInstanceNode> TYPE = NodeClass.create(DynamicNewInstanceNode.class); @Input ValueNode clazz; public DynamicNewInstanceNode(ValueNode clazz, boolean fillContents) { - super(TYPE, StampFactory.objectNonNull(), fillContents); + this(TYPE, clazz, fillContents); + } + + protected DynamicNewInstanceNode(NodeClass<? extends DynamicNewInstanceNode> c, ValueNode clazz, boolean fillContents) { + super(c, StampFactory.objectNonNull(), fillContents); this.clazz = clazz; } @@ -59,12 +63,17 @@ if (clazz.isConstant()) { ResolvedJavaType type = tool.getConstantReflection().asJavaType(clazz.asConstant()); if (type != null && type.isInitialized() && !throwsInstantiationException(type, tool.getMetaAccess())) { - return new NewInstanceNode(type, fillContents()); + return createNewInstanceNode(type); } } return this; } + /** Hook for subclasses to instantiate a subclass of {@link NewInstanceNode}. */ + protected NewInstanceNode createNewInstanceNode(ResolvedJavaType type) { + return new NewInstanceNode(type, fillContents()); + } + public static boolean throwsInstantiationException(Class<?> type) { return type.isPrimitive() || type.isArray() || type.isInterface() || Modifier.isAbstract(type.getModifiers()) || type == Class.class; }