changeset: 87669:d964d7023aa4 branch: 2.7 user: Alexandre Vassalotti date: Sat Nov 30 17:43:42 2013 -0800 files: Include/object.h Lib/pickle.py Lib/test/pickletester.py Misc/NEWS Modules/cPickle.c Objects/object.c description: Issue #6477: Revert fbb97f6eb3b3 as it broke test_xpickle. diff -r 9ca47b3babe5 -r d964d7023aa4 Include/object.h --- a/Include/object.h Sat Nov 30 16:56:36 2013 -0800 +++ b/Include/object.h Sat Nov 30 17:43:42 2013 -0800 @@ -829,9 +829,6 @@ PyAPI_FUNC(void) Py_IncRef(PyObject *); PyAPI_FUNC(void) Py_DecRef(PyObject *); -PyAPI_DATA(PyTypeObject) PyNone_Type; -PyAPI_DATA(PyTypeObject) PyNotImplemented_Type; - /* _Py_NoneStruct is an object of undefined type which can be used in contexts where NULL (nil) is not suitable (since NULL often means 'error'). diff -r 9ca47b3babe5 -r d964d7023aa4 Lib/pickle.py --- a/Lib/pickle.py Sat Nov 30 16:56:36 2013 -0800 +++ b/Lib/pickle.py Sat Nov 30 17:43:42 2013 -0800 @@ -427,14 +427,6 @@ self.write(NONE) dispatch[NoneType] = save_none - def save_ellipsis(self, obj): - self.save_global(Ellipsis, 'Ellipsis') - dispatch[type(Ellipsis)] = save_ellipsis - - def save_notimplemented(self, obj): - self.save_global(NotImplemented, 'NotImplemented') - dispatch[type(NotImplemented)] = save_notimplemented - def save_bool(self, obj): if self.proto >= 2: self.write(obj and NEWTRUE or NEWFALSE) @@ -778,18 +770,7 @@ dispatch[ClassType] = save_global dispatch[FunctionType] = save_global dispatch[BuiltinFunctionType] = save_global - - def save_type(self, obj): - if obj is type(None): - return self.save_reduce(type, (None,), obj=obj) - elif obj is type(NotImplemented): - return self.save_reduce(type, (NotImplemented,), obj=obj) - elif obj is type(Ellipsis): - return self.save_reduce(type, (Ellipsis,), obj=obj) - return self.save_global(obj) - - dispatch[TypeType] = save_type - + dispatch[TypeType] = save_global # Pickling helpers diff -r 9ca47b3babe5 -r d964d7023aa4 Lib/test/pickletester.py --- a/Lib/test/pickletester.py Sat Nov 30 16:56:36 2013 -0800 +++ b/Lib/test/pickletester.py Sat Nov 30 17:43:42 2013 -0800 @@ -661,15 +661,6 @@ u = self.loads(s) self.assertEqual(t, u) - def test_singleton_types(self): - # Issue #6477: Test that types of built-in singletons can be pickled. - singletons = [None, Ellipsis, NotImplemented] - for singleton in singletons: - for proto in protocols: - s = self.dumps(type(singleton), proto) - u = self.loads(s) - self.assertIs(type(singleton), u) - # Tests for protocol 2 def test_proto(self): diff -r 9ca47b3babe5 -r d964d7023aa4 Misc/NEWS --- a/Misc/NEWS Sat Nov 30 16:56:36 2013 -0800 +++ b/Misc/NEWS Sat Nov 30 17:43:42 2013 -0800 @@ -15,9 +15,6 @@ Library ------- -- Issue #6477: Added pickling support for built-in singletons (i.e., None, - Ellipsis and NotImplemented) and their respective types. - - Issue #16231: Fixed pickle.Pickler to only fallback to its default pickling behaviour when Pickler.persistent_id returns None, but not for any other false values. This allows false values other than None to be used as diff -r 9ca47b3babe5 -r d964d7023aa4 Modules/cPickle.c --- a/Modules/cPickle.c Sat Nov 30 16:56:36 2013 -0800 +++ b/Modules/cPickle.c Sat Nov 30 17:43:42 2013 -0800 @@ -2559,60 +2559,6 @@ } static int -save_ellipsis(Picklerobject *self, PyObject *obj) -{ - PyObject *str = PyString_FromString("Ellipsis"); - int res; - if (str == NULL) - return -1; - res = save_global(self, Py_Ellipsis, str); - Py_DECREF(str); - return res; -} - -static int -save_notimplemented(Picklerobject *self, PyObject *obj) -{ - PyObject *str = PyString_FromString("NotImplemented"); - int res; - if (str == NULL) - return -1; - res = save_global(self, Py_NotImplemented, str); - Py_DECREF(str); - return res; -} - -static int -save_singleton_type(Picklerobject *self, PyObject *obj, PyObject *singleton) -{ - PyObject *reduce_value; - int status; - - reduce_value = Py_BuildValue("O(O)", &PyType_Type, singleton); - if (reduce_value == NULL) { - return -1; - } - status = save_reduce(self, reduce_value, (PyObject *)self, obj); - Py_DECREF(reduce_value); - return status; -} - -static int -save_type(Picklerobject *self, PyObject *obj) -{ - if (obj == (PyObject *)&PyNone_Type) { - return save_singleton_type(self, obj, Py_None); - } - else if (obj == (PyObject *)&PyEllipsis_Type) { - return save_singleton_type(self, obj, Py_Ellipsis); - } - else if (obj == (PyObject *)&PyNotImplemented_Type) { - return save_singleton_type(self, obj, Py_NotImplemented); - } - return save_global(self, obj, NULL); -} - -static int save(Picklerobject *self, PyObject *args, int pers_save) { PyTypeObject *type; @@ -2634,14 +2580,6 @@ res = save_none(self, args); goto finally; } - else if (args == Py_Ellipsis) { - res = save_ellipsis(self, args); - goto finally; - } - else if (args == Py_NotImplemented) { - res = save_notimplemented(self, args); - goto finally; - } type = Py_TYPE(args); @@ -2733,7 +2671,7 @@ goto finally; } if (type == &PyType_Type) { - res = save_type(self, args); + res = save_global(self, args, NULL); goto finally; } break; diff -r 9ca47b3babe5 -r d964d7023aa4 Objects/object.c --- a/Objects/object.c Sat Nov 30 16:56:36 2013 -0800 +++ b/Objects/object.c Sat Nov 30 17:43:42 2013 -0800 @@ -2012,7 +2012,7 @@ } -PyTypeObject PyNone_Type = { +static PyTypeObject PyNone_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "NoneType", 0, @@ -2043,7 +2043,7 @@ return PyString_FromString("NotImplemented"); } -PyTypeObject PyNotImplemented_Type = { +static PyTypeObject PyNotImplemented_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "NotImplementedType", 0,