diff options
author | Stefan Behnel <stefan_ml@behnel.de> | 2021-04-20 18:16:52 +0200 |
---|---|---|
committer | Stefan Behnel <stefan_ml@behnel.de> | 2021-04-20 18:16:52 +0200 |
commit | 184146d9b4aeb1f4eaba898f71369bcdc4245776 (patch) | |
tree | cff7a913348694fbcb248c21cda50e1c06ae75ef | |
parent | a29b2a6b3598af1e893468d052d57d983b562d5e (diff) | |
download | cython-184146d9b4aeb1f4eaba898f71369bcdc4245776.tar.gz |
Reduce overhead in gc.enable/disable during PyType_Ready() calls.
-rw-r--r-- | Cython/Utility/ExtensionTypes.c | 14 |
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 |