|
#ifndef COBJECTS_CPP |
|
#define COBJECTS_CPP |
|
|
|
|
|
|
|
|
|
|
|
#ifdef __clang__ |
|
# pragma clang diagnostic push |
|
# pragma clang diagnostic ignored "-Wunused-function" |
|
#endif |
|
|
|
#include "greenlet_exceptions.hpp" |
|
|
|
#include "greenlet_internal.hpp" |
|
#include "greenlet_refs.hpp" |
|
|
|
|
|
#include "TThreadStateDestroy.cpp" |
|
|
|
#include "PyGreenlet.hpp" |
|
|
|
using greenlet::PyErrOccurred; |
|
using greenlet::Require; |
|
|
|
|
|
|
|
extern "C" { |
|
static PyGreenlet* |
|
PyGreenlet_GetCurrent(void) |
|
{ |
|
return GET_THREAD_STATE().state().get_current().relinquish_ownership(); |
|
} |
|
|
|
static int |
|
PyGreenlet_SetParent(PyGreenlet* g, PyGreenlet* nparent) |
|
{ |
|
return green_setparent((PyGreenlet*)g, (PyObject*)nparent, NULL); |
|
} |
|
|
|
static PyGreenlet* |
|
PyGreenlet_New(PyObject* run, PyGreenlet* parent) |
|
{ |
|
using greenlet::refs::NewDictReference; |
|
|
|
|
|
|
|
|
|
OwnedGreenlet g = OwnedGreenlet::consuming(green_new(&PyGreenlet_Type, nullptr, nullptr)); |
|
if (!g) { |
|
return NULL; |
|
} |
|
|
|
try { |
|
NewDictReference kwargs; |
|
if (run) { |
|
kwargs.SetItem(mod_globs->str_run, run); |
|
} |
|
if (parent) { |
|
kwargs.SetItem("parent", (PyObject*)parent); |
|
} |
|
|
|
Require(green_init(g.borrow(), mod_globs->empty_tuple, kwargs.borrow())); |
|
} |
|
catch (const PyErrOccurred&) { |
|
return nullptr; |
|
} |
|
|
|
return g.relinquish_ownership(); |
|
} |
|
|
|
static PyObject* |
|
PyGreenlet_Switch(PyGreenlet* self, PyObject* args, PyObject* kwargs) |
|
{ |
|
if (!PyGreenlet_Check(self)) { |
|
PyErr_BadArgument(); |
|
return NULL; |
|
} |
|
|
|
if (args == NULL) { |
|
args = mod_globs->empty_tuple; |
|
} |
|
|
|
if (kwargs == NULL || !PyDict_Check(kwargs)) { |
|
kwargs = NULL; |
|
} |
|
|
|
return green_switch(self, args, kwargs); |
|
} |
|
|
|
static PyObject* |
|
PyGreenlet_Throw(PyGreenlet* self, PyObject* typ, PyObject* val, PyObject* tb) |
|
{ |
|
if (!PyGreenlet_Check(self)) { |
|
PyErr_BadArgument(); |
|
return nullptr; |
|
} |
|
try { |
|
PyErrPieces err_pieces(typ, val, tb); |
|
return internal_green_throw(self, err_pieces).relinquish_ownership(); |
|
} |
|
catch (const PyErrOccurred&) { |
|
return nullptr; |
|
} |
|
} |
|
|
|
|
|
|
|
static int |
|
Extern_PyGreenlet_MAIN(PyGreenlet* self) |
|
{ |
|
if (!PyGreenlet_Check(self)) { |
|
PyErr_BadArgument(); |
|
return -1; |
|
} |
|
return self->pimpl->main(); |
|
} |
|
|
|
static int |
|
Extern_PyGreenlet_ACTIVE(PyGreenlet* self) |
|
{ |
|
if (!PyGreenlet_Check(self)) { |
|
PyErr_BadArgument(); |
|
return -1; |
|
} |
|
return self->pimpl->active(); |
|
} |
|
|
|
static int |
|
Extern_PyGreenlet_STARTED(PyGreenlet* self) |
|
{ |
|
if (!PyGreenlet_Check(self)) { |
|
PyErr_BadArgument(); |
|
return -1; |
|
} |
|
return self->pimpl->started(); |
|
} |
|
|
|
static PyGreenlet* |
|
Extern_PyGreenlet_GET_PARENT(PyGreenlet* self) |
|
{ |
|
if (!PyGreenlet_Check(self)) { |
|
PyErr_BadArgument(); |
|
return NULL; |
|
} |
|
|
|
return self->pimpl->parent().acquire(); |
|
} |
|
} |
|
|
|
|
|
#ifdef __clang__ |
|
# pragma clang diagnostic pop |
|
#endif |
|
|
|
|
|
#endif |
|
|