]> granicus.if.org Git - python/commitdiff
Issue #22995: Instances of extension types with a state that aren't
authorSerhiy Storchaka <storchaka@gmail.com>
Fri, 25 Dec 2015 19:05:35 +0000 (21:05 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Fri, 25 Dec 2015 19:05:35 +0000 (21:05 +0200)
subclasses of list or dict and haven't implemented any pickle-related
methods (__reduce__, __reduce_ex__, __getnewargs__, __getnewargs_ex__,
or __getstate__), can no longer be pickled.  Including memoryview.

1  2 
Lib/test/test_csv.py
Misc/NEWS
Objects/typeobject.c

Simple merge
diff --cc Misc/NEWS
Simple merge
index 2e75ec378db0195a4a271d4e1fab8a573c73fbd1,f3c0c38ee65cb20930d256c578622d0d1d6fb327..4fac9e889bffe6c66e8c8a08b25df82761ccc373
@@@ -4157,9 -4169,9 +4177,9 @@@ reduce_newobj(PyObject *obj
              Py_INCREF(v);
              PyTuple_SET_ITEM(newargs, i+1, v);
          }
-         Py_DECREF(args);
+         Py_XDECREF(args);
      }
 -    else if (proto >= 4) {
 +    else {
          _Py_IDENTIFIER(__newobj_ex__);
  
          newobj = _PyObject_GetAttrId(copyreg, &PyId___newobj_ex__);
              return NULL;
          }
      }
 -    else {
 -        PyErr_SetString(PyExc_ValueError,
 -                        "must use protocol 4 or greater to copy this "
 -                        "object; since __getnewargs_ex__ returned "
 -                        "keyword arguments.");
 -        Py_DECREF(args);
 -        Py_DECREF(kwargs);
 -        Py_DECREF(copyreg);
 -        return NULL;
 -    }
  
-     state = _PyObject_GetState(obj);
+     state = _PyObject_GetState(obj,
+                 !hasargs && !PyList_Check(obj) && !PyDict_Check(obj));
      if (state == NULL) {
          Py_DECREF(newobj);
          Py_DECREF(newargs);