Mercurial > cpython-lru_cache-weakref
diff Python/compile.c @ 35797:3778083fe2c8 legacy-trunk
Ensure that compiler_exit_scope() is called as necessary to free memory
allocated by compiler_enter_scope(). Change return type for
compiler_exit_scope() to be void.
| author | Neil Schemenauer <nascheme@enme.ucalgary.ca> |
|---|---|
| date | Tue, 25 Oct 2005 06:30:14 +0000 |
| parents | f7b0cbea905b |
| children | 9b885c934144 |
line wrap: on
line diff
--- a/Python/compile.c Mon Oct 24 12:14:59 2005 +0000 +++ b/Python/compile.c Tue Oct 25 06:30:14 2005 +0000 @@ -1113,7 +1113,7 @@ return 1; } -static int +static void compiler_exit_scope(struct compiler *c) { int n; @@ -1126,14 +1126,14 @@ if (n >= 0) { wrapper = PyList_GET_ITEM(c->c_stack, n); c->u = (struct compiler_unit *)PyCObject_AsVoidPtr(wrapper); + /* we are deleting from a list so this really shouldn't fail */ if (PySequence_DelItem(c->c_stack, n) < 0) - return 0; + Py_FatalError("compiler_exit_scope()"); compiler_unit_check(c->u); } else c->u = NULL; - return 1; /* XXX void? */ } /* Allocate a new block and return a pointer to it. @@ -1701,8 +1701,10 @@ return NULL; switch (mod->kind) { case Module_kind: - if (!compiler_body(c, mod->v.Module.body)) + if (!compiler_body(c, mod->v.Module.body)) { + compiler_exit_scope(c); return 0; + } break; case Interactive_kind: c->c_interactive = 1; @@ -1872,8 +1874,10 @@ docstring = compiler_isdocstring(st); if (docstring) first_const = st->v.Expr.value->v.Str.s; - if (compiler_add_o(c, c->u->u_consts, first_const) < 0) + if (compiler_add_o(c, c->u->u_consts, first_const) < 0) { + compiler_exit_scope(c); return 0; + } /* unpack nested arguments */ compiler_arguments(c, args); @@ -1889,9 +1893,9 @@ VISIT(c, stmt, s2); } co = assemble(c, 1); + compiler_exit_scope(c); if (co == NULL) return 0; - compiler_exit_scope(c); compiler_make_closure(c, co, asdl_seq_LEN(args->defaults)); @@ -1923,6 +1927,7 @@ str = PyString_InternFromString("__name__"); if (!str || !compiler_nameop(c, str, Load)) { Py_XDECREF(str); + compiler_exit_scope(c); return 0; } @@ -1930,19 +1935,22 @@ str = PyString_InternFromString("__module__"); if (!str || !compiler_nameop(c, str, Store)) { Py_XDECREF(str); + compiler_exit_scope(c); return 0; } Py_DECREF(str); - if (!compiler_body(c, s->v.ClassDef.body)) + if (!compiler_body(c, s->v.ClassDef.body)) { + compiler_exit_scope(c); return 0; + } ADDOP(c, LOAD_LOCALS); ADDOP(c, RETURN_VALUE); co = assemble(c, 1); + compiler_exit_scope(c); if (co == NULL) return 0; - compiler_exit_scope(c); compiler_make_closure(c, co, 0); ADDOP_I(c, CALL_FUNCTION, 0); @@ -1976,9 +1984,9 @@ VISIT(c, expr, e->v.Lambda.body); ADDOP(c, RETURN_VALUE); co = assemble(c, 1); + compiler_exit_scope(c); if (co == NULL) return 0; - compiler_exit_scope(c); compiler_make_closure(c, co, asdl_seq_LEN(args->defaults)); Py_DECREF(name); @@ -3149,9 +3157,9 @@ compiler_genexp_generator(c, e->v.GeneratorExp.generators, 0, e->v.GeneratorExp.elt); co = assemble(c, 1); + compiler_exit_scope(c); if (co == NULL) return 0; - compiler_exit_scope(c); compiler_make_closure(c, co, 0); VISIT(c, expr, outermost_iter);
