# HG changeset patch # User Doug Simon # Date 1341909368 -7200 # Node ID 93f6ad9a05960572969642bb7a69b06779aa1a0f # Parent a24d30822e4f4f6022e36d05ecd52016a29c098b added null check for receiver of non-static invokes diff -r a24d30822e4f -r 93f6ad9a0596 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/Invoke.java --- 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(); diff -r a24d30822e4f -r 93f6ad9a0596 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java --- 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 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); } diff -r a24d30822e4f -r 93f6ad9a0596 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java --- 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 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); } diff -r a24d30822e4f -r 93f6ad9a0596 graal/com.oracle.graal.snippets.test/src/com/oracle/graal/snippets/InvokeTest.java --- 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) {