@@ -2195,6 +2195,30 @@ def delslice():
21952195 self .assertRaises (BufferError , delslice )
21962196 self .assertEqual (b , orig )
21972197
2198+ def test_decode_resize_forbidden (self ):
2199+ # The storage is pinned while it is decoded, so an error handler
2200+ # cannot resize the bytearray.
2201+ b = bytearray (b'ab\xff cd' )
2202+ def handler (exc ):
2203+ self .assertRaises (BufferError , b .clear )
2204+ self .assertRaises (BufferError , b .append , 0 )
2205+ return ('?' , exc .end )
2206+ codecs .register_error ('test.bytearray_decode_resize' , handler )
2207+ for encoding in 'utf-8' , 'utf-8-sig' :
2208+ with self .subTest (encoding = encoding ):
2209+ self .assertEqual (
2210+ b .decode (encoding , 'test.bytearray_decode_resize' ),
2211+ 'ab?cd' )
2212+ self .assertEqual (b , b'ab\xff cd' )
2213+
2214+ def test_decode_subclass_buffer (self ):
2215+ # decode() decodes the buffer that the object exports.
2216+ class B (bytearray ):
2217+ def __buffer__ (self , flags ):
2218+ return memoryview (b'other' )
2219+ self .assertEqual (B (b'mine' ).decode (), 'other' )
2220+ self .assertEqual (B (b'mine' ).decode ('latin-1' ), 'other' )
2221+
21982222 @test .support .cpython_only
21992223 def test_obsolete_write_lock (self ):
22002224 _testcapi = import_helper .import_module ('_testcapi' )
0 commit comments