From: Raymond Hettinger Date: Tue, 16 Sep 2003 04:36:33 +0000 (+0000) Subject: Backport leak fix for new code objects. X-Git-Tag: v2.3.1~50 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c866ac776c65799fc55da397c582ea583330ea9c;p=thirdparty%2FPython%2Fcpython.git Backport leak fix for new code objects. --- diff --git a/Misc/NEWS b/Misc/NEWS index ce1fb7e0d5da..c60771af2ba6 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,8 @@ What's New in Python 2.3.1? Core and builtins ----------------- +- Fixed a leak when new code objects are instantiated. + - Bug #800796: slice(1).__hash__() now raises a TypeError, unhashable type. - Bug #603724: Pass an explicit buffer to setvbuf in PyFile_SetBufSize(). diff --git a/Python/compile.c b/Python/compile.c index 38624d4cceb5..9ac0032bab28 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -104,6 +104,8 @@ code_new(PyTypeObject *type, PyObject *args, PyObject *kw) int nlocals; int stacksize; int flags; + PyObject *co; + PyObject *empty = NULL; PyObject *code; PyObject *consts; PyObject *names; @@ -127,31 +129,28 @@ code_new(PyTypeObject *type, PyObject *args, PyObject *kw) &PyTuple_Type, &cellvars)) return NULL; - if (freevars == NULL || cellvars == NULL) { - PyObject *empty = PyTuple_New(0); - if (empty == NULL) - return NULL; - if (freevars == NULL) { - freevars = empty; - Py_INCREF(freevars); - } - if (cellvars == NULL) { - cellvars = empty; - Py_INCREF(cellvars); - } - Py_DECREF(empty); - } - if (!PyObject_CheckReadBuffer(code)) { PyErr_SetString(PyExc_TypeError, "bytecode object must be a single-segment read-only buffer"); return NULL; } - return (PyObject *)PyCode_New(argcount, nlocals, stacksize, flags, + if (freevars == NULL || cellvars == NULL) { + empty = PyTuple_New(0); + if (empty == NULL) + return NULL; + if (freevars == NULL) + freevars = empty; + if (cellvars == NULL) + cellvars = empty; + } + + co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags, code, consts, names, varnames, freevars, cellvars, filename, name, - firstlineno, lnotab); + firstlineno, lnotab); + Py_XDECREF(empty); + return co; } static void