Kaydet (Commit) 957a23b0 authored tarafından Antoine Pitrou's avatar Antoine Pitrou

Issue #17408: Avoid using an obsolete instance of the copyreg module when the…

Issue #17408: Avoid using an obsolete instance of the copyreg module when the interpreter is shutdown and then started again.
üst 5de183a0
...@@ -219,6 +219,7 @@ PyAPI_FUNC(void) PyFloat_Fini(void); ...@@ -219,6 +219,7 @@ PyAPI_FUNC(void) PyFloat_Fini(void);
PyAPI_FUNC(void) PyOS_FiniInterrupts(void); PyAPI_FUNC(void) PyOS_FiniInterrupts(void);
PyAPI_FUNC(void) _PyGC_Fini(void); PyAPI_FUNC(void) _PyGC_Fini(void);
PyAPI_FUNC(void) PySlice_Fini(void); PyAPI_FUNC(void) PySlice_Fini(void);
PyAPI_FUNC(void) _PyType_Fini(void);
PyAPI_DATA(PyThreadState *) _Py_Finalizing; PyAPI_DATA(PyThreadState *) _Py_Finalizing;
#endif #endif
......
...@@ -12,6 +12,9 @@ What's New in Python 3.3.2? ...@@ -12,6 +12,9 @@ What's New in Python 3.3.2?
Core and Builtins 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 - Issue #17863: In the interactive console, don't loop forever if the encoding
can't be fetched from stdin. can't be fetched from stdin.
......
...@@ -7,6 +7,10 @@ ...@@ -7,6 +7,10 @@
#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
...@@ -68,6 +72,15 @@ PyType_ClearCache(void) ...@@ -68,6 +72,15 @@ PyType_ClearCache(void)
return cur_version_tag; return cur_version_tag;
} }
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 void
PyType_Modified(PyTypeObject *type) PyType_Modified(PyTypeObject *type)
{ {
...@@ -3339,19 +3352,18 @@ static PyObject * ...@@ -3339,19 +3352,18 @@ static PyObject *
import_copyreg(void) import_copyreg(void)
{ {
static PyObject *copyreg_str; static PyObject *copyreg_str;
static PyObject *mod_copyreg = NULL;
if (!copyreg_str) { if (!copyreg_str) {
copyreg_str = PyUnicode_InternFromString("copyreg"); copyreg_str = PyUnicode_InternFromString("copyreg");
if (copyreg_str == NULL) if (copyreg_str == NULL)
return NULL; return NULL;
} }
if (!mod_copyreg) { if (!cached_copyreg_module) {
mod_copyreg = PyImport_Import(copyreg_str); cached_copyreg_module = PyImport_Import(copyreg_str);
} }
Py_XINCREF(mod_copyreg); Py_XINCREF(cached_copyreg_module);
return mod_copyreg; return cached_copyreg_module;
} }
static PyObject * static PyObject *
......
...@@ -506,9 +506,6 @@ Py_Finalize(void) ...@@ -506,9 +506,6 @@ Py_Finalize(void)
/* Disable signal handling */ /* Disable signal handling */
PyOS_FiniInterrupts(); PyOS_FiniInterrupts();
/* Clear type lookup cache */
PyType_ClearCache();
/* Collect garbage. This may call finalizers; it's nice to call these /* Collect garbage. This may call finalizers; it's nice to call these
* before all modules are destroyed. * before all modules are destroyed.
* XXX If a __del__ or weakref callback is triggered here, and tries to * XXX If a __del__ or weakref callback is triggered here, and tries to
...@@ -614,6 +611,7 @@ Py_Finalize(void) ...@@ -614,6 +611,7 @@ Py_Finalize(void)
PyFloat_Fini(); PyFloat_Fini();
PyDict_Fini(); PyDict_Fini();
PySlice_Fini(); PySlice_Fini();
_PyType_Fini();
/* Cleanup Unicode implementation */ /* Cleanup Unicode implementation */
_PyUnicode_Fini(); _PyUnicode_Fini();
......
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