]> granicus.if.org Git - python/commitdiff
Issue #10095: fp_setreadl() doesn't reopen the file, reuse instead the file
authorVictor Stinner <victor.stinner@haypocalc.com>
Thu, 14 Oct 2010 12:04:34 +0000 (12:04 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Thu, 14 Oct 2010 12:04:34 +0000 (12:04 +0000)
descriptor.

Misc/NEWS
Parser/tokenizer.c
Parser/tokenizer.h

index c8a43b5834ec1fc523afc7cfe5a0c5d456bb36f6..2d784122268de73cd3da8b0e33910735162215e4 100644 (file)
--- 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.
 
index 90b1b689b5452c667f4a2249793f39f54cfe1afc..28dcea1085a38c50f9bf624966ad4be0d29d5aea 100644 (file)
@@ -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;
 
index c8e19c19ba469a379440d2d5795587f9e71c1635..d9866f6c18547ba1d1552d6b453bd92aa0cfce9b 100644 (file)
@@ -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. */