1#ifndef Py_CPYTHON_DESCROBJECT_H
2#  error "this header file must not be included directly"
3#endif
4
5typedef PyObject *(*wrapperfunc)(PyObject *self, PyObject *args,
6                                 void *wrapped);
7
8typedef PyObject *(*wrapperfunc_kwds)(PyObject *self, PyObject *args,
9                                      void *wrapped, PyObject *kwds);
10
11struct wrapperbase {
12    const char *name;
13    int offset;
14    void *function;
15    wrapperfunc wrapper;
16    const char *doc;
17    int flags;
18    PyObject *name_strobj;
19};
20
21/* Flags for above struct */
22#define PyWrapperFlag_KEYWORDS 1 /* wrapper function takes keyword args */
23
24/* Various kinds of descriptor objects */
25
26typedef struct {
27    PyObject_HEAD
28    PyTypeObject *d_type;
29    PyObject *d_name;
30    PyObject *d_qualname;
31} PyDescrObject;
32
33#define PyDescr_COMMON PyDescrObject d_common
34
35#define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type)
36#define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name)
37
38typedef struct {
39    PyDescr_COMMON;
40    PyMethodDef *d_method;
41    vectorcallfunc vectorcall;
42} PyMethodDescrObject;
43
44typedef struct {
45    PyDescr_COMMON;
46    PyMemberDef *d_member;
47} PyMemberDescrObject;
48
49typedef struct {
50    PyDescr_COMMON;
51    PyGetSetDef *d_getset;
52} PyGetSetDescrObject;
53
54typedef struct {
55    PyDescr_COMMON;
56    struct wrapperbase *d_base;
57    void *d_wrapped; /* This can be any function pointer */
58} PyWrapperDescrObject;
59
60PyAPI_DATA(PyTypeObject) _PyMethodWrapper_Type;
61
62PyAPI_FUNC(PyObject *) PyDescr_NewWrapper(PyTypeObject *,
63                                                struct wrapperbase *, void *);
64PyAPI_FUNC(int) PyDescr_IsData(PyObject *);
65