]> granicus.if.org Git - python/commitdiff
Fixes #13842: cannot pickle Ellipsis or NotImplemented.
authorŁukasz Langa <lukasz@langa.pl>
Mon, 12 Mar 2012 18:46:12 +0000 (19:46 +0100)
committerŁukasz Langa <lukasz@langa.pl>
Mon, 12 Mar 2012 18:46:12 +0000 (19:46 +0100)
Thanks for James Sanders for the bug report and the patch.

Lib/pickle.py
Lib/test/pickletester.py
Misc/ACKS
Modules/_pickle.c

index 20b3646a5bf43ae6326dd86a6b82c8c56dbcc981..9e6536832721d4710dd6f520088bc50f3d9399e0 100644 (file)
@@ -438,6 +438,14 @@ class _Pickler:
         self.write(NONE)
     dispatch[type(None)] = 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)
index 1a551c8bde3e45731dd4bad9b286d4372caf2a8c..3686a62c663eb8af0b6166f0bd93cf1a678c502a 100644 (file)
@@ -743,6 +743,18 @@ class AbstractPickleTests(unittest.TestCase):
                 u = self.loads(s)
                 self.assertEqual(t, u)
 
+    def test_ellipsis(self):
+        for proto in protocols:
+            s = self.dumps(..., proto)
+            u = self.loads(s)
+            self.assertEqual(..., u)
+
+    def test_notimplemented(self):
+        for proto in protocols:
+            s = self.dumps(NotImplemented, proto)
+            u = self.loads(s)
+            self.assertEqual(NotImplemented, u)
+
     # Tests for protocol 2
 
     def test_proto(self):
index 49efa297f7a5b1a81f25d6c22cb8c91fbb52c436..a0685c1a0fabd20f9f45a599857448a3c7155027 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -883,6 +883,7 @@ George Sakkis
 Rich Salz
 Kevin Samborn
 Adrian Sampson
+James Sanders
 Ilya Sandler
 Mark Sapiro
 Ty Sarna
index 2dc3a4116dc6c41a7eb7007a86e56647d4049b87..4212e7a02fe350742fac854cc4ed1d954a109dc4 100644 (file)
@@ -2811,6 +2811,19 @@ save_global(PicklerObject *self, PyObject *obj, PyObject *name)
     return status;
 }
 
+static int
+save_ellipsis(PicklerObject *self, PyObject *obj)
+{
+    return save_global(self, Py_Ellipsis, PyUnicode_FromString("Ellipsis"));
+}
+
+static int
+save_notimplemented(PicklerObject *self, PyObject *obj)
+{
+    return save_global(self, Py_NotImplemented,
+                       PyUnicode_FromString("NotImplemented"));
+}
+
 static int
 save_pers(PicklerObject *self, PyObject *obj, PyObject *func)
 {
@@ -3114,6 +3127,14 @@ save(PicklerObject *self, PyObject *obj, int pers_save)
         status = save_none(self, obj);
         goto done;
     }
+    else if (obj == Py_Ellipsis) {
+        status = save_ellipsis(self, obj);
+        goto done;
+    }
+    else if (obj == Py_NotImplemented) {
+        status = save_notimplemented(self, obj);
+        goto done;
+    }
     else if (obj == Py_False || obj == Py_True) {
         status = save_bool(self, obj);
         goto done;