package org.jruby.ir.runtime;

import org.jruby.exceptions.Unrescuable;
import org.jruby.runtime.builtin.IRubyObject;

// This class is just a thin wrapper around a return value
// from nonlocal-return and break instructions.
//
// At IR build time, we don't know if a return/break in a block
// will be a non-local return / break (as in a proc or block)
// or will just be a regular return (as in a lambda). To ensure
// uniform instruction semantics at runtime, we push the local return
// through an exception object (just like IRReturnJump and IRBreakJump)
// and let it go through exception handlers which ensure that frame/scope
// are updated properly and ruby-level ensure code is run.
public class IRWrappedLambdaReturnValue extends IRJump implements Unrescuable {
    public final IRubyObject returnValue;
    boolean isBreak;

    public IRWrappedLambdaReturnValue(IRubyObject v, boolean isBreak) {
        this.returnValue = v;
        this.isBreak = isBreak;
    }

    public IRWrappedLambdaReturnValue(IRubyObject v) {
        this(v, false);
    }

    public boolean isReturn() {
        return !isBreak;
    }
}
