summaryrefslogtreecommitdiffstats
path: root/Lib/copy_reg.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/copy_reg.py')
-rw-r--r--Lib/copy_reg.py29
1 files changed, 29 insertions, 0 deletions
diff --git a/Lib/copy_reg.py b/Lib/copy_reg.py
index e4f0b3c..e93c2a3 100644
--- a/Lib/copy_reg.py
+++ b/Lib/copy_reg.py
@@ -33,3 +33,32 @@ def pickle_complex(c):
return complex, (c.real, c.imag)
pickle(type(1j), pickle_complex, complex)
+
+# Support for picking new-style objects
+
+_dummy_classes = {}
+
+def _reconstructor(cls, base, state):
+ dummy = _dummy_classes.get(base)
+ if dummy is None:
+ class dummy(base): pass
+ _dummy_classes[base] = dummy
+ obj = dummy(state)
+ obj._foo = 1; del obj._foo # hack to create __dict__
+ obj.__class__ = cls
+ return obj
+_reconstructor.__safe_for_unpickling__ = 1
+
+_HEAPTYPE = 1<<9
+
+def _reduce(self):
+ for base in self.__class__.__mro__:
+ if not base.__flags__ & _HEAPTYPE:
+ break
+ else:
+ base = object # not really reachable
+ if base is object:
+ state = None
+ else:
+ state = base(self)
+ return _reconstructor, (self.__class__, base, state), self.__dict__