[Python-checkins] cpython (3.5): restructure fp_setreadl so as to avoid refleaks (closes #27981)

benjamin.peterson python-checkins at python.org
Tue Sep 13 01:10:17 EDT 2016


https://hg.python.org/cpython/rev/2be31da53dcc
changeset: 103736:2be31da53dcc
branch: 3.5
parent: 103725:138625694ed6
user: Benjamin Peterson <benjamin at python.org>
date: Mon Sep 12 22:06:58 2016 -0700
summary:
 restructure fp_setreadl so as to avoid refleaks (closes #27981)
files:
 Parser/tokenizer.c | 32 +++++++++++++++++---------------
 1 files changed, 17 insertions(+), 15 deletions(-)
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c
--- a/Parser/tokenizer.c
+++ b/Parser/tokenizer.c
@@ -497,16 +497,12 @@
 static int
 fp_setreadl(struct tok_state *tok, const char* enc)
 {
- PyObject *readline = NULL, *stream = NULL, *io = NULL;
+ PyObject *readline, *io, *stream;
 _Py_IDENTIFIER(open);
 _Py_IDENTIFIER(readline);
 int fd;
 long pos;
 
- io = PyImport_ImportModuleNoBlock("io");
- if (io == NULL)
- goto cleanup;
-
 fd = fileno(tok->fp);
 /* Due to buffering the file offset for fd can be different from the file
 * position of tok->fp. If tok->fp was opened in text mode on Windows,
@@ -517,27 +513,33 @@
 if (pos == -1 ||
 lseek(fd, (off_t)(pos > 0 ? pos - 1 : pos), SEEK_SET) == (off_t)-1) {
 PyErr_SetFromErrnoWithFilename(PyExc_OSError, NULL);
- goto cleanup;
+ return 0;
 }
 
+ io = PyImport_ImportModuleNoBlock("io");
+ if (io == NULL)
+ return 0;
+
 stream = _PyObject_CallMethodId(io, &PyId_open, "isisOOO",
 fd, "r", -1, enc, Py_None, Py_None, Py_False);
+ Py_DECREF(io);
 if (stream == NULL)
- goto cleanup;
+ return 0;
 
 readline = _PyObject_GetAttrId(stream, &PyId_readline);
+ Py_DECREF(stream);
+ if (readline == NULL)
+ return 0;
 Py_XSETREF(tok->decoding_readline, readline);
+
 if (pos > 0) {
- if (PyObject_CallObject(readline, NULL) == NULL) {
- readline = NULL;
- goto cleanup;
- }
+ PyObject *bufobj = PyObject_CallObject(readline, NULL);
+ if (bufobj == NULL)
+ return 0;
+ Py_DECREF(bufobj);
 }
 
- cleanup:
- Py_XDECREF(stream);
- Py_XDECREF(io);
- return readline != NULL;
+ return 1;
 }
 
 /* Fetch the next byte from TOK. */
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

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