[Python-checkins] cpython (3.3): Issue #17408: Avoid using an obsolete instance of the copyreg module when the
antoine.pitrou
python-checkins at python.org
Sat May 4 20:46:34 CEST 2013
http://hg.python.org/cpython/rev/8c1385205a35
changeset: 83612:8c1385205a35
branch: 3.3
parent: 83609:6bd2446f129a
user: Antoine Pitrou <solipsis at pitrou.net>
date: Sat May 04 20:45:02 2013 +0200
summary:
Issue #17408: Avoid using an obsolete instance of the copyreg module when the interpreter is shutdown and then started again.
files:
Include/pythonrun.h | 1 +
Misc/NEWS | 3 +++
Objects/typeobject.c | 26 +++++++++++++++++++-------
Python/pythonrun.c | 4 +---
4 files changed, 24 insertions(+), 10 deletions(-)
diff --git a/Include/pythonrun.h b/Include/pythonrun.h
--- a/Include/pythonrun.h
+++ b/Include/pythonrun.h
@@ -219,6 +219,7 @@
PyAPI_FUNC(void) PyOS_FiniInterrupts(void);
PyAPI_FUNC(void) _PyGC_Fini(void);
PyAPI_FUNC(void) PySlice_Fini(void);
+PyAPI_FUNC(void) _PyType_Fini(void);
PyAPI_DATA(PyThreadState *) _Py_Finalizing;
#endif
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@
Core and Builtins
-----------------
+- Issue #17408: Avoid using an obsolete instance of the copyreg module when
+ the interpreter is shutdown and then started again.
+
- Issue #17863: In the interactive console, don't loop forever if the encoding
can't be fetched from stdin.
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -7,6 +7,10 @@
#include <ctype.h>
+/* Cached lookup of the copyreg module, for faster __reduce__ calls */
+
+static PyObject *cached_copyreg_module = NULL;
+
/* Support type attribute cache */
/* The cache can keep references to the names alive for longer than
@@ -69,6 +73,15 @@
}
void
+_PyType_Fini(void)
+{
+ PyType_ClearCache();
+ /* Need to forget our obsolete instance of the copyreg module at
+ * interpreter shutdown (issue #17408). */
+ Py_CLEAR(cached_copyreg_module);
+}
+
+void
PyType_Modified(PyTypeObject *type)
{
/* Invalidate any cached data for the specified type and all
@@ -3339,19 +3352,18 @@
import_copyreg(void)
{
static PyObject *copyreg_str;
- static PyObject *mod_copyreg = NULL;
if (!copyreg_str) {
copyreg_str = PyUnicode_InternFromString("copyreg");
if (copyreg_str == NULL)
return NULL;
}
- if (!mod_copyreg) {
- mod_copyreg = PyImport_Import(copyreg_str);
- }
-
- Py_XINCREF(mod_copyreg);
- return mod_copyreg;
+ if (!cached_copyreg_module) {
+ cached_copyreg_module = PyImport_Import(copyreg_str);
+ }
+
+ Py_XINCREF(cached_copyreg_module);
+ return cached_copyreg_module;
}
static PyObject *
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -506,9 +506,6 @@
/* Disable signal handling */
PyOS_FiniInterrupts();
- /* Clear type lookup cache */
- PyType_ClearCache();
-
/* Collect garbage. This may call finalizers; it's nice to call these
* before all modules are destroyed.
* XXX If a __del__ or weakref callback is triggered here, and tries to
@@ -614,6 +611,7 @@
PyFloat_Fini();
PyDict_Fini();
PySlice_Fini();
+ _PyType_Fini();
/* Cleanup Unicode implementation */
_PyUnicode_Fini();
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list