package org.jruby.ir.operands;
import org.jruby.ir.IRVisitor;
import org.jruby.parser.StaticScope;
import org.jruby.runtime.DynamicScope;
import org.jruby.runtime.ThreadContext;
import org.jruby.runtime.builtin.IRubyObject;
// This operand is used to represent the result of an explicit return instruction.
// So, "return <blah>" will return this operand so ruby expressions like
// "foo || return false"
// have something in the second slot of the || instruction. But since control flow
// can never go beyond the return, this value itself can never be interpreted or executed.
// It exists only to fulfil the needs of IR to not have null operands.
public class UnexecutableNil extends Nil {
public static final UnexecutableNil U_NIL = new UnexecutableNil();
private UnexecutableNil() {
super();
}
@Override
public OperandType getOperandType() {
return OperandType.UNEXECUTABLE_NIL;
}
@Override
public String toString() {
return "nil(unexecutable)";
}
@Override
public Object retrieve(ThreadContext context, IRubyObject self, StaticScope currScope, DynamicScope currDynScope, Object[] temp) {
throw new RuntimeException(this.getClass().getSimpleName() + " should not be directly interpreted");
}
@Override
public void visit(IRVisitor visitor) {
visitor.UnexecutableNil(this);
}
}