14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Descriptors */
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef Py_DESCROBJECT_H
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_DESCROBJECT_H
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __cplusplus
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern "C" {
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef PyObject *(*getter)(PyObject *, void *);
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef int (*setter)(PyObject *, PyObject *, void *);
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct PyGetSetDef {
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *name;
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    getter get;
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    setter set;
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *doc;
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    void *closure;
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} PyGetSetDef;
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef PyObject *(*wrapperfunc)(PyObject *self, PyObject *args,
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                 void *wrapped);
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef PyObject *(*wrapperfunc_kwds)(PyObject *self, PyObject *args,
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                      void *wrapped, PyObject *kwds);
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstruct wrapperbase {
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *name;
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int offset;
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    void *function;
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    wrapperfunc wrapper;
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *doc;
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int flags;
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *name_strobj;
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Flags for above struct */
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PyWrapperFlag_KEYWORDS 1 /* wrapper function takes keyword args */
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Various kinds of descriptor objects */
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PyDescr_COMMON \
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_HEAD \
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyTypeObject *d_type; \
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *d_name
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct {
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyDescr_COMMON;
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} PyDescrObject;
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct {
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyDescr_COMMON;
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyMethodDef *d_method;
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} PyMethodDescrObject;
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct {
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyDescr_COMMON;
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct PyMemberDef *d_member;
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} PyMemberDescrObject;
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct {
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyDescr_COMMON;
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyGetSetDef *d_getset;
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} PyGetSetDescrObject;
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct {
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyDescr_COMMON;
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct wrapperbase *d_base;
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    void *d_wrapped; /* This can be any function pointer */
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} PyWrapperDescrObject;
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_DATA(PyTypeObject) PyWrapperDescr_Type;
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_DATA(PyTypeObject) PyDictProxy_Type;
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_DATA(PyTypeObject) PyGetSetDescr_Type;
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_DATA(PyTypeObject) PyMemberDescr_Type;
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(PyObject *) PyDescr_NewMethod(PyTypeObject *, PyMethodDef *);
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(PyObject *) PyDescr_NewClassMethod(PyTypeObject *, PyMethodDef *);
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(PyObject *) PyDescr_NewMember(PyTypeObject *,
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                               struct PyMemberDef *);
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(PyObject *) PyDescr_NewGetSet(PyTypeObject *,
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                               struct PyGetSetDef *);
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(PyObject *) PyDescr_NewWrapper(PyTypeObject *,
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                                struct wrapperbase *, void *);
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PyDescr_IsData(d) (Py_TYPE(d)->tp_descr_set != NULL)
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(PyObject *) PyDictProxy_New(PyObject *);
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(PyObject *) PyWrapper_New(PyObject *, PyObject *);
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_DATA(PyTypeObject) PyProperty_Type;
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __cplusplus
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* !Py_DESCROBJECT_H */
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
95