diff --git a/Python/compile.c b/Python/compile.c index f2d424b291b..7eac91ab5a5 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3912,8 +3912,10 @@ jcompile(node *n, char *filename, struct compiling *base) PyErr_SetString(PyExc_SystemError, "lost syntax error"); } exit: - if (base == NULL) + if (base == NULL) { PySymtable_Free(sc.c_symtable); + sc.c_symtable = NULL; + } com_free(&sc); return co; } @@ -4193,6 +4195,7 @@ PySymtable_Free(struct symtable *st) { Py_XDECREF(st->st_symbols); Py_XDECREF(st->st_stack); + Py_XDECREF(st->st_cur); PyMem_Free((void *)st); } @@ -4359,10 +4362,11 @@ symtable_enter_scope(struct symtable *st, char *name, int type, PySymtableEntry_New(st, name, type, lineno); if (strcmp(name, TOP) == 0) st->st_global = st->st_cur->ste_symbols; - if (prev) + if (prev && st->st_pass == 1) { if (PyList_Append(prev->ste_children, (PyObject *)st->st_cur) < 0) st->st_errors++; + } } static int diff --git a/Python/symtable.c b/Python/symtable.c index 5dc0272daca..0d2e3243a1e 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -13,8 +13,10 @@ PySymtableEntry_New(struct symtable *st, char *name, int type, int lineno) if (k == NULL) goto fail; v = PyDict_GetItem(st->st_symbols, k); - if (v) /* XXX could check that name, type, lineno match */ - return v; + if (v) /* XXX could check that name, type, lineno match */ { + Py_INCREF(v); + return v; + } ste = (PySymtableEntryObject *)PyObject_New(PySymtableEntryObject, &PySymtableEntry_Type); @@ -69,7 +71,7 @@ PySymtableEntry_New(struct symtable *st, char *name, int type, int lineno) if (PyDict_SetItem(st->st_symbols, ste->ste_id, (PyObject *)ste) < 0) goto fail; - + return (PyObject *)ste; fail: Py_XDECREF(ste);