Mercurial > hg > truffle
diff graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLogicalAndNode.java @ 13836:64c77f0577bb
More documentation and improvements of Simple Language
author | Christian Wimmer <christian.wimmer@oracle.com> |
---|---|
date | Thu, 30 Jan 2014 17:53:27 -0800 |
parents | b16ec83edc73 |
children | abe7128ca473 |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLogicalAndNode.java Thu Jan 30 17:52:24 2014 -0800 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/SLLogicalAndNode.java Thu Jan 30 17:53:27 2014 -0800 @@ -26,15 +26,32 @@ import com.oracle.truffle.api.nodes.*; import com.oracle.truffle.sl.nodes.*; +/** + * This class declares specializations similar to the extensively documented {@link SLAddNode}. It + * uses one additional feature of the Truffle DSL: {@link ShortCircuit}. + * <p> + * Logical operations in SL use short circuit evaluation: if the evaluation of the left operand + * already decides the result of the operation, the right operand must not be executed. This is + * expressed in the Truffle DSL via a method annotated with {@link ShortCircuit}, which returns + * whether a child needs to be executed based on the result of already executed children. + */ @NodeInfo(shortName = "&&") @SuppressWarnings("unused") public abstract class SLLogicalAndNode extends SLBinaryNode { + /** + * This method is called after the left child was evaluated, but before the right child is + * evaluated. The right child is only evaluated when the return value is {code true}. + */ @ShortCircuit("rightNode") protected boolean needsRightNode(boolean left) { return left; } + /** + * Similar to {@link #needsRightNode(boolean)}, but for generic cases where the type of the left + * child is not known. + */ @ShortCircuit("rightNode") protected boolean needsRightNode(Object left) { return left instanceof Boolean && needsRightNode(((Boolean) left).booleanValue());