From 9832613beba817aa3d6abfde85eba40a9173fcdc Mon Sep 17 00:00:00 2001
From: Jeremy Hylton <jeremy@alum.mit.edu>
Date: Mon, 22 Sep 2003 04:26:44 +0000
Subject: Fix SF bug [ 808594 ] leak on lambda with duplicate arguments error.

Refactor code so that one helper routine sets error location and
increments st_errors.

Bug fix candidate.
---
 Python/compile.c | 31 ++++++++++++++++---------------
 1 file changed, 16 insertions(+), 15 deletions(-)

diff --git a/Python/compile.c b/Python/compile.c
index b95732b..73d9742 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -4778,6 +4778,16 @@ symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
 }
 
 static int
+symtable_error(struct symtable *st, int lineno)
+{
+	if (lineno == 0)
+		lineno = st->st_cur->ste_lineno;
+	PyErr_SyntaxLocation(st->st_filename, lineno);
+	st->st_errors++;
+	return -1;
+}
+
+static int
 symtable_load_symbols(struct compiling *c)
 {
 	struct symtable *st = c->c_symtable;
@@ -4835,9 +4845,7 @@ symtable_load_symbols(struct compiling *c)
 			if (flags & DEF_PARAM) {
 				PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
 					     PyString_AS_STRING(name));
-				PyErr_SyntaxLocation(st->st_filename, 
-						   ste->ste_lineno);
-				st->st_errors++;
+				symtable_error(st, 0);
 				goto fail;
 			}
 			if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
@@ -5190,9 +5198,7 @@ symtable_add_def_o(struct symtable *st, PyObject *dict,
 	    if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
 		    PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
 				 PyString_AsString(name));
-		    PyErr_SyntaxLocation(st->st_filename,
-				       st->st_cur->ste_lineno);
-		    return -1;
+		    return symtable_error(st, 0);
 	    }
 	    val |= flag;
 	} else
@@ -5589,9 +5595,7 @@ symtable_global(struct symtable *st, node *n)
 				PyErr_Format(PyExc_SyntaxError,
 				     "name '%.400s' is local and global",
 					     name);
-				PyErr_SyntaxLocation(st->st_filename,
-						   st->st_cur->ste_lineno);
-				st->st_errors++;
+				symtable_error(st, 0);
 				return;
 			}
 			else {
@@ -5651,9 +5655,7 @@ symtable_import(struct symtable *st, node *n)
 			if (n->n_lineno >= st->st_future->ff_last_lineno) {
 				PyErr_SetString(PyExc_SyntaxError,
 						LATE_FUTURE);
- 				PyErr_SyntaxLocation(st->st_filename,
-						   n->n_lineno);
-				st->st_errors++;
+				symtable_error(st, n->n_lineno);
 				return;
 			}
 		}
@@ -5747,9 +5749,8 @@ symtable_assign(struct symtable *st, node *n, int def_flag)
 			if (strcmp(STR(tmp), "__debug__") == 0) {
 				PyErr_SetString(PyExc_SyntaxError, 
 						ASSIGN_DEBUG);
-				PyErr_SyntaxLocation(st->st_filename,
-						     n->n_lineno);
-				st->st_errors++;
+				symtable_error(st, n->n_lineno);
+				return;
 			}
 			symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
 		}
-- 
cgit v0.12

