mirror of
https://github.com/python/cpython.git
synced 2025-07-23 03:05:38 +00:00
[3.9] bpo-41654: Fix deallocator of MemoryError to account for subclasses (GH-22020) (GH-22045)
When allocating MemoryError classes, there is some logic to use
pre-allocated instances in a freelist only if the type that is being
allocated is not a subclass of MemoryError. Unfortunately in the
destructor this logic is not present so the freelist is altered even
with subclasses of MemoryError..
(cherry picked from commit 9b648a95cc
)
Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
This commit is contained in:
parent
4217b3c128
commit
d14775ddbb
3 changed files with 45 additions and 2 deletions
|
@ -1,6 +1,7 @@
|
|||
# Python test set -- part 5, built-in exceptions
|
||||
|
||||
import copy
|
||||
import gc
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
|
@ -1327,6 +1328,36 @@ class ExceptionTests(unittest.TestCase):
|
|||
del AssertionError
|
||||
self.fail('Expected exception')
|
||||
|
||||
def test_memory_error_subclasses(self):
|
||||
# bpo-41654: MemoryError instances use a freelist of objects that are
|
||||
# linked using the 'dict' attribute when they are inactive/dead.
|
||||
# Subclasses of MemoryError should not participate in the freelist
|
||||
# schema. This test creates a MemoryError object and keeps it alive
|
||||
# (therefore advancing the freelist) and then it creates and destroys a
|
||||
# subclass object. Finally, it checks that creating a new MemoryError
|
||||
# succeeds, proving that the freelist is not corrupted.
|
||||
|
||||
class TestException(MemoryError):
|
||||
pass
|
||||
|
||||
try:
|
||||
raise MemoryError
|
||||
except MemoryError as exc:
|
||||
inst = exc
|
||||
|
||||
try:
|
||||
raise TestException
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
for _ in range(10):
|
||||
try:
|
||||
raise MemoryError
|
||||
except MemoryError as exc:
|
||||
pass
|
||||
|
||||
gc_collect()
|
||||
|
||||
|
||||
class ImportErrorTests(unittest.TestCase):
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue