From c866ac776c65799fc55da397c582ea583330ea9c Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Tue, 16 Sep 2003 04:36:33 +0000 Subject: [PATCH] Backport leak fix for new code objects. --- Misc/NEWS | 2 ++ Python/compile.c | 33 ++++++++++++++++----------------- 2 files changed, 18 insertions(+), 17 deletions(-) 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 -- 2.47.3