mirror of https://github.com/python/cpython
Issue #19088: Fix incorrect caching of the copyreg module.
This fix does not cause any degradation in performance.
This commit is contained in:
parent
04a684b2f2
commit
1a83070d9e
|
@ -18,6 +18,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #19088: Fixed incorrect caching of the copyreg module in
|
||||||
|
object.__reduce__() and object.__reduce_ex__().
|
||||||
|
|
||||||
- Issue #11508: Fixed uuid.getnode() and uuid.uuid1() on environment with
|
- Issue #11508: Fixed uuid.getnode() and uuid.uuid1() on environment with
|
||||||
virtual interface. Original patch by Kent Frazier.
|
virtual interface. Original patch by Kent Frazier.
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,6 @@
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
|
|
||||||
/* Cached lookup of the copyreg module, for faster __reduce__ calls */
|
|
||||||
|
|
||||||
static PyObject *cached_copyreg_module = NULL;
|
|
||||||
|
|
||||||
/* Support type attribute cache */
|
/* Support type attribute cache */
|
||||||
|
|
||||||
/* The cache can keep references to the names alive for longer than
|
/* The cache can keep references to the names alive for longer than
|
||||||
|
@ -73,9 +69,6 @@ void
|
||||||
_PyType_Fini(void)
|
_PyType_Fini(void)
|
||||||
{
|
{
|
||||||
PyType_ClearCache();
|
PyType_ClearCache();
|
||||||
/* Need to forget our obsolete instance of the copyreg module at
|
|
||||||
* interpreter shutdown (issue #17408). */
|
|
||||||
Py_CLEAR(cached_copyreg_module);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -3348,19 +3341,29 @@ static PyGetSetDef object_getsets[] = {
|
||||||
static PyObject *
|
static PyObject *
|
||||||
import_copyreg(void)
|
import_copyreg(void)
|
||||||
{
|
{
|
||||||
static PyObject *copyreg_str;
|
PyObject *copyreg_str;
|
||||||
|
PyObject *copyreg_module;
|
||||||
|
PyInterpreterState *interp = PyThreadState_GET()->interp;
|
||||||
|
_Py_IDENTIFIER(copyreg);
|
||||||
|
|
||||||
if (!copyreg_str) {
|
copyreg_str = _PyUnicode_FromId(&PyId_copyreg);
|
||||||
copyreg_str = PyUnicode_InternFromString("copyreg");
|
if (copyreg_str == NULL) {
|
||||||
if (copyreg_str == NULL)
|
return NULL;
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
if (!cached_copyreg_module) {
|
/* Try to fetch cached copy of copyreg from sys.modules first in an
|
||||||
cached_copyreg_module = PyImport_Import(copyreg_str);
|
attempt to avoid the import overhead. Previously this was implemented
|
||||||
|
by storing a reference to the cached module in a static variable, but
|
||||||
|
this broke when multiple embeded interpreters were in use (see issue
|
||||||
|
#17408 and #19088). */
|
||||||
|
copyreg_module = PyDict_GetItemWithError(interp->modules, copyreg_str);
|
||||||
|
if (copyreg_module != NULL) {
|
||||||
|
Py_INCREF(copyreg_module);
|
||||||
|
return copyreg_module;
|
||||||
}
|
}
|
||||||
|
if (PyErr_Occurred()) {
|
||||||
Py_XINCREF(cached_copyreg_module);
|
return NULL;
|
||||||
return cached_copyreg_module;
|
}
|
||||||
|
return PyImport_Import(copyreg_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
|
Loading…
Reference in New Issue