# HG changeset patch # User Christian Wimmer # Date 1434060854 25200 # Node ID ae5bee2d61b2b73d7637526541ae1f59723ae6d5 # Parent 130e06e34659c7e39fc51d32f0e85ad337379620 Allow subclasses of DynamicNewArrayNode and DynamicNewInstanceNode diff -r 130e06e34659 -r ae5bee2d61b2 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/DynamicNewArrayNode.java --- 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; } diff -r 130e06e34659 -r ae5bee2d61b2 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/DynamicNewInstanceNode.java --- 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 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 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; }