From: Alexandre Vassalotti Date: Sun, 24 Nov 2013 10:53:45 +0000 (-0800) Subject: Make Ellipsis and NotImplemented picklable through the reduce protocol. X-Git-Tag: v3.4.0b1~11 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c49477b1848d5f7f1a98c6f19931d75c29019c7e;p=python Make Ellipsis and NotImplemented picklable through the reduce protocol. --- diff --git a/Lib/pickle.py b/Lib/pickle.py index d4aa13bd0c..cf8e2c5964 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 f0c918f87e..31875555e2 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 395e28d63e..11718aaae2 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 52f1c89ded..104952333a 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 */