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 */
133