summaryrefslogtreecommitdiffstats
path: root/Lib/pickle.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2003-01-31 17:17:49 (GMT)
committerGuido van Rossum <guido@python.org>2003-01-31 17:17:49 (GMT)
commitf7f4517faeec7a37f5ad545092252a55e0450e10 (patch)
treee021afc066aef9d8e14beb0899b8063b2eac92d5 /Lib/pickle.py
parentd053b4b41663b3ebf5795790e390e1dab96f2d58 (diff)
downloadcpython-f7f4517faeec7a37f5ad545092252a55e0450e10.zip
cpython-f7f4517faeec7a37f5ad545092252a55e0450e10.tar.gz
cpython-f7f4517faeec7a37f5ad545092252a55e0450e10.tar.bz2
Pass the object to save_reduce(), so the memoize() call can go into
save_reduce(), before the state is pickled. This makes it possible for an object to be referenced from its own (mutable) state.
Diffstat (limited to 'Lib/pickle.py')
-rw-r--r--Lib/pickle.py11
1 files changed, 8 insertions, 3 deletions
diff --git a/Lib/pickle.py b/Lib/pickle.py
index bb840c9..ec19e24 100644
--- a/Lib/pickle.py
+++ b/Lib/pickle.py
@@ -329,8 +329,7 @@ class Pickler:
"exactly two or three elements" % reduce)
# Save the reduce() output and finally memoize the object
- self.save_reduce(func, args, state)
- self.memoize(obj)
+ self.save_reduce(func, args, state, obj)
def persistent_id(self, obj):
# This exists so a subclass can override it
@@ -344,7 +343,7 @@ class Pickler:
else:
self.write(PERSID + str(pid) + '\n')
- def save_reduce(self, func, args, state=None):
+ def save_reduce(self, func, args, state=None, obj=None):
# This API is be called by some subclasses
# Assert that args is a tuple or None
@@ -397,6 +396,9 @@ class Pickler:
if not hasattr(cls, "__new__"):
raise PicklingError(
"args[0] from __newobj__ args has no __new__")
+ if obj is not None and cls is not obj.__class__:
+ raise PicklingError(
+ "args[0] from __newobj__ args has the wrong class")
args = args[1:]
save(cls)
save(args)
@@ -406,6 +408,9 @@ class Pickler:
save(args)
write(REDUCE)
+ if obj is not None:
+ self.memoize(obj)
+
if state is not None:
save(state)
write(BUILD)