1  /*[clinic input]
       2  preserve
       3  [clinic start generated code]*/
       4  
       5  #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
       6  #  include "pycore_gc.h"            // PyGC_Head
       7  #  include "pycore_runtime.h"       // _Py_ID()
       8  #endif
       9  
      10  
      11  PyDoc_STRVAR(_testcapi_VectorCallClass_set_vectorcall__doc__,
      12  "set_vectorcall($self, type, /)\n"
      13  "--\n"
      14  "\n"
      15  "Set self\'s vectorcall function for `type` to one that returns \"vectorcall\"");
      16  
      17  #define _TESTCAPI_VECTORCALLCLASS_SET_VECTORCALL_METHODDEF    \
      18      {"set_vectorcall", (PyCFunction)_testcapi_VectorCallClass_set_vectorcall, METH_O, _testcapi_VectorCallClass_set_vectorcall__doc__},
      19  
      20  static PyObject *
      21  _testcapi_VectorCallClass_set_vectorcall_impl(PyObject *self,
      22                                                PyTypeObject *type);
      23  
      24  static PyObject *
      25  _testcapi_VectorCallClass_set_vectorcall(PyObject *self, PyObject *arg)
      26  {
      27      PyObject *return_value = NULL;
      28      PyTypeObject *type;
      29  
      30      if (!PyObject_TypeCheck(arg, &PyType_Type)) {
      31          _PyArg_BadArgument("set_vectorcall", "argument", (&PyType_Type)->tp_name, arg);
      32          goto exit;
      33      }
      34      type = (PyTypeObject *)arg;
      35      return_value = _testcapi_VectorCallClass_set_vectorcall_impl(self, type);
      36  
      37  exit:
      38      return return_value;
      39  }
      40  
      41  PyDoc_STRVAR(_testcapi_make_vectorcall_class__doc__,
      42  "make_vectorcall_class($module, base=<unrepresentable>, /)\n"
      43  "--\n"
      44  "\n"
      45  "Create a class whose instances return \"tpcall\" when called.\n"
      46  "\n"
      47  "When the \"set_vectorcall\" method is called on an instance, a vectorcall\n"
      48  "function that returns \"vectorcall\" will be installed.");
      49  
      50  #define _TESTCAPI_MAKE_VECTORCALL_CLASS_METHODDEF    \
      51      {"make_vectorcall_class", _PyCFunction_CAST(_testcapi_make_vectorcall_class), METH_FASTCALL, _testcapi_make_vectorcall_class__doc__},
      52  
      53  static PyObject *
      54  _testcapi_make_vectorcall_class_impl(PyObject *module, PyTypeObject *base);
      55  
      56  static PyObject *
      57  _testcapi_make_vectorcall_class(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
      58  {
      59      PyObject *return_value = NULL;
      60      PyTypeObject *base = NULL;
      61  
      62      if (!_PyArg_CheckPositional("make_vectorcall_class", nargs, 0, 1)) {
      63          goto exit;
      64      }
      65      if (nargs < 1) {
      66          goto skip_optional;
      67      }
      68      if (!PyObject_TypeCheck(args[0], &PyType_Type)) {
      69          _PyArg_BadArgument("make_vectorcall_class", "argument 1", (&PyType_Type)->tp_name, args[0]);
      70          goto exit;
      71      }
      72      base = (PyTypeObject *)args[0];
      73  skip_optional:
      74      return_value = _testcapi_make_vectorcall_class_impl(module, base);
      75  
      76  exit:
      77      return return_value;
      78  }
      79  
      80  PyDoc_STRVAR(_testcapi_has_vectorcall_flag__doc__,
      81  "has_vectorcall_flag($module, type, /)\n"
      82  "--\n"
      83  "\n"
      84  "Return true iff Py_TPFLAGS_HAVE_VECTORCALL is set on the class.");
      85  
      86  #define _TESTCAPI_HAS_VECTORCALL_FLAG_METHODDEF    \
      87      {"has_vectorcall_flag", (PyCFunction)_testcapi_has_vectorcall_flag, METH_O, _testcapi_has_vectorcall_flag__doc__},
      88  
      89  static int
      90  _testcapi_has_vectorcall_flag_impl(PyObject *module, PyTypeObject *type);
      91  
      92  static PyObject *
      93  _testcapi_has_vectorcall_flag(PyObject *module, PyObject *arg)
      94  {
      95      PyObject *return_value = NULL;
      96      PyTypeObject *type;
      97      int _return_value;
      98  
      99      if (!PyObject_TypeCheck(arg, &PyType_Type)) {
     100          _PyArg_BadArgument("has_vectorcall_flag", "argument", (&PyType_Type)->tp_name, arg);
     101          goto exit;
     102      }
     103      type = (PyTypeObject *)arg;
     104      _return_value = _testcapi_has_vectorcall_flag_impl(module, type);
     105      if ((_return_value == -1) && PyErr_Occurred()) {
     106          goto exit;
     107      }
     108      return_value = PyBool_FromLong((long)_return_value);
     109  
     110  exit:
     111      return return_value;
     112  }
     113  /*[clinic end generated code: output=609569aa9942584f input=a9049054013a1b77]*/