gh-93575: Use correct way to calculate PyUnicode struct sizes (GH-93602)

* gh-93575: Use correct way to calculate PyUnicode struct sizes

* Add comment to keep test_sys and test_unicode in sync

* Fix case code < 256
This commit is contained in:
Christian Heimes 2022-06-08 20:18:08 +02:00 committed by GitHub
parent 2dece90808
commit 5442561c1a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 5 deletions

View file

@ -2370,15 +2370,19 @@ class UnicodeTest(string_tests.CommonTest,
self.assertIs(s.expandtabs(), s)
def test_raiseMemError(self):
null_byte = 1
ascii_struct_size = sys.getsizeof("a") - len("a") - null_byte
compact_struct_size = sys.getsizeof("\xff") - len("\xff") - null_byte
asciifields = "nnb"
compactfields = asciifields + "nP"
ascii_struct_size = support.calcobjsize(asciifields)
compact_struct_size = support.calcobjsize(compactfields)
for char in ('a', '\xe9', '\u20ac', '\U0010ffff'):
code = ord(char)
if code < 0x100:
if code < 0x80:
char_size = 1 # sizeof(Py_UCS1)
struct_size = ascii_struct_size
elif code < 0x100:
char_size = 1 # sizeof(Py_UCS1)
struct_size = compact_struct_size
elif code < 0x10000:
char_size = 2 # sizeof(Py_UCS2)
struct_size = compact_struct_size
@ -2390,7 +2394,16 @@ class UnicodeTest(string_tests.CommonTest,
# be allocatable, given enough memory.
maxlen = ((sys.maxsize - struct_size) // char_size)
alloc = lambda: char * maxlen
with self.subTest(char=char):
with self.subTest(
char=char,
struct_size=struct_size,
char_size=char_size
):
# self-check
self.assertEqual(
sys.getsizeof(char * 42),
struct_size + (char_size * (42 + 1))
)
self.assertRaises(MemoryError, alloc)
self.assertRaises(MemoryError, alloc)