mirror of https://github.com/python/cpython
Issue #25455: Clean up reference loops created in tests for recursive
functools.partial objects.
This commit is contained in:
parent
7bea2347c7
commit
46fe29de31
|
@ -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):
|
||||||
|
|
Loading…
Reference in New Issue