@@ -4690,6 +4690,65 @@ def __release_buffer__(self, buffer):
46904690 c .buffer .release ()
46914691 ba .clear ()
46924692
4693+ def test_multiple_inheritance_buffer_last (self ):
4694+ class A :
4695+ def __buffer__ (self , flags ):
4696+ return memoryview (b"hello A" )
4697+
4698+ class B (A , bytearray ):
4699+ def __buffer__ (self , flags ):
4700+ return super ().__buffer__ (flags )
4701+
4702+ b = B (b"hello" )
4703+ with memoryview (b ) as mv :
4704+ self .assertEqual (mv .tobytes (), b"hello A" )
4705+
4706+ class Releaser :
4707+ def __release_buffer__ (self , buffer ):
4708+ self .buffer = buffer
4709+
4710+ class C (Releaser , bytearray ):
4711+ def __buffer__ (self , flags ):
4712+ return super ().__buffer__ (flags )
4713+
4714+ c = C (b"hello C" )
4715+ with memoryview (c ) as mv :
4716+ self .assertEqual (mv .tobytes (), b"hello C" )
4717+ c .clear ()
4718+ with self .assertRaises (ValueError ):
4719+ c .buffer .tobytes ()
4720+
4721+ def test_multiple_inheritance_buffer_last (self ):
4722+ class A :
4723+ def __buffer__ (self , flags ):
4724+ raise RuntimeError ("should not be called" )
4725+
4726+ def __release_buffer__ (self , buffer ):
4727+ raise RuntimeError ("should not be called" )
4728+
4729+ class B (bytearray , A ):
4730+ def __buffer__ (self , flags ):
4731+ return super ().__buffer__ (flags )
4732+
4733+ b = B (b"hello" )
4734+ with memoryview (b ) as mv :
4735+ self .assertEqual (mv .tobytes (), b"hello" )
4736+
4737+ class Releaser :
4738+ buffer = None
4739+ def __release_buffer__ (self , buffer ):
4740+ self .buffer = buffer
4741+
4742+ class C (bytearray , Releaser ):
4743+ def __buffer__ (self , flags ):
4744+ return super ().__buffer__ (flags )
4745+
4746+ c = C (b"hello" )
4747+ with memoryview (c ) as mv :
4748+ self .assertEqual (mv .tobytes (), b"hello" )
4749+ c .clear ()
4750+ self .assertIs (c .buffer , None )
4751+
46934752
46944753if __name__ == "__main__" :
46954754 unittest .main ()
0 commit comments