mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
Added PyObject_AsFileDescriptor, which checks for integer, long integer,
or .fileno() method
This commit is contained in:
parent
9656abd913
commit
06051edc0d
2 changed files with 59 additions and 0 deletions
|
@ -30,6 +30,7 @@ extern DL_IMPORT(PyObject *) PyFile_GetLine(PyObject *, int);
|
|||
extern DL_IMPORT(int) PyFile_WriteObject(PyObject *, PyObject *, int);
|
||||
extern DL_IMPORT(int) PyFile_SoftSpace(PyObject *, int);
|
||||
extern DL_IMPORT(int) PyFile_WriteString(char *, PyObject *);
|
||||
extern DL_IMPORT(int) PyObject_AsFileDescriptor(PyObject *);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -1098,3 +1098,61 @@ PyFile_WriteString(char *s, PyObject *f)
|
|||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Try to get a file-descriptor from a Python object. If the object
|
||||
is an integer or long integer, its value is returned. If not, the
|
||||
object's fileno() method is called if it exists; the method must return
|
||||
an integer or long integer, which is returned as the file descriptor value.
|
||||
-1 is returned on failure.
|
||||
*/
|
||||
|
||||
int PyObject_AsFileDescriptor(PyObject *o)
|
||||
{
|
||||
int fd;
|
||||
PyObject *meth;
|
||||
|
||||
if (PyInt_Check(o)) {
|
||||
fd = PyInt_AsLong(o);
|
||||
}
|
||||
else if (PyLong_Check(o)) {
|
||||
fd = PyLong_AsLong(o);
|
||||
}
|
||||
else if ((meth = PyObject_GetAttrString(o, "fileno")) != NULL)
|
||||
{
|
||||
PyObject *fno = PyEval_CallObject(meth, NULL);
|
||||
Py_DECREF(meth);
|
||||
if (fno == NULL)
|
||||
return -1;
|
||||
|
||||
if (PyInt_Check(fno)) {
|
||||
fd = PyInt_AsLong(fno);
|
||||
Py_DECREF(fno);
|
||||
}
|
||||
else if (PyLong_Check(fno)) {
|
||||
fd = PyLong_AsLong(fno);
|
||||
Py_DECREF(fno);
|
||||
}
|
||||
else {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"fileno() returned a non-integer");
|
||||
Py_DECREF(fno);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"argument must be an int, or have a fileno() method.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (fd < 0) {
|
||||
PyErr_Format(PyExc_ValueError,
|
||||
"file descriptor cannot be a negative integer (%i)",
|
||||
fd);
|
||||
return -1;
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue