From: Barry Warsaw Date: Mon, 11 Jan 2016 20:51:27 +0000 (-0500) Subject: As per further discussion, re-enable the typeobject.c guard for picklability. X-Git-Tag: v3.6.0a1~792^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3d220cc4d7be841e97d2b43bde6534081b06c001;p=python As per further discussion, re-enable the typeobject.c guard for picklability. upstreams such as Cython will have to adjust. --- 3d220cc4d7be841e97d2b43bde6534081b06c001 diff --cc Misc/NEWS index 593ed2475e,7bdce71301..e062d918ce --- a/Misc/NEWS +++ b/Misc/NEWS @@@ -10,9 -10,9 +10,6 @@@ Release date: tb 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 diff --cc Objects/typeobject.c index f92f1e9cfe,415f91689f..db15cf6768 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@@ -3872,33 -3866,6 +3872,24 @@@ _PyObject_GetState(PyObject *obj, int r } 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;