fn vm_yield(&mut self, args: &Args2) -> InvokeResult {
        match &self.get_method_block() {
            Some(Block::Block(method, outer)) => {
                let outer = self.cfp_from_frame(*outer).ep();
                self.stack
                    .insert(self.sp() - args.len(), outer.self_value());
                self.invoke_block(*method, outer, args)
            }
            Some(Block::Proc(proc)) => {
                self.stack.insert(self.sp() - args.len(), Value::nil());
                self.invoke_proc(*proc, None, args)
            }
            Some(Block::Sym(sym)) => self.invoke_sym_proc(*sym, args),
            None => Err(RubyError::local_jump("No block given.")),
        }
    }
Invoke the block given to the method with `args`.
ruruby/src/vm/executor/opt_core.rs