Issue #25455: Clean up reference loops created in tests for recursive

functools.partial objects.
This commit is contained in:
Serhiy Storchaka 2016-06-12 15:45:14 +03:00
parent 7bea2347c7
commit 46fe29de31
1 changed files with 36 additions and 12 deletions

View File

@ -225,15 +225,24 @@ class TestPartialC(TestPartial, unittest.TestCase):
f = self.partial(capture) f = self.partial(capture)
f.__setstate__((f, (), {}, {})) f.__setstate__((f, (), {}, {}))
self.assertEqual(repr(f), '%s(%s(...))' % (name, name)) try:
self.assertEqual(repr(f), '%s(%s(...))' % (name, name))
finally:
f.__setstate__((capture, (), {}, {}))
f = self.partial(capture) f = self.partial(capture)
f.__setstate__((capture, (f,), {}, {})) f.__setstate__((capture, (f,), {}, {}))
self.assertEqual(repr(f), '%s(%r, %s(...))' % (name, capture, name)) try:
self.assertEqual(repr(f), '%s(%r, %s(...))' % (name, capture, name))
finally:
f.__setstate__((capture, (), {}, {}))
f = self.partial(capture) f = self.partial(capture)
f.__setstate__((capture, (), {'a': f}, {})) f.__setstate__((capture, (), {'a': f}, {}))
self.assertEqual(repr(f), '%s(%r, a=%s(...))' % (name, capture, name)) try:
self.assertEqual(repr(f), '%s(%r, a=%s(...))' % (name, capture, name))
finally:
f.__setstate__((capture, (), {}, {}))
def test_pickle(self): def test_pickle(self):
f = self.partial(signature, ['asdf'], bar=[True]) f = self.partial(signature, ['asdf'], bar=[True])
@ -318,21 +327,36 @@ class TestPartialC(TestPartial, unittest.TestCase):
def test_recursive_pickle(self): def test_recursive_pickle(self):
f = self.partial(capture) f = self.partial(capture)
f.__setstate__((f, (), {}, {})) f.__setstate__((f, (), {}, {}))
for proto in range(pickle.HIGHEST_PROTOCOL + 1): try:
with self.assertRaises(RecursionError): for proto in range(pickle.HIGHEST_PROTOCOL + 1):
pickle.dumps(f, proto) with self.assertRaises(RecursionError):
pickle.dumps(f, proto)
finally:
f.__setstate__((capture, (), {}, {}))
f = self.partial(capture) f = self.partial(capture)
f.__setstate__((capture, (f,), {}, {})) f.__setstate__((capture, (f,), {}, {}))
for proto in range(pickle.HIGHEST_PROTOCOL + 1): try:
f_copy = pickle.loads(pickle.dumps(f, proto)) for proto in range(pickle.HIGHEST_PROTOCOL + 1):
self.assertIs(f_copy.args[0], f_copy) f_copy = pickle.loads(pickle.dumps(f, proto))
try:
self.assertIs(f_copy.args[0], f_copy)
finally:
f_copy.__setstate__((capture, (), {}, {}))
finally:
f.__setstate__((capture, (), {}, {}))
f = self.partial(capture) f = self.partial(capture)
f.__setstate__((capture, (), {'a': f}, {})) f.__setstate__((capture, (), {'a': f}, {}))
for proto in range(pickle.HIGHEST_PROTOCOL + 1): try:
f_copy = pickle.loads(pickle.dumps(f, proto)) for proto in range(pickle.HIGHEST_PROTOCOL + 1):
self.assertIs(f_copy.keywords['a'], f_copy) f_copy = pickle.loads(pickle.dumps(f, proto))
try:
self.assertIs(f_copy.keywords['a'], f_copy)
finally:
f_copy.__setstate__((capture, (), {}, {}))
finally:
f.__setstate__((capture, (), {}, {}))
# Issue 6083: Reference counting bug # Issue 6083: Reference counting bug
def test_setstate_refcount(self): def test_setstate_refcount(self):