Kaydet (Commit) 815b41b1 authored tarafından Martin v. Löwis's avatar Martin v. Löwis

Issue #20731: Properly position in source code files even if they

are opened in text mode. Patch by Serhiy Storchaka.
üst 9db1ab82
...@@ -37,6 +37,8 @@ Lib/test/xmltestdata/* = BIN ...@@ -37,6 +37,8 @@ Lib/test/xmltestdata/* = BIN
Lib/venv/scripts/nt/* = BIN Lib/venv/scripts/nt/* = BIN
Lib/test/coding20731.py = BIN
# All other files (which presumably are human-editable) are "native". # All other files (which presumably are human-editable) are "native".
# This must be the last rule! # This must be the last rule!
......
import unittest import unittest
from test.support import TESTFN, unlink, unload from test.support import TESTFN, unlink, unload
import importlib, os, sys import importlib, os, sys, subprocess
class CodingTest(unittest.TestCase): class CodingTest(unittest.TestCase):
def test_bad_coding(self): def test_bad_coding(self):
...@@ -58,6 +58,13 @@ class CodingTest(unittest.TestCase): ...@@ -58,6 +58,13 @@ class CodingTest(unittest.TestCase):
self.assertTrue(c.exception.args[0].startswith(expected), self.assertTrue(c.exception.args[0].startswith(expected),
msg=c.exception.args[0]) msg=c.exception.args[0])
def test_20731(self):
sub = subprocess.Popen([sys.executable,
os.path.join(os.path.dirname(__file__),
'coding20731.py')],
stderr=subprocess.PIPE)
err = sub.communicate()[1]
self.assertEquals(err, b'')
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()
...@@ -10,6 +10,9 @@ What's New in Python 3.3.5 release candidate 1? ...@@ -10,6 +10,9 @@ What's New in Python 3.3.5 release candidate 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #20731: Properly position in source code files even if they
are opened in text mode. Patch by Serhiy Storchaka.
- Issue #19619: str.encode, bytes.decode and bytearray.decode now use an - Issue #19619: str.encode, bytes.decode and bytearray.decode now use an
internal API to throw LookupError for known non-text encodings, rather internal API to throw LookupError for known non-text encodings, rather
than attempting the encoding or decoding operation and then throwing a than attempting the encoding or decoding operation and then throwing a
......
...@@ -498,9 +498,13 @@ fp_setreadl(struct tok_state *tok, const char* enc) ...@@ -498,9 +498,13 @@ fp_setreadl(struct tok_state *tok, const char* enc)
fd = fileno(tok->fp); fd = fileno(tok->fp);
/* Due to buffering the file offset for fd can be different from the file /* 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); 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); PyErr_SetFromErrnoWithFilename(PyExc_OSError, NULL);
goto cleanup; goto cleanup;
} }
...@@ -513,6 +517,12 @@ fp_setreadl(struct tok_state *tok, const char* enc) ...@@ -513,6 +517,12 @@ fp_setreadl(struct tok_state *tok, const char* enc)
Py_XDECREF(tok->decoding_readline); Py_XDECREF(tok->decoding_readline);
readline = _PyObject_GetAttrId(stream, &PyId_readline); readline = _PyObject_GetAttrId(stream, &PyId_readline);
tok->decoding_readline = readline; tok->decoding_readline = readline;
if (pos > 0) {
if (PyObject_CallObject(readline, NULL) == NULL) {
readline = NULL;
goto cleanup;
}
}
cleanup: cleanup:
Py_XDECREF(stream); Py_XDECREF(stream);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment