# HG changeset patch # User Christian Humer # Date 1433506369 -7200 # Node ID 2e850dbf82ae1b0bbd3719e2656135a5683bf9d4 # Parent b6ee5d3f3255f559ebbfb078cf7d478fb0524b56 Truffle-DSL: fix NPE in getImplicitCastType if an implicitely casted type is short circuited. (reported-by: Mohaned Qunaibit) diff -r b6ee5d3f3255 -r 2e850dbf82ae graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ShortCircuitTest.java --- a/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ShortCircuitTest.java Fri Jun 05 13:04:40 2015 +0200 +++ b/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ShortCircuitTest.java Fri Jun 05 14:12:49 2015 +0200 @@ -29,6 +29,7 @@ import com.oracle.truffle.api.*; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.dsl.test.ShortCircuitTestFactory.DoubleChildNodeFactory; +import com.oracle.truffle.api.dsl.test.ShortCircuitTestFactory.ShortCircuitWithImplicitCastNodeFactory; import com.oracle.truffle.api.dsl.test.ShortCircuitTestFactory.SingleChildNodeFactory; import com.oracle.truffle.api.dsl.test.ShortCircuitTestFactory.VarArgsNodeFactory; import com.oracle.truffle.api.dsl.test.TypeSystemTest.ArgumentNode; @@ -160,4 +161,38 @@ } + @Test + public void testShortCircuitWithImplicitCastNode() { + ArgumentNode arg0 = new ArgumentNode(0); + ArgumentNode arg1 = new ArgumentNode(1); + CallTarget callTarget = TestHelper.createCallTarget(ShortCircuitWithImplicitCastNodeFactory.create(new ValueNode[]{arg0, arg1})); + assertEquals(42, callTarget.call(new Object[]{42, 41})); + } + + @TypeSystem(int.class) + abstract static class ShortCircuitWithImplicitCastTypes { + + @ImplicitCast + public static int doAnImplicitCast(String foo) { + return Integer.parseInt(foo); + } + + } + + @NodeChild(value = "children", type = ValueNode[].class) + @TypeSystemReference(ShortCircuitWithImplicitCastTypes.class) + abstract static class ShortCircuitWithImplicitCastNode extends ValueNode { + + @ShortCircuit("children[1]") + public boolean needsRightNode(Object left) { + return (int) left == 41; + } + + @Specialization + public int doInteger(int left, boolean needsRight, int right) { + return needsRight ? right : left; + } + + } + } diff -r b6ee5d3f3255 -r 2e850dbf82ae graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/TypeSystemCodeGenerator.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/TypeSystemCodeGenerator.java Fri Jun 05 13:04:40 2015 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/TypeSystemCodeGenerator.java Fri Jun 05 14:12:49 2015 +0200 @@ -410,6 +410,11 @@ builder.end(); } + builder.startElseIf().string(LOCAL_VALUE).string(" == ").nullLiteral().end(); + builder.startBlock(); + builder.startReturn().typeLiteral(context.getType(Object.class)).end(); + builder.end(); + builder.startElseBlock(); builder.tree(createTransferToInterpreterAndInvalidate()); builder.startThrow().startNew(context.getType(IllegalArgumentException.class)).doubleQuote("Illegal type ").end().end();