summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS3
-rw-r--r--Parser/tokenizer.c15
-rw-r--r--Parser/tokenizer.h2
3 files changed, 13 insertions, 7 deletions
diff --git a/Misc/NEWS b/Misc/NEWS
index c8a43b5..2d78412 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ What's New in Python 3.2 Beta 1?
Core and Builtins
-----------------
+- Issue #10095: fp_setreadl() doesn't reopen the file, reuse instead the file
+ descriptor.
+
- Issue #9418: Moved private string methods ``_formatter_parser`` and
``_formatter_field_name_split`` into a new ``_string`` module.
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c
index 90b1b68..28dcea1 100644
--- a/Parser/tokenizer.c
+++ b/Parser/tokenizer.c
@@ -462,17 +462,20 @@ static int
fp_setreadl(struct tok_state *tok, const char* enc)
{
PyObject *readline = NULL, *stream = NULL, *io = NULL;
+ int fd;
io = PyImport_ImportModuleNoBlock("io");
if (io == NULL)
goto cleanup;
- if (tok->filename)
- stream = PyObject_CallMethod(io, "open", "ssis",
- tok->filename, "r", -1, enc);
- else
- stream = PyObject_CallMethod(io, "open", "isisOOO",
- fileno(tok->fp), "r", -1, enc, Py_None, Py_None, Py_False);
+ fd = fileno(tok->fp);
+ if (lseek(fd, 0, SEEK_SET) == (off_t)-1) {
+ PyErr_SetFromErrnoWithFilename(PyExc_OSError, NULL);
+ goto cleanup;
+ }
+
+ stream = PyObject_CallMethod(io, "open", "isisOOO",
+ fd, "r", -1, enc, Py_None, Py_None, Py_False);
if (stream == NULL)
goto cleanup;
diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h
index c8e19c1..d9866f6 100644
--- a/Parser/tokenizer.h
+++ b/Parser/tokenizer.h
@@ -53,7 +53,7 @@ struct tok_state {
int cont_line; /* whether we are in a continuation line. */
const char* line_start; /* pointer to start of current line */
#ifndef PGEN
- PyObject *decoding_readline; /* codecs.open(...).readline */
+ PyObject *decoding_readline; /* open(...).readline */
PyObject *decoding_buffer;
#endif
const char* enc; /* Encoding for the current str. */