pub(super) fn invoke_block(
        &mut self,
        fid: FnId,
        outer: EnvFrame,
        args: &Args2,
    ) -> InvokeResult {
        use MethodInfo::*;
        let val = match &self.globals.methods[fid] {
            BuiltinFunc { func, name, .. } => {
                let name = *name;
                let func = *func;
                self.exec_native(&func, fid, name, args)?
            }
            RubyFunc { iseq } => {
                let iseq = iseq.clone();
                if iseq.opt_flag {
                    self.push_block_frame_fast(iseq, args, outer, true);
                } else {
                    self.push_block_frame_slow(iseq, args, outer, true)?;
                }
                return Ok(VMResKind::Invoke);
            }
            _ => unreachable!(),
        };
        Ok(VMResKind::Return(val))
    }
Invoke the method with given `method_name`, `outer` context, and `args`, and push the returned value on the stack.
ruruby/src/vm/executor/method.rs