]> granicus.if.org Git - python/commitdiff
Issue #19088: Merge with 3.3.
authorAlexandre Vassalotti <alexandre@peadrop.com>
Sat, 30 Nov 2013 09:05:51 +0000 (01:05 -0800)
committerAlexandre Vassalotti <alexandre@peadrop.com>
Sat, 30 Nov 2013 09:05:51 +0000 (01:05 -0800)
1  2 
Misc/NEWS
Objects/typeobject.c

diff --cc Misc/NEWS
index 3092821cdcc14c879af4a87194b0f5e28d5b7394,a0fcc2f38c2c427830b120f72727da6c2e048c4f..09d2516b1a6fc2b7f83f6ddd74144b08d25a27f8
+++ b/Misc/NEWS
@@@ -18,17 -18,9 +18,20 @@@ Core and Builtin
  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.
  
index 42a0a58b76163768be4b5b5041a0ea0914165508,8851faeeee5fc18db881c23af7d7111f48ac1c38..8b2ea1c1a667fa93c2319f4db3dacb24eadef962
@@@ -3390,24 -3341,35 +3383,34 @@@ static PyGetSetDef object_getsets[] = 
  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__);