From 37a724d718072e0cdb7b9e773a7c0b9461b3eba1 Mon Sep 17 00:00:00 2001
From: Raymond Hettinger <python@rcn.com>
Date: Mon, 15 Sep 2003 21:43:16 +0000
Subject: Fix leak discovered in test_new by Michael Hudson.

Will backport to 2.3.1
---
 Python/compile.c | 31 ++++++++++++++-----------------
 1 file changed, 14 insertions(+), 17 deletions(-)

diff --git a/Python/compile.c b/Python/compile.c
index 69a07af..f94a3ac 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;
 	PyObject *code;
 	PyObject *consts;
 	PyObject *names;
@@ -127,31 +129,26 @@ 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,
+	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_DECREF(empty);
+	return co;
 }
 
 static void
-- 
cgit v0.12

