diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2010-10-14 12:04:34 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2010-10-14 12:04:34 (GMT) |
commit | 22a351aabfaf8a9136ad148ceecddb55a9874f1f (patch) | |
tree | 98fa31d1fe60a942736cfb269430e05324781a31 | |
parent | 383c32dd3821828f271c0bf7bcf21f0ba71792e8 (diff) | |
download | cpython-22a351aabfaf8a9136ad148ceecddb55a9874f1f.zip cpython-22a351aabfaf8a9136ad148ceecddb55a9874f1f.tar.gz cpython-22a351aabfaf8a9136ad148ceecddb55a9874f1f.tar.bz2 |
Issue #10095: fp_setreadl() doesn't reopen the file, reuse instead the file
descriptor.
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Parser/tokenizer.c | 15 | ||||
-rw-r--r-- | Parser/tokenizer.h | 2 |
3 files changed, 13 insertions, 7 deletions
@@ -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. */ |