changeset 5802:93f6ad9a0596

added null check for receiver of non-static invokes
author Doug Simon <doug.simon@oracle.com>
date Tue, 10 Jul 2012 10:36:08 +0200
parents a24d30822e4f
children 5d329d42dd73
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/Invoke.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java graal/com.oracle.graal.snippets.test/src/com/oracle/graal/snippets/InvokeTest.java
diffstat 4 files changed, 22 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/Invoke.java	Tue Jul 10 10:08:49 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/Invoke.java	Tue Jul 10 10:36:08 2012 +0200
@@ -24,8 +24,9 @@
 
 import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.java.*;
+import com.oracle.graal.nodes.spi.*;
 
-public interface Invoke extends StateSplit {
+public interface Invoke extends StateSplit, Lowerable {
 
     FixedNode next();
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java	Tue Jul 10 10:08:49 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java	Tue Jul 10 10:36:08 2012 +0200
@@ -95,6 +95,15 @@
     }
 
     @Override
+    public void lower(LoweringTool tool) {
+        NodeInputList<ValueNode> parameters = callTarget.arguments();
+        ValueNode firstParam = parameters.size() <= 0 ? null : parameters.get(0);
+        if (!callTarget.isStatic() && firstParam.kind() == Kind.Object && !firstParam.objectStamp().nonNull()) {
+            dependencies().add(tool.createNullCheckGuard(firstParam, leafGraphId));
+        }
+    }
+
+    @Override
     public void generate(LIRGeneratorTool gen) {
         gen.emitInvoke(this);
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java	Tue Jul 10 10:08:49 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java	Tue Jul 10 10:36:08 2012 +0200
@@ -127,6 +127,15 @@
     }
 
     @Override
+    public void lower(LoweringTool tool) {
+        NodeInputList<ValueNode> parameters = callTarget.arguments();
+        ValueNode firstParam = parameters.size() <= 0 ? null : parameters.get(0);
+        if (!callTarget.isStatic() && firstParam.kind() == Kind.Object && !firstParam.objectStamp().nonNull()) {
+            dependencies().add(tool.createNullCheckGuard(firstParam, leafGraphId));
+        }
+    }
+
+    @Override
     public void generate(LIRGeneratorTool gen) {
         gen.emitInvoke(this);
     }
--- a/graal/com.oracle.graal.snippets.test/src/com/oracle/graal/snippets/InvokeTest.java	Tue Jul 10 10:08:49 2012 +0200
+++ b/graal/com.oracle.graal.snippets.test/src/com/oracle/graal/snippets/InvokeTest.java	Tue Jul 10 10:36:08 2012 +0200
@@ -93,7 +93,8 @@
     }
 
     public static String invokevirtual2(A a, String s) {
-        return a.virtualMethod(s) + a.virtualMethod(s);
+        a.virtualMethod(s);
+        return a.virtualMethod(s);
     }
 
     public static String invokeinterface(I i, String s) {