mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
bpo-36785: PEP 574 implementation (GH-7076)
This commit is contained in:
parent
22ccb0b490
commit
91f4380ced
19 changed files with 1888 additions and 242 deletions
|
@ -565,6 +565,41 @@ bytes8 = ArgumentDescriptor(
|
|||
the number of bytes, and the second argument is that many bytes.
|
||||
""")
|
||||
|
||||
|
||||
def read_bytearray8(f):
|
||||
r"""
|
||||
>>> import io, struct, sys
|
||||
>>> read_bytearray8(io.BytesIO(b"\x00\x00\x00\x00\x00\x00\x00\x00abc"))
|
||||
bytearray(b'')
|
||||
>>> read_bytearray8(io.BytesIO(b"\x03\x00\x00\x00\x00\x00\x00\x00abcdef"))
|
||||
bytearray(b'abc')
|
||||
>>> bigsize8 = struct.pack("<Q", sys.maxsize//3)
|
||||
>>> read_bytearray8(io.BytesIO(bigsize8 + b"abcdef")) #doctest: +ELLIPSIS
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
ValueError: expected ... bytes in a bytearray8, but only 6 remain
|
||||
"""
|
||||
|
||||
n = read_uint8(f)
|
||||
assert n >= 0
|
||||
if n > sys.maxsize:
|
||||
raise ValueError("bytearray8 byte count > sys.maxsize: %d" % n)
|
||||
data = f.read(n)
|
||||
if len(data) == n:
|
||||
return bytearray(data)
|
||||
raise ValueError("expected %d bytes in a bytearray8, but only %d remain" %
|
||||
(n, len(data)))
|
||||
|
||||
bytearray8 = ArgumentDescriptor(
|
||||
name="bytearray8",
|
||||
n=TAKEN_FROM_ARGUMENT8U,
|
||||
reader=read_bytearray8,
|
||||
doc="""A counted bytearray.
|
||||
|
||||
The first argument is an 8-byte little-endian unsigned int giving
|
||||
the number of bytes, and the second argument is that many bytes.
|
||||
""")
|
||||
|
||||
def read_unicodestringnl(f):
|
||||
r"""
|
||||
>>> import io
|
||||
|
@ -970,6 +1005,11 @@ pybytes = StackObject(
|
|||
obtype=bytes,
|
||||
doc="A Python bytes object.")
|
||||
|
||||
pybytearray = StackObject(
|
||||
name='bytearray',
|
||||
obtype=bytearray,
|
||||
doc="A Python bytearray object.")
|
||||
|
||||
pyunicode = StackObject(
|
||||
name='str',
|
||||
obtype=str,
|
||||
|
@ -1005,6 +1045,11 @@ pyfrozenset = StackObject(
|
|||
obtype=set,
|
||||
doc="A Python frozenset object.")
|
||||
|
||||
pybuffer = StackObject(
|
||||
name='buffer',
|
||||
obtype=object,
|
||||
doc="A Python buffer-like object.")
|
||||
|
||||
anyobject = StackObject(
|
||||
name='any',
|
||||
obtype=object,
|
||||
|
@ -1265,7 +1310,7 @@ opcodes = [
|
|||
object instead.
|
||||
"""),
|
||||
|
||||
# Bytes (protocol 3 only; older protocols don't support bytes at all)
|
||||
# Bytes (protocol 3 and higher)
|
||||
|
||||
I(name='BINBYTES',
|
||||
code='B',
|
||||
|
@ -1306,6 +1351,39 @@ opcodes = [
|
|||
which are taken literally as the string content.
|
||||
"""),
|
||||
|
||||
# Bytearray (protocol 5 and higher)
|
||||
|
||||
I(name='BYTEARRAY8',
|
||||
code='\x96',
|
||||
arg=bytearray8,
|
||||
stack_before=[],
|
||||
stack_after=[pybytearray],
|
||||
proto=5,
|
||||
doc="""Push a Python bytearray object.
|
||||
|
||||
There are two arguments: the first is an 8-byte unsigned int giving
|
||||
the number of bytes in the bytearray, and the second is that many bytes,
|
||||
which are taken literally as the bytearray content.
|
||||
"""),
|
||||
|
||||
# Out-of-band buffer (protocol 5 and higher)
|
||||
|
||||
I(name='NEXT_BUFFER',
|
||||
code='\x97',
|
||||
arg=None,
|
||||
stack_before=[],
|
||||
stack_after=[pybuffer],
|
||||
proto=5,
|
||||
doc="Push an out-of-band buffer object."),
|
||||
|
||||
I(name='READONLY_BUFFER',
|
||||
code='\x98',
|
||||
arg=None,
|
||||
stack_before=[pybuffer],
|
||||
stack_after=[pybuffer],
|
||||
proto=5,
|
||||
doc="Make an out-of-band buffer object read-only."),
|
||||
|
||||
# Ways to spell None.
|
||||
|
||||
I(name='NONE',
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue