]> granicus.if.org Git - python/commitdiff
Fix SF bug [ 808594 ] leak on lambda with duplicate arguments error.
authorJeremy Hylton <jeremy@alum.mit.edu>
Mon, 22 Sep 2003 04:26:44 +0000 (04:26 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Mon, 22 Sep 2003 04:26:44 +0000 (04:26 +0000)
Refactor code so that one helper routine sets error location and
increments st_errors.

Bug fix candidate.

Python/compile.c

index b95732b046e75d17ef6cfba2e1cf8cad73a897a3..73d9742e1998576d1b06ab265cdca02648ee5c6b 100644 (file)
@@ -4777,6 +4777,16 @@ symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
        return 0;
 }
 
+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)
 {
@@ -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);
                }