[Python-checkins] cpython (3.3): Issue #20731: Properly position in source code files even if they

martin.v.loewis python-checkins at python.org
Fri Feb 28 15:49:39 CET 2014


http://hg.python.org/cpython/rev/ade5e4922a54
changeset: 89423:ade5e4922a54
branch: 3.3
parent: 89419:daf44eb9c54e
user: Martin v. Löwis <martin at v.loewis.de>
date: Fri Feb 28 15:27:29 2014 +0100
summary:
 Issue #20731: Properly position in source code files even if they
are opened in text mode. Patch by Serhiy Storchaka.
files:
 .hgeol | 2 ++
 Lib/test/coding20731.py | 4 ++++
 Lib/test/test_coding.py | 9 ++++++++-
 Misc/NEWS | 3 +++
 Parser/tokenizer.c | 14 ++++++++++++--
 5 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/.hgeol b/.hgeol
--- a/.hgeol
+++ b/.hgeol
@@ -37,6 +37,8 @@
 
 Lib/venv/scripts/nt/* = BIN
 
+Lib/test/coding20731.py = BIN
+
 # All other files (which presumably are human-editable) are "native".
 # This must be the last rule!
 
diff --git a/Lib/test/coding20731.py b/Lib/test/coding20731.py
new file mode 100644
--- /dev/null
+++ b/Lib/test/coding20731.py
@@ -0,0 +1,4 @@
+#coding:latin1
+
+
+
diff --git a/Lib/test/test_coding.py b/Lib/test/test_coding.py
--- a/Lib/test/test_coding.py
+++ b/Lib/test/test_coding.py
@@ -1,6 +1,6 @@
 import unittest
 from test.support import TESTFN, unlink, unload
-import importlib, os, sys
+import importlib, os, sys, subprocess
 
 class CodingTest(unittest.TestCase):
 def test_bad_coding(self):
@@ -58,6 +58,13 @@
 self.assertTrue(c.exception.args[0].startswith(expected),
 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__":
 unittest.main()
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@
 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
 internal API to throw LookupError for known non-text encodings, rather
 than attempting the encoding or decoding operation and then throwing a
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c
--- a/Parser/tokenizer.c
+++ b/Parser/tokenizer.c
@@ -498,9 +498,13 @@
 
 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 @@
 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);
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /