1 /* vim:set noet ts=8 sw=8 : */
3 /* Greenlet object interface */
5 #ifndef Py_GREENLETOBJECT_H
6 #define Py_GREENLETOBJECT_H
14 #define GREENLET_VERSION "0.4.12"
16 typedef struct _greenlet {
22 struct _greenlet* stack_prev;
23 struct _greenlet* parent;
25 struct _frame* top_frame;
27 PyObject* weakreflist;
30 PyObject* exc_traceback;
34 #define PyGreenlet_Check(op) PyObject_TypeCheck(op, &PyGreenlet_Type)
35 #define PyGreenlet_MAIN(op) (((PyGreenlet*)(op))->stack_stop == (char*) -1)
36 #define PyGreenlet_STARTED(op) (((PyGreenlet*)(op))->stack_stop != NULL)
37 #define PyGreenlet_ACTIVE(op) (((PyGreenlet*)(op))->stack_start != NULL)
38 #define PyGreenlet_GET_PARENT(op) (((PyGreenlet*)(op))->parent)
40 #if (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 7) || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 1) || PY_MAJOR_VERSION > 3
41 #define GREENLET_USE_PYCAPSULE
46 /* Total number of symbols that are exported */
47 #define PyGreenlet_API_pointers 8
49 #define PyGreenlet_Type_NUM 0
50 #define PyExc_GreenletError_NUM 1
51 #define PyExc_GreenletExit_NUM 2
53 #define PyGreenlet_New_NUM 3
54 #define PyGreenlet_GetCurrent_NUM 4
55 #define PyGreenlet_Throw_NUM 5
56 #define PyGreenlet_Switch_NUM 6
57 #define PyGreenlet_SetParent_NUM 7
59 #ifndef GREENLET_MODULE
60 /* This section is used by modules that uses the greenlet C API */
61 static void **_PyGreenlet_API = NULL;
63 #define PyGreenlet_Type (*(PyTypeObject *) _PyGreenlet_API[PyGreenlet_Type_NUM])
65 #define PyExc_GreenletError \
66 ((PyObject *) _PyGreenlet_API[PyExc_GreenletError_NUM])
68 #define PyExc_GreenletExit \
69 ((PyObject *) _PyGreenlet_API[PyExc_GreenletExit_NUM])
72 * PyGreenlet_New(PyObject *args)
74 * greenlet.greenlet(run, parent=None)
76 #define PyGreenlet_New \
77 (* (PyGreenlet * (*)(PyObject *run, PyGreenlet *parent)) \
78 _PyGreenlet_API[PyGreenlet_New_NUM])
81 * PyGreenlet_GetCurrent(void)
83 * greenlet.getcurrent()
85 #define PyGreenlet_GetCurrent \
86 (* (PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM])
90 * PyGreenlet *greenlet,
97 #define PyGreenlet_Throw \
99 (PyGreenlet *self, PyObject *typ, PyObject *val, PyObject *tb)) \
100 _PyGreenlet_API[PyGreenlet_Throw_NUM])
103 * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args)
105 * g.switch(*args, **kwargs)
107 #define PyGreenlet_Switch \
108 (* (PyObject * (*)(PyGreenlet *greenlet, PyObject *args, PyObject *kwargs)) \
109 _PyGreenlet_API[PyGreenlet_Switch_NUM])
112 * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent)
114 * g.parent = new_parent
116 #define PyGreenlet_SetParent \
117 (* (int (*)(PyGreenlet *greenlet, PyGreenlet *nparent)) \
118 _PyGreenlet_API[PyGreenlet_SetParent_NUM])
120 /* Macro that imports greenlet and initializes C API */
121 #ifdef GREENLET_USE_PYCAPSULE
122 #define PyGreenlet_Import() \
124 _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \
127 #define PyGreenlet_Import() \
129 PyObject *module = PyImport_ImportModule("greenlet"); \
130 if (module != NULL) { \
131 PyObject *c_api_object = PyObject_GetAttrString( \
133 if (c_api_object != NULL && PyCObject_Check(c_api_object)) { \
135 (void **) PyCObject_AsVoidPtr(c_api_object); \
136 Py_DECREF(c_api_object); \
143 #endif /* GREENLET_MODULE */
148 #endif /* !Py_GREENLETOBJECT_H */