# HG changeset patch # User Christian Humer # Date 1378128145 -7200 # Node ID d6a5ab791b0d319ba81444f8a8215f338d2f7a8f # Parent e6645c18d1548500a275bfaeea9afaa920d34c7e Truffle-DSL: fixed a bug in grouping of abstract guards. diff -r e6645c18d154 -r d6a5ab791b0d graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/GuardsTest.java --- a/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/GuardsTest.java Fri Aug 30 17:45:53 2013 +0200 +++ b/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/GuardsTest.java Mon Sep 02 15:22:25 2013 +0200 @@ -34,11 +34,15 @@ import com.oracle.truffle.api.dsl.test.GuardsTestFactory.GuardWithBoxedPrimitiveFactory; import com.oracle.truffle.api.dsl.test.GuardsTestFactory.GuardWithObjectFactory; import com.oracle.truffle.api.dsl.test.GuardsTestFactory.InvocationGuardFactory; +import com.oracle.truffle.api.dsl.test.GuardsTestFactory.TestAbstractGuard1Factory; import com.oracle.truffle.api.dsl.test.GuardsTestFactory.TestGuardResolve1Factory; import com.oracle.truffle.api.dsl.test.GuardsTestFactory.TestGuardResolve2Factory; import com.oracle.truffle.api.dsl.test.GuardsTestFactory.TestGuardResolve3Factory; import com.oracle.truffle.api.dsl.test.NodeContainerTest.Str; import com.oracle.truffle.api.dsl.test.NodeContainerTest.StrBase; +import com.oracle.truffle.api.dsl.test.TypeSystemTest.Abstract; +import com.oracle.truffle.api.dsl.test.TypeSystemTest.BExtendsAbstract; +import com.oracle.truffle.api.dsl.test.TypeSystemTest.CExtendsAbstract; import com.oracle.truffle.api.dsl.test.TypeSystemTest.TestRootNode; import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode; @@ -271,4 +275,43 @@ } } + @NodeChild("expression") + public abstract static class TestGuardResolve4 extends ValueNode { + + boolean guard(StrBase primitive) { + return false; + } + + @Specialization(guards = "guard") + int doSpecialized(Str value0) { + return 42; + } + } + + @Test + public void testAbstractGuard1() { + TestRootNode root = createRoot(TestAbstractGuard1Factory.getInstance()); + + assertEquals(BExtendsAbstract.INSTANCE, executeWith(root, BExtendsAbstract.INSTANCE)); + assertEquals(CExtendsAbstract.INSTANCE, executeWith(root, CExtendsAbstract.INSTANCE)); + } + + @NodeChild("expression") + public abstract static class TestAbstractGuard1 extends ValueNode { + + boolean guard(Abstract value0) { + return true; + } + + @Specialization(order = 1, guards = "guard") + BExtendsAbstract doSpecialized1(BExtendsAbstract value0) { + return value0; + } + + @Specialization(order = 2, guards = "guard") + CExtendsAbstract doSpecialized2(CExtendsAbstract value0) { + return value0; + } + } + } diff -r e6645c18d154 -r d6a5ab791b0d graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/TypeSystemTest.java --- a/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/TypeSystemTest.java Fri Aug 30 17:45:53 2013 +0200 +++ b/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/TypeSystemTest.java Mon Sep 02 15:22:25 2013 +0200 @@ -30,7 +30,7 @@ public class TypeSystemTest { - @TypeSystem({int.class, boolean.class, String.class, Str.class, CallTarget.class, Object[].class}) + @TypeSystem({int.class, boolean.class, String.class, Str.class, CallTarget.class, BExtendsAbstract.class, CExtendsAbstract.class, Abstract.class, Object[].class}) static class SimpleTypes { static int intCheck; @@ -73,6 +73,14 @@ return SimpleTypesGen.SIMPLETYPES.expectObjectArray(execute(frame)); } + public BExtendsAbstract executeBExtendsAbstract(VirtualFrame frame) throws UnexpectedResultException { + return SimpleTypesGen.SIMPLETYPES.expectBExtendsAbstract(execute(frame)); + } + + public CExtendsAbstract executeCExtendsAbstract(VirtualFrame frame) throws UnexpectedResultException { + return SimpleTypesGen.SIMPLETYPES.expectCExtendsAbstract(execute(frame)); + } + public abstract Object execute(VirtualFrame frame); @Override @@ -154,4 +162,18 @@ } + abstract static class Abstract { + } + + static final class BExtendsAbstract extends Abstract { + + static final BExtendsAbstract INSTANCE = new BExtendsAbstract(); + + } + + static final class CExtendsAbstract extends Abstract { + + static final CExtendsAbstract INSTANCE = new CExtendsAbstract(); + } + } diff -r e6645c18d154 -r d6a5ab791b0d graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/SpecializationGroup.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/SpecializationGroup.java Fri Aug 30 17:45:53 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/SpecializationGroup.java Mon Sep 02 15:22:25 2013 +0200 @@ -119,6 +119,11 @@ if (previous == null || previous.getGuards().size() != elseConnectedGuards.size() + 1) { return null; } + + if (elseConnectedGuards.contains(guard)) { + return guard; + } + GuardData previousGuard = previous.getGuards().get(elseConnectedGuards.size()); if (guard.getMethod().equals(previousGuard.getMethod()) && guard.isNegated() != previousGuard.isNegated()) { return guard; @@ -212,7 +217,7 @@ int signatureIndex = 0; for (ActualParameter parameter : guardMatch.getParameters()) { signatureIndex++; - if (parameter.getSpecification().isSignature()) { + if (!parameter.getSpecification().isSignature()) { continue; }