# HG changeset patch # User Thomas Wuerthinger # Date 1376672704 -7200 # Node ID 07814c3b5dba81f0f755894b35a9bf266348de33 # Parent bdd94e3133d751fa10552ed740700c62d3afbffd# Parent 77bf4af4cc94c3c85114b663bb5d5195f15800f5 Merge. diff -r bdd94e3133d7 -r 07814c3b5dba graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/PolymorphicTest.java --- a/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/PolymorphicTest.java Fri Aug 16 19:04:31 2013 +0200 +++ b/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/PolymorphicTest.java Fri Aug 16 19:05:04 2013 +0200 @@ -31,6 +31,7 @@ import com.oracle.truffle.api.dsl.test.BinaryNodeTest.BinaryNode; import com.oracle.truffle.api.dsl.test.PolymorphicTestFactory.Node1Factory; import com.oracle.truffle.api.dsl.test.TypeSystemTest.TestRootNode; +import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode; import com.oracle.truffle.api.nodes.*; import com.oracle.truffle.api.nodes.NodeInfo.Kind; @@ -44,6 +45,8 @@ assertEquals("(int,boolean)", executeWith(node, 42, false)); assertEquals("(boolean,int)", executeWith(node, false, 42)); assertEquals(Kind.SPECIALIZED, node.getNode().getClass().getAnnotation(NodeInfo.class).kind()); + assertEquals(node.getNode(), node.getNode().getLeft().getParent()); + assertEquals(node.getNode(), node.getNode().getRight().getParent()); } @Test @@ -52,6 +55,8 @@ assertEquals("(int,boolean)", executeWith(node, 42, false)); assertEquals("(int,int)", executeWith(node, 42, 42)); assertEquals(Kind.POLYMORPHIC, node.getNode().getClass().getAnnotation(NodeInfo.class).kind()); + assertEquals(node.getNode(), node.getNode().getLeft().getParent()); + assertEquals(node.getNode(), node.getNode().getRight().getParent()); } @Test @@ -61,6 +66,8 @@ assertEquals("(boolean,boolean)", executeWith(node, true, false)); assertEquals("(int,int)", executeWith(node, 42, 42)); assertEquals(Kind.POLYMORPHIC, node.getNode().getClass().getAnnotation(NodeInfo.class).kind()); + assertEquals(node.getNode(), node.getNode().getLeft().getParent()); + assertEquals(node.getNode(), node.getNode().getRight().getParent()); } @Test @@ -71,6 +78,8 @@ assertEquals("(boolean,boolean)", executeWith(node, true, false)); assertEquals("(int,int)", executeWith(node, 42, 42)); assertEquals(Kind.GENERIC, node.getNode().getClass().getAnnotation(NodeInfo.class).kind()); + assertEquals(node.getNode(), node.getNode().getLeft().getParent()); + assertEquals(node.getNode(), node.getNode().getRight().getParent()); } @Test @@ -78,21 +87,30 @@ TestRootNode node = TestHelper.createRoot(Node1Factory.getInstance()); assertEquals("(generic,generic)", executeWith(node, "", "")); assertEquals(Kind.GENERIC, node.getNode().getClass().getAnnotation(NodeInfo.class).kind()); + assertEquals(node.getNode(), node.getNode().getLeft().getParent()); + assertEquals(node.getNode(), node.getNode().getRight().getParent()); } @Test - public void testGenericPolymorphic() { + public void testGenericPolymorphic1() { TestRootNode node = TestHelper.createRoot(Node1Factory.getInstance()); assertEquals("(boolean,int)", executeWith(node, false, 42)); - assertEquals("(int,boolean)", executeWith(node, 42, false)); + assertEquals("(boolean,boolean)", executeWith(node, false, false)); assertEquals("(generic,generic)", executeWith(node, "", "")); assertEquals(Kind.GENERIC, node.getNode().getClass().getAnnotation(NodeInfo.class).kind()); + /* Assertions for bug GRAAL-425 */ + assertEquals(node.getNode(), node.getNode().getLeft().getParent()); + assertEquals(node.getNode(), node.getNode().getRight().getParent()); } @SuppressWarnings("unused") @PolymorphicLimit(3) abstract static class Node1 extends BinaryNode { + public abstract ValueNode getLeft(); + + public abstract ValueNode getRight(); + @Specialization(order = 1) String add(int left, int right) { return "(int,int)"; diff -r bdd94e3133d7 -r 07814c3b5dba graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java Fri Aug 16 19:04:31 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java Fri Aug 16 19:05:04 2013 +0200 @@ -1769,6 +1769,12 @@ CodeTreeBuilder builder = parent.create(); builder.declaration(getContext().getTruffleTypes().getNode(), "root", currentNode); builder.startIf().string(currentNode).string(".next0 != null").end().startBlock(); + /* + * Communicates to the caller of executeAndSpecialize that it was rewritten to generic. + * Its important that this is used instead of the currentNode since the caller is this. + * CurrentNode may not be this anymore at this place. + */ + builder.statement("this.next0 = null"); builder.tree(createFindRoot(builder, node, false)); builder.end(); builder.end(); @@ -2502,9 +2508,10 @@ builder.startIf().string("depth > ").string(String.valueOf(node.getPolymorphicDepth())).end(); builder.startBlock(); - String message = ("Polymorphic limit reached (" + node.getPolymorphicDepth() + ")"); + String message = "Polymorphic limit reached (" + node.getPolymorphicDepth() + ")"; + String castRoot = "(" + baseClassName(node) + ") root"; builder.tree(createGenericInvoke(builder, node.getGenericPolymorphicSpecialization(), node.getGenericSpecialization(), - createReplaceCall(builder, node.getGenericSpecialization(), "root", "this", message), null)); + createReplaceCall(builder, node.getGenericSpecialization(), "root", castRoot, message), null)); builder.end(); builder.startElseBlock(); @@ -2521,7 +2528,9 @@ builder.declaration(node.getGenericSpecialization().getReturnType().getType(), "result", specializeCall.getRoot()); + builder.startIf().string("this.next0 != null").end().startBlock(); builder.startStatement().string("(").cast(nodePolymorphicClassName(node, node.getGenericPolymorphicSpecialization())).string("root).optimizeTypes()").end(); + builder.end(); if (Utils.isVoid(builder.findMethod().getReturnType())) { builder.returnStatement();