// TODO: don't require pop
if (!expr) context.consumeCurrentValue();
}
public void compileForIter(Node node, BodyCompiler context) {
final ForNode forNode = (ForNode) node;
// create the closure class and instantiate it
final CompilerCallback closureBody = new CompilerCallback() {
public void call(BodyCompiler context) {
if (forNode.getBodyNode() != null) {
compile(forNode.getBodyNode(), context,true);
} else {
context.loadNil();
}
}
};
// create the closure class and instantiate it
final CompilerCallback closureArgs = new CompilerCallback() {
public void call(BodyCompiler context) {
if (forNode.getVarNode() != null) {
compileAssignment(forNode.getVarNode(), context, false);
// consume the block, since for loops can't receive block
context.consumeCurrentValue();
}
}
};
boolean hasMultipleArgsHead = false;
if (forNode.getVarNode() instanceof MultipleAsgnNode) {
hasMultipleArgsHead = ((MultipleAsgnNode) forNode.getVarNode()).getHeadNode() != null;
}
NodeType argsNodeId = null;
if (forNode.getVarNode() != null) {
argsNodeId = forNode.getVarNode().getNodeType();
}
ASTInspector inspector = new ASTInspector();
inspector.inspect(forNode.getBodyNode());
inspector.inspect(forNode.getVarNode());
// force heap-scope behavior, since it uses parent's scope
inspector.setFlag(forNode, ASTInspector.CLOSURE);
context.createNewForLoop(Arity.procArityOf(forNode.getVarNode()).getValue(),
closureBody, closureArgs, hasMultipleArgsHead, argsNodeId, inspector);
}