diff options
author | Alexandre Vassalotti <alexandre@peadrop.com> | 2008-06-10 04:03:04 (GMT) |
---|---|---|
committer | Alexandre Vassalotti <alexandre@peadrop.com> | 2008-06-10 04:03:04 (GMT) |
commit | 7505607ae764d2095f15fcfb1a0f89843231ba7e (patch) | |
tree | c90ef9c1896e05447590b2fb1213fdf6e4aaf0d6 | |
parent | 1c9a2d96ec511e89b72db9d6c883f8266166f656 (diff) | |
download | cpython-7505607ae764d2095f15fcfb1a0f89843231ba7e.zip cpython-7505607ae764d2095f15fcfb1a0f89843231ba7e.tar.gz cpython-7505607ae764d2095f15fcfb1a0f89843231ba7e.tar.bz2 |
Issue 2582: Fix pickling of range objects.
-rw-r--r-- | Lib/test/test_range.py | 10 | ||||
-rw-r--r-- | Objects/rangeobject.c | 9 |
2 files changed, 19 insertions, 0 deletions
diff --git a/Lib/test/test_range.py b/Lib/test/test_range.py index 1fd8f1d..b14a22b 100644 --- a/Lib/test/test_range.py +++ b/Lib/test/test_range.py @@ -2,6 +2,7 @@ import test.support, unittest import sys +import pickle import warnings warnings.filterwarnings("ignore", "integer argument expected", @@ -61,6 +62,15 @@ class RangeTest(unittest.TestCase): self.assertEqual(repr(range(1, 2)), 'range(1, 2)') self.assertEqual(repr(range(1, 2, 3)), 'range(1, 2, 3)') + def test_pickling(self): + testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1), + (13, 21, 3), (-2, 2, 2)] + for proto in range(pickle.HIGHEST_PROTOCOL): + for t in testcases: + r = range(*t) + self.assertEquals(list(pickle.loads(pickle.dumps(r, proto))), + list(r)) + def test_main(): test.support.run_unittest(RangeTest) diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index cd5a804..f9a9cc9 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -252,6 +252,14 @@ range_repr(rangeobject *r) r->start, r->stop, r->step); } +/* Pickling support */ +static PyObject * +range_reduce(rangeobject *r, PyObject *args) +{ + return Py_BuildValue("(O(OOO))", Py_TYPE(r), + r->start, r->stop, r->step); +} + static PySequenceMethods range_as_sequence = { (lenfunc)range_length, /* sq_length */ 0, /* sq_concat */ @@ -269,6 +277,7 @@ PyDoc_STRVAR(reverse_doc, static PyMethodDef range_methods[] = { {"__reversed__", (PyCFunction)range_reverse, METH_NOARGS, reverse_doc}, + {"__reduce__", (PyCFunction)range_reduce, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; |