Author: neal.norwitz
Date: Sun Aug 12 02:03:22 2007
New Revision: 56938

Modified:
   python/branches/py3k/Parser/tokenizer.c
Log:
Fix refleaks from execfile('file that contains a # coding: line')
Also simplify logic a bit in fp_setreadl.


Modified: python/branches/py3k/Parser/tokenizer.c
==============================================================================
--- python/branches/py3k/Parser/tokenizer.c     (original)
+++ python/branches/py3k/Parser/tokenizer.c     Sun Aug 12 02:03:22 2007
@@ -369,6 +369,7 @@
        PyObject* bufobj = tok->decoding_buffer;
        const char *buf;
        Py_ssize_t buflen;
+       int allocated = 0;
 
        /* Ask for one less byte so we can terminate it */
        assert(size > 0);
@@ -377,21 +378,34 @@
        if (bufobj == NULL) {
                bufobj = PyObject_CallObject(tok->decoding_readline, NULL);
                if (bufobj == NULL)
-                       return error_ret(tok);
+                       goto error;
+               allocated = 1;
+       }
+        if (PyObject_AsCharBuffer(bufobj, &buf, &buflen) < 0) {
+               goto error;
        }
-        if (PyObject_AsCharBuffer(bufobj, &buf, &buflen) < 0)
-               return error_ret(tok);
        if (buflen > size) {
+               Py_XDECREF(tok->decoding_buffer);
                tok->decoding_buffer = PyBytes_FromStringAndSize(buf+size,
                                                                 buflen-size);
                if (tok->decoding_buffer == NULL)
-                       return error_ret(tok);
+                       goto error;
                buflen = size;
        }
        memcpy(s, buf, buflen);
        s[buflen] = '\0';
-       if (buflen == 0) return NULL; /* EOF */
+       if (buflen == 0) /* EOF */
+               s = NULL;
+       if (allocated) {
+               Py_DECREF(bufobj);
+       }
        return s;
+
+error:
+       if (allocated) {
+               Py_XDECREF(bufobj);
+       }
+       return error_ret(tok);
 }
 
 /* Set the readline function for TOK to a StreamReader's
@@ -408,7 +422,6 @@
 fp_setreadl(struct tok_state *tok, const char* enc)
 {
        PyObject *readline = NULL, *stream = NULL, *io = NULL;
-       int ok = 0;
 
        io = PyImport_ImportModule("io");
        if (io == NULL)
@@ -419,17 +432,14 @@
        if (stream == NULL)
                goto cleanup;
 
+       Py_XDECREF(tok->decoding_readline);
        readline = PyObject_GetAttrString(stream, "readline");
-       if (readline == NULL)
-               goto cleanup;
-
        tok->decoding_readline = readline;
-       ok = 1;
 
   cleanup:
        Py_XDECREF(stream);
        Py_XDECREF(io);
-       return ok;
+       return readline != NULL;
 }
 
 /* Fetch the next byte from TOK. */
_______________________________________________
Python-3000-checkins mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-3000-checkins

Reply via email to