Commit e8c18b79 authored by Jason Madden's avatar Jason Madden

Updates to work with greenlet 1.0a1

parent dc02c69c
...@@ -184,7 +184,7 @@ jobs: ...@@ -184,7 +184,7 @@ jobs:
# UnicodeEncodeError: 'ascii' codec can't encode character u'\u2588' in position 6: ordinal not in range(128) # UnicodeEncodeError: 'ascii' codec can't encode character u'\u2588' in position 6: ordinal not in range(128)
# when downloading files. This started sometime in mid 2020. It's from # when downloading files. This started sometime in mid 2020. It's from
# pip's vendored progress.bar class. # pip's vendored progress.bar class.
- &build-gevent-deps pip install -U -q setuptools wheel twine && pip install -q -U 'faulthandler; python_version == "2.7" and platform_python_implementation == "CPython"' 'cffi;platform_python_implementation=="CPython"' 'cython>=3.0a5' 'greenlet;platform_python_implementation=="CPython"' - &build-gevent-deps pip install -U -q setuptools wheel twine && pip install -q -U 'faulthandler; python_version == "2.7" and platform_python_implementation == "CPython"' 'cffi;platform_python_implementation=="CPython"' 'cython>=3.0a5' 'greenlet>=1.0a1;platform_python_implementation=="CPython"'
# Next, build the wheel *in place*. This helps ccache, and also lets us cache the configure # Next, build the wheel *in place*. This helps ccache, and also lets us cache the configure
# output (pip install uses a random temporary directory, making this difficult) # output (pip install uses a random temporary directory, making this difficult)
- python setup.py bdist_wheel - python setup.py bdist_wheel
......
...@@ -179,10 +179,11 @@ build_script: ...@@ -179,10 +179,11 @@ build_script:
# Try to get some things that don't wind up in the pip cache as # Try to get some things that don't wind up in the pip cache as
# built wheels if they're built during an isolated build. # built wheels if they're built during an isolated build.
- "%CMD_IN_ENV% %PYEXE% -m pip install --pre -U wheel cython setuptools cffi" - "%CMD_IN_ENV% %PYEXE% -m pip install --pre -U wheel cython setuptools cffi"
- if not "%GWHEEL_ONLY%"=="true" %PYEXE% -m pip install -U -e .[test] - if not "%GWHEEL_ONLY%"=="true" %PYEXE% -m pip install --pre -U -e .[test]
test_script: test_script:
# Run the project tests # Run the project tests
- if not "%GWHEEL_ONLY%"=="true" %PYEXE% -c "import greenlet; print(greenlet, greenlet.__version__)"
- if not "%GWHEEL_ONLY%"=="true" %PYEXE% -c "import gevent.core; print(gevent.core.loop)" - if not "%GWHEEL_ONLY%"=="true" %PYEXE% -c "import gevent.core; print(gevent.core.loop)"
- if not "%GWHEEL_ONLY%"=="true" %PYEXE% -c "import gevent; print(gevent.config.settings['resolver'].get_options())" - if not "%GWHEEL_ONLY%"=="true" %PYEXE% -c "import gevent; print(gevent.config.settings['resolver'].get_options())"
- if not "%GWHEEL_ONLY%"=="true" %PYEXE% -c "from gevent._compat import get_clock_info; print(get_clock_info('perf_counter'))" - if not "%GWHEEL_ONLY%"=="true" %PYEXE% -c "from gevent._compat import get_clock_info; print(get_clock_info('perf_counter'))"
......
/* vim:set noet ts=8 sw=8 : */ /* -*- indent-tabs-mode: nil; tab-width: 4; -*- */
/* Greenlet object interface */ /* Greenlet object interface */
...@@ -11,99 +11,85 @@ ...@@ -11,99 +11,85 @@
extern "C" { extern "C" {
#endif #endif
#define GREENLET_VERSION "0.4.17" /* This is deprecated and undocumented. It does not change. */
#define GREENLET_VERSION "1.0.0"
#if PY_VERSION_HEX >= 0x030700A3
# define GREENLET_USE_EXC_INFO
#endif
#ifndef GREENLET_USE_CONTEXT_VARS
#ifdef Py_CONTEXT_H
#define GREENLET_USE_CONTEXT_VARS 1
#else
#define GREENLET_USE_CONTEXT_VARS 0
#endif
#endif
typedef struct _greenlet { typedef struct _greenlet {
PyObject_HEAD PyObject_HEAD
char* stack_start; char* stack_start;
char* stack_stop; char* stack_stop;
char* stack_copy; char* stack_copy;
intptr_t stack_saved; intptr_t stack_saved;
struct _greenlet* stack_prev; struct _greenlet* stack_prev;
struct _greenlet* parent; struct _greenlet* parent;
PyObject* run_info; PyObject* run_info;
struct _frame* top_frame; struct _frame* top_frame;
int recursion_depth; int recursion_depth;
PyObject* weakreflist; PyObject* weakreflist;
#ifdef GREENLET_USE_EXC_INFO #if PY_VERSION_HEX >= 0x030700A3
_PyErr_StackItem* exc_info; _PyErr_StackItem* exc_info;
_PyErr_StackItem exc_state; _PyErr_StackItem exc_state;
#else #else
PyObject* exc_type; PyObject* exc_type;
PyObject* exc_value; PyObject* exc_value;
PyObject* exc_traceback; PyObject* exc_traceback;
#endif #endif
PyObject* dict; PyObject* dict;
#if GREENLET_USE_CONTEXT_VARS #if PY_VERSION_HEX >= 0x030700A3
PyObject* context; PyObject* context;
#endif #endif
} PyGreenlet; } PyGreenlet;
#define PyGreenlet_Check(op) PyObject_TypeCheck(op, &PyGreenlet_Type) #define PyGreenlet_Check(op) PyObject_TypeCheck(op, &PyGreenlet_Type)
#define PyGreenlet_MAIN(op) (((PyGreenlet*)(op))->stack_stop == (char*) -1) #define PyGreenlet_MAIN(op) (((PyGreenlet*)(op))->stack_stop == (char*)-1)
#define PyGreenlet_STARTED(op) (((PyGreenlet*)(op))->stack_stop != NULL) #define PyGreenlet_STARTED(op) (((PyGreenlet*)(op))->stack_stop != NULL)
#define PyGreenlet_ACTIVE(op) (((PyGreenlet*)(op))->stack_start != NULL) #define PyGreenlet_ACTIVE(op) (((PyGreenlet*)(op))->stack_start != NULL)
#define PyGreenlet_GET_PARENT(op) (((PyGreenlet*)(op))->parent) #define PyGreenlet_GET_PARENT(op) (((PyGreenlet*)(op))->parent)
#if (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 7) || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 1) || PY_MAJOR_VERSION > 3
#define GREENLET_USE_PYCAPSULE
#endif
/* C API functions */ /* C API functions */
/* Total number of symbols that are exported */ /* Total number of symbols that are exported */
#define PyGreenlet_API_pointers 8 #define PyGreenlet_API_pointers 8
#define PyGreenlet_Type_NUM 0 #define PyGreenlet_Type_NUM 0
#define PyExc_GreenletError_NUM 1 #define PyExc_GreenletError_NUM 1
#define PyExc_GreenletExit_NUM 2 #define PyExc_GreenletExit_NUM 2
#define PyGreenlet_New_NUM 3 #define PyGreenlet_New_NUM 3
#define PyGreenlet_GetCurrent_NUM 4 #define PyGreenlet_GetCurrent_NUM 4
#define PyGreenlet_Throw_NUM 5 #define PyGreenlet_Throw_NUM 5
#define PyGreenlet_Switch_NUM 6 #define PyGreenlet_Switch_NUM 6
#define PyGreenlet_SetParent_NUM 7 #define PyGreenlet_SetParent_NUM 7
#ifndef GREENLET_MODULE #ifndef GREENLET_MODULE
/* This section is used by modules that uses the greenlet C API */ /* This section is used by modules that uses the greenlet C API */
static void **_PyGreenlet_API = NULL; static void** _PyGreenlet_API = NULL;
#define PyGreenlet_Type (*(PyTypeObject *) _PyGreenlet_API[PyGreenlet_Type_NUM]) # define PyGreenlet_Type \
(*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM])
#define PyExc_GreenletError \ # define PyExc_GreenletError \
((PyObject *) _PyGreenlet_API[PyExc_GreenletError_NUM]) ((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM])
#define PyExc_GreenletExit \ # define PyExc_GreenletExit \
((PyObject *) _PyGreenlet_API[PyExc_GreenletExit_NUM]) ((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM])
/* /*
* PyGreenlet_New(PyObject *args) * PyGreenlet_New(PyObject *args)
* *
* greenlet.greenlet(run, parent=None) * greenlet.greenlet(run, parent=None)
*/ */
#define PyGreenlet_New \ # define PyGreenlet_New \
(* (PyGreenlet * (*)(PyObject *run, PyGreenlet *parent)) \ (*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \
_PyGreenlet_API[PyGreenlet_New_NUM]) _PyGreenlet_API[PyGreenlet_New_NUM])
/* /*
* PyGreenlet_GetCurrent(void) * PyGreenlet_GetCurrent(void)
* *
* greenlet.getcurrent() * greenlet.getcurrent()
*/ */
#define PyGreenlet_GetCurrent \ # define PyGreenlet_GetCurrent \
(* (PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM]) (*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM])
/* /*
* PyGreenlet_Throw( * PyGreenlet_Throw(
...@@ -114,51 +100,40 @@ static void **_PyGreenlet_API = NULL; ...@@ -114,51 +100,40 @@ static void **_PyGreenlet_API = NULL;
* *
* g.throw(...) * g.throw(...)
*/ */
#define PyGreenlet_Throw \ # define PyGreenlet_Throw \
(* (PyObject * (*) \ (*(PyObject * (*)(PyGreenlet * self, \
(PyGreenlet *self, PyObject *typ, PyObject *val, PyObject *tb)) \ PyObject * typ, \
_PyGreenlet_API[PyGreenlet_Throw_NUM]) PyObject * val, \
PyObject * tb)) \
_PyGreenlet_API[PyGreenlet_Throw_NUM])
/* /*
* PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args) * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args)
* *
* g.switch(*args, **kwargs) * g.switch(*args, **kwargs)
*/ */
#define PyGreenlet_Switch \ # define PyGreenlet_Switch \
(* (PyObject * (*)(PyGreenlet *greenlet, PyObject *args, PyObject *kwargs)) \ (*(PyObject * \
_PyGreenlet_API[PyGreenlet_Switch_NUM]) (*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \
_PyGreenlet_API[PyGreenlet_Switch_NUM])
/* /*
* PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent) * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent)
* *
* g.parent = new_parent * g.parent = new_parent
*/ */
#define PyGreenlet_SetParent \ # define PyGreenlet_SetParent \
(* (int (*)(PyGreenlet *greenlet, PyGreenlet *nparent)) \ (*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \
_PyGreenlet_API[PyGreenlet_SetParent_NUM]) _PyGreenlet_API[PyGreenlet_SetParent_NUM])
/* Macro that imports greenlet and initializes C API */ /* Macro that imports greenlet and initializes C API */
#ifdef GREENLET_USE_PYCAPSULE /* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we
#define PyGreenlet_Import() \ keep the older definition to be sure older code that might have a copy of
{ \ the header still works. */
_PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \ # define PyGreenlet_Import() \
} { \
#else _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \
#define PyGreenlet_Import() \ }
{ \
PyObject *module = PyImport_ImportModule("greenlet"); \
if (module != NULL) { \
PyObject *c_api_object = PyObject_GetAttrString( \
module, "_C_API"); \
if (c_api_object != NULL && PyCObject_Check(c_api_object)) { \
_PyGreenlet_API = \
(void **) PyCObject_AsVoidPtr(c_api_object); \
Py_DECREF(c_api_object); \
} \
Py_DECREF(module); \
} \
}
#endif
#endif /* GREENLET_MODULE */ #endif /* GREENLET_MODULE */
......
...@@ -26,7 +26,7 @@ requires = [ ...@@ -26,7 +26,7 @@ requires = [
# Python 3.7 requires at least 0.4.14, which is ABI incompatible with earlier # Python 3.7 requires at least 0.4.14, which is ABI incompatible with earlier
# releases. Python 3.9 and 3.10 require 0.4.16; # releases. Python 3.9 and 3.10 require 0.4.16;
# 0.4.17 is ABI incompatible with earlier releases. # 0.4.17 is ABI incompatible with earlier releases.
"greenlet >= 0.4.17 ; platform_python_implementation == 'CPython'", "greenlet >= 0.4.17, < 2.0 ; platform_python_implementation == 'CPython'",
] ]
[tool.towncrier] [tool.towncrier]
......
...@@ -192,8 +192,10 @@ greenlet_requires = [ ...@@ -192,8 +192,10 @@ greenlet_requires = [
# We need to watch our greenlet version fairly carefully, # We need to watch our greenlet version fairly carefully,
# since we compile cython code that extends the greenlet object. # since we compile cython code that extends the greenlet object.
# Binary compatibility would break if the greenlet struct changes. # Binary compatibility would break if the greenlet struct changes.
# (Which it did in 0.4.14 for Python 3.7) # (Which it did in 0.4.14 for Python 3.7 and again in 0.4.17; with
'greenlet >= 0.4.17; platform_python_implementation=="CPython"', # the release of 1.0a1 it began promising ABI stability with SemVer
# so we can add an upper bound)
'greenlet >= 0.4.17, < 2.0; platform_python_implementation=="CPython"',
] ]
# Note that we don't add cffi to install_requires, it's # Note that we don't add cffi to install_requires, it's
......
...@@ -148,6 +148,10 @@ class TestTree(greentest.TestCase): ...@@ -148,6 +148,10 @@ class TestTree(greentest.TestCase):
value = value.replace('ref=-1', 'ref=0') value = value.replace('ref=-1', 'ref=0')
value = value.replace("type.current_tree", 'GreenletTree.current_tree') value = value.replace("type.current_tree", 'GreenletTree.current_tree')
value = value.replace('gevent.tests.__main__.MyLocal', '__main__.MyLocal') value = value.replace('gevent.tests.__main__.MyLocal', '__main__.MyLocal')
# The repr in CPython greenlet 1.0a1 added extra info
value = value.replace('(otid=X) ', '')
value = value.replace(' dead>', '>')
value = value.replace(' current active started main>', '>')
return value return value
@greentest.ignores_leakcheck @greentest.ignores_leakcheck
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment