Update 2025-04-13_16:25:39
This commit is contained in:
157
venv/lib/python3.11/site-packages/greenlet/CObjects.cpp
Normal file
157
venv/lib/python3.11/site-packages/greenlet/CObjects.cpp
Normal file
@ -0,0 +1,157 @@
|
||||
#ifndef COBJECTS_CPP
|
||||
#define COBJECTS_CPP
|
||||
/*****************************************************************************
|
||||
* C interface
|
||||
*
|
||||
* These are exported using the CObject API
|
||||
*/
|
||||
#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;
|
||||
// In the past, we didn't use green_new and green_init, but that
|
||||
// was a maintenance issue because we duplicated code. This way is
|
||||
// much safer, but slightly slower. If that's a problem, we could
|
||||
// refactor green_init to separate argument parsing from initialization.
|
||||
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;
|
||||
}
|
||||
// This can return NULL even if there is no exception
|
||||
return self->pimpl->parent().acquire();
|
||||
}
|
||||
} // extern C.
|
||||
|
||||
/** End C API ****************************************************************/
|
||||
#ifdef __clang__
|
||||
# pragma clang diagnostic pop
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user