mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Merged revisions 85896 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r85896 | antoine.pitrou | 2010-10-29 00:56:58 +0200 (ven., 29 oct. 2010) | 4 lines Issue #5437: A preallocated MemoryError instance should not hold traceback data (including local variables caught in the stack trace) alive infinitely. ........
This commit is contained in:
parent
d7a3ab962b
commit
98e2b45297
5 changed files with 132 additions and 35 deletions
|
@ -669,6 +669,46 @@ class ExceptionTests(unittest.TestCase):
|
|||
tb2 = raiseMemError()
|
||||
self.assertEqual(tb1, tb2)
|
||||
|
||||
def test_memory_error_cleanup(self):
|
||||
# Issue #5437: preallocated MemoryError instances should not keep
|
||||
# traceback objects alive.
|
||||
from _testcapi import raise_memoryerror
|
||||
class C:
|
||||
pass
|
||||
wr = None
|
||||
def inner():
|
||||
nonlocal wr
|
||||
c = C()
|
||||
wr = weakref.ref(c)
|
||||
raise_memoryerror()
|
||||
# We cannot use assertRaises since it manually deletes the traceback
|
||||
try:
|
||||
inner()
|
||||
except MemoryError as e:
|
||||
self.assertNotEqual(wr(), None)
|
||||
else:
|
||||
self.fail("MemoryError not raised")
|
||||
self.assertEqual(wr(), None)
|
||||
|
||||
def test_recursion_error_cleanup(self):
|
||||
# Same test as above, but with "recursion exceeded" errors
|
||||
class C:
|
||||
pass
|
||||
wr = None
|
||||
def inner():
|
||||
nonlocal wr
|
||||
c = C()
|
||||
wr = weakref.ref(c)
|
||||
inner()
|
||||
# We cannot use assertRaises since it manually deletes the traceback
|
||||
try:
|
||||
inner()
|
||||
except RuntimeError as e:
|
||||
self.assertNotEqual(wr(), None)
|
||||
else:
|
||||
self.fail("RuntimeError not raised")
|
||||
self.assertEqual(wr(), None)
|
||||
|
||||
def test_main():
|
||||
run_unittest(ExceptionTests)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue