]> granicus.if.org Git - python/commitdiff
Make Ellipsis and NotImplemented picklable through the reduce protocol.
authorAlexandre Vassalotti <alexandre@peadrop.com>
Sun, 24 Nov 2013 10:53:45 +0000 (02:53 -0800)
committerAlexandre Vassalotti <alexandre@peadrop.com>
Sun, 24 Nov 2013 10:53:45 +0000 (02:53 -0800)
Lib/pickle.py
Modules/_pickle.c
Objects/object.c
Objects/sliceobject.c

index d4aa13bd0c635ad6a7caea9059f539c8fa34c68a..cf8e2c5964d41f1637a817b2bbe94be476310ee4 100644 (file)
@@ -633,14 +633,6 @@ 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(NEWTRUE if obj else NEWFALSE)
index f0c918f87e036a78d99a7afac6d56afa0e1c1e39..31875555e2676f86b2fe594db418f0686c604e48 100644 (file)
@@ -3171,30 +3171,6 @@ save_global(PicklerObject *self, PyObject *obj, PyObject *name)
     return status;
 }
 
-static int
-save_ellipsis(PicklerObject *self, PyObject *obj)
-{
-    PyObject *str = PyUnicode_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 = PyUnicode_FromString("NotImplemented");
-    int res;
-    if (str == NULL)
-        return -1;
-    res = save_global(self, Py_NotImplemented, str);
-    Py_DECREF(str);
-    return res;
-}
-
 static int
 save_pers(PicklerObject *self, PyObject *obj, PyObject *func)
 {
@@ -3552,14 +3528,6 @@ 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;
index 395e28d63ea0cbe4e87c7d50688f1bcad6151577..11718aaae2b61744a522ebb071a1c763aba415a4 100644 (file)
@@ -1464,6 +1464,17 @@ NotImplemented_repr(PyObject *op)
     return PyUnicode_FromString("NotImplemented");
 }
 
+static PyObject *
+NotImplemented_reduce(PyObject *op)
+{
+    return PyUnicode_FromString("NotImplemented");
+}
+
+static PyMethodDef notimplemented_methods[] = {
+    {"__reduce__", (PyCFunction)NotImplemented_reduce, METH_NOARGS, NULL},
+    {NULL, NULL}
+};
+
 static PyObject *
 notimplemented_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
 {
@@ -1511,7 +1522,7 @@ static PyTypeObject PyNotImplemented_Type = {
     0,                  /*tp_weaklistoffset */
     0,                  /*tp_iter */
     0,                  /*tp_iternext */
-    0,                  /*tp_methods */
+    notimplemented_methods, /*tp_methods */
     0,                  /*tp_members */
     0,                  /*tp_getset */
     0,                  /*tp_base */
index 52f1c89ded95198f9ab4aafaef9701e637be6cc7..104952333a5ae3ed3214c1b9dbf67b25a206fe82 100644 (file)
@@ -33,6 +33,17 @@ ellipsis_repr(PyObject *op)
     return PyUnicode_FromString("Ellipsis");
 }
 
+static PyObject *
+ellipsis_reduce(PyObject *op)
+{
+    return PyUnicode_FromString("Ellipsis");
+}
+
+static PyMethodDef ellipsis_methods[] = {
+    {"__reduce__", (PyCFunction)ellipsis_reduce, METH_NOARGS, NULL},
+    {NULL, NULL}
+};
+
 PyTypeObject PyEllipsis_Type = {
     PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "ellipsis",                         /* tp_name */
@@ -61,7 +72,7 @@ PyTypeObject PyEllipsis_Type = {
     0,                                  /* tp_weaklistoffset */
     0,                                  /* tp_iter */
     0,                                  /* tp_iternext */
-    0,                                  /* tp_methods */
+    ellipsis_methods,                   /* tp_methods */
     0,                                  /* tp_members */
     0,                                  /* tp_getset */
     0,                                  /* tp_base */