public Operand buildLambda(LambdaNode node, IRScope s) { IRClosure closure = new IRClosure(manager, s, false, node.getPosition().getStartLine(), node.getScope(), Arity.procArityOf(node.getArgs()), node.getArgumentType(), true); s.addClosure(closure); // Create a new nested builder to ensure this gets its own IR builder state // like the ensure block stack IRBuilder closureBuilder = newIRBuilder(manager); // Receive self closure.addInstr(new ReceiveSelfInstr(getSelf(closure))); // args closureBuilder.receiveBlockArgs(node, closure); closureBuilder.receiveBlockClosureArg(node.getBlockVarNode(), closure); Operand closureRetVal = node.getBody() == null ? manager.getNil() : closureBuilder.build(node.getBody(), closure); // can be U_NIL if the node is an if node with returns in both branches. if (closureRetVal != U_NIL) closure.addInstr(new ReturnInstr(closureRetVal)); // Added as part of 'prepareForInterpretation' code. // catchUncaughtBreakInLambdas(closure); Variable lambda = s.getNewTemporaryVariable(); s.addInstr(new BuildLambdaInstr(lambda, closure, node.getPosition())); return lambda; }
public Operand buildLambda(LambdaNode node, IRScope s) { IRClosure closure = new IRClosure(manager, s, false, node.getPosition().getStartLine(), node.getScope(), Arity.procArityOf(node.getArgs()), node.getArgumentType(), true); s.addClosure(closure); // Create a new nested builder to ensure this gets its own IR builder state // like the ensure block stack IRBuilder closureBuilder = newIRBuilder(manager); // Receive self closure.addInstr(new ReceiveSelfInstr(getSelf(closure))); // args closureBuilder.receiveBlockArgs(node, closure); closureBuilder.receiveBlockClosureArg(node.getBlockVarNode(), closure); Operand closureRetVal = node.getBody() == null ? manager.getNil() : closureBuilder.build(node.getBody(), closure); // can be U_NIL if the node is an if node with returns in both branches. if (closureRetVal != U_NIL) closure.addInstr(new ReturnInstr(closureRetVal)); // Added as part of 'prepareForInterpretation' code. // catchUncaughtBreakInLambdas(closure); Variable lambda = s.getNewTemporaryVariable(); s.addInstr(new BuildLambdaInstr(lambda, closure, node.getPosition())); return lambda; }