diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/ForNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/ForNode.java index e4551cd325a0131593570391b2c2e7a29cc98f27..718773b5c373be24c61b470616700538a00907ef 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/ForNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/ForNode.java @@ -54,7 +54,7 @@ public final class ForNode extends AbstractLoopNode implements VisibilityControl this.writeIndexNode = WriteVariableNode.createAnonymous(indexName, null, Mode.REGULAR); this.writeRangeNode = WriteVariableNode.createAnonymous(rangeName, range, Mode.REGULAR); this.writeLengthNode = WriteVariableNode.createAnonymous(lengthName, RLengthNodeGen.create(ReadVariableNode.create(rangeName, false)), Mode.REGULAR); - this.loopNode = Truffle.getRuntime().createLoopNode(new ForRepeatingNode(cvar, body, indexName, lengthName, rangeName)); + this.loopNode = Truffle.getRuntime().createLoopNode(new ForRepeatingNode(this, cvar, body, indexName, lengthName, rangeName)); } public static ForNode create(WriteVariableNode cvar, RSyntaxNode range, RSyntaxNode body) { @@ -140,7 +140,11 @@ public final class ForNode extends AbstractLoopNode implements VisibilityControl @Child private WriteVariableNode writeIndexNode; @Child private RNode loadElement; - public ForRepeatingNode(WriteVariableNode cvar, RNode body, String indexName, String lengthName, String rangeName) { + // used as RSyntaxNode + private final ForNode forNode; + + public ForRepeatingNode(ForNode forNode, WriteVariableNode cvar, RNode body, String indexName, String lengthName, String rangeName) { + this.forNode = forNode; this.writeElementNode = cvar; this.body = body; @@ -193,6 +197,11 @@ public final class ForNode extends AbstractLoopNode implements VisibilityControl } } + @Override + protected RSyntaxNode getRSyntaxNode() { + return forNode; + } + @Override public String toString() { RootNode rootNode = getRootNode(); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/WhileNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/WhileNode.java index e9f8d69f51819a79e23710faaf2049601f729ffd..2cffa597351156b8f0d6c6e223f429971fa87cff 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/WhileNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/WhileNode.java @@ -45,7 +45,7 @@ public final class WhileNode extends AbstractLoopNode implements RSyntaxNode, Vi private final boolean isRepeat; private WhileNode(RSyntaxNode condition, RSyntaxNode body, boolean isRepeat) { - this.loop = Truffle.getRuntime().createLoopNode(new WhileRepeatingNode(ConvertBooleanNode.create(condition), body.asRNode())); + this.loop = Truffle.getRuntime().createLoopNode(new WhileRepeatingNode(this, ConvertBooleanNode.create(condition), body.asRNode())); this.isRepeat = isRepeat; } @@ -122,7 +122,11 @@ public final class WhileNode extends AbstractLoopNode implements RSyntaxNode, Vi private final BranchProfile breakBlock = BranchProfile.create(); private final BranchProfile nextBlock = BranchProfile.create(); - public WhileRepeatingNode(ConvertBooleanNode condition, RNode body) { + // used as RSyntaxNode + private final WhileNode whileNode; + + public WhileRepeatingNode(WhileNode whileNode, ConvertBooleanNode condition, RNode body) { + this.whileNode = whileNode; this.condition = condition; this.body = body; // pre-initialize the profile so that loop exits to not deoptimize @@ -154,6 +158,11 @@ public final class WhileNode extends AbstractLoopNode implements RSyntaxNode, Vi } } + @Override + protected RSyntaxNode getRSyntaxNode() { + return whileNode; + } + @Override public String toString() { RootNode rootNode = getRootNode();