changeset 19820:ab1e960217ef

fixed NPE when creating an InstanceOfDynamicNode during parsing
author Doug Simon <doug.simon@oracle.com>
date Fri, 13 Mar 2015 10:52:17 +0100
parents a5b09092003a
children c9e3131099fb
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/InstanceOfDynamicNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java
diffstat 2 files changed, 21 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/InstanceOfDynamicNode.java	Thu Mar 12 18:04:30 2015 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/InstanceOfDynamicNode.java	Fri Mar 13 10:52:17 2015 +0100
@@ -42,6 +42,15 @@
     @Input ValueNode object;
     @Input ValueNode mirror;
 
+    public static LogicNode create(ConstantReflectionProvider constantReflection, ValueNode mirror, ValueNode object) {
+        LogicNode synonym = findSynonym(constantReflection, object, mirror);
+        if (synonym != null) {
+            return synonym;
+        }
+        return new InstanceOfDynamicNode(mirror, object);
+
+    }
+
     public InstanceOfDynamicNode(ValueNode mirror, ValueNode object) {
         super(TYPE);
         this.mirror = mirror;
@@ -56,9 +65,9 @@
         tool.getLowerer().lower(this, tool);
     }
 
-    public LogicNode canonical(CanonicalizerTool tool, ValueNode forObject, ValueNode forMirror) {
+    private static LogicNode findSynonym(ConstantReflectionProvider constantReflection, ValueNode forObject, ValueNode forMirror) {
         if (forMirror.isConstant()) {
-            ResolvedJavaType t = tool.getConstantReflection().asJavaType(forMirror.asConstant());
+            ResolvedJavaType t = constantReflection.asJavaType(forMirror.asConstant());
             if (t != null) {
                 if (t.isPrimitive()) {
                     return LogicConstantNode.contradiction();
@@ -67,7 +76,15 @@
                 }
             }
         }
-        return this;
+        return null;
+    }
+
+    public LogicNode canonical(CanonicalizerTool tool, ValueNode forObject, ValueNode forMirror) {
+        LogicNode res = findSynonym(tool.getConstantReflection(), forObject, forMirror);
+        if (res == null) {
+            res = this;
+        }
+        return res;
     }
 
     public ValueNode object() {
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java	Thu Mar 12 18:04:30 2015 -0700
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java	Fri Mar 13 10:52:17 2015 +0100
@@ -359,7 +359,7 @@
         r.register2("isInstance", Receiver.class, Object.class, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode type, ValueNode object) {
                 ValueNode nullCheckedType = nullCheckedValue(b, type);
-                LogicNode condition = b.append(new InstanceOfDynamicNode(nullCheckedType, object).canonical(null, nullCheckedType, object));
+                LogicNode condition = b.append(InstanceOfDynamicNode.create(b.getConstantReflection(), nullCheckedType, object));
                 b.push(Kind.Boolean.getStackKind(), b.append(new ConditionalNode(condition).canonical(null)));
                 return true;
             }