diff Python/compile.c @ 30428:c2c10f1eb8e2 legacy-trunk

Fix leak discovered in test_new by Michael Hudson. Will backport to 2.3.1
author Raymond Hettinger <python@rcn.com>
date Mon, 15 Sep 2003 21:43:16 +0000
parents 806179400f35
children e8147f841a4a
line wrap: on
line diff
--- a/Python/compile.c	Mon Sep 15 18:20:52 2003 +0000
+++ b/Python/compile.c	Mon Sep 15 21:43:16 2003 +0000
@@ -104,6 +104,8 @@
 	int nlocals;
 	int stacksize;
 	int flags;
+	PyObject *co;
+	PyObject *empty;
 	PyObject *code;
 	PyObject *consts;
 	PyObject *names;
@@ -127,31 +129,26 @@
 			      &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