code: func (m *Mrb) Yield(block Value, args ...Value) (*MrbValue, error) {
  	mrbBlock := block.MrbValue(m)
  
  	var argv []C.mrb_value
  	var argvPtr *C.mrb_value
  
  	if len(args) > 0 {
  		// Make the raw byte slice to hold our arguments we'll pass to C
  		argv = make([]C.mrb_value, len(args))
  		for i, arg := range args {
  			argv[i] = arg.MrbValue(m).value
  		}
  
  		argvPtr = &argv[0]
  	}
  
  	result := C._go_mrb_yield_argv(
  		m.state,
  		mrbBlock.value,
  		C.mrb_int(len(argv)),
  		argvPtr)
  
  	if exc := checkException(m.state); exc != nil {
  		return nil, exc
  	}
  
  	return newValue(m.state, result), nil
  }
docs: // Yield yields to a block with the given arguments.
  //
  // This should be called within the context of a Func.