mirror of
https://github.com/RustPython/RustPython.git
synced 2026-06-02 19:39:49 +09:00
Update test_memoryview from CPython 3.10.6
This commit is contained in:
committed by
Jeong YunWon
parent
43820783b1
commit
b5dcd61b58
101
Lib/test/test_memoryview.py
vendored
101
Lib/test/test_memoryview.py
vendored
@@ -562,6 +562,107 @@ class OtherTest(unittest.TestCase):
|
||||
with self.assertRaises(TypeError):
|
||||
pickle.dumps(m, proto)
|
||||
|
||||
def test_use_released_memory(self):
|
||||
# gh-92888: Previously it was possible to use a memoryview even after
|
||||
# backing buffer is freed in certain cases. This tests that those
|
||||
# cases raise an exception.
|
||||
size = 128
|
||||
def release():
|
||||
m.release()
|
||||
nonlocal ba
|
||||
ba = bytearray(size)
|
||||
class MyIndex:
|
||||
def __index__(self):
|
||||
release()
|
||||
return 4
|
||||
class MyFloat:
|
||||
def __float__(self):
|
||||
release()
|
||||
return 4.25
|
||||
class MyBool:
|
||||
def __bool__(self):
|
||||
release()
|
||||
return True
|
||||
|
||||
ba = None
|
||||
m = memoryview(bytearray(b'\xff'*size))
|
||||
with self.assertRaises(ValueError):
|
||||
m[MyIndex()]
|
||||
|
||||
ba = None
|
||||
m = memoryview(bytearray(b'\xff'*size))
|
||||
self.assertEqual(list(m[:MyIndex()]), [255] * 4)
|
||||
|
||||
ba = None
|
||||
m = memoryview(bytearray(b'\xff'*size))
|
||||
self.assertEqual(list(m[MyIndex():8]), [255] * 4)
|
||||
|
||||
ba = None
|
||||
m = memoryview(bytearray(b'\xff'*size)).cast('B', (64, 2))
|
||||
with self.assertRaisesRegex(ValueError, "operation forbidden"):
|
||||
m[MyIndex(), 0]
|
||||
|
||||
ba = None
|
||||
m = memoryview(bytearray(b'\xff'*size)).cast('B', (2, 64))
|
||||
with self.assertRaisesRegex(ValueError, "operation forbidden"):
|
||||
m[0, MyIndex()]
|
||||
|
||||
ba = None
|
||||
m = memoryview(bytearray(b'\xff'*size))
|
||||
with self.assertRaisesRegex(ValueError, "operation forbidden"):
|
||||
m[MyIndex()] = 42
|
||||
self.assertEqual(ba[:8], b'\0'*8)
|
||||
|
||||
ba = None
|
||||
m = memoryview(bytearray(b'\xff'*size))
|
||||
with self.assertRaisesRegex(ValueError, "operation forbidden"):
|
||||
m[:MyIndex()] = b'spam'
|
||||
self.assertEqual(ba[:8], b'\0'*8)
|
||||
|
||||
ba = None
|
||||
m = memoryview(bytearray(b'\xff'*size))
|
||||
with self.assertRaisesRegex(ValueError, "operation forbidden"):
|
||||
m[MyIndex():8] = b'spam'
|
||||
self.assertEqual(ba[:8], b'\0'*8)
|
||||
|
||||
ba = None
|
||||
m = memoryview(bytearray(b'\xff'*size)).cast('B', (64, 2))
|
||||
with self.assertRaisesRegex(ValueError, "operation forbidden"):
|
||||
m[MyIndex(), 0] = 42
|
||||
self.assertEqual(ba[8:16], b'\0'*8)
|
||||
ba = None
|
||||
m = memoryview(bytearray(b'\xff'*size)).cast('B', (2, 64))
|
||||
with self.assertRaisesRegex(ValueError, "operation forbidden"):
|
||||
m[0, MyIndex()] = 42
|
||||
self.assertEqual(ba[:8], b'\0'*8)
|
||||
|
||||
ba = None
|
||||
m = memoryview(bytearray(b'\xff'*size))
|
||||
with self.assertRaisesRegex(ValueError, "operation forbidden"):
|
||||
m[0] = MyIndex()
|
||||
self.assertEqual(ba[:8], b'\0'*8)
|
||||
|
||||
for fmt in 'bhilqnBHILQN':
|
||||
with self.subTest(fmt=fmt):
|
||||
ba = None
|
||||
m = memoryview(bytearray(b'\xff'*size)).cast(fmt)
|
||||
with self.assertRaisesRegex(ValueError, "operation forbidden"):
|
||||
m[0] = MyIndex()
|
||||
self.assertEqual(ba[:8], b'\0'*8)
|
||||
|
||||
for fmt in 'fd':
|
||||
with self.subTest(fmt=fmt):
|
||||
ba = None
|
||||
m = memoryview(bytearray(b'\xff'*size)).cast(fmt)
|
||||
with self.assertRaisesRegex(ValueError, "operation forbidden"):
|
||||
m[0] = MyFloat()
|
||||
self.assertEqual(ba[:8], b'\0'*8)
|
||||
|
||||
ba = None
|
||||
m = memoryview(bytearray(b'\xff'*size)).cast('?')
|
||||
with self.assertRaisesRegex(ValueError, "operation forbidden"):
|
||||
m[0] = MyBool()
|
||||
self.assertEqual(ba[:8], b'\0'*8)
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user