]> granicus.if.org Git - python/commitdiff
_reduce():
authorGuido van Rossum <guido@python.org>
Sat, 24 Nov 2001 21:04:31 +0000 (21:04 +0000)
committerGuido van Rossum <guido@python.org>
Sat, 24 Nov 2001 21:04:31 +0000 (21:04 +0000)
  - Fix for SF bug #482752: __getstate__ & __setstate__ ignored (by Anon.)

    In fact, only __getstate__ isn't recognized.  This fixes that.

  - Separately, the test for base.__flags__ & _HEAPTYPE raised an
    AttributeError exception when a classic class was amongst the
    bases.  Fixed this with a hasattr() bandaid (classic classes never
    qualify as the "hard" base class anyway, which is what the code is
    trying to find).

Lib/copy_reg.py

index d4697449a022bb011d93dcc3eade06a1409a6f69..92cbd5345b7163995ccb2961c1183fc9af7e4460 100644 (file)
@@ -46,7 +46,7 @@ _HEAPTYPE = 1<<9
 
 def _reduce(self):
     for base in self.__class__.__mro__:
-        if not base.__flags__ & _HEAPTYPE:
+        if hasattr(base, '__flags__') and not base.__flags__ & _HEAPTYPE:
             break
     else:
         base = object # not really reachable
@@ -56,9 +56,14 @@ def _reduce(self):
         state = base(self)
     args = (self.__class__, base, state)
     try:
-        dict = self.__dict__
+        getstate = self.__getstate__
     except AttributeError:
-        dict = None
+        try:
+            dict = self.__dict__
+        except AttributeError:
+            dict = None
+    else:
+        dict = getstate()
     if dict:
         return _reconstructor, args, dict
     else: