mirror of
https://github.com/python/cpython.git
synced 2025-11-01 18:51:43 +00:00
Merge with 3.3
This commit is contained in:
commit
78f1e4c865
5 changed files with 30 additions and 2 deletions
|
|
@ -498,9 +498,13 @@ fp_setreadl(struct tok_state *tok, const char* enc)
|
|||
|
||||
fd = fileno(tok->fp);
|
||||
/* Due to buffering the file offset for fd can be different from the file
|
||||
* position of tok->fp. */
|
||||
* position of tok->fp. If tok->fp was opened in text mode on Windows,
|
||||
* its file position counts CRLF as one char and can't be directly mapped
|
||||
* to the file offset for fd. Instead we step back one byte and read to
|
||||
* the end of line.*/
|
||||
pos = ftell(tok->fp);
|
||||
if (pos == -1 || lseek(fd, (off_t)pos, SEEK_SET) == (off_t)-1) {
|
||||
if (pos == -1 ||
|
||||
lseek(fd, (off_t)(pos > 0 ? pos - 1 : pos), SEEK_SET) == (off_t)-1) {
|
||||
PyErr_SetFromErrnoWithFilename(PyExc_OSError, NULL);
|
||||
goto cleanup;
|
||||
}
|
||||
|
|
@ -513,6 +517,12 @@ fp_setreadl(struct tok_state *tok, const char* enc)
|
|||
Py_XDECREF(tok->decoding_readline);
|
||||
readline = _PyObject_GetAttrId(stream, &PyId_readline);
|
||||
tok->decoding_readline = readline;
|
||||
if (pos > 0) {
|
||||
if (PyObject_CallObject(readline, NULL) == NULL) {
|
||||
readline = NULL;
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
cleanup:
|
||||
Py_XDECREF(stream);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue