From 13936697f60feedd560d16c94e2524453bb1255a Mon Sep 17 00:00:00 2001
From: Raymond Hettinger <python@rcn.com>
Date: Wed, 11 Apr 2007 18:40:58 +0000
Subject: [PATCH] SF 1191699:  Make slices picklable

---
 Lib/test/test_slice.py |  8 ++++++++
 Misc/NEWS              |  2 ++
 Objects/sliceobject.c  | 10 ++++++++++
 3 files changed, 20 insertions(+)

diff --git a/Lib/test/test_slice.py b/Lib/test/test_slice.py
index c34d9ea4ad..83f051f688 100644
--- a/Lib/test/test_slice.py
+++ b/Lib/test/test_slice.py
@@ -2,6 +2,7 @@
 
 import unittest
 from test import test_support
+from cPickle import loads, dumps
 
 import sys
 
@@ -102,6 +103,13 @@ class SliceTest(unittest.TestCase):
         x[1:2] = 42
         self.assertEquals(tmp, [(1, 2, 42)])
 
+    def test_pickle(self):
+        s = slice(10, 20, 3)
+        for protocol in (0,1,2):
+            t = loads(dumps(s, protocol))
+            self.assertEqual(s, t)
+            self.assertEqual(s.indices(15), t.indices(15))
+            self.assertNotEqual(id(s), id(t))
 
 def test_main():
     test_support.run_unittest(SliceTest)
diff --git a/Misc/NEWS b/Misc/NEWS
index d15f673275..96b8b1d8cb 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@ What's New in Python 2.6 alpha 1?
 Core and builtins
 -----------------
 
+- Request #1191699:  Slices can now be pickled.
+
 - Patch #1682205: a TypeError while unpacking an iterable is no longer
   masked by a generic one with the message "unpack non-sequence".
 
diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c
index d8a24653a7..3fb1430308 100644
--- a/Objects/sliceobject.c
+++ b/Objects/sliceobject.c
@@ -274,9 +274,19 @@ indices, and the stride length of the extended slice described by\n\
 S. Out of bounds indices are clipped in a manner consistent with the\n\
 handling of normal slices.");
 
+static PyObject *
+slice_reduce(PySliceObject* self)
+{
+	return Py_BuildValue("O(OOO)", self->ob_type, self->start, self->stop, self->step);
+}
+
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
+
 static PyMethodDef slice_methods[] = {
 	{"indices",	(PyCFunction)slice_indices,
 	 METH_O,	slice_indices_doc},
+	{"__reduce__",	(PyCFunction)slice_reduce,
+	 METH_NOARGS,	reduce_doc},
 	{NULL, NULL}
 };
 
-- 
2.40.0