pub(crate) fn eval_block_self(
        &mut self,
        block: &Block,
        self_value: impl Into<Value>,
        args: &Args,
    ) -> VMResult {
        let self_value = self_value.into();
        match block {
            Block::Block(method, outer) => {
                let outer = self.cfp_from_frame(*outer).ep();
                self.stack_push(self_value);
                let args = self.stack_push_args(args);
                self.invoke_block(*method, outer, &args)?.handle(self)
            }
            Block::Proc(proc) => self.eval_proc(*proc, self_value, &args),
            _ => unimplemented!(),
        }
    }
Evaluate the block with given `self_val` and `args`.
ruruby/src/vm/executor/method.rs