CheckArityInstr.java
package org.jruby.ir.instructions;
import org.jruby.ir.IRVisitor;
import org.jruby.ir.Operation;
import org.jruby.ir.operands.Fixnum;
import org.jruby.ir.operands.Operand;
import org.jruby.ir.runtime.IRRuntimeHelpers;
import org.jruby.ir.transformations.inlining.CloneInfo;
import org.jruby.ir.transformations.inlining.InlineCloneInfo;
import org.jruby.ir.transformations.inlining.SimpleCloneInfo;
import org.jruby.runtime.ThreadContext;
public class CheckArityInstr extends Instr implements FixedArityInstr {
public final int required;
public final int opt;
public final int rest;
public final boolean receivesKeywords;
public final int restKey;
public CheckArityInstr(int required, int opt, int rest, boolean receivesKeywords, int restKey) {
super(Operation.CHECK_ARITY);
this.required = required;
this.opt = opt;
this.rest = rest;
this.receivesKeywords = receivesKeywords;
this.restKey = restKey;
}
@Override
public Operand[] getOperands() {
return new Operand[] { new Fixnum(required), new Fixnum(opt), new Fixnum(rest) };
}
@Override
public String toString() {
return super.toString() + " req: " + required + ", opt: " + opt + ", *r: " + rest + ", kw: " + receivesKeywords + ", **r: " + restKey;
}
@Override
public Instr clone(CloneInfo info) {
if (info instanceof SimpleCloneInfo) return new CheckArityInstr(required, opt, rest, receivesKeywords, restKey);
InlineCloneInfo ii = (InlineCloneInfo) info;
if (ii.canMapArgsStatically()) { // we can error on bad arity or remove check_arity
int numArgs = ii.getArgsCount();
if (numArgs < required || (rest == -1 && numArgs > (required + opt))) {
return new RaiseArgumentErrorInstr(required, opt, rest, rest);
}
return null;
}
return new CheckArgsArrayArityInstr(ii.getArgs(), required, opt, rest);
}
public void checkArity(ThreadContext context, Object[] args) {
IRRuntimeHelpers.checkArity(context, args, required, opt, rest, receivesKeywords, restKey);
}
@Override
public void visit(IRVisitor visitor) {
visitor.CheckArityInstr(this);
}
}