mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Issue #9935: Speed up pickling of instances of user-defined classes.
This commit is contained in:
parent
61ec8de809
commit
7eecffd05d
4 changed files with 104 additions and 48 deletions
|
@ -3,6 +3,7 @@ import unittest
|
|||
import pickle
|
||||
import pickletools
|
||||
import copyreg
|
||||
import weakref
|
||||
from http.cookies import SimpleCookie
|
||||
|
||||
from test.support import TestFailed, TESTFN, run_with_locale
|
||||
|
@ -842,6 +843,25 @@ class AbstractPickleTests(unittest.TestCase):
|
|||
self.assertEqual(B(x), B(y), detail)
|
||||
self.assertEqual(x.__dict__, y.__dict__, detail)
|
||||
|
||||
def test_newobj_proxies(self):
|
||||
# NEWOBJ should use the __class__ rather than the raw type
|
||||
classes = myclasses[:]
|
||||
# Cannot create weakproxies to these classes
|
||||
for c in (MyInt, MyTuple):
|
||||
classes.remove(c)
|
||||
for proto in protocols:
|
||||
for C in classes:
|
||||
B = C.__base__
|
||||
x = C(C.sample)
|
||||
x.foo = 42
|
||||
p = weakref.proxy(x)
|
||||
s = self.dumps(p, proto)
|
||||
y = self.loads(s)
|
||||
self.assertEqual(type(y), type(x)) # rather than type(p)
|
||||
detail = (proto, C, B, x, y, type(y))
|
||||
self.assertEqual(B(x), B(y), detail)
|
||||
self.assertEqual(x.__dict__, y.__dict__, detail)
|
||||
|
||||
# Register a type with copyreg, with extension code extcode. Pickle
|
||||
# an object of that type. Check that the resulting pickle uses opcode
|
||||
# (EXT[124]) under proto 2, and not in proto 1.
|
||||
|
@ -1008,7 +1028,6 @@ class AbstractPickleTests(unittest.TestCase):
|
|||
self.assertRaises(RuntimeError, self.dumps, x, proto)
|
||||
# protocol 2 don't raise a RuntimeError.
|
||||
d = self.dumps(x, 2)
|
||||
self.assertRaises(RuntimeError, self.loads, d)
|
||||
|
||||
def test_reduce_bad_iterator(self):
|
||||
# Issue4176: crash when 4th and 5th items of __reduce__()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue