1c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Descriptors */
2c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef Py_DESCROBJECT_H
3c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_DESCROBJECT_H
4c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef __cplusplus
5c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielextern "C" {
6c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
7c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
8c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef PyObject *(*getter)(PyObject *, void *);
9c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef int (*setter)(PyObject *, PyObject *, void *);
10c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
11c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef struct PyGetSetDef {
12c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    char *name;
13c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    getter get;
14c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    setter set;
15c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    char *doc;
16c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    void *closure;
17c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} PyGetSetDef;
18c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
19c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef PyObject *(*wrapperfunc)(PyObject *self, PyObject *args,
20c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 void *wrapped);
21c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
22c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef PyObject *(*wrapperfunc_kwds)(PyObject *self, PyObject *args,
23c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                      void *wrapped, PyObject *kwds);
24c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
25c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstruct wrapperbase {
26c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    char *name;
27c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int offset;
28c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    void *function;
29c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    wrapperfunc wrapper;
30c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    char *doc;
31c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int flags;
32c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *name_strobj;
33c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel};
34c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
35c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Flags for above struct */
36c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PyWrapperFlag_KEYWORDS 1 /* wrapper function takes keyword args */
37c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
38c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Various kinds of descriptor objects */
39c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
40c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PyDescr_COMMON \
41c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject_HEAD \
42c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyTypeObject *d_type; \
43c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *d_name
44c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
45c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef struct {
46c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyDescr_COMMON;
47c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} PyDescrObject;
48c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
49c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef struct {
50c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyDescr_COMMON;
51c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyMethodDef *d_method;
52c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} PyMethodDescrObject;
53c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
54c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef struct {
55c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyDescr_COMMON;
56c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    struct PyMemberDef *d_member;
57c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} PyMemberDescrObject;
58c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
59c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef struct {
60c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyDescr_COMMON;
61c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyGetSetDef *d_getset;
62c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} PyGetSetDescrObject;
63c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
64c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef struct {
65c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyDescr_COMMON;
66c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    struct wrapperbase *d_base;
67c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    void *d_wrapped; /* This can be any function pointer */
68c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} PyWrapperDescrObject;
69c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
70c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_DATA(PyTypeObject) PyWrapperDescr_Type;
71c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_DATA(PyTypeObject) PyDictProxy_Type;
72c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_DATA(PyTypeObject) PyGetSetDescr_Type;
73c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_DATA(PyTypeObject) PyMemberDescr_Type;
74c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
75c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_FUNC(PyObject *) PyDescr_NewMethod(PyTypeObject *, PyMethodDef *);
76c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_FUNC(PyObject *) PyDescr_NewClassMethod(PyTypeObject *, PyMethodDef *);
77c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_FUNC(PyObject *) PyDescr_NewMember(PyTypeObject *,
78c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                               struct PyMemberDef *);
79c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_FUNC(PyObject *) PyDescr_NewGetSet(PyTypeObject *,
80c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                               struct PyGetSetDef *);
81c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_FUNC(PyObject *) PyDescr_NewWrapper(PyTypeObject *,
82c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                                struct wrapperbase *, void *);
83c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PyDescr_IsData(d) (Py_TYPE(d)->tp_descr_set != NULL)
84c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
85c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_FUNC(PyObject *) PyDictProxy_New(PyObject *);
86c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_FUNC(PyObject *) PyWrapper_New(PyObject *, PyObject *);
87c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
88c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
89c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAPI_DATA(PyTypeObject) PyProperty_Type;
90c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef __cplusplus
91c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
92c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
93c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* !Py_DESCROBJECT_H */
94c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
95