summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2021-04-20 18:16:52 +0200
committerStefan Behnel <stefan_ml@behnel.de>2021-04-20 18:16:52 +0200
commit184146d9b4aeb1f4eaba898f71369bcdc4245776 (patch)
treecff7a913348694fbcb248c21cda50e1c06ae75ef
parenta29b2a6b3598af1e893468d052d57d983b562d5e (diff)
downloadcython-184146d9b4aeb1f4eaba898f71369bcdc4245776.tar.gz
Reduce overhead in gc.enable/disable during PyType_Ready() calls.
-rw-r--r--Cython/Utility/ExtensionTypes.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/Cython/Utility/ExtensionTypes.c b/Cython/Utility/ExtensionTypes.c
index 2d8f2dff1..2b759aac7 100644
--- a/Cython/Utility/ExtensionTypes.c
+++ b/Cython/Utility/ExtensionTypes.c
@@ -8,6 +8,7 @@ static int __Pyx_PyType_Ready(PyTypeObject *t);/*proto*/
#endif
/////////////// PyType_Ready ///////////////
+//@requires: ObjectHandling.c::PyObjectCallMethod0
#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API
// Wrapper around PyType_Ready() with some runtime checks and fixes
@@ -73,9 +74,14 @@ static int __Pyx_PyType_Ready(PyTypeObject *t) {
// For details, see https://github.com/cython/cython/issues/3603
PyObject *ret, *py_status;
int gc_was_enabled;
- PyObject *gc = PyImport_Import(PYUNICODE("gc"));
+ PyObject *gc = NULL;
+ #if !CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM+0 >= 0x070304
+ // https://foss.heptapod.net/pypy/pypy/-/issues/3385
+ gc = PyImport_GetModule(PYUNICODE("gc"));
+ #endif
+ if (unlikely(!gc)) gc = PyImport_Import(PYUNICODE("gc"));
if (unlikely(!gc)) return -1;
- py_status = PyObject_CallMethodObjArgs(gc, PYUNICODE("isenabled"), NULL);
+ py_status = __Pyx_PyObject_CallMethod0(gc, PYUNICODE("isenabled"));
if (unlikely(!py_status)) {
Py_DECREF(gc);
return -1;
@@ -83,7 +89,7 @@ static int __Pyx_PyType_Ready(PyTypeObject *t) {
gc_was_enabled = __Pyx_PyObject_IsTrue(py_status);
Py_DECREF(py_status);
if (gc_was_enabled > 0) {
- ret = PyObject_CallMethodObjArgs(gc, PYUNICODE("disable"), NULL);
+ ret = __Pyx_PyObject_CallMethod0(gc, PYUNICODE("disable"));
if (unlikely(!ret)) {
Py_DECREF(gc);
return -1;
@@ -112,7 +118,7 @@ static int __Pyx_PyType_Ready(PyTypeObject *t) {
if (gc_was_enabled) {
PyObject *t, *v, *tb;
PyErr_Fetch(&t, &v, &tb);
- ret = PyObject_CallMethodObjArgs(gc, PYUNICODE("enable"), NULL);
+ ret = __Pyx_PyObject_CallMethod0(gc, PYUNICODE("enable"));
if (likely(ret || r == -1)) {
Py_XDECREF(ret);
// do not overwrite exceptions raised by PyType_Ready() above