private Node new_call_blockpass(Node receiver, Token operation, BlockPassNode blockPass) {
ISourcePosition position = position(receiver, blockPass);
String name = (String) operation.getValue();
Node args = blockPass.getArgsNode();
if (args == null) return new CallNoArgBlockPassNode(position, receiver, name, args, blockPass);
if (!(args instanceof ArrayNode)) return new CallSpecialArgBlockPassNode(position, receiver, name, args, blockPass);
switch (((ArrayNode) args).size()) {
case 0: // foo()
return new CallNoArgBlockPassNode(position, receiver, name, args, blockPass);
case 1:
return new CallOneArgBlockPassNode(position, receiver, name, (ArrayNode) args, blockPass);
case 2:
return new CallTwoArgBlockPassNode(position, receiver, name, (ArrayNode) args, blockPass);
case 3: