mirror of
https://github.com/python/cpython.git
synced 2025-08-22 09:45:06 +00:00
Issue #20175: Converted the _io module to Argument Clinic.
This commit is contained in:
parent
7f90cba7f3
commit
f24131ff31
16 changed files with 4209 additions and 1372 deletions
|
@ -2,6 +2,12 @@
|
|||
#include "structmember.h" /* for offsetof() */
|
||||
#include "_iomodule.h"
|
||||
|
||||
/*[clinic input]
|
||||
module _io
|
||||
class _io.BytesIO "bytesio *" "&PyBytesIO_Type"
|
||||
[clinic start generated code]*/
|
||||
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=7f50ec034f5c0b26]*/
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
PyObject *buf;
|
||||
|
@ -203,40 +209,71 @@ bytesio_get_closed(bytesio *self)
|
|||
}
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(readable_doc,
|
||||
"readable() -> bool. Returns True if the IO object can be read.");
|
||||
/*[clinic input]
|
||||
_io.BytesIO.readable
|
||||
|
||||
PyDoc_STRVAR(writable_doc,
|
||||
"writable() -> bool. Returns True if the IO object can be written.");
|
||||
Returns True if the IO object can be read.
|
||||
[clinic start generated code]*/
|
||||
|
||||
PyDoc_STRVAR(seekable_doc,
|
||||
"seekable() -> bool. Returns True if the IO object can be seeked.");
|
||||
|
||||
/* Generic getter for the writable, readable and seekable properties */
|
||||
static PyObject *
|
||||
return_not_closed(bytesio *self)
|
||||
_io_BytesIO_readable_impl(bytesio *self)
|
||||
/*[clinic end generated code: output=4e93822ad5b62263 input=96c5d0cccfb29f5c]*/
|
||||
{
|
||||
CHECK_CLOSED(self);
|
||||
Py_RETURN_TRUE;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(flush_doc,
|
||||
"flush() -> None. Does nothing.");
|
||||
/*[clinic input]
|
||||
_io.BytesIO.writable
|
||||
|
||||
Returns True if the IO object can be written.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
bytesio_flush(bytesio *self)
|
||||
_io_BytesIO_writable_impl(bytesio *self)
|
||||
/*[clinic end generated code: output=64ff6a254b1150b8 input=700eed808277560a]*/
|
||||
{
|
||||
CHECK_CLOSED(self);
|
||||
Py_RETURN_TRUE;
|
||||
}
|
||||
|
||||
/*[clinic input]
|
||||
_io.BytesIO.seekable
|
||||
|
||||
Returns True if the IO object can be seeked.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
_io_BytesIO_seekable_impl(bytesio *self)
|
||||
/*[clinic end generated code: output=6b417f46dcc09b56 input=9421f65627a344dd]*/
|
||||
{
|
||||
CHECK_CLOSED(self);
|
||||
Py_RETURN_TRUE;
|
||||
}
|
||||
|
||||
/*[clinic input]
|
||||
_io.BytesIO.flush
|
||||
|
||||
Does nothing.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
_io_BytesIO_flush_impl(bytesio *self)
|
||||
/*[clinic end generated code: output=187e3d781ca134a0 input=561ea490be4581a7]*/
|
||||
{
|
||||
CHECK_CLOSED(self);
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(getbuffer_doc,
|
||||
"getbuffer() -> bytes.\n"
|
||||
"\n"
|
||||
"Get a read-write view over the contents of the BytesIO object.");
|
||||
/*[clinic input]
|
||||
_io.BytesIO.getbuffer
|
||||
|
||||
Get a read-write view over the contents of the BytesIO object.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
bytesio_getbuffer(bytesio *self)
|
||||
_io_BytesIO_getbuffer_impl(bytesio *self)
|
||||
/*[clinic end generated code: output=72cd7c6e13aa09ed input=8f738ef615865176]*/
|
||||
{
|
||||
PyTypeObject *type = &_PyBytesIOBuffer_Type;
|
||||
bytesiobuf *buf;
|
||||
|
@ -254,13 +291,15 @@ bytesio_getbuffer(bytesio *self)
|
|||
return view;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(getval_doc,
|
||||
"getvalue() -> bytes.\n"
|
||||
"\n"
|
||||
"Retrieve the entire contents of the BytesIO object.");
|
||||
/*[clinic input]
|
||||
_io.BytesIO.getvalue
|
||||
|
||||
Retrieve the entire contents of the BytesIO object.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
bytesio_getvalue(bytesio *self)
|
||||
_io_BytesIO_getvalue_impl(bytesio *self)
|
||||
/*[clinic end generated code: output=b3f6a3233c8fd628 input=4b403ac0af3973ed]*/
|
||||
{
|
||||
CHECK_CLOSED(self);
|
||||
if (self->string_size <= 1 || self->exports > 0)
|
||||
|
@ -281,24 +320,31 @@ bytesio_getvalue(bytesio *self)
|
|||
return self->buf;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(isatty_doc,
|
||||
"isatty() -> False.\n"
|
||||
"\n"
|
||||
"Always returns False since BytesIO objects are not connected\n"
|
||||
"to a tty-like device.");
|
||||
/*[clinic input]
|
||||
_io.BytesIO.isatty
|
||||
|
||||
Always returns False.
|
||||
|
||||
BytesIO objects are not connected to a TTY-like device.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
bytesio_isatty(bytesio *self)
|
||||
_io_BytesIO_isatty_impl(bytesio *self)
|
||||
/*[clinic end generated code: output=df67712e669f6c8f input=6f97f0985d13f827]*/
|
||||
{
|
||||
CHECK_CLOSED(self);
|
||||
Py_RETURN_FALSE;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(tell_doc,
|
||||
"tell() -> current file position, an integer\n");
|
||||
/*[clinic input]
|
||||
_io.BytesIO.tell
|
||||
|
||||
Current file position, an integer.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
bytesio_tell(bytesio *self)
|
||||
_io_BytesIO_tell_impl(bytesio *self)
|
||||
/*[clinic end generated code: output=b54b0f93cd0e5e1d input=b106adf099cb3657]*/
|
||||
{
|
||||
CHECK_CLOSED(self);
|
||||
return PyLong_FromSsize_t(self->pos);
|
||||
|
@ -324,23 +370,25 @@ read_bytes(bytesio *self, Py_ssize_t size)
|
|||
return PyBytes_FromStringAndSize(output, size);
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(read_doc,
|
||||
"read([size]) -> read at most size bytes, returned as a bytes object.\n"
|
||||
"\n"
|
||||
"If the size argument is negative, read until EOF is reached.\n"
|
||||
"Return an empty bytes object at EOF.");
|
||||
/*[clinic input]
|
||||
_io.BytesIO.read
|
||||
size as arg: object = None
|
||||
/
|
||||
|
||||
Read at most size bytes, returned as a bytes object.
|
||||
|
||||
If the size argument is negative, read until EOF is reached.
|
||||
Return an empty bytes object at EOF.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
bytesio_read(bytesio *self, PyObject *args)
|
||||
_io_BytesIO_read_impl(bytesio *self, PyObject *arg)
|
||||
/*[clinic end generated code: output=85dacb535c1e1781 input=cc7ba4a797bb1555]*/
|
||||
{
|
||||
Py_ssize_t size, n;
|
||||
PyObject *arg = Py_None;
|
||||
|
||||
CHECK_CLOSED(self);
|
||||
|
||||
if (!PyArg_ParseTuple(args, "|O:read", &arg))
|
||||
return NULL;
|
||||
|
||||
if (PyLong_Check(arg)) {
|
||||
size = PyLong_AsSsize_t(arg);
|
||||
if (size == -1 && PyErr_Occurred())
|
||||
|
@ -368,43 +416,44 @@ bytesio_read(bytesio *self, PyObject *args)
|
|||
}
|
||||
|
||||
|
||||
PyDoc_STRVAR(read1_doc,
|
||||
"read1(size) -> read at most size bytes, returned as a bytes object.\n"
|
||||
"\n"
|
||||
"If the size argument is negative or omitted, read until EOF is reached.\n"
|
||||
"Return an empty bytes object at EOF.");
|
||||
/*[clinic input]
|
||||
_io.BytesIO.read1
|
||||
size: object
|
||||
/
|
||||
|
||||
Read at most size bytes, returned as a bytes object.
|
||||
|
||||
If the size argument is negative or omitted, read until EOF is reached.
|
||||
Return an empty bytes object at EOF.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
bytesio_read1(bytesio *self, PyObject *n)
|
||||
_io_BytesIO_read1(bytesio *self, PyObject *size)
|
||||
/*[clinic end generated code: output=16021f5d0ac3d4e2 input=d4f40bb8f2f99418]*/
|
||||
{
|
||||
PyObject *arg, *res;
|
||||
|
||||
arg = PyTuple_Pack(1, n);
|
||||
if (arg == NULL)
|
||||
return NULL;
|
||||
res = bytesio_read(self, arg);
|
||||
Py_DECREF(arg);
|
||||
return res;
|
||||
return _io_BytesIO_read_impl(self, size);
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(readline_doc,
|
||||
"readline([size]) -> next line from the file, as a bytes object.\n"
|
||||
"\n"
|
||||
"Retain newline. A non-negative size argument limits the maximum\n"
|
||||
"number of bytes to return (an incomplete line may be returned then).\n"
|
||||
"Return an empty bytes object at EOF.\n");
|
||||
/*[clinic input]
|
||||
_io.BytesIO.readline
|
||||
size as arg: object = None
|
||||
/
|
||||
|
||||
Next line from the file, as a bytes object.
|
||||
|
||||
Retain newline. A non-negative size argument limits the maximum
|
||||
number of bytes to return (an incomplete line may be returned then).
|
||||
Return an empty bytes object at EOF.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
bytesio_readline(bytesio *self, PyObject *args)
|
||||
_io_BytesIO_readline_impl(bytesio *self, PyObject *arg)
|
||||
/*[clinic end generated code: output=1c2115534a4f9276 input=ca31f06de6eab257]*/
|
||||
{
|
||||
Py_ssize_t size, n;
|
||||
PyObject *arg = Py_None;
|
||||
|
||||
CHECK_CLOSED(self);
|
||||
|
||||
if (!PyArg_ParseTuple(args, "|O:readline", &arg))
|
||||
return NULL;
|
||||
|
||||
if (PyLong_Check(arg)) {
|
||||
size = PyLong_AsSsize_t(arg);
|
||||
if (size == -1 && PyErr_Occurred())
|
||||
|
@ -425,26 +474,28 @@ bytesio_readline(bytesio *self, PyObject *args)
|
|||
return read_bytes(self, n);
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(readlines_doc,
|
||||
"readlines([size]) -> list of strings, each a line from the file.\n"
|
||||
"\n"
|
||||
"Call readline() repeatedly and return a list of the lines so read.\n"
|
||||
"The optional size argument, if given, is an approximate bound on the\n"
|
||||
"total number of bytes in the lines returned.\n");
|
||||
/*[clinic input]
|
||||
_io.BytesIO.readlines
|
||||
size as arg: object = None
|
||||
/
|
||||
|
||||
List of bytes objects, each a line from the file.
|
||||
|
||||
Call readline() repeatedly and return a list of the lines so read.
|
||||
The optional size argument, if given, is an approximate bound on the
|
||||
total number of bytes in the lines returned.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
bytesio_readlines(bytesio *self, PyObject *args)
|
||||
_io_BytesIO_readlines_impl(bytesio *self, PyObject *arg)
|
||||
/*[clinic end generated code: output=09b8e34c880808ff input=691aa1314f2c2a87]*/
|
||||
{
|
||||
Py_ssize_t maxsize, size, n;
|
||||
PyObject *result, *line;
|
||||
char *output;
|
||||
PyObject *arg = Py_None;
|
||||
|
||||
CHECK_CLOSED(self);
|
||||
|
||||
if (!PyArg_ParseTuple(args, "|O:readlines", &arg))
|
||||
return NULL;
|
||||
|
||||
if (PyLong_Check(arg)) {
|
||||
maxsize = PyLong_AsSsize_t(arg);
|
||||
if (maxsize == -1 && PyErr_Occurred())
|
||||
|
@ -488,25 +539,27 @@ bytesio_readlines(bytesio *self, PyObject *args)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(readinto_doc,
|
||||
"readinto(bytearray) -> int. Read up to len(b) bytes into b.\n"
|
||||
"\n"
|
||||
"Returns number of bytes read (0 for EOF), or None if the object\n"
|
||||
"is set not to block as has no data to read.");
|
||||
/*[clinic input]
|
||||
_io.BytesIO.readinto
|
||||
buffer: Py_buffer(types={'rwbuffer'})
|
||||
/
|
||||
|
||||
Read up to len(buffer) bytes into buffer.
|
||||
|
||||
Returns number of bytes read (0 for EOF), or None if the object
|
||||
is set not to block as has no data to read.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
bytesio_readinto(bytesio *self, PyObject *arg)
|
||||
_io_BytesIO_readinto_impl(bytesio *self, Py_buffer *buffer)
|
||||
/*[clinic end generated code: output=a5d407217dcf0639 input=d289da851c7c4159]*/
|
||||
{
|
||||
Py_buffer buffer;
|
||||
Py_ssize_t len, n;
|
||||
|
||||
CHECK_CLOSED(self);
|
||||
|
||||
if (!PyArg_Parse(arg, "w*", &buffer))
|
||||
return NULL;
|
||||
|
||||
/* adjust invalid sizes */
|
||||
len = buffer.len;
|
||||
len = buffer->len;
|
||||
n = self->string_size - self->pos;
|
||||
if (len > n) {
|
||||
len = n;
|
||||
|
@ -514,33 +567,34 @@ bytesio_readinto(bytesio *self, PyObject *arg)
|
|||
len = 0;
|
||||
}
|
||||
|
||||
memcpy(buffer.buf, PyBytes_AS_STRING(self->buf) + self->pos, len);
|
||||
memcpy(buffer->buf, PyBytes_AS_STRING(self->buf) + self->pos, len);
|
||||
assert(self->pos + len < PY_SSIZE_T_MAX);
|
||||
assert(len >= 0);
|
||||
self->pos += len;
|
||||
PyBuffer_Release(&buffer);
|
||||
|
||||
return PyLong_FromSsize_t(len);
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(truncate_doc,
|
||||
"truncate([size]) -> int. Truncate the file to at most size bytes.\n"
|
||||
"\n"
|
||||
"Size defaults to the current file position, as returned by tell().\n"
|
||||
"The current file position is unchanged. Returns the new size.\n");
|
||||
/*[clinic input]
|
||||
_io.BytesIO.truncate
|
||||
size as arg: object = None
|
||||
/
|
||||
|
||||
Truncate the file to at most size bytes.
|
||||
|
||||
Size defaults to the current file position, as returned by tell().
|
||||
The current file position is unchanged. Returns the new size.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
bytesio_truncate(bytesio *self, PyObject *args)
|
||||
_io_BytesIO_truncate_impl(bytesio *self, PyObject *arg)
|
||||
/*[clinic end generated code: output=81e6be60e67ddd66 input=11ed1966835462ba]*/
|
||||
{
|
||||
Py_ssize_t size;
|
||||
PyObject *arg = Py_None;
|
||||
|
||||
CHECK_CLOSED(self);
|
||||
CHECK_EXPORTS(self);
|
||||
|
||||
if (!PyArg_ParseTuple(args, "|O:truncate", &arg))
|
||||
return NULL;
|
||||
|
||||
if (PyLong_Check(arg)) {
|
||||
size = PyLong_AsSsize_t(arg);
|
||||
if (size == -1 && PyErr_Occurred())
|
||||
|
@ -586,36 +640,37 @@ bytesio_iternext(bytesio *self)
|
|||
return read_bytes(self, n);
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(seek_doc,
|
||||
"seek(pos, whence=0) -> int. Change stream position.\n"
|
||||
"\n"
|
||||
"Seek to byte offset pos relative to position indicated by whence:\n"
|
||||
" 0 Start of stream (the default). pos should be >= 0;\n"
|
||||
" 1 Current position - pos may be negative;\n"
|
||||
" 2 End of stream - pos usually negative.\n"
|
||||
"Returns the new absolute position.");
|
||||
/*[clinic input]
|
||||
_io.BytesIO.seek
|
||||
pos: Py_ssize_t
|
||||
whence: int = 0
|
||||
/
|
||||
|
||||
Change stream position.
|
||||
|
||||
Seek to byte offset pos relative to position indicated by whence:
|
||||
0 Start of stream (the default). pos should be >= 0;
|
||||
1 Current position - pos may be negative;
|
||||
2 End of stream - pos usually negative.
|
||||
Returns the new absolute position.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
bytesio_seek(bytesio *self, PyObject *args)
|
||||
_io_BytesIO_seek_impl(bytesio *self, Py_ssize_t pos, int whence)
|
||||
/*[clinic end generated code: output=c26204a68e9190e4 input=1e875e6ebc652948]*/
|
||||
{
|
||||
Py_ssize_t pos;
|
||||
int mode = 0;
|
||||
|
||||
CHECK_CLOSED(self);
|
||||
|
||||
if (!PyArg_ParseTuple(args, "n|i:seek", &pos, &mode))
|
||||
return NULL;
|
||||
|
||||
if (pos < 0 && mode == 0) {
|
||||
if (pos < 0 && whence == 0) {
|
||||
PyErr_Format(PyExc_ValueError,
|
||||
"negative seek value %zd", pos);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* mode 0: offset relative to beginning of the string.
|
||||
mode 1: offset relative to current position.
|
||||
mode 2: offset relative the end of the string. */
|
||||
if (mode == 1) {
|
||||
/* whence = 0: offset relative to beginning of the string.
|
||||
whence = 1: offset relative to current position.
|
||||
whence = 2: offset relative the end of the string. */
|
||||
if (whence == 1) {
|
||||
if (pos > PY_SSIZE_T_MAX - self->pos) {
|
||||
PyErr_SetString(PyExc_OverflowError,
|
||||
"new position too large");
|
||||
|
@ -623,7 +678,7 @@ bytesio_seek(bytesio *self, PyObject *args)
|
|||
}
|
||||
pos += self->pos;
|
||||
}
|
||||
else if (mode == 2) {
|
||||
else if (whence == 2) {
|
||||
if (pos > PY_SSIZE_T_MAX - self->string_size) {
|
||||
PyErr_SetString(PyExc_OverflowError,
|
||||
"new position too large");
|
||||
|
@ -631,9 +686,9 @@ bytesio_seek(bytesio *self, PyObject *args)
|
|||
}
|
||||
pos += self->string_size;
|
||||
}
|
||||
else if (mode != 0) {
|
||||
else if (whence != 0) {
|
||||
PyErr_Format(PyExc_ValueError,
|
||||
"invalid whence (%i, should be 0, 1 or 2)", mode);
|
||||
"invalid whence (%i, should be 0, 1 or 2)", whence);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -644,54 +699,63 @@ bytesio_seek(bytesio *self, PyObject *args)
|
|||
return PyLong_FromSsize_t(self->pos);
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(write_doc,
|
||||
"write(bytes) -> int. Write bytes to file.\n"
|
||||
"\n"
|
||||
"Return the number of bytes written.");
|
||||
/*[clinic input]
|
||||
_io.BytesIO.write
|
||||
b: object
|
||||
/
|
||||
|
||||
Write bytes to file.
|
||||
|
||||
Return the number of bytes written.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
bytesio_write(bytesio *self, PyObject *obj)
|
||||
_io_BytesIO_write(bytesio *self, PyObject *b)
|
||||
/*[clinic end generated code: output=53316d99800a0b95 input=f5ec7c8c64ed720a]*/
|
||||
{
|
||||
Py_ssize_t n = 0;
|
||||
Py_buffer buf;
|
||||
PyObject *result = NULL;
|
||||
|
||||
CHECK_CLOSED(self);
|
||||
CHECK_EXPORTS(self);
|
||||
|
||||
if (PyObject_GetBuffer(obj, &buf, PyBUF_CONTIG_RO) < 0)
|
||||
if (PyObject_GetBuffer(b, &buf, PyBUF_CONTIG_RO) < 0)
|
||||
return NULL;
|
||||
|
||||
if (buf.len != 0)
|
||||
n = write_bytes(self, buf.buf, buf.len);
|
||||
if (n >= 0)
|
||||
result = PyLong_FromSsize_t(n);
|
||||
|
||||
PyBuffer_Release(&buf);
|
||||
return result;
|
||||
return n >= 0 ? PyLong_FromSsize_t(n) : NULL;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(writelines_doc,
|
||||
"writelines(lines) -> None. Write bytes objects to the file.\n"
|
||||
"\n"
|
||||
"Note that newlines are not added. The argument can be any iterable\n"
|
||||
"object producing bytes objects. This is equivalent to calling write() for\n"
|
||||
"each bytes object.");
|
||||
/*[clinic input]
|
||||
_io.BytesIO.writelines
|
||||
lines: object
|
||||
/
|
||||
|
||||
Write lines to the file.
|
||||
|
||||
Note that newlines are not added. lines can be any iterable object
|
||||
producing bytes-like objects. This is equivalent to calling write() for
|
||||
each element.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
bytesio_writelines(bytesio *self, PyObject *v)
|
||||
_io_BytesIO_writelines(bytesio *self, PyObject *lines)
|
||||
/*[clinic end generated code: output=7f33aa3271c91752 input=e972539176fc8fc1]*/
|
||||
{
|
||||
PyObject *it, *item;
|
||||
PyObject *ret;
|
||||
|
||||
CHECK_CLOSED(self);
|
||||
|
||||
it = PyObject_GetIter(v);
|
||||
it = PyObject_GetIter(lines);
|
||||
if (it == NULL)
|
||||
return NULL;
|
||||
|
||||
while ((item = PyIter_Next(it)) != NULL) {
|
||||
ret = bytesio_write(self, item);
|
||||
ret = _io_BytesIO_write(self, item);
|
||||
Py_DECREF(item);
|
||||
if (ret == NULL) {
|
||||
Py_DECREF(it);
|
||||
|
@ -708,11 +772,15 @@ bytesio_writelines(bytesio *self, PyObject *v)
|
|||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(close_doc,
|
||||
"close() -> None. Disable all I/O operations.");
|
||||
/*[clinic input]
|
||||
_io.BytesIO.close
|
||||
|
||||
Disable all I/O operations.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
bytesio_close(bytesio *self)
|
||||
_io_BytesIO_close_impl(bytesio *self)
|
||||
/*[clinic end generated code: output=1471bb9411af84a0 input=37e1f55556e61f60]*/
|
||||
{
|
||||
CHECK_EXPORTS(self);
|
||||
Py_CLEAR(self->buf);
|
||||
|
@ -737,7 +805,7 @@ bytesio_close(bytesio *self)
|
|||
static PyObject *
|
||||
bytesio_getstate(bytesio *self)
|
||||
{
|
||||
PyObject *initvalue = bytesio_getvalue(self);
|
||||
PyObject *initvalue = _io_BytesIO_getvalue_impl(self);
|
||||
PyObject *dict;
|
||||
PyObject *state;
|
||||
|
||||
|
@ -787,7 +855,7 @@ bytesio_setstate(bytesio *self, PyObject *state)
|
|||
|
||||
/* Set the value of the internal buffer. If state[0] does not support the
|
||||
buffer protocol, bytesio_write will raise the appropriate TypeError. */
|
||||
result = bytesio_write(self, PyTuple_GET_ITEM(state, 0));
|
||||
result = _io_BytesIO_write(self, PyTuple_GET_ITEM(state, 0));
|
||||
if (result == NULL)
|
||||
return NULL;
|
||||
Py_DECREF(result);
|
||||
|
@ -874,16 +942,17 @@ bytesio_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
return (PyObject *)self;
|
||||
}
|
||||
|
||||
/*[clinic input]
|
||||
_io.BytesIO.__init__
|
||||
initial_bytes as initvalue: object(c_default="NULL") = b''
|
||||
|
||||
Buffered I/O implementation using an in-memory bytes buffer.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static int
|
||||
bytesio_init(bytesio *self, PyObject *args, PyObject *kwds)
|
||||
_io_BytesIO___init___impl(bytesio *self, PyObject *initvalue)
|
||||
/*[clinic end generated code: output=65c0c51e24c5b621 input=aac7f31b67bf0fb6]*/
|
||||
{
|
||||
char *kwlist[] = {"initial_bytes", NULL};
|
||||
PyObject *initvalue = NULL;
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:BytesIO", kwlist,
|
||||
&initvalue))
|
||||
return -1;
|
||||
|
||||
/* In case, __init__ is called multiple times. */
|
||||
self->string_size = 0;
|
||||
self->pos = 0;
|
||||
|
@ -902,7 +971,7 @@ bytesio_init(bytesio *self, PyObject *args, PyObject *kwds)
|
|||
}
|
||||
else {
|
||||
PyObject *res;
|
||||
res = bytesio_write(self, initvalue);
|
||||
res = _io_BytesIO_write(self, initvalue);
|
||||
if (res == NULL)
|
||||
return -1;
|
||||
Py_DECREF(res);
|
||||
|
@ -939,6 +1008,8 @@ bytesio_clear(bytesio *self)
|
|||
}
|
||||
|
||||
|
||||
#include "clinic/bytesio.c.h"
|
||||
|
||||
static PyGetSetDef bytesio_getsetlist[] = {
|
||||
{"closed", (getter)bytesio_get_closed, NULL,
|
||||
"True if the file is closed."},
|
||||
|
@ -946,36 +1017,30 @@ static PyGetSetDef bytesio_getsetlist[] = {
|
|||
};
|
||||
|
||||
static struct PyMethodDef bytesio_methods[] = {
|
||||
{"readable", (PyCFunction)return_not_closed, METH_NOARGS, readable_doc},
|
||||
{"seekable", (PyCFunction)return_not_closed, METH_NOARGS, seekable_doc},
|
||||
{"writable", (PyCFunction)return_not_closed, METH_NOARGS, writable_doc},
|
||||
{"close", (PyCFunction)bytesio_close, METH_NOARGS, close_doc},
|
||||
{"flush", (PyCFunction)bytesio_flush, METH_NOARGS, flush_doc},
|
||||
{"isatty", (PyCFunction)bytesio_isatty, METH_NOARGS, isatty_doc},
|
||||
{"tell", (PyCFunction)bytesio_tell, METH_NOARGS, tell_doc},
|
||||
{"write", (PyCFunction)bytesio_write, METH_O, write_doc},
|
||||
{"writelines", (PyCFunction)bytesio_writelines, METH_O, writelines_doc},
|
||||
{"read1", (PyCFunction)bytesio_read1, METH_O, read1_doc},
|
||||
{"readinto", (PyCFunction)bytesio_readinto, METH_O, readinto_doc},
|
||||
{"readline", (PyCFunction)bytesio_readline, METH_VARARGS, readline_doc},
|
||||
{"readlines", (PyCFunction)bytesio_readlines, METH_VARARGS, readlines_doc},
|
||||
{"read", (PyCFunction)bytesio_read, METH_VARARGS, read_doc},
|
||||
{"getbuffer", (PyCFunction)bytesio_getbuffer, METH_NOARGS, getbuffer_doc},
|
||||
{"getvalue", (PyCFunction)bytesio_getvalue, METH_NOARGS, getval_doc},
|
||||
{"seek", (PyCFunction)bytesio_seek, METH_VARARGS, seek_doc},
|
||||
{"truncate", (PyCFunction)bytesio_truncate, METH_VARARGS, truncate_doc},
|
||||
_IO_BYTESIO_READABLE_METHODDEF
|
||||
_IO_BYTESIO_SEEKABLE_METHODDEF
|
||||
_IO_BYTESIO_WRITABLE_METHODDEF
|
||||
_IO_BYTESIO_CLOSE_METHODDEF
|
||||
_IO_BYTESIO_FLUSH_METHODDEF
|
||||
_IO_BYTESIO_ISATTY_METHODDEF
|
||||
_IO_BYTESIO_TELL_METHODDEF
|
||||
_IO_BYTESIO_WRITE_METHODDEF
|
||||
_IO_BYTESIO_WRITELINES_METHODDEF
|
||||
_IO_BYTESIO_READ1_METHODDEF
|
||||
_IO_BYTESIO_READINTO_METHODDEF
|
||||
_IO_BYTESIO_READLINE_METHODDEF
|
||||
_IO_BYTESIO_READLINES_METHODDEF
|
||||
_IO_BYTESIO_READ_METHODDEF
|
||||
_IO_BYTESIO_GETBUFFER_METHODDEF
|
||||
_IO_BYTESIO_GETVALUE_METHODDEF
|
||||
_IO_BYTESIO_SEEK_METHODDEF
|
||||
_IO_BYTESIO_TRUNCATE_METHODDEF
|
||||
{"__getstate__", (PyCFunction)bytesio_getstate, METH_NOARGS, NULL},
|
||||
{"__setstate__", (PyCFunction)bytesio_setstate, METH_O, NULL},
|
||||
{"__sizeof__", (PyCFunction)bytesio_sizeof, METH_NOARGS, NULL},
|
||||
{NULL, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
PyDoc_STRVAR(bytesio_doc,
|
||||
"BytesIO([buffer]) -> object\n"
|
||||
"\n"
|
||||
"Create a buffered I/O implementation using an in-memory bytes\n"
|
||||
"buffer, ready for reading and writing.");
|
||||
|
||||
PyTypeObject PyBytesIO_Type = {
|
||||
PyVarObject_HEAD_INIT(NULL, 0)
|
||||
"_io.BytesIO", /*tp_name*/
|
||||
|
@ -998,7 +1063,7 @@ PyTypeObject PyBytesIO_Type = {
|
|||
0, /*tp_as_buffer*/
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
|
||||
Py_TPFLAGS_HAVE_GC, /*tp_flags*/
|
||||
bytesio_doc, /*tp_doc*/
|
||||
_io_BytesIO___init____doc__, /*tp_doc*/
|
||||
(traverseproc)bytesio_traverse, /*tp_traverse*/
|
||||
(inquiry)bytesio_clear, /*tp_clear*/
|
||||
0, /*tp_richcompare*/
|
||||
|
@ -1013,7 +1078,7 @@ PyTypeObject PyBytesIO_Type = {
|
|||
0, /*tp_descr_get*/
|
||||
0, /*tp_descr_set*/
|
||||
offsetof(bytesio, dict), /*tp_dictoffset*/
|
||||
(initproc)bytesio_init, /*tp_init*/
|
||||
_io_BytesIO___init__, /*tp_init*/
|
||||
0, /*tp_alloc*/
|
||||
bytesio_new, /*tp_new*/
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue