Blocked revisions 67002 via svnmerge

........
  r67002 | hirokazu.yamamoto | 2008-10-23 09:37:33 +0900 | 1 line

  Issue #4183: Some tests didn't run with pickle.HIGHEST_PROTOCOL.
........
diff --git a/Lib/pickle.py b/Lib/pickle.py
index 37c3d52..2e55c8a 100644
--- a/Lib/pickle.py
+++ b/Lib/pickle.py
@@ -345,6 +345,9 @@
         else:
             self.write(PERSID + str(pid).encode("ascii") + b'\n')
 
+    def _isiter(self, obj):
+        return hasattr(obj, '__next__') and hasattr(obj, '__iter__')
+
     def save_reduce(self, func, args, state=None,
                     listitems=None, dictitems=None, obj=None):
         # This API is called by some subclasses
@@ -357,6 +360,16 @@
         if not hasattr(func, '__call__'):
             raise PicklingError("func from save_reduce() should be callable")
 
+        # Assert that listitems is an iterator
+        if listitems is not None and not self._isiter(listitems):
+            raise PicklingError("listitems from save_reduce() should be an "
+                                "iterator")
+
+        # Assert that dictitems is an iterator
+        if dictitems is not None and not self._isiter(dictitems):
+            raise PicklingError("dictitems from save_reduce() should be an "
+                                "iterator")
+
         save = self.save
         write = self.write