Qucs-S S-parameter Viewer & RF Synthesis Tools
Loading...
Searching...
No Matches
CObjects.cpp
1#ifndef COBJECTS_CPP
2#define COBJECTS_CPP
3/*****************************************************************************
4 * C interface
5 *
6 * These are exported using the CObject API
7 */
8#ifdef __clang__
9# pragma clang diagnostic push
10# pragma clang diagnostic ignored "-Wunused-function"
11#endif
12
13#include "greenlet_exceptions.hpp"
14
15#include "greenlet_internal.hpp"
16#include "greenlet_refs.hpp"
17
18
19#include "TThreadStateDestroy.cpp"
20
21#include "PyGreenlet.hpp"
22
24using greenlet::Require;
25
26
27
28extern "C" {
29static PyGreenlet*
30PyGreenlet_GetCurrent(void)
31{
32 return GET_THREAD_STATE().state().get_current().relinquish_ownership();
33}
34
35static int
36PyGreenlet_SetParent(PyGreenlet* g, PyGreenlet* nparent)
37{
38 return green_setparent((PyGreenlet*)g, (PyObject*)nparent, NULL);
39}
40
41static PyGreenlet*
42PyGreenlet_New(PyObject* run, PyGreenlet* parent)
43{
45 // In the past, we didn't use green_new and green_init, but that
46 // was a maintenance issue because we duplicated code. This way is
47 // much safer, but slightly slower. If that's a problem, we could
48 // refactor green_init to separate argument parsing from initialization.
49 OwnedGreenlet g = OwnedGreenlet::consuming(green_new(&PyGreenlet_Type, nullptr, nullptr));
50 if (!g) {
51 return NULL;
52 }
53
54 try {
55 NewDictReference kwargs;
56 if (run) {
57 kwargs.SetItem(mod_globs->str_run, run);
58 }
59 if (parent) {
60 kwargs.SetItem("parent", (PyObject*)parent);
61 }
62
63 Require(green_init(g.borrow(), mod_globs->empty_tuple, kwargs.borrow()));
64 }
65 catch (const PyErrOccurred&) {
66 return nullptr;
67 }
68
69 return g.relinquish_ownership();
70}
71
72static PyObject*
73PyGreenlet_Switch(PyGreenlet* self, PyObject* args, PyObject* kwargs)
74{
75 if (!PyGreenlet_Check(self)) {
76 PyErr_BadArgument();
77 return NULL;
78 }
79
80 if (args == NULL) {
81 args = mod_globs->empty_tuple;
82 }
83
84 if (kwargs == NULL || !PyDict_Check(kwargs)) {
85 kwargs = NULL;
86 }
87
88 return green_switch(self, args, kwargs);
89}
90
91static PyObject*
92PyGreenlet_Throw(PyGreenlet* self, PyObject* typ, PyObject* val, PyObject* tb)
93{
94 if (!PyGreenlet_Check(self)) {
95 PyErr_BadArgument();
96 return nullptr;
97 }
98 try {
99 PyErrPieces err_pieces(typ, val, tb);
100 return internal_green_throw(self, err_pieces).relinquish_ownership();
101 }
102 catch (const PyErrOccurred&) {
103 return nullptr;
104 }
105}
106
107
108
109static int
110Extern_PyGreenlet_MAIN(PyGreenlet* self)
111{
112 if (!PyGreenlet_Check(self)) {
113 PyErr_BadArgument();
114 return -1;
115 }
116 return self->pimpl->main();
117}
118
119static int
120Extern_PyGreenlet_ACTIVE(PyGreenlet* self)
121{
122 if (!PyGreenlet_Check(self)) {
123 PyErr_BadArgument();
124 return -1;
125 }
126 return self->pimpl->active();
127}
128
129static int
130Extern_PyGreenlet_STARTED(PyGreenlet* self)
131{
132 if (!PyGreenlet_Check(self)) {
133 PyErr_BadArgument();
134 return -1;
135 }
136 return self->pimpl->started();
137}
138
139static PyGreenlet*
140Extern_PyGreenlet_GET_PARENT(PyGreenlet* self)
141{
142 if (!PyGreenlet_Check(self)) {
143 PyErr_BadArgument();
144 return NULL;
145 }
146 // This can return NULL even if there is no exception
147 return self->pimpl->parent().acquire();
148}
149} // extern C.
150
152#ifdef __clang__
153# pragma clang diagnostic pop
154#endif
155
156
157#endif
Definition greenlet_exceptions.hpp:17
Definition greenlet_refs.hpp:447
Definition greenlet_refs.hpp:995
Definition greenlet.h:22