code: func (c *callback) call(ctx context.Context, method string, args []reflect.Value) (res interface{}, errRes error) {
  	// Create the argument slice.
  	fullargs := make([]reflect.Value, 0, 2+len(args))
  	if c.rcvr.IsValid() {
  		fullargs = append(fullargs, c.rcvr)
  	}
  	if c.hasCtx {
  		fullargs = append(fullargs, reflect.ValueOf(ctx))
  	}
  	fullargs = append(fullargs, args...)
  
  	// Catch panic while running the callback.
  	defer func() {
  		if err := recover(); err != nil {
  			const size = 64 << 10
  			buf := make([]byte, size)
  			buf = buf[:runtime.Stack(buf, false)]
  			log.Error("RPC method " + method + " crashed: " + fmt.Sprintf("%v\n%s", err, buf))
  			errRes = errors.New("method handler crashed")
  		}
  	}()
  	// Run the callback.
  	results := c.fn.Call(fullargs)
  	if len(results) == 0 {
  		return nil, nil
  	}
  	if c.errPos >= 0 && !results[c.errPos].IsNil() {
  		// Method has returned non-nil error value.
  		err := results[c.errPos].Interface().(error)
  		return reflect.Value{}, err
  	}
  	return results[0].Interface(), nil
  }
docs: // call invokes the callback.