Home | History | Annotate | Download | only in Include
      1 /* Descriptors */
      2 #ifndef Py_DESCROBJECT_H
      3 #define Py_DESCROBJECT_H
      4 #ifdef __cplusplus
      5 extern "C" {
      6 #endif
      7 
      8 typedef PyObject *(*getter)(PyObject *, void *);
      9 typedef int (*setter)(PyObject *, PyObject *, void *);
     10 
     11 typedef struct PyGetSetDef {
     12     const char *name;
     13     getter get;
     14     setter set;
     15     const char *doc;
     16     void *closure;
     17 } PyGetSetDef;
     18 
     19 #ifndef Py_LIMITED_API
     20 typedef PyObject *(*wrapperfunc)(PyObject *self, PyObject *args,
     21                                  void *wrapped);
     22 
     23 typedef PyObject *(*wrapperfunc_kwds)(PyObject *self, PyObject *args,
     24                                       void *wrapped, PyObject *kwds);
     25 
     26 struct wrapperbase {
     27     const char *name;
     28     int offset;
     29     void *function;
     30     wrapperfunc wrapper;
     31     const char *doc;
     32     int flags;
     33     PyObject *name_strobj;
     34 };
     35 
     36 /* Flags for above struct */
     37 #define PyWrapperFlag_KEYWORDS 1 /* wrapper function takes keyword args */
     38 
     39 /* Various kinds of descriptor objects */
     40 
     41 typedef struct {
     42     PyObject_HEAD
     43     PyTypeObject *d_type;
     44     PyObject *d_name;
     45     PyObject *d_qualname;
     46 } PyDescrObject;
     47 
     48 #define PyDescr_COMMON PyDescrObject d_common
     49 
     50 #define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type)
     51 #define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name)
     52 
     53 typedef struct {
     54     PyDescr_COMMON;
     55     PyMethodDef *d_method;
     56 } PyMethodDescrObject;
     57 
     58 typedef struct {
     59     PyDescr_COMMON;
     60     struct PyMemberDef *d_member;
     61 } PyMemberDescrObject;
     62 
     63 typedef struct {
     64     PyDescr_COMMON;
     65     PyGetSetDef *d_getset;
     66 } PyGetSetDescrObject;
     67 
     68 typedef struct {
     69     PyDescr_COMMON;
     70     struct wrapperbase *d_base;
     71     void *d_wrapped; /* This can be any function pointer */
     72 } PyWrapperDescrObject;
     73 #endif /* Py_LIMITED_API */
     74 
     75 PyAPI_DATA(PyTypeObject) PyClassMethodDescr_Type;
     76 PyAPI_DATA(PyTypeObject) PyGetSetDescr_Type;
     77 PyAPI_DATA(PyTypeObject) PyMemberDescr_Type;
     78 PyAPI_DATA(PyTypeObject) PyMethodDescr_Type;
     79 PyAPI_DATA(PyTypeObject) PyWrapperDescr_Type;
     80 PyAPI_DATA(PyTypeObject) PyDictProxy_Type;
     81 #ifndef Py_LIMITED_API
     82 PyAPI_DATA(PyTypeObject) _PyMethodWrapper_Type;
     83 #endif /* Py_LIMITED_API */
     84 
     85 PyAPI_FUNC(PyObject *) PyDescr_NewMethod(PyTypeObject *, PyMethodDef *);
     86 PyAPI_FUNC(PyObject *) PyDescr_NewClassMethod(PyTypeObject *, PyMethodDef *);
     87 struct PyMemberDef; /* forward declaration for following prototype */
     88 PyAPI_FUNC(PyObject *) PyDescr_NewMember(PyTypeObject *,
     89                                                struct PyMemberDef *);
     90 PyAPI_FUNC(PyObject *) PyDescr_NewGetSet(PyTypeObject *,
     91                                                struct PyGetSetDef *);
     92 #ifndef Py_LIMITED_API
     93 
     94 PyAPI_FUNC(PyObject *) _PyMethodDescr_FastCallKeywords(
     95         PyObject *descrobj, PyObject *const *stack, Py_ssize_t nargs, PyObject *kwnames);
     96 PyAPI_FUNC(PyObject *) PyDescr_NewWrapper(PyTypeObject *,
     97                                                 struct wrapperbase *, void *);
     98 #define PyDescr_IsData(d) (Py_TYPE(d)->tp_descr_set != NULL)
     99 #endif
    100 
    101 PyAPI_FUNC(PyObject *) PyDictProxy_New(PyObject *);
    102 PyAPI_FUNC(PyObject *) PyWrapper_New(PyObject *, PyObject *);
    103 
    104 
    105 PyAPI_DATA(PyTypeObject) PyProperty_Type;
    106 #ifdef __cplusplus
    107 }
    108 #endif
    109 #endif /* !Py_DESCROBJECT_H */
    110 
    111