OSDN Git Service

PEP8対応
[stux/ultron.git] / venv / Include / greenlet / greenlet.h
1 /* vim:set noet ts=8 sw=8 : */
2
3 /* Greenlet object interface */
4
5 #ifndef Py_GREENLETOBJECT_H
6 #define Py_GREENLETOBJECT_H
7
8 #include <Python.h>
9
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13
14 #define GREENLET_VERSION "0.4.12"
15
16 typedef struct _greenlet {
17         PyObject_HEAD
18         char* stack_start;
19         char* stack_stop;
20         char* stack_copy;
21         intptr_t stack_saved;
22         struct _greenlet* stack_prev;
23         struct _greenlet* parent;
24         PyObject* run_info;
25         struct _frame* top_frame;
26         int recursion_depth;
27         PyObject* weakreflist;
28         PyObject* exc_type;
29         PyObject* exc_value;
30         PyObject* exc_traceback;
31         PyObject* dict;
32 } PyGreenlet;
33
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)
39
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
42 #endif
43
44 /* C API functions */
45
46 /* Total number of symbols that are exported */
47 #define PyGreenlet_API_pointers  8
48
49 #define PyGreenlet_Type_NUM       0
50 #define PyExc_GreenletError_NUM   1
51 #define PyExc_GreenletExit_NUM    2
52
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
58
59 #ifndef GREENLET_MODULE
60 /* This section is used by modules that uses the greenlet C API */
61 static void **_PyGreenlet_API = NULL;
62
63 #define PyGreenlet_Type (*(PyTypeObject *) _PyGreenlet_API[PyGreenlet_Type_NUM])
64
65 #define PyExc_GreenletError \
66         ((PyObject *) _PyGreenlet_API[PyExc_GreenletError_NUM])
67
68 #define PyExc_GreenletExit \
69         ((PyObject *) _PyGreenlet_API[PyExc_GreenletExit_NUM])
70
71 /*
72  * PyGreenlet_New(PyObject *args)
73  *
74  * greenlet.greenlet(run, parent=None)
75  */
76 #define PyGreenlet_New \
77         (* (PyGreenlet * (*)(PyObject *run, PyGreenlet *parent)) \
78          _PyGreenlet_API[PyGreenlet_New_NUM])
79
80 /*
81  * PyGreenlet_GetCurrent(void)
82  *
83  * greenlet.getcurrent()
84  */
85 #define PyGreenlet_GetCurrent \
86         (* (PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM])
87
88 /*
89  * PyGreenlet_Throw(
90  *         PyGreenlet *greenlet,
91  *         PyObject *typ,
92  *         PyObject *val,
93  *         PyObject *tb)
94  *
95  * g.throw(...)
96  */
97 #define PyGreenlet_Throw \
98         (* (PyObject * (*) \
99             (PyGreenlet *self, PyObject *typ, PyObject *val, PyObject *tb)) \
100          _PyGreenlet_API[PyGreenlet_Throw_NUM])
101
102 /*
103  * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args)
104  *
105  * g.switch(*args, **kwargs)
106  */
107 #define PyGreenlet_Switch \
108         (* (PyObject * (*)(PyGreenlet *greenlet, PyObject *args, PyObject *kwargs)) \
109          _PyGreenlet_API[PyGreenlet_Switch_NUM])
110
111 /*
112  * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent)
113  *
114  * g.parent = new_parent
115  */
116 #define PyGreenlet_SetParent \
117         (* (int (*)(PyGreenlet *greenlet, PyGreenlet *nparent)) \
118          _PyGreenlet_API[PyGreenlet_SetParent_NUM])
119
120 /* Macro that imports greenlet and initializes C API */
121 #ifdef GREENLET_USE_PYCAPSULE
122 #define PyGreenlet_Import() \
123 { \
124         _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \
125 }
126 #else
127 #define PyGreenlet_Import() \
128 { \
129         PyObject *module = PyImport_ImportModule("greenlet"); \
130         if (module != NULL) { \
131                 PyObject *c_api_object = PyObject_GetAttrString( \
132                         module, "_C_API"); \
133                 if (c_api_object != NULL && PyCObject_Check(c_api_object)) { \
134                         _PyGreenlet_API = \
135                                 (void **) PyCObject_AsVoidPtr(c_api_object); \
136                         Py_DECREF(c_api_object); \
137                 } \
138                 Py_DECREF(module); \
139         } \
140 }
141 #endif
142
143 #endif /* GREENLET_MODULE */
144
145 #ifdef __cplusplus
146 }
147 #endif
148 #endif /* !Py_GREENLETOBJECT_H */