python (3.11.7)

(root)/
include/
python3.11/
methodobject.h
       1  
       2  /* Method object interface */
       3  
       4  #ifndef Py_METHODOBJECT_H
       5  #define Py_METHODOBJECT_H
       6  #ifdef __cplusplus
       7  extern "C" {
       8  #endif
       9  
      10  /* This is about the type 'builtin_function_or_method',
      11     not Python methods in user-defined classes.  See classobject.h
      12     for the latter. */
      13  
      14  PyAPI_DATA(PyTypeObject) PyCFunction_Type;
      15  
      16  #define PyCFunction_CheckExact(op) Py_IS_TYPE(op, &PyCFunction_Type)
      17  #define PyCFunction_Check(op) PyObject_TypeCheck(op, &PyCFunction_Type)
      18  
      19  typedef PyObject *(*PyCFunction)(PyObject *, PyObject *);
      20  typedef PyObject *(*_PyCFunctionFast) (PyObject *, PyObject *const *, Py_ssize_t);
      21  typedef PyObject *(*PyCFunctionWithKeywords)(PyObject *, PyObject *,
      22                                               PyObject *);
      23  typedef PyObject *(*_PyCFunctionFastWithKeywords) (PyObject *,
      24                                                     PyObject *const *, Py_ssize_t,
      25                                                     PyObject *);
      26  typedef PyObject *(*PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *,
      27                                 size_t, PyObject *);
      28  
      29  // Cast an function to the PyCFunction type to use it with PyMethodDef.
      30  //
      31  // This macro can be used to prevent compiler warnings if the first parameter
      32  // uses a different pointer type than PyObject* (ex: METH_VARARGS and METH_O
      33  // calling conventions).
      34  //
      35  // The macro can also be used for METH_FASTCALL and METH_VARARGS|METH_KEYWORDS
      36  // calling conventions to avoid compiler warnings because the function has more
      37  // than 2 parameters. The macro first casts the function to the
      38  // "void func(void)" type to prevent compiler warnings.
      39  //
      40  // If a function is declared with the METH_NOARGS calling convention, it must
      41  // have 2 parameters. Since the second parameter is unused, Py_UNUSED() can be
      42  // used to prevent a compiler warning. If the function has a single parameter,
      43  // it triggers an undefined behavior when Python calls it with 2 parameters
      44  // (bpo-33012).
      45  #define _PyCFunction_CAST(func) \
      46      _Py_CAST(PyCFunction, _Py_CAST(void(*)(void), (func)))
      47  
      48  PyAPI_FUNC(PyCFunction) PyCFunction_GetFunction(PyObject *);
      49  PyAPI_FUNC(PyObject *) PyCFunction_GetSelf(PyObject *);
      50  PyAPI_FUNC(int) PyCFunction_GetFlags(PyObject *);
      51  
      52  Py_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyCFunction_Call(PyObject *, PyObject *, PyObject *);
      53  
      54  struct PyMethodDef {
      55      const char  *ml_name;   /* The name of the built-in function/method */
      56      PyCFunction ml_meth;    /* The C function that implements it */
      57      int         ml_flags;   /* Combination of METH_xxx flags, which mostly
      58                                 describe the args expected by the C func */
      59      const char  *ml_doc;    /* The __doc__ attribute, or NULL */
      60  };
      61  
      62  /* PyCFunction_New is declared as a function for stable ABI (declaration is
      63   * needed for e.g. GCC with -fvisibility=hidden), but redefined as a macro
      64   * that calls PyCFunction_NewEx. */
      65  PyAPI_FUNC(PyObject *) PyCFunction_New(PyMethodDef *, PyObject *);
      66  #define PyCFunction_New(ML, SELF) PyCFunction_NewEx((ML), (SELF), NULL)
      67  
      68  /* PyCFunction_NewEx is similar: on 3.9+, this calls PyCMethod_New. */
      69  PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, PyObject *,
      70                                           PyObject *);
      71  
      72  #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000
      73  #define PyCFunction_NewEx(ML, SELF, MOD) PyCMethod_New((ML), (SELF), (MOD), NULL)
      74  PyAPI_FUNC(PyObject *) PyCMethod_New(PyMethodDef *, PyObject *,
      75                                       PyObject *, PyTypeObject *);
      76  #endif
      77  
      78  
      79  /* Flag passed to newmethodobject */
      80  /* #define METH_OLDARGS  0x0000   -- unsupported now */
      81  #define METH_VARARGS  0x0001
      82  #define METH_KEYWORDS 0x0002
      83  /* METH_NOARGS and METH_O must not be combined with the flags above. */
      84  #define METH_NOARGS   0x0004
      85  #define METH_O        0x0008
      86  
      87  /* METH_CLASS and METH_STATIC are a little different; these control
      88     the construction of methods for a class.  These cannot be used for
      89     functions in modules. */
      90  #define METH_CLASS    0x0010
      91  #define METH_STATIC   0x0020
      92  
      93  /* METH_COEXIST allows a method to be entered even though a slot has
      94     already filled the entry.  When defined, the flag allows a separate
      95     method, "__contains__" for example, to coexist with a defined
      96     slot like sq_contains. */
      97  
      98  #define METH_COEXIST   0x0040
      99  
     100  #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030a0000
     101  #  define METH_FASTCALL  0x0080
     102  #endif
     103  
     104  /* This bit is preserved for Stackless Python */
     105  #ifdef STACKLESS
     106  #  define METH_STACKLESS 0x0100
     107  #else
     108  #  define METH_STACKLESS 0x0000
     109  #endif
     110  
     111  /* METH_METHOD means the function stores an
     112   * additional reference to the class that defines it;
     113   * both self and class are passed to it.
     114   * It uses PyCMethodObject instead of PyCFunctionObject.
     115   * May not be combined with METH_NOARGS, METH_O, METH_CLASS or METH_STATIC.
     116   */
     117  
     118  #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000
     119  #define METH_METHOD 0x0200
     120  #endif
     121  
     122  
     123  #ifndef Py_LIMITED_API
     124  #  define Py_CPYTHON_METHODOBJECT_H
     125  #  include "cpython/methodobject.h"
     126  #  undef Py_CPYTHON_METHODOBJECT_H
     127  #endif
     128  
     129  #ifdef __cplusplus
     130  }
     131  #endif
     132  #endif /* !Py_METHODOBJECT_H */