Mercurial > hg > truffle
diff graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ShortCircuitTest.java @ 21742:2e850dbf82ae
Truffle-DSL: fix NPE in getImplicitCastType if an implicitely casted type is short circuited. (reported-by: Mohaned Qunaibit)
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Fri, 05 Jun 2015 14:12:49 +0200 |
parents | 08aa0372dad4 |
children |
line wrap: on
line diff
--- 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; + } + + } + }