Core and Builtins
-----------------
--- Issue #22995: [UPDATE] Comment out the one of the pickleability tests in
-- _PyObject_GetState() due to regressions observed in Cython-based projects.
--
- Issue #25961: Disallowed null characters in the type name.
- Issue #25973: Fix segfault when an invalid nonlocal statement binds a name
}
assert(slotnames == Py_None || PyList_Check(slotnames));
- #if 0
- /* 2016-01-11 barry - This clause breaks at least three packages which
- rely on Cython: kivy, pysam, and s3ql. Cython may be doing
- something funny under the hood, but as this is clearly a regression
- and the rationale for this prohibition is suspect, I am commenting
- this out. Perhaps it should just be removed. See issue #22995 for
- details.
- */
+ if (required) {
+ Py_ssize_t basicsize = PyBaseObject_Type.tp_basicsize;
+ if (obj->ob_type->tp_dictoffset)
+ basicsize += sizeof(PyObject *);
+ if (obj->ob_type->tp_weaklistoffset)
+ basicsize += sizeof(PyObject *);
+ if (slotnames != Py_None)
+ basicsize += sizeof(PyObject *) * Py_SIZE(slotnames);
+ if (obj->ob_type->tp_basicsize > basicsize) {
+ Py_DECREF(slotnames);
+ Py_DECREF(state);
+ PyErr_Format(PyExc_TypeError,
+ "can't pickle %.200s objects",
+ Py_TYPE(obj)->tp_name);
+ return NULL;
+ }
+ }
- #endif
+
if (slotnames != Py_None && Py_SIZE(slotnames) > 0) {
PyObject *slots;
Py_ssize_t slotnames_size, i;