.gitignore added
[dotfiles/.git] / .local / include / python2.7 / greenlet / greenlet.h
1 /* -*- indent-tabs-mode: nil; tab-width: 4; -*- */
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 /* This is deprecated and undocumented. It does not change. */
15 #define GREENLET_VERSION "1.0.0"
16
17 typedef struct _greenlet {
18     PyObject_HEAD
19     char* stack_start;
20     char* stack_stop;
21     char* stack_copy;
22     intptr_t stack_saved;
23     struct _greenlet* stack_prev;
24     struct _greenlet* parent;
25     PyObject* run_info;
26     struct _frame* top_frame;
27     int recursion_depth;
28     PyObject* weakreflist;
29 #if PY_VERSION_HEX >= 0x030700A3
30     _PyErr_StackItem* exc_info;
31     _PyErr_StackItem exc_state;
32 #else
33     PyObject* exc_type;
34     PyObject* exc_value;
35     PyObject* exc_traceback;
36 #endif
37     PyObject* dict;
38 #if PY_VERSION_HEX >= 0x030700A3
39     PyObject* context;
40 #endif
41 } PyGreenlet;
42
43 #define PyGreenlet_Check(op) PyObject_TypeCheck(op, &PyGreenlet_Type)
44 #define PyGreenlet_MAIN(op) (((PyGreenlet*)(op))->stack_stop == (char*)-1)
45 #define PyGreenlet_STARTED(op) (((PyGreenlet*)(op))->stack_stop != NULL)
46 #define PyGreenlet_ACTIVE(op) (((PyGreenlet*)(op))->stack_start != NULL)
47 #define PyGreenlet_GET_PARENT(op) (((PyGreenlet*)(op))->parent)
48
49 /* C API functions */
50
51 /* Total number of symbols that are exported */
52 #define PyGreenlet_API_pointers 8
53
54 #define PyGreenlet_Type_NUM 0
55 #define PyExc_GreenletError_NUM 1
56 #define PyExc_GreenletExit_NUM 2
57
58 #define PyGreenlet_New_NUM 3
59 #define PyGreenlet_GetCurrent_NUM 4
60 #define PyGreenlet_Throw_NUM 5
61 #define PyGreenlet_Switch_NUM 6
62 #define PyGreenlet_SetParent_NUM 7
63
64 #ifndef GREENLET_MODULE
65 /* This section is used by modules that uses the greenlet C API */
66 static void** _PyGreenlet_API = NULL;
67
68 #    define PyGreenlet_Type \
69         (*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM])
70
71 #    define PyExc_GreenletError \
72         ((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM])
73
74 #    define PyExc_GreenletExit \
75         ((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM])
76
77 /*
78  * PyGreenlet_New(PyObject *args)
79  *
80  * greenlet.greenlet(run, parent=None)
81  */
82 #    define PyGreenlet_New                                        \
83         (*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \
84              _PyGreenlet_API[PyGreenlet_New_NUM])
85
86 /*
87  * PyGreenlet_GetCurrent(void)
88  *
89  * greenlet.getcurrent()
90  */
91 #    define PyGreenlet_GetCurrent \
92         (*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM])
93
94 /*
95  * PyGreenlet_Throw(
96  *         PyGreenlet *greenlet,
97  *         PyObject *typ,
98  *         PyObject *val,
99  *         PyObject *tb)
100  *
101  * g.throw(...)
102  */
103 #    define PyGreenlet_Throw                 \
104         (*(PyObject * (*)(PyGreenlet * self, \
105                           PyObject * typ,    \
106                           PyObject * val,    \
107                           PyObject * tb))    \
108              _PyGreenlet_API[PyGreenlet_Throw_NUM])
109
110 /*
111  * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args)
112  *
113  * g.switch(*args, **kwargs)
114  */
115 #    define PyGreenlet_Switch                                              \
116         (*(PyObject *                                                      \
117            (*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \
118              _PyGreenlet_API[PyGreenlet_Switch_NUM])
119
120 /*
121  * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent)
122  *
123  * g.parent = new_parent
124  */
125 #    define PyGreenlet_SetParent                                 \
126         (*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \
127              _PyGreenlet_API[PyGreenlet_SetParent_NUM])
128
129 /* Macro that imports greenlet and initializes C API */
130 /* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we
131    keep the older definition to be sure older code that might have a copy of
132    the header still works. */
133 #    define PyGreenlet_Import()                                               \
134         {                                                                     \
135             _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \
136         }
137
138 #endif /* GREENLET_MODULE */
139
140 #ifdef __cplusplus
141 }
142 #endif
143 #endif /* !Py_GREENLETOBJECT_H */