samples = ['1'*100, '\xff'*50,
'\u0100'*40, '\uffff'*100,
'\U00010000'*30, '\U0010ffff'*100]
+ # also update field definitions in test_unicode.test_raiseMemError
asciifields = "nnb"
compactfields = asciifields + "nP"
unicodefields = compactfields + "P"
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
# 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)