mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
SF bug [#470040] ParseTuple t# vs subclasses.
inherit_slots(): tp_as_buffer was getting inherited as if it were a method pointer, rather than a pointer to a vector of method pointers. As a result, inheriting from a type that implemented buffer methods was ineffective, leaving all the tp_as_buffer slots NULL in the subclass.
This commit is contained in:
parent
401a76dcab
commit
fc57ccb982
2 changed files with 43 additions and 2 deletions
|
@ -2298,7 +2298,37 @@ def subclasspropagation():
|
|||
pass
|
||||
else:
|
||||
raise TestFailed, "d.foo should be undefined now"
|
||||
|
||||
|
||||
def buffer_inherit():
|
||||
import binascii
|
||||
# SF bug [#470040] ParseTuple t# vs subclasses.
|
||||
if verbose:
|
||||
print "Testing that buffer interface is inherited ..."
|
||||
|
||||
class MyStr(str):
|
||||
pass
|
||||
base = 'abc'
|
||||
m = MyStr(base)
|
||||
# b2a_hex uses the buffer interface to get its argument's value, via
|
||||
# PyArg_ParseTuple 't#' code.
|
||||
vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
|
||||
|
||||
# It's not clear that unicode will continue to support the character
|
||||
# buffer interface, and this test will fail if that's taken away.
|
||||
class MyUni(unicode):
|
||||
pass
|
||||
base = u'abc'
|
||||
m = MyUni(base)
|
||||
vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
|
||||
|
||||
class MyInt(int):
|
||||
pass
|
||||
m = MyInt(42)
|
||||
try:
|
||||
binascii.b2a_hex(m)
|
||||
raise TestFailed('subclass of int should not have a buffer interface')
|
||||
except TypeError:
|
||||
pass
|
||||
|
||||
def test_main():
|
||||
class_docstrings()
|
||||
|
@ -2347,6 +2377,7 @@ def test_main():
|
|||
copies()
|
||||
binopoverride()
|
||||
subclasspropagation()
|
||||
buffer_inherit()
|
||||
if verbose: print "All OK"
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue