gh-101819: Adapt _io._BufferedIOBase_Type methods to Argument Clinic (#104355)

Make sure the defining class is passed to all methods,
so we can easily fetch module state from them in the future.
This commit is contained in:
Erlend E. Aasland 2023-05-10 16:22:55 +02:00 committed by GitHub
parent 13ac1766bc
commit ce8d3db256
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 236 additions and 44 deletions

View file

@ -115,6 +115,9 @@ bufferediobase_unsupported(_PyIO_State *state, const char *message)
/*[clinic input]
_io._BufferedIOBase.detach
cls: defining_class
/
Disconnect this buffer from its underlying raw stream and return it.
After the raw stream has been detached, the buffer is in an unusable
@ -122,63 +125,89 @@ state.
[clinic start generated code]*/
static PyObject *
_io__BufferedIOBase_detach_impl(PyObject *self)
/*[clinic end generated code: output=754977c8d10ed88c input=822427fb58fe4169]*/
_io__BufferedIOBase_detach_impl(PyObject *self, PyTypeObject *cls)
/*[clinic end generated code: output=b87b135d67cd4448 input=0b61a7b4357c1ea7]*/
{
_PyIO_State *state = IO_STATE();
return bufferediobase_unsupported(state, "detach");
}
PyDoc_STRVAR(bufferediobase_read_doc,
"Read and return up to n bytes.\n"
"\n"
"If the argument is omitted, None, or negative, reads and\n"
"returns all data until EOF.\n"
"\n"
"If the argument is positive, and the underlying raw stream is\n"
"not 'interactive', multiple raw reads may be issued to satisfy\n"
"the byte count (unless EOF is reached first). But for\n"
"interactive raw streams (as well as sockets and pipes), at most\n"
"one raw read will be issued, and a short result does not imply\n"
"that EOF is imminent.\n"
"\n"
"Returns an empty bytes object on EOF.\n"
"\n"
"Returns None if the underlying raw stream was open in non-blocking\n"
"mode and no data is available at the moment.\n");
/*[clinic input]
_io._BufferedIOBase.read
cls: defining_class
/
*args: object
Read and return up to n bytes.
If the argument is omitted, None, or negative, read and
return all data until EOF.
If the argument is positive, and the underlying raw stream is
not 'interactive', multiple raw reads may be issued to satisfy
the byte count (unless EOF is reached first).
However, for interactive raw streams (as well as sockets and pipes),
at most one raw read will be issued, and a short result does not
imply that EOF is imminent.
Return an empty bytes object on EOF.
Return None if the underlying raw stream was open in non-blocking
mode and no data is available at the moment.
[clinic start generated code]*/
static PyObject *
bufferediobase_read(PyObject *self, PyObject *args)
_io__BufferedIOBase_read_impl(PyObject *self, PyTypeObject *cls,
PyObject *args)
/*[clinic end generated code: output=4521b30940fd7b67 input=390205758adc8510]*/
{
_PyIO_State *state = IO_STATE();
return bufferediobase_unsupported(state, "read");
}
PyDoc_STRVAR(bufferediobase_read1_doc,
"Read and return up to n bytes, with at most one read() call\n"
"to the underlying raw stream. A short result does not imply\n"
"that EOF is imminent.\n"
"\n"
"Returns an empty bytes object on EOF.\n");
/*[clinic input]
_io._BufferedIOBase.read1
cls: defining_class
/
*args: object
Read and return up to n bytes, with at most one read() call to the underlying raw stream.
Return an empty bytes object on EOF.
A short result does not imply that EOF is imminent.
[clinic start generated code]*/
static PyObject *
bufferediobase_read1(PyObject *self, PyObject *args)
_io__BufferedIOBase_read1_impl(PyObject *self, PyTypeObject *cls,
PyObject *args)
/*[clinic end generated code: output=636fd241c21e050a input=ef546a1238c5b41c]*/
{
_PyIO_State *state = IO_STATE();
return bufferediobase_unsupported(state, "read1");
}
PyDoc_STRVAR(bufferediobase_write_doc,
"Write the given buffer to the IO stream.\n"
"\n"
"Returns the number of bytes written, which is always the length of b\n"
"in bytes.\n"
"\n"
"Raises BlockingIOError if the buffer is full and the\n"
"underlying raw stream cannot accept more data at the moment.\n");
/*[clinic input]
_io._BufferedIOBase.write
cls: defining_class
/
*args: object
Write the given buffer to the IO stream.
Return the number of bytes written, which is always
the length of b in bytes.
Raise BlockingIOError if the buffer is full and the
underlying raw stream cannot accept more data at the moment.
[clinic start generated code]*/
static PyObject *
bufferediobase_write(PyObject *self, PyObject *args)
_io__BufferedIOBase_write_impl(PyObject *self, PyTypeObject *cls,
PyObject *args)
/*[clinic end generated code: output=d51feea4bcac9892 input=f79b72c4dccb3dc2]*/
{
_PyIO_State *state = IO_STATE();
return bufferediobase_unsupported(state, "write");
@ -2336,11 +2365,11 @@ _io_BufferedRandom___init___impl(buffered *self, PyObject *raw,
static PyMethodDef bufferediobase_methods[] = {
_IO__BUFFEREDIOBASE_DETACH_METHODDEF
{"read", bufferediobase_read, METH_VARARGS, bufferediobase_read_doc},
{"read1", bufferediobase_read1, METH_VARARGS, bufferediobase_read1_doc},
_IO__BUFFEREDIOBASE_READ_METHODDEF
_IO__BUFFEREDIOBASE_READ1_METHODDEF
_IO__BUFFEREDIOBASE_READINTO_METHODDEF
_IO__BUFFEREDIOBASE_READINTO1_METHODDEF
{"write", bufferediobase_write, METH_VARARGS, bufferediobase_write_doc},
_IO__BUFFEREDIOBASE_WRITE_METHODDEF
{NULL, NULL}
};

View file

@ -92,15 +92,178 @@ PyDoc_STRVAR(_io__BufferedIOBase_detach__doc__,
"state.");
#define _IO__BUFFEREDIOBASE_DETACH_METHODDEF \
{"detach", (PyCFunction)_io__BufferedIOBase_detach, METH_NOARGS, _io__BufferedIOBase_detach__doc__},
{"detach", _PyCFunction_CAST(_io__BufferedIOBase_detach), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _io__BufferedIOBase_detach__doc__},
static PyObject *
_io__BufferedIOBase_detach_impl(PyObject *self);
_io__BufferedIOBase_detach_impl(PyObject *self, PyTypeObject *cls);
static PyObject *
_io__BufferedIOBase_detach(PyObject *self, PyObject *Py_UNUSED(ignored))
_io__BufferedIOBase_detach(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
return _io__BufferedIOBase_detach_impl(self);
if (nargs) {
PyErr_SetString(PyExc_TypeError, "detach() takes no arguments");
return NULL;
}
return _io__BufferedIOBase_detach_impl(self, cls);
}
PyDoc_STRVAR(_io__BufferedIOBase_read__doc__,
"read($self, /, *args)\n"
"--\n"
"\n"
"Read and return up to n bytes.\n"
"\n"
"If the argument is omitted, None, or negative, read and\n"
"return all data until EOF.\n"
"\n"
"If the argument is positive, and the underlying raw stream is\n"
"not \'interactive\', multiple raw reads may be issued to satisfy\n"
"the byte count (unless EOF is reached first).\n"
"However, for interactive raw streams (as well as sockets and pipes),\n"
"at most one raw read will be issued, and a short result does not\n"
"imply that EOF is imminent.\n"
"\n"
"Return an empty bytes object on EOF.\n"
"\n"
"Return None if the underlying raw stream was open in non-blocking\n"
"mode and no data is available at the moment.");
#define _IO__BUFFEREDIOBASE_READ_METHODDEF \
{"read", _PyCFunction_CAST(_io__BufferedIOBase_read), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _io__BufferedIOBase_read__doc__},
static PyObject *
_io__BufferedIOBase_read_impl(PyObject *self, PyTypeObject *cls,
PyObject *args);
static PyObject *
_io__BufferedIOBase_read(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty)
#else
# define KWTUPLE NULL
#endif
static const char * const _keywords[] = { NULL};
static _PyArg_Parser _parser = {
.keywords = _keywords,
.fname = "read",
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
PyObject *argsbuf[1];
PyObject *__clinic_args = NULL;
args = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, 0, argsbuf);
if (!args) {
goto exit;
}
__clinic_args = args[0];
return_value = _io__BufferedIOBase_read_impl(self, cls, __clinic_args);
exit:
Py_XDECREF(__clinic_args);
return return_value;
}
PyDoc_STRVAR(_io__BufferedIOBase_read1__doc__,
"read1($self, /, *args)\n"
"--\n"
"\n"
"Read and return up to n bytes, with at most one read() call to the underlying raw stream.\n"
"\n"
"Return an empty bytes object on EOF.\n"
"A short result does not imply that EOF is imminent.");
#define _IO__BUFFEREDIOBASE_READ1_METHODDEF \
{"read1", _PyCFunction_CAST(_io__BufferedIOBase_read1), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _io__BufferedIOBase_read1__doc__},
static PyObject *
_io__BufferedIOBase_read1_impl(PyObject *self, PyTypeObject *cls,
PyObject *args);
static PyObject *
_io__BufferedIOBase_read1(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty)
#else
# define KWTUPLE NULL
#endif
static const char * const _keywords[] = { NULL};
static _PyArg_Parser _parser = {
.keywords = _keywords,
.fname = "read1",
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
PyObject *argsbuf[1];
PyObject *__clinic_args = NULL;
args = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, 0, argsbuf);
if (!args) {
goto exit;
}
__clinic_args = args[0];
return_value = _io__BufferedIOBase_read1_impl(self, cls, __clinic_args);
exit:
Py_XDECREF(__clinic_args);
return return_value;
}
PyDoc_STRVAR(_io__BufferedIOBase_write__doc__,
"write($self, /, *args)\n"
"--\n"
"\n"
"Write the given buffer to the IO stream.\n"
"\n"
"Return the number of bytes written, which is always\n"
"the length of b in bytes.\n"
"\n"
"Raise BlockingIOError if the buffer is full and the\n"
"underlying raw stream cannot accept more data at the moment.");
#define _IO__BUFFEREDIOBASE_WRITE_METHODDEF \
{"write", _PyCFunction_CAST(_io__BufferedIOBase_write), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _io__BufferedIOBase_write__doc__},
static PyObject *
_io__BufferedIOBase_write_impl(PyObject *self, PyTypeObject *cls,
PyObject *args);
static PyObject *
_io__BufferedIOBase_write(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty)
#else
# define KWTUPLE NULL
#endif
static const char * const _keywords[] = { NULL};
static _PyArg_Parser _parser = {
.keywords = _keywords,
.fname = "write",
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
PyObject *argsbuf[1];
PyObject *__clinic_args = NULL;
args = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, 0, argsbuf);
if (!args) {
goto exit;
}
__clinic_args = args[0];
return_value = _io__BufferedIOBase_write_impl(self, cls, __clinic_args);
exit:
Py_XDECREF(__clinic_args);
return return_value;
}
PyDoc_STRVAR(_io__Buffered_peek__doc__,
@ -714,4 +877,4 @@ skip_optional_pos:
exit:
return return_value;
}
/*[clinic end generated code: output=8412b10c04259bb8 input=a9049054013a1b77]*/
/*[clinic end generated code: output=c4ea041ccc91b5d2 input=a9049054013a1b77]*/