@@ -4690,6 +4690,65 @@ def __release_buffer__(self, buffer):
4690
4690
c .buffer .release ()
4691
4691
ba .clear ()
4692
4692
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
+
4693
4752
4694
4753
if __name__ == "__main__" :
4695
4754
unittest .main ()
0 commit comments