Mercurial > hg > truffle
diff graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLWhileNode.java @ 16917:6af9d523222a
SL: use new LoopNode API.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Sat, 23 Aug 2014 19:31:44 +0200 |
parents | abe7128ca473 |
children |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLWhileNode.java Sat Aug 23 19:31:40 2014 +0200 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/controlflow/SLWhileNode.java Sat Aug 23 19:31:44 2014 +0200 @@ -23,89 +23,24 @@ package com.oracle.truffle.sl.nodes.controlflow; import com.oracle.truffle.api.*; -import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.nodes.*; import com.oracle.truffle.api.source.*; -import com.oracle.truffle.api.utilities.*; import com.oracle.truffle.sl.nodes.*; @NodeInfo(shortName = "while", description = "The node implementing a while loop") public final class SLWhileNode extends SLStatementNode { - /** - * The condition of the loop. This in a {@link SLExpressionNode} because we require a result - * value. We do not have a node type that can only return a {@code boolean} value, so - * {@link #evaluateCondition executing the condition} can lead to a type error. - */ - @Child private SLExpressionNode conditionNode; - - /** Statement (or {@link SLBlockNode block}) executed as long as the condition is true. */ - @Child private SLStatementNode bodyNode; - - /** - * Profiling information, collected by the interpreter, capturing whether a {@code continue} - * statement was used in this loop. This allows the compiler to generate better code for loops - * without a {@code continue}. - */ - private final BranchProfile continueTaken = new BranchProfile(); - private final BranchProfile breakTaken = new BranchProfile(); + @Child private LoopNode loopNode; public SLWhileNode(SourceSection src, SLExpressionNode conditionNode, SLStatementNode bodyNode) { super(src); - this.conditionNode = conditionNode; - this.bodyNode = bodyNode; + this.loopNode = Truffle.getRuntime().createLoopNode(new SLRepeatingNode(src, conditionNode, bodyNode)); } @Override public void executeVoid(VirtualFrame frame) { - int count = 0; - try { - while (evaluateCondition(frame)) { - try { - /* Execute the loop body. */ - bodyNode.executeVoid(frame); - - if (CompilerDirectives.inInterpreter()) { - /* In the interpreter, profile the the number of loop iteration. */ - count++; - } - } catch (SLContinueException ex) { - /* In the interpreter, record profiling information that the loop uses continue. */ - continueTaken.enter(); - /* Fall through to next loop iteration. */ - } - } - } catch (SLBreakException ex) { - /* In the interpreter, record profiling information that the loop uses break. */ - breakTaken.enter(); - /* Done executing this loop, exit method to execute statement following the loop. */ - - } finally { - if (CompilerDirectives.inInterpreter()) { - /* - * In the interpreter, report the loop count to the Truffle system. It is used for - * compilation and inlining decisions. - */ - getRootNode().reportLoopCount(count); - } - } + loopNode.executeLoop(frame); } - private boolean evaluateCondition(VirtualFrame frame) { - try { - /* - * The condition must evaluate to a boolean value, so we call the boolean-specialized - * execute method. - */ - return conditionNode.executeBoolean(frame); - } catch (UnexpectedResultException ex) { - /* - * The condition evaluated to a non-boolean result. This is a type error in the SL - * program. We report it with the same exception that Truffle DSL generated nodes use to - * report type errors. - */ - throw new UnsupportedSpecializationException(this, new Node[]{conditionNode}, ex.getResult()); - } - } }