]> granicus.if.org Git - python/commitdiff
Issue 2582: Fix pickling of range objects.
authorAlexandre Vassalotti <alexandre@peadrop.com>
Tue, 10 Jun 2008 04:03:04 +0000 (04:03 +0000)
committerAlexandre Vassalotti <alexandre@peadrop.com>
Tue, 10 Jun 2008 04:03:04 +0000 (04:03 +0000)
Lib/test/test_range.py
Objects/rangeobject.c

index 1fd8f1d14107ecbb5a004d46c6b3f2fa7ac31047..b14a22b42e7e68e4d2aad63f88cae9470dfa0c97 100644 (file)
@@ -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)
 
index cd5a804fd92dc4f3e4fb4ec5fbd8a29e0ed6631f..f9a9cc99306223cdc94a3ce94ce63791145e7d05 100644 (file)
@@ -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 */
 };