Commit cc6e87b2 authored by Alexandre Vassalotti's avatar Alexandre Vassalotti

Issue #19088: Merge with 3.3.

parents 8ddd59e8 1a83070d
...@@ -22,6 +22,9 @@ Library ...@@ -22,6 +22,9 @@ Library
constructor is given a str. Move the array module typecode documentation to constructor is given a str. Move the array module typecode documentation to
the docstring of the constructor. the docstring of the constructor.
- Issue #19088: Fixed incorrect caching of the copyreg module in
object.__reduce__() and object.__reduce_ex__().
- Issue #19698: Removed exec_module() methods from - Issue #19698: Removed exec_module() methods from
importlib.machinery.BuiltinImporter and ExtensionFileLoader. importlib.machinery.BuiltinImporter and ExtensionFileLoader.
......
...@@ -7,10 +7,6 @@ ...@@ -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
...@@ -79,9 +75,6 @@ void ...@@ -79,9 +75,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
...@@ -3390,19 +3383,29 @@ static PyGetSetDef object_getsets[] = { ...@@ -3390,19 +3383,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()) {
return NULL;
} }
return PyImport_Import(copyreg_str);
Py_XINCREF(cached_copyreg_module);
return cached_copyreg_module;
} }
Py_LOCAL(PyObject *) Py_LOCAL(PyObject *)
......
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