summaryrefslogtreecommitdiffstats
path: root/Parser
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@haypocalc.com>2010-10-14 12:04:34 (GMT)
committerVictor Stinner <victor.stinner@haypocalc.com>2010-10-14 12:04:34 (GMT)
commit22a351aabfaf8a9136ad148ceecddb55a9874f1f (patch)
tree98fa31d1fe60a942736cfb269430e05324781a31 /Parser
parent383c32dd3821828f271c0bf7bcf21f0ba71792e8 (diff)
downloadcpython-22a351aabfaf8a9136ad148ceecddb55a9874f1f.zip
cpython-22a351aabfaf8a9136ad148ceecddb55a9874f1f.tar.gz
cpython-22a351aabfaf8a9136ad148ceecddb55a9874f1f.tar.bz2
Issue #10095: fp_setreadl() doesn't reopen the file, reuse instead the file
descriptor.
Diffstat (limited to 'Parser')
-rw-r--r--Parser/tokenizer.c15
-rw-r--r--Parser/tokenizer.h2
2 files changed, 10 insertions, 7 deletions
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. */