From: Serhiy Storchaka Date: Thu, 12 Nov 2015 09:59:03 +0000 (+0200) Subject: Issue #22995: Default implementation of __reduce__ and __reduce_ex__ now X-Git-Tag: v2.7.11rc1~29 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fedcf9474e73a8cb209a61f513f46fb062f2cd11;p=python Issue #22995: Default implementation of __reduce__ and __reduce_ex__ now rejects builtin types with not defined __new__. --- diff --git a/Misc/NEWS b/Misc/NEWS index 03aac95da4..e9251039d2 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 2.7.11? Core and Builtins ----------------- +- Issue #22995: Default implementation of __reduce__ and __reduce_ex__ now + rejects builtin types with not defined __new__. + - Issue #7267: format(int, 'c') now raises OverflowError when the argument is not in range(0, 256). diff --git a/Objects/typeobject.c b/Objects/typeobject.c index d3e5384a6d..720a84e97e 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -3214,6 +3214,13 @@ reduce_2(PyObject *obj) if (cls == NULL) return NULL; + if (PyType_Check(cls) && ((PyTypeObject *)cls)->tp_new == NULL) { + PyErr_Format(PyExc_TypeError, + "can't pickle %s objects", + ((PyTypeObject *)cls)->tp_name); + return NULL; + } + getnewargs = PyObject_GetAttrString(obj, "__getnewargs__"); if (getnewargs != NULL) { args = PyObject_CallObject(getnewargs, NULL);