return 1;
}
-static int
+static void
compiler_exit_scope(struct compiler *c)
{
int n;
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.
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;
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);
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));
str = PyString_InternFromString("__name__");
if (!str || !compiler_nameop(c, str, Load)) {
Py_XDECREF(str);
+ compiler_exit_scope(c);
return 0;
}
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);
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);
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);