From d5fa8847346e6bc0aadf3c734ec8343d9c7795fd Mon Sep 17 00:00:00 2001 From: Polina Date: Thu, 2 Jul 2026 18:27:52 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=C2=AB?= =?UTF-8?q?venv/Lib/site-packages/greenlet=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- venv/Lib/site-packages/greenlet/CObjects.cpp | 161 +++++++++ venv/Lib/site-packages/greenlet/__init__.py | 62 ++++ .../greenlet/_greenlet.cp314-win_amd64.pyd | Bin 0 -> 72704 bytes venv/Lib/site-packages/greenlet/greenlet.cpp | 324 ++++++++++++++++++ venv/Lib/site-packages/greenlet/greenlet.h | 164 +++++++++ 5 files changed, 711 insertions(+) create mode 100644 venv/Lib/site-packages/greenlet/CObjects.cpp create mode 100644 venv/Lib/site-packages/greenlet/__init__.py create mode 100644 venv/Lib/site-packages/greenlet/_greenlet.cp314-win_amd64.pyd create mode 100644 venv/Lib/site-packages/greenlet/greenlet.cpp create mode 100644 venv/Lib/site-packages/greenlet/greenlet.h diff --git a/venv/Lib/site-packages/greenlet/CObjects.cpp b/venv/Lib/site-packages/greenlet/CObjects.cpp new file mode 100644 index 0000000..ec89208 --- /dev/null +++ b/venv/Lib/site-packages/greenlet/CObjects.cpp @@ -0,0 +1,161 @@ +#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) +{ + if (greenlet::IsShuttingDown()) { + PyErr_SetString(PyExc_RuntimeError, "greenlet is being finalized"); + return nullptr; + } + 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 diff --git a/venv/Lib/site-packages/greenlet/__init__.py b/venv/Lib/site-packages/greenlet/__init__.py new file mode 100644 index 0000000..e2f209a --- /dev/null +++ b/venv/Lib/site-packages/greenlet/__init__.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +""" +The root of the greenlet package. +""" + +__all__ = [ + '__version__', + '_C_API', + + 'GreenletExit', + 'error', + + 'getcurrent', + 'greenlet', + + 'gettrace', + 'settrace', +] + +# pylint:disable=no-name-in-module + +### +# Metadata +### +__version__ = '3.5.3' +from ._greenlet import _C_API # pylint:disable=no-name-in-module + +### +# Exceptions +### +from ._greenlet import GreenletExit +from ._greenlet import error + +### +# greenlets +### +from ._greenlet import getcurrent +from ._greenlet import greenlet + +### +# tracing +### +from ._greenlet import gettrace +from ._greenlet import settrace + +### +# Constants +# These constants aren't documented and aren't recommended. +# In 1.0, USE_GC and USE_TRACING are always true, and USE_CONTEXT_VARS +# is the same as ``sys.version_info[:2] >= 3.7`` +### +from ._greenlet import GREENLET_USE_CONTEXT_VARS # pylint:disable=unused-import +from ._greenlet import GREENLET_USE_GC # pylint:disable=unused-import +from ._greenlet import GREENLET_USE_TRACING # pylint:disable=unused-import + +# Controlling the use of the gc module. Provisional API for this greenlet +# implementation in 2.0. +from ._greenlet import CLOCKS_PER_SEC # pylint:disable=unused-import +from ._greenlet import enable_optional_cleanup # pylint:disable=unused-import +from ._greenlet import get_clocks_used_doing_optional_cleanup # pylint:disable=unused-import + +# Other APIS in the _greenlet module are for test support. diff --git a/venv/Lib/site-packages/greenlet/_greenlet.cp314-win_amd64.pyd b/venv/Lib/site-packages/greenlet/_greenlet.cp314-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..c8acc091a630d395c50f03d249f143cab256c03e GIT binary patch literal 72704 zcmeEveSB2K)&J&YNd&@%mxWY7uDD1r8Y97)5YP=tF0M#VO6u>BsL$@Z z{V%UPG3*2L|CZO*fAAN)@43YO;Y$dAtc>{ZMGlice4fL>AN~=cW2~8O|8OhbUwOj* z!4!n!FCP8j%Luo;w)O)G$6q{*-^X9vE#HUp`<$xsN-8t5hD8My%i?wYEJt=+eT$iP z$}(0N5IZQ-@>|3-irCG+MwracO<;p~jXwi@#WY5t(FO#74f0n4*3$ zmc>YY4&mP^voprhLt#dYrL#Xh$iJc(OCrkM{GP=!%8UyS-?vy&@m}{XqX?z6p&Ut9 zC^Gbv?x|?>;Pw4Y_#qOh?h){c#ZsDHzqrg(X0Z&v0qJe{UyT2c;(yqm6Gf*BFiT<* z5)|-cAi{HDKzMWlLwcP6Gciu<%naRfHxNKz%o1IUABbvxpnC9wK!fZ84`LH{ zsvT`44&8UDM|!$jc33R0hW}Nl+Q4xn)0*}E^J6UANhDP*zFiF@l|78dj`�-POE7 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/greenlet/greenlet.cpp b/venv/Lib/site-packages/greenlet/greenlet.cpp new file mode 100644 index 0000000..b360335 --- /dev/null +++ b/venv/Lib/site-packages/greenlet/greenlet.cpp @@ -0,0 +1,324 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ +/* Format with: + * clang-format -i --style=file src/greenlet/greenlet.c + * + * + * Fix missing braces with: + * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" +*/ +#include +#include +#include +#include + + +#define PY_SSIZE_T_CLEAN +#include +#include "structmember.h" // PyMemberDef + +#include "greenlet_internal.hpp" +// Code after this point can assume access to things declared in stdint.h, +// including the fixed-width types. This goes for the platform-specific switch functions +// as well. +#include "greenlet_refs.hpp" +#include "greenlet_slp_switch.hpp" + +#include "greenlet_thread_support.hpp" +#include "TGreenlet.hpp" + +#include "TGreenletGlobals.cpp" + +#include "TGreenlet.cpp" +#include "TMainGreenlet.cpp" +#include "TUserGreenlet.cpp" +#include "TBrokenGreenlet.cpp" +#include "TExceptionState.cpp" +#include "TPythonState.cpp" +#include "TStackState.cpp" + +#include "TThreadState.hpp" +#include "TThreadStateCreator.hpp" +#include "TThreadStateDestroy.cpp" + +#include "PyGreenlet.cpp" +#include "PyGreenletUnswitchable.cpp" +#include "CObjects.cpp" + +using greenlet::LockGuard; +using greenlet::LockInitError; +using greenlet::PyErrOccurred; +using greenlet::Require; + +using greenlet::g_handle_exit; +using greenlet::single_result; + +using greenlet::Greenlet; +using greenlet::UserGreenlet; +using greenlet::MainGreenlet; +using greenlet::BrokenGreenlet; +using greenlet::ThreadState; +using greenlet::PythonState; + + + +// ******* Implementation of things from included files +template +greenlet::refs::_BorrowedGreenlet& greenlet::refs::_BorrowedGreenlet::operator=(const greenlet::refs::BorrowedObject& other) +{ + this->_set_raw_pointer(static_cast(other)); + return *this; +} + +template +inline greenlet::refs::_BorrowedGreenlet::operator Greenlet*() const noexcept +{ + if (!this->p) { + return nullptr; + } + return reinterpret_cast(this->p)->pimpl; +} + +template +greenlet::refs::_BorrowedGreenlet::_BorrowedGreenlet(const BorrowedObject& p) + : BorrowedReference(nullptr) +{ + + this->_set_raw_pointer(p.borrow()); +} + +template +inline greenlet::refs::_OwnedGreenlet::operator Greenlet*() const noexcept +{ + if (!this->p) { + return nullptr; + } + return reinterpret_cast(this->p)->pimpl; +} + + + +#ifdef __clang__ +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wmissing-field-initializers" +# pragma clang diagnostic ignored "-Wwritable-strings" +#elif defined(__GNUC__) +# pragma GCC diagnostic push +// warning: ISO C++ forbids converting a string constant to ‘char*’ +// (The python APIs aren't const correct and accept writable char*) +# pragma GCC diagnostic ignored "-Wwrite-strings" +#endif + + +/*********************************************************** + +A PyGreenlet is a range of C stack addresses that must be +saved and restored in such a way that the full range of the +stack contains valid data when we switch to it. + +Stack layout for a greenlet: + + | ^^^ | + | older data | + | | + stack_stop . |_______________| + . | | + . | greenlet data | + . | in stack | + . * |_______________| . . _____________ stack_copy + stack_saved + . | | | | + . | data | |greenlet data| + . | unrelated | | saved | + . | to | | in heap | + stack_start . | this | . . |_____________| stack_copy + | greenlet | + | | + | newer data | + | vvv | + + +Note that a greenlet's stack data is typically partly at its correct +place in the stack, and partly saved away in the heap, but always in +the above configuration: two blocks, the more recent one in the heap +and the older one still in the stack (either block may be empty). + +Greenlets are chained: each points to the previous greenlet, which is +the one that owns the data currently in the C stack above my +stack_stop. The currently running greenlet is the first element of +this chain. The main (initial) greenlet is the last one. Greenlets +whose stack is entirely in the heap can be skipped from the chain. + +The chain is not related to execution order, but only to the order +in which bits of C stack happen to belong to greenlets at a particular +point in time. + +The main greenlet doesn't have a stack_stop: it is responsible for the +complete rest of the C stack, and we don't know where it begins. We +use (char*) -1, the largest possible address. + +States: + stack_stop == NULL && stack_start == NULL: did not start yet + stack_stop != NULL && stack_start == NULL: already finished + stack_stop != NULL && stack_start != NULL: active + +The running greenlet's stack_start is undefined but not NULL. + + ***********************************************************/ + + + + +/***********************************************************/ + +/* Some functions must not be inlined: + * slp_restore_state, when inlined into slp_switch might cause + it to restore stack over its own local variables + * slp_save_state, when inlined would add its own local + variables to the saved stack, wasting space + * slp_switch, cannot be inlined for obvious reasons + * g_initialstub, when inlined would receive a pointer into its + own stack frame, leading to incomplete stack save/restore + +g_initialstub is a member function and declared virtual so that the +compiler always calls it through a vtable. + +slp_save_state and slp_restore_state are also member functions. They +are called from trampoline functions that themselves are declared as +not eligible for inlining. +*/ + +extern "C" { +static int GREENLET_NOINLINE(slp_save_state_trampoline)(char* stackref) +{ + return switching_thread_state->slp_save_state(stackref); +} +static void GREENLET_NOINLINE(slp_restore_state_trampoline)() +{ + switching_thread_state->slp_restore_state(); +} +} + + +/***********************************************************/ + + +#include "PyModule.cpp" + + + +static PyObject* +greenlet_internal_mod_init() noexcept +{ + static void* _PyGreenlet_API[PyGreenlet_API_pointers]; + + try { + CreatedModule m(greenlet_module_def); + + Require(PyType_Ready(&PyGreenlet_Type)); + Require(PyType_Ready(&PyGreenletUnswitchable_Type)); + + mod_globs = new greenlet::GreenletGlobals; + ThreadState::init(); + + m.PyAddObject("greenlet", PyGreenlet_Type); + m.PyAddObject("UnswitchableGreenlet", PyGreenletUnswitchable_Type); + m.PyAddObject("error", mod_globs->PyExc_GreenletError); + m.PyAddObject("GreenletExit", mod_globs->PyExc_GreenletExit); + + m.PyAddObject("GREENLET_USE_GC", 1); + m.PyAddObject("GREENLET_USE_TRACING", 1); + m.PyAddObject("GREENLET_USE_CONTEXT_VARS", 1L); + m.PyAddObject("GREENLET_USE_STANDARD_THREADING", 1L); + + NewReference clocks_per_sec(Require(PyLong_FromSsize_t(CLOCKS_PER_SEC))); + m.PyAddObject("CLOCKS_PER_SEC", clocks_per_sec); + + /* also publish module-level data as attributes of the greentype. */ + // XXX: This is weird, and enables a strange pattern of + // confusing the class greenlet with the module greenlet; with + // the exception of (possibly) ``getcurrent()``, this + // shouldn't be encouraged so don't add new items here. + for (const char* const* p = copy_on_greentype; *p; p++) { + OwnedObject o = m.PyRequireAttr(*p); + Require(PyDict_SetItemString(PyGreenlet_Type.tp_dict, *p, o.borrow())); + } + + /* + * Expose C API + */ + + /* types */ + _PyGreenlet_API[PyGreenlet_Type_NUM] = (void*)&PyGreenlet_Type; + + /* exceptions */ + _PyGreenlet_API[PyExc_GreenletError_NUM] = (void*)mod_globs->PyExc_GreenletError; + _PyGreenlet_API[PyExc_GreenletExit_NUM] = (void*)mod_globs->PyExc_GreenletExit; + + /* methods */ + _PyGreenlet_API[PyGreenlet_New_NUM] = (void*)PyGreenlet_New; + _PyGreenlet_API[PyGreenlet_GetCurrent_NUM] = (void*)PyGreenlet_GetCurrent; + _PyGreenlet_API[PyGreenlet_Throw_NUM] = (void*)PyGreenlet_Throw; + _PyGreenlet_API[PyGreenlet_Switch_NUM] = (void*)PyGreenlet_Switch; + _PyGreenlet_API[PyGreenlet_SetParent_NUM] = (void*)PyGreenlet_SetParent; + + /* Previously macros, but now need to be functions externally. */ + _PyGreenlet_API[PyGreenlet_MAIN_NUM] = (void*)Extern_PyGreenlet_MAIN; + _PyGreenlet_API[PyGreenlet_STARTED_NUM] = (void*)Extern_PyGreenlet_STARTED; + _PyGreenlet_API[PyGreenlet_ACTIVE_NUM] = (void*)Extern_PyGreenlet_ACTIVE; + _PyGreenlet_API[PyGreenlet_GET_PARENT_NUM] = (void*)Extern_PyGreenlet_GET_PARENT; + + /* XXX: Note that our module name is ``greenlet._greenlet``, but for + backwards compatibility with existing C code, we need the _C_API to + be directly in greenlet. + */ + const NewReference c_api_object(Require( + PyCapsule_New( + (void*)_PyGreenlet_API, + "greenlet._C_API", + NULL))); + m.PyAddObject("_C_API", c_api_object); + assert(c_api_object.REFCNT() == 2); + + // cerr << "Sizes:" + // << "\n\tGreenlet : " << sizeof(Greenlet) + // << "\n\tUserGreenlet : " << sizeof(UserGreenlet) + // << "\n\tMainGreenlet : " << sizeof(MainGreenlet) + // << "\n\tExceptionState : " << sizeof(greenlet::ExceptionState) + // << "\n\tPythonState : " << sizeof(greenlet::PythonState) + // << "\n\tStackState : " << sizeof(greenlet::StackState) + // << "\n\tSwitchingArgs : " << sizeof(greenlet::SwitchingArgs) + // << "\n\tOwnedObject : " << sizeof(greenlet::refs::OwnedObject) + // << "\n\tBorrowedObject : " << sizeof(greenlet::refs::BorrowedObject) + // << "\n\tPyGreenlet : " << sizeof(PyGreenlet) + // << endl; + +#ifdef Py_GIL_DISABLED + PyUnstable_Module_SetGIL(m.borrow(), Py_MOD_GIL_NOT_USED); +#endif + + return m.borrow(); // But really it's the main reference. + } + catch (const LockInitError& e) { + PyErr_SetString(PyExc_MemoryError, e.what()); + return NULL; + } + catch (const PyErrOccurred&) { + return NULL; + } + +} + +extern "C" { + +PyMODINIT_FUNC +PyInit__greenlet(void) +{ + return greenlet_internal_mod_init(); +} + +}; // extern C + +#ifdef __clang__ +# pragma clang diagnostic pop +#elif defined(__GNUC__) +# pragma GCC diagnostic pop +#endif diff --git a/venv/Lib/site-packages/greenlet/greenlet.h b/venv/Lib/site-packages/greenlet/greenlet.h new file mode 100644 index 0000000..9cc3877 --- /dev/null +++ b/venv/Lib/site-packages/greenlet/greenlet.h @@ -0,0 +1,164 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ + +/* Greenlet object interface */ + +#ifndef Py_GREENLETOBJECT_H +#define Py_GREENLETOBJECT_H + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* This is deprecated and undocumented. It does not change. */ +#define GREENLET_VERSION "1.0.0" + +#ifndef GREENLET_MODULE +#define implementation_ptr_t void* +#endif + +typedef struct _greenlet { + PyObject_HEAD + PyObject* weakreflist; + PyObject* dict; + implementation_ptr_t pimpl; +} PyGreenlet; + +#define PyGreenlet_Check(op) (op && PyObject_TypeCheck(op, &PyGreenlet_Type)) + + +/* C API functions */ + +/* Total number of symbols that are exported */ +#define PyGreenlet_API_pointers 12 + +#define PyGreenlet_Type_NUM 0 +#define PyExc_GreenletError_NUM 1 +#define PyExc_GreenletExit_NUM 2 + +#define PyGreenlet_New_NUM 3 +#define PyGreenlet_GetCurrent_NUM 4 +#define PyGreenlet_Throw_NUM 5 +#define PyGreenlet_Switch_NUM 6 +#define PyGreenlet_SetParent_NUM 7 + +#define PyGreenlet_MAIN_NUM 8 +#define PyGreenlet_STARTED_NUM 9 +#define PyGreenlet_ACTIVE_NUM 10 +#define PyGreenlet_GET_PARENT_NUM 11 + +#ifndef GREENLET_MODULE +/* This section is used by modules that uses the greenlet C API */ +static void** _PyGreenlet_API = NULL; + +# define PyGreenlet_Type \ + (*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM]) + +# define PyExc_GreenletError \ + ((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM]) + +# define PyExc_GreenletExit \ + ((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM]) + +/* + * PyGreenlet_New(PyObject *args) + * + * greenlet.greenlet(run, parent=None) + */ +# define PyGreenlet_New \ + (*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \ + _PyGreenlet_API[PyGreenlet_New_NUM]) + +/* + * PyGreenlet_GetCurrent(void) + * + * greenlet.getcurrent() + */ +# define PyGreenlet_GetCurrent \ + (*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM]) + +/* + * PyGreenlet_Throw( + * PyGreenlet *greenlet, + * PyObject *typ, + * PyObject *val, + * PyObject *tb) + * + * g.throw(...) + */ +# define PyGreenlet_Throw \ + (*(PyObject * (*)(PyGreenlet * self, \ + PyObject * typ, \ + PyObject * val, \ + PyObject * tb)) \ + _PyGreenlet_API[PyGreenlet_Throw_NUM]) + +/* + * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args) + * + * g.switch(*args, **kwargs) + */ +# define PyGreenlet_Switch \ + (*(PyObject * \ + (*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \ + _PyGreenlet_API[PyGreenlet_Switch_NUM]) + +/* + * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent) + * + * g.parent = new_parent + */ +# define PyGreenlet_SetParent \ + (*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \ + _PyGreenlet_API[PyGreenlet_SetParent_NUM]) + +/* + * PyGreenlet_GetParent(PyObject* greenlet) + * + * return greenlet.parent; + * + * This could return NULL even if there is no exception active. + * If it does not return NULL, you are responsible for decrementing the + * reference count. + */ +# define PyGreenlet_GetParent \ + (*(PyGreenlet* (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_GET_PARENT_NUM]) + +/* + * deprecated, undocumented alias. + */ +# define PyGreenlet_GET_PARENT PyGreenlet_GetParent + +# define PyGreenlet_MAIN \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_MAIN_NUM]) + +# define PyGreenlet_STARTED \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_STARTED_NUM]) + +# define PyGreenlet_ACTIVE \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_ACTIVE_NUM]) + + + + +/* Macro that imports greenlet and initializes C API */ +/* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we + keep the older definition to be sure older code that might have a copy of + the header still works. */ +# define PyGreenlet_Import() \ + { \ + _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \ + } + +#endif /* GREENLET_MODULE */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GREENLETOBJECT_H */