Operand |
IR_Builder.buildOr(OrNode orNode,
IR_Scope m)
private class OpElementAsgnArgumentsCallback implements ArgumentsCallback {
private Node node;
public OpElementAsgnArgumentsCallback(Node node) {
this.node = node;
}
public int getArity() {
switch (node.getNodeType()) {
case ARGSCATNODE:
case ARGSPUSHNODE:
case SPLATNODE:
return -1;
case ARRAYNODE:
ArrayNode arrayNode = (ArrayNode)node;
if (arrayNode.size() == 0) {
return 0;
} else if (arrayNode.size() > 3) {
return -1;
} else {
return ((ArrayNode)node).size();
}
default:
return 1;
}
}
public void call(IR_Scope m) {
if (getArity() == 1) {
// if arity 1, just build the one element to save us the array cost
build(((ArrayNode)node).get(0), m,true);
} else {
// build into array
buildArguments(node, m);
}
}
};
public Operand buildOpElementAsgnWithOr(Node node, IR_Scope m) {
final OpElementAsgnNode opElementAsgnNode = (OpElementAsgnNode) node;
CompilerCallback receiverCallback = new CompilerCallback() {
public void call(IR_Scope m) {
build(opElementAsgnNode.getReceiverNode(), m);
}
};
ArgumentsCallback argsCallback = new OpElementAsgnArgumentsCallback(opElementAsgnNode.getArgsNode());
CompilerCallback valueCallback = new CompilerCallback() {
public void call(IR_Scope m) {
build(opElementAsgnNode.getValueNode(), m, true);
}
};
m.getInvocationCompiler().opElementAsgnWithOr(receiverCallback, argsCallback, valueCallback);
// TODO: don't require pop
if (!expr) m.consumeCurrentValue();
}
public Operand buildOpElementAsgnWithAnd(Node node, IR_Scope m) {
final OpElementAsgnNode opElementAsgnNode = (OpElementAsgnNode) node;
CompilerCallback receiverCallback = new CompilerCallback() {
public void call(IR_Scope m) {
build(opElementAsgnNode.getReceiverNode(), m);
}
};
ArgumentsCallback argsCallback = new OpElementAsgnArgumentsCallback(opElementAsgnNode.getArgsNode());
CompilerCallback valueCallback = new CompilerCallback() {
public void call(IR_Scope m) {
build(opElementAsgnNode.getValueNode(), m);
}
};
m.getInvocationCompiler().opElementAsgnWithAnd(receiverCallback, argsCallback, valueCallback);
}
public Operand buildOpElementAsgnWithMethod(Node node, IR_Scope m) {
final OpElementAsgnNode opElementAsgnNode = (OpElementAsgnNode) node;
CompilerCallback receiverCallback = new CompilerCallback() {
public void call(IR_Scope m) {
build(opElementAsgnNode.getReceiverNode(), m);
}
};
ArgumentsCallback argsCallback = setupCallArgs(opElementAsgnNode.getArgsNode());
CompilerCallback valueCallback = new CompilerCallback() {
public void call(IR_Scope m) {
build(opElementAsgnNode.getValueNode(), m);
}
};
m.getInvocationCompiler().opElementAsgnWithMethod(receiverCallback, argsCallback, valueCallback, opElementAsgnNode.getOperatorName());
} |