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;
     }