From c49477b1848d5f7f1a98c6f19931d75c29019c7e Mon Sep 17 00:00:00 2001 From: Alexandre Vassalotti Date: Sun, 24 Nov 2013 02:53:45 -0800 Subject: [PATCH] Make Ellipsis and NotImplemented picklable through the reduce protocol. --- Lib/pickle.py | 8 -------- Modules/_pickle.c | 32 -------------------------------- Objects/object.c | 13 ++++++++++++- Objects/sliceobject.c | 13 ++++++++++++- 4 files changed, 24 insertions(+), 42 deletions(-) diff --git a/Lib/pickle.py b/Lib/pickle.py index d4aa13bd0c6..cf8e2c5964d 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -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) diff --git a/Modules/_pickle.c b/Modules/_pickle.c index f0c918f87e0..31875555e26 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -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; diff --git a/Objects/object.c b/Objects/object.c index 395e28d63ea..11718aaae2b 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -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 */ diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c index 52f1c89ded9..104952333a5 100644 --- a/Objects/sliceobject.c +++ b/Objects/sliceobject.c @@ -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 */