diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2014-02-28 14:27:29 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2014-02-28 14:27:29 (GMT) |
commit | 815b41b1cdb98686fc3f9cdf995b6983c12c04b3 (patch) | |
tree | 58c273e0da20ff65f83301041971ec3e723bd1d3 /Parser | |
parent | 9db1ab82508cd4be4195e520da8cb8d86cd1f7e4 (diff) | |
download | cpython-815b41b1cdb98686fc3f9cdf995b6983c12c04b3.zip cpython-815b41b1cdb98686fc3f9cdf995b6983c12c04b3.tar.gz cpython-815b41b1cdb98686fc3f9cdf995b6983c12c04b3.tar.bz2 |
Issue #20731: Properly position in source code files even if they
are opened in text mode. Patch by Serhiy Storchaka.
Diffstat (limited to 'Parser')
-rw-r--r-- | Parser/tokenizer.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 8530723..660c0f0 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -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); |