Library
-------
+- Issue #3693: Make the error message more helpful when the array.array()
+ constructor is given a str. Move the array module typecode documentation to
+ 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
+ importlib.machinery.BuiltinImporter and ExtensionFileLoader.
+
+- ssl.create_default_context() sets OP_NO_COMPRESSION to prevent CRIME.
+
+- Issue #19802: Add socket.SO_PRIORITY.
+
- Issue #11508: Fixed uuid.getnode() and uuid.uuid1() on environment with
virtual interface. Original patch by Kent Frazier.
static PyObject *
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_InternFromString("copyreg");
- if (copyreg_str == NULL)
- return NULL;
+ copyreg_str = _PyUnicode_FromId(&PyId_copyreg);
+ if (copyreg_str == NULL) {
+ return NULL;
}
- if (!cached_copyreg_module) {
- cached_copyreg_module = PyImport_Import(copyreg_str);
+ /* Try to fetch cached copy of copyreg from sys.modules first in an
+ 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;
}
-
- Py_XINCREF(cached_copyreg_module);
- return cached_copyreg_module;
+ return PyImport_Import(copyreg_str);
}
-static PyObject *
-slotnames(PyObject *cls)
+Py_LOCAL(PyObject *)
+_PyType_GetSlotNames(PyTypeObject *cls)
{
- PyObject *clsdict;
PyObject *copyreg;
PyObject *slotnames;
_Py_IDENTIFIER(__slotnames__);