mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Merged revisions 76806,76808 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k ................ r76806 | benjamin.peterson | 2009-12-13 13:25:34 -0600 (Sun, 13 Dec 2009) | 14 lines Merged revisions 76805 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r76805 | benjamin.peterson | 2009-12-13 13:19:07 -0600 (Sun, 13 Dec 2009) | 7 lines accept None as the same as having passed no argument in file types #7349 This is for consistency with imitation file objects like StringIO and BytesIO. This commit also adds a few tests, where they were lacking for concerned methods. ........ ................ r76808 | benjamin.peterson | 2009-12-13 13:28:09 -0600 (Sun, 13 Dec 2009) | 9 lines Merged revisions 76807 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r76807 | benjamin.peterson | 2009-12-13 13:27:02 -0600 (Sun, 13 Dec 2009) | 1 line remove unused variable ........ ................
This commit is contained in:
parent
bb4cd51982
commit
6b59f77c43
9 changed files with 81 additions and 18 deletions
|
@ -561,6 +561,30 @@ PyNumber_AsOff_t(PyObject *item, PyObject *err)
|
|||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* Basically the "n" format code with the ability to turn None into -1. */
|
||||
int
|
||||
_PyIO_ConvertSsize_t(PyObject *obj, void *result) {
|
||||
Py_ssize_t limit;
|
||||
if (obj == Py_None) {
|
||||
limit = -1;
|
||||
}
|
||||
else if (PyNumber_Check(obj)) {
|
||||
limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError);
|
||||
if (limit == -1 && PyErr_Occurred())
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"integer argument expected, got '%.200s'",
|
||||
Py_TYPE(obj)->tp_name);
|
||||
return 0;
|
||||
}
|
||||
*((Py_ssize_t *)result) = limit;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
iomodule_traverse(PyObject *mod, visitproc visit, void *arg) {
|
||||
_PyIO_State *state = IO_MOD_STATE(mod);
|
||||
|
@ -574,6 +598,7 @@ iomodule_traverse(PyObject *mod, visitproc visit, void *arg) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
iomodule_clear(PyObject *mod) {
|
||||
_PyIO_State *state = IO_MOD_STATE(mod);
|
||||
|
@ -591,6 +616,7 @@ iomodule_free(PyObject *mod) {
|
|||
iomodule_clear(mod);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Module definition
|
||||
*/
|
||||
|
|
|
@ -19,6 +19,9 @@ extern PyTypeObject PyBufferedRandom_Type;
|
|||
extern PyTypeObject PyTextIOWrapper_Type;
|
||||
extern PyTypeObject PyIncrementalNewlineDecoder_Type;
|
||||
|
||||
|
||||
extern int _PyIO_ConvertSsize_t(PyObject *, void *);
|
||||
|
||||
/* These functions are used as METH_NOARGS methods, are normally called
|
||||
* with args=NULL, and return a new reference.
|
||||
* BUT when args=Py_True is passed, they return a borrowed reference.
|
||||
|
|
|
@ -716,7 +716,7 @@ buffered_read(buffered *self, PyObject *args)
|
|||
PyObject *res;
|
||||
|
||||
CHECK_INITIALIZED(self)
|
||||
if (!PyArg_ParseTuple(args, "|n:read", &n)) {
|
||||
if (!PyArg_ParseTuple(args, "|O&:read", &_PyIO_ConvertSsize_t, &n)) {
|
||||
return NULL;
|
||||
}
|
||||
if (n < -1) {
|
||||
|
@ -949,10 +949,8 @@ buffered_readline(buffered *self, PyObject *args)
|
|||
Py_ssize_t limit = -1;
|
||||
|
||||
CHECK_INITIALIZED(self)
|
||||
|
||||
if (!PyArg_ParseTuple(args, "|n:readline", &limit)) {
|
||||
if (!PyArg_ParseTuple(args, "|O&:readline", &_PyIO_ConvertSsize_t, &limit))
|
||||
return NULL;
|
||||
}
|
||||
return _buffered_readline(self, limit);
|
||||
}
|
||||
|
||||
|
|
|
@ -602,7 +602,7 @@ fileio_read(fileio *self, PyObject *args)
|
|||
if (!self->readable)
|
||||
return err_mode("reading");
|
||||
|
||||
if (!PyArg_ParseTuple(args, "|n", &size))
|
||||
if (!PyArg_ParseTuple(args, "|O&", &_PyIO_ConvertSsize_t, &size))
|
||||
return NULL;
|
||||
|
||||
if (size < 0) {
|
||||
|
|
|
@ -455,7 +455,7 @@ iobase_readline(PyObject *self, PyObject *args)
|
|||
PyObject *buffer, *result;
|
||||
Py_ssize_t old_size = -1;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "|n:readline", &limit)) {
|
||||
if (!PyArg_ParseTuple(args, "|O&:readline", &_PyIO_ConvertSsize_t, &limit)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -577,16 +577,11 @@ static PyObject *
|
|||
iobase_readlines(PyObject *self, PyObject *args)
|
||||
{
|
||||
Py_ssize_t hint = -1, length = 0;
|
||||
PyObject *hintobj = Py_None, *result;
|
||||
PyObject *result;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "|O:readlines", &hintobj)) {
|
||||
if (!PyArg_ParseTuple(args, "|O&:readlines", &_PyIO_ConvertSsize_t, &hint)) {
|
||||
return NULL;
|
||||
}
|
||||
if (hintobj != Py_None) {
|
||||
hint = PyNumber_AsSsize_t(hintobj, PyExc_ValueError);
|
||||
if (hint == -1 && PyErr_Occurred())
|
||||
return NULL;
|
||||
}
|
||||
|
||||
result = PyList_New(0);
|
||||
if (result == NULL)
|
||||
|
|
|
@ -1479,7 +1479,7 @@ textiowrapper_read(textio *self, PyObject *args)
|
|||
|
||||
CHECK_INITIALIZED(self);
|
||||
|
||||
if (!PyArg_ParseTuple(args, "|n:read", &n))
|
||||
if (!PyArg_ParseTuple(args, "|O&:read", &_PyIO_ConvertSsize_t, &n))
|
||||
return NULL;
|
||||
|
||||
CHECK_CLOSED(self);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue