mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
Merged revisions 62047 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r62047 | georg.brandl | 2008-03-29 23:40:17 -0700 (Sat, 29 Mar 2008) | 2 lines Patch #2511: Give the "excepthandler" AST item proper attributes by making it a Sum. ........
This commit is contained in:
parent
d35759388b
commit
ad74aa8dc0
7 changed files with 141 additions and 109 deletions
|
@ -342,10 +342,17 @@ struct _comprehension {
|
||||||
asdl_seq *ifs;
|
asdl_seq *ifs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum _excepthandler_kind {ExceptHandler_kind=1};
|
||||||
struct _excepthandler {
|
struct _excepthandler {
|
||||||
|
enum _excepthandler_kind kind;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
expr_ty type;
|
expr_ty type;
|
||||||
identifier name;
|
identifier name;
|
||||||
asdl_seq *body;
|
asdl_seq *body;
|
||||||
|
} ExceptHandler;
|
||||||
|
|
||||||
|
} v;
|
||||||
int lineno;
|
int lineno;
|
||||||
int col_offset;
|
int col_offset;
|
||||||
};
|
};
|
||||||
|
@ -525,8 +532,8 @@ slice_ty _Py_Index(expr_ty value, PyArena *arena);
|
||||||
#define comprehension(a0, a1, a2, a3) _Py_comprehension(a0, a1, a2, a3)
|
#define comprehension(a0, a1, a2, a3) _Py_comprehension(a0, a1, a2, a3)
|
||||||
comprehension_ty _Py_comprehension(expr_ty target, expr_ty iter, asdl_seq *
|
comprehension_ty _Py_comprehension(expr_ty target, expr_ty iter, asdl_seq *
|
||||||
ifs, PyArena *arena);
|
ifs, PyArena *arena);
|
||||||
#define excepthandler(a0, a1, a2, a3, a4, a5) _Py_excepthandler(a0, a1, a2, a3, a4, a5)
|
#define ExceptHandler(a0, a1, a2, a3, a4, a5) _Py_ExceptHandler(a0, a1, a2, a3, a4, a5)
|
||||||
excepthandler_ty _Py_excepthandler(expr_ty type, identifier name, asdl_seq *
|
excepthandler_ty _Py_ExceptHandler(expr_ty type, identifier name, asdl_seq *
|
||||||
body, int lineno, int col_offset, PyArena
|
body, int lineno, int col_offset, PyArena
|
||||||
*arena);
|
*arena);
|
||||||
#define arguments(a0, a1, a2, a3, a4, a5, a6, a7, a8) _Py_arguments(a0, a1, a2, a3, a4, a5, a6, a7, a8)
|
#define arguments(a0, a1, a2, a3, a4, a5, a6, a7, a8) _Py_arguments(a0, a1, a2, a3, a4, a5, a6, a7, a8)
|
||||||
|
|
|
@ -152,7 +152,7 @@ def run_tests():
|
||||||
#### EVERYTHING BELOW IS GENERATED #####
|
#### EVERYTHING BELOW IS GENERATED #####
|
||||||
exec_results = [
|
exec_results = [
|
||||||
('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, [], None, None, [], []), [('Pass', (1, 9))], [], None)]),
|
('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, [], None, None, [], []), [('Pass', (1, 9))], [], None)]),
|
||||||
('Module', [('ClassDef', (1, 0), 'C', [], [], None, None, [('Pass', (1, 8))], [], )]),
|
('Module', [('ClassDef', (1, 0), 'C', [], [], None, None, [('Pass', (1, 8))], [])]),
|
||||||
('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, [], None, None, [], []), [('Return', (1, 8), ('Num', (1, 15), 1))], [], None)]),
|
('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, [], None, None, [], []), [('Return', (1, 8), ('Num', (1, 15), 1))], [], None)]),
|
||||||
('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])]),
|
('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])]),
|
||||||
('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Num', (1, 4), 1))]),
|
('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Num', (1, 4), 1))]),
|
||||||
|
@ -161,7 +161,7 @@ exec_results = [
|
||||||
('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])]),
|
('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])]),
|
||||||
('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])]),
|
('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])]),
|
||||||
('Module', [('Raise', (1, 0), ('Call', (1, 6), ('Name', (1, 6), 'Exception', ('Load',)), [('Str', (1, 16), 'string')], [], None, None), None)]),
|
('Module', [('Raise', (1, 0), ('Call', (1, 6), ('Name', (1, 6), 'Exception', ('Load',)), [('Str', (1, 16), 'string')], [], None, None), None)]),
|
||||||
('Module', [('TryExcept', (1, 0), [('Pass', (2, 2))], [('excepthandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))], 3, 0)], [])]),
|
('Module', [('TryExcept', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [])]),
|
||||||
('Module', [('TryFinally', (1, 0), [('Pass', (2, 2))], [('Pass', (4, 2))])]),
|
('Module', [('TryFinally', (1, 0), [('Pass', (2, 2))], [('Pass', (4, 2))])]),
|
||||||
('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)]),
|
('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)]),
|
||||||
('Module', [('Import', (1, 0), [('alias', 'sys', None)])]),
|
('Module', [('Import', (1, 0), [('alias', 'sys', None)])]),
|
||||||
|
|
|
@ -101,11 +101,8 @@ module Python version "$Revision$"
|
||||||
comprehension = (expr target, expr iter, expr* ifs)
|
comprehension = (expr target, expr iter, expr* ifs)
|
||||||
|
|
||||||
-- not sure what to call the first argument for raise and except
|
-- not sure what to call the first argument for raise and except
|
||||||
-- TODO(jhylton): Figure out if there is a better way to handle
|
excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)
|
||||||
-- lineno and col_offset fields, particularly when
|
attributes (int lineno, int col_offset)
|
||||||
-- ast is exposed to Python.
|
|
||||||
excepthandler = (expr? type, identifier? name, stmt* body, int lineno,
|
|
||||||
int col_offset)
|
|
||||||
|
|
||||||
arguments = (arg* args, identifier? vararg, expr? varargannotation,
|
arguments = (arg* args, identifier? vararg, expr? varargannotation,
|
||||||
arg* kwonlyargs, identifier? kwarg,
|
arg* kwonlyargs, identifier? kwarg,
|
||||||
|
|
|
@ -351,13 +351,16 @@ static char *comprehension_fields[]={
|
||||||
"ifs",
|
"ifs",
|
||||||
};
|
};
|
||||||
static PyTypeObject *excepthandler_type;
|
static PyTypeObject *excepthandler_type;
|
||||||
|
static char *excepthandler_attributes[] = {
|
||||||
|
"lineno",
|
||||||
|
"col_offset",
|
||||||
|
};
|
||||||
static PyObject* ast2obj_excepthandler(void*);
|
static PyObject* ast2obj_excepthandler(void*);
|
||||||
static char *excepthandler_fields[]={
|
static PyTypeObject *ExceptHandler_type;
|
||||||
|
static char *ExceptHandler_fields[]={
|
||||||
"type",
|
"type",
|
||||||
"name",
|
"name",
|
||||||
"body",
|
"body",
|
||||||
"lineno",
|
|
||||||
"col_offset",
|
|
||||||
};
|
};
|
||||||
static PyTypeObject *arguments_type;
|
static PyTypeObject *arguments_type;
|
||||||
static PyObject* ast2obj_arguments(void*);
|
static PyObject* ast2obj_arguments(void*);
|
||||||
|
@ -881,9 +884,13 @@ static int init_types(void)
|
||||||
comprehension_type = make_type("comprehension", &AST_type,
|
comprehension_type = make_type("comprehension", &AST_type,
|
||||||
comprehension_fields, 3);
|
comprehension_fields, 3);
|
||||||
if (!comprehension_type) return 0;
|
if (!comprehension_type) return 0;
|
||||||
excepthandler_type = make_type("excepthandler", &AST_type,
|
excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0);
|
||||||
excepthandler_fields, 5);
|
|
||||||
if (!excepthandler_type) return 0;
|
if (!excepthandler_type) return 0;
|
||||||
|
if (!add_attributes(excepthandler_type, excepthandler_attributes, 2))
|
||||||
|
return 0;
|
||||||
|
ExceptHandler_type = make_type("ExceptHandler", excepthandler_type,
|
||||||
|
ExceptHandler_fields, 3);
|
||||||
|
if (!ExceptHandler_type) return 0;
|
||||||
arguments_type = make_type("arguments", &AST_type, arguments_fields, 8);
|
arguments_type = make_type("arguments", &AST_type, arguments_fields, 8);
|
||||||
if (!arguments_type) return 0;
|
if (!arguments_type) return 0;
|
||||||
arg_type = make_type("arg", &AST_type, arg_fields, 2);
|
arg_type = make_type("arg", &AST_type, arg_fields, 2);
|
||||||
|
@ -2002,16 +2009,17 @@ comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, PyArena *arena)
|
||||||
}
|
}
|
||||||
|
|
||||||
excepthandler_ty
|
excepthandler_ty
|
||||||
excepthandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int
|
ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int
|
||||||
col_offset, PyArena *arena)
|
col_offset, PyArena *arena)
|
||||||
{
|
{
|
||||||
excepthandler_ty p;
|
excepthandler_ty p;
|
||||||
p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
|
p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
|
||||||
if (!p)
|
if (!p)
|
||||||
return NULL;
|
return NULL;
|
||||||
p->type = type;
|
p->kind = ExceptHandler_kind;
|
||||||
p->name = name;
|
p->v.ExceptHandler.type = type;
|
||||||
p->body = body;
|
p->v.ExceptHandler.name = name;
|
||||||
|
p->v.ExceptHandler.body = body;
|
||||||
p->lineno = lineno;
|
p->lineno = lineno;
|
||||||
p->col_offset = col_offset;
|
p->col_offset = col_offset;
|
||||||
return p;
|
return p;
|
||||||
|
@ -3144,31 +3152,35 @@ ast2obj_excepthandler(void* _o)
|
||||||
return Py_None;
|
return Py_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = PyType_GenericNew(excepthandler_type, NULL, NULL);
|
switch (o->kind) {
|
||||||
if (!result) return NULL;
|
case ExceptHandler_kind:
|
||||||
value = ast2obj_expr(o->type);
|
result = PyType_GenericNew(ExceptHandler_type, NULL, NULL);
|
||||||
|
if (!result) goto failed;
|
||||||
|
value = ast2obj_expr(o->v.ExceptHandler.type);
|
||||||
if (!value) goto failed;
|
if (!value) goto failed;
|
||||||
if (PyObject_SetAttrString(result, "type", value) == -1)
|
if (PyObject_SetAttrString(result, "type", value) == -1)
|
||||||
goto failed;
|
goto failed;
|
||||||
Py_DECREF(value);
|
Py_DECREF(value);
|
||||||
value = ast2obj_identifier(o->name);
|
value = ast2obj_identifier(o->v.ExceptHandler.name);
|
||||||
if (!value) goto failed;
|
if (!value) goto failed;
|
||||||
if (PyObject_SetAttrString(result, "name", value) == -1)
|
if (PyObject_SetAttrString(result, "name", value) == -1)
|
||||||
goto failed;
|
goto failed;
|
||||||
Py_DECREF(value);
|
Py_DECREF(value);
|
||||||
value = ast2obj_list(o->body, ast2obj_stmt);
|
value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);
|
||||||
if (!value) goto failed;
|
if (!value) goto failed;
|
||||||
if (PyObject_SetAttrString(result, "body", value) == -1)
|
if (PyObject_SetAttrString(result, "body", value) == -1)
|
||||||
goto failed;
|
goto failed;
|
||||||
Py_DECREF(value);
|
Py_DECREF(value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
value = ast2obj_int(o->lineno);
|
value = ast2obj_int(o->lineno);
|
||||||
if (!value) goto failed;
|
if (!value) goto failed;
|
||||||
if (PyObject_SetAttrString(result, "lineno", value) == -1)
|
if (PyObject_SetAttrString(result, "lineno", value) < 0)
|
||||||
goto failed;
|
goto failed;
|
||||||
Py_DECREF(value);
|
Py_DECREF(value);
|
||||||
value = ast2obj_int(o->col_offset);
|
value = ast2obj_int(o->col_offset);
|
||||||
if (!value) goto failed;
|
if (!value) goto failed;
|
||||||
if (PyObject_SetAttrString(result, "col_offset", value) == -1)
|
if (PyObject_SetAttrString(result, "col_offset", value) < 0)
|
||||||
goto failed;
|
goto failed;
|
||||||
Py_DECREF(value);
|
Py_DECREF(value);
|
||||||
return result;
|
return result;
|
||||||
|
@ -5976,11 +5988,42 @@ int
|
||||||
obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
|
obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
|
||||||
{
|
{
|
||||||
PyObject* tmp = NULL;
|
PyObject* tmp = NULL;
|
||||||
|
|
||||||
|
int lineno;
|
||||||
|
int col_offset;
|
||||||
|
|
||||||
|
if (obj == Py_None) {
|
||||||
|
*out = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (PyObject_HasAttrString(obj, "lineno")) {
|
||||||
|
int res;
|
||||||
|
tmp = PyObject_GetAttrString(obj, "lineno");
|
||||||
|
if (tmp == NULL) goto failed;
|
||||||
|
res = obj2ast_int(tmp, &lineno, arena);
|
||||||
|
if (res != 0) goto failed;
|
||||||
|
Py_XDECREF(tmp);
|
||||||
|
tmp = NULL;
|
||||||
|
} else {
|
||||||
|
PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (PyObject_HasAttrString(obj, "col_offset")) {
|
||||||
|
int res;
|
||||||
|
tmp = PyObject_GetAttrString(obj, "col_offset");
|
||||||
|
if (tmp == NULL) goto failed;
|
||||||
|
res = obj2ast_int(tmp, &col_offset, arena);
|
||||||
|
if (res != 0) goto failed;
|
||||||
|
Py_XDECREF(tmp);
|
||||||
|
tmp = NULL;
|
||||||
|
} else {
|
||||||
|
PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (PyObject_IsInstance(obj, (PyObject*)ExceptHandler_type)) {
|
||||||
expr_ty type;
|
expr_ty type;
|
||||||
identifier name;
|
identifier name;
|
||||||
asdl_seq* body;
|
asdl_seq* body;
|
||||||
int lineno;
|
|
||||||
int col_offset;
|
|
||||||
|
|
||||||
if (PyObject_HasAttrString(obj, "type")) {
|
if (PyObject_HasAttrString(obj, "type")) {
|
||||||
int res;
|
int res;
|
||||||
|
@ -6011,7 +6054,7 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
|
||||||
tmp = PyObject_GetAttrString(obj, "body");
|
tmp = PyObject_GetAttrString(obj, "body");
|
||||||
if (tmp == NULL) goto failed;
|
if (tmp == NULL) goto failed;
|
||||||
if (!PyList_Check(tmp)) {
|
if (!PyList_Check(tmp)) {
|
||||||
PyErr_Format(PyExc_TypeError, "excepthandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
|
PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
len = PyList_GET_SIZE(tmp);
|
len = PyList_GET_SIZE(tmp);
|
||||||
|
@ -6026,35 +6069,18 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
|
||||||
Py_XDECREF(tmp);
|
Py_XDECREF(tmp);
|
||||||
tmp = NULL;
|
tmp = NULL;
|
||||||
} else {
|
} else {
|
||||||
PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from excepthandler");
|
PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (PyObject_HasAttrString(obj, "lineno")) {
|
*out = ExceptHandler(type, name, body, lineno, col_offset,
|
||||||
int res;
|
arena);
|
||||||
tmp = PyObject_GetAttrString(obj, "lineno");
|
if (*out == NULL) goto failed;
|
||||||
if (tmp == NULL) goto failed;
|
|
||||||
res = obj2ast_int(tmp, &lineno, arena);
|
|
||||||
if (res != 0) goto failed;
|
|
||||||
Py_XDECREF(tmp);
|
|
||||||
tmp = NULL;
|
|
||||||
} else {
|
|
||||||
PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (PyObject_HasAttrString(obj, "col_offset")) {
|
|
||||||
int res;
|
|
||||||
tmp = PyObject_GetAttrString(obj, "col_offset");
|
|
||||||
if (tmp == NULL) goto failed;
|
|
||||||
res = obj2ast_int(tmp, &col_offset, arena);
|
|
||||||
if (res != 0) goto failed;
|
|
||||||
Py_XDECREF(tmp);
|
|
||||||
tmp = NULL;
|
|
||||||
} else {
|
|
||||||
PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
*out = excepthandler(type, name, body, lineno, col_offset, arena);
|
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = PyObject_Repr(obj);
|
||||||
|
if (tmp == NULL) goto failed;
|
||||||
|
PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %.400s", PyString_AS_STRING(tmp));
|
||||||
failed:
|
failed:
|
||||||
Py_XDECREF(tmp);
|
Py_XDECREF(tmp);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -6493,6 +6519,8 @@ init_ast(void)
|
||||||
(PyObject*)comprehension_type) < 0) return;
|
(PyObject*)comprehension_type) < 0) return;
|
||||||
if (PyDict_SetItemString(d, "excepthandler",
|
if (PyDict_SetItemString(d, "excepthandler",
|
||||||
(PyObject*)excepthandler_type) < 0) return;
|
(PyObject*)excepthandler_type) < 0) return;
|
||||||
|
if (PyDict_SetItemString(d, "ExceptHandler",
|
||||||
|
(PyObject*)ExceptHandler_type) < 0) return;
|
||||||
if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) <
|
if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) <
|
||||||
0) return;
|
0) return;
|
||||||
if (PyDict_SetItemString(d, "arg", (PyObject*)arg_type) < 0) return;
|
if (PyDict_SetItemString(d, "arg", (PyObject*)arg_type) < 0) return;
|
||||||
|
|
|
@ -2787,7 +2787,7 @@ ast_for_except_clause(struct compiling *c, const node *exc, node *body)
|
||||||
if (!suite_seq)
|
if (!suite_seq)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
|
return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
|
||||||
exc->n_col_offset, c->c_arena);
|
exc->n_col_offset, c->c_arena);
|
||||||
}
|
}
|
||||||
else if (NCH(exc) == 2) {
|
else if (NCH(exc) == 2) {
|
||||||
|
@ -2801,7 +2801,7 @@ ast_for_except_clause(struct compiling *c, const node *exc, node *body)
|
||||||
if (!suite_seq)
|
if (!suite_seq)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return excepthandler(expression, NULL, suite_seq, LINENO(exc),
|
return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
|
||||||
exc->n_col_offset, c->c_arena);
|
exc->n_col_offset, c->c_arena);
|
||||||
}
|
}
|
||||||
else if (NCH(exc) == 4) {
|
else if (NCH(exc) == 4) {
|
||||||
|
@ -2817,7 +2817,7 @@ ast_for_except_clause(struct compiling *c, const node *exc, node *body)
|
||||||
if (!suite_seq)
|
if (!suite_seq)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return excepthandler(expression, e, suite_seq, LINENO(exc),
|
return ExceptHandler(expression, e, suite_seq, LINENO(exc),
|
||||||
exc->n_col_offset, c->c_arena);
|
exc->n_col_offset, c->c_arena);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1984,22 +1984,22 @@ compiler_try_except(struct compiler *c, stmt_ty s)
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
|
excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
|
||||||
s->v.TryExcept.handlers, i);
|
s->v.TryExcept.handlers, i);
|
||||||
if (!handler->type && i < n-1)
|
if (!handler->v.ExceptHandler.type && i < n-1)
|
||||||
return compiler_error(c, "default 'except:' must be last");
|
return compiler_error(c, "default 'except:' must be last");
|
||||||
c->u->u_lineno_set = 0;
|
c->u->u_lineno_set = 0;
|
||||||
c->u->u_lineno = handler->lineno;
|
c->u->u_lineno = handler->lineno;
|
||||||
except = compiler_new_block(c);
|
except = compiler_new_block(c);
|
||||||
if (except == NULL)
|
if (except == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
if (handler->type) {
|
if (handler->v.ExceptHandler.type) {
|
||||||
ADDOP(c, DUP_TOP);
|
ADDOP(c, DUP_TOP);
|
||||||
VISIT(c, expr, handler->type);
|
VISIT(c, expr, handler->v.ExceptHandler.type);
|
||||||
ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
|
ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
|
||||||
ADDOP_JREL(c, JUMP_IF_FALSE, except);
|
ADDOP_JREL(c, JUMP_IF_FALSE, except);
|
||||||
ADDOP(c, POP_TOP);
|
ADDOP(c, POP_TOP);
|
||||||
}
|
}
|
||||||
ADDOP(c, POP_TOP);
|
ADDOP(c, POP_TOP);
|
||||||
if (handler->name) {
|
if (handler->v.ExceptHandler.name) {
|
||||||
basicblock *cleanup_end, *cleanup_body;
|
basicblock *cleanup_end, *cleanup_body;
|
||||||
|
|
||||||
cleanup_end = compiler_new_block(c);
|
cleanup_end = compiler_new_block(c);
|
||||||
|
@ -2007,7 +2007,7 @@ compiler_try_except(struct compiler *c, stmt_ty s)
|
||||||
if(!(cleanup_end || cleanup_body))
|
if(!(cleanup_end || cleanup_body))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
compiler_nameop(c, handler->name, Store);
|
compiler_nameop(c, handler->v.ExceptHandler.name, Store);
|
||||||
ADDOP(c, POP_TOP);
|
ADDOP(c, POP_TOP);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2028,7 +2028,7 @@ compiler_try_except(struct compiler *c, stmt_ty s)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* second # body */
|
/* second # body */
|
||||||
VISIT_SEQ(c, stmt, handler->body);
|
VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
|
||||||
ADDOP(c, POP_BLOCK);
|
ADDOP(c, POP_BLOCK);
|
||||||
compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
|
compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
|
||||||
|
|
||||||
|
@ -2040,10 +2040,10 @@ compiler_try_except(struct compiler *c, stmt_ty s)
|
||||||
|
|
||||||
/* name = None */
|
/* name = None */
|
||||||
ADDOP_O(c, LOAD_CONST, Py_None, consts);
|
ADDOP_O(c, LOAD_CONST, Py_None, consts);
|
||||||
compiler_nameop(c, handler->name, Store);
|
compiler_nameop(c, handler->v.ExceptHandler.name, Store);
|
||||||
|
|
||||||
/* del name */
|
/* del name */
|
||||||
compiler_nameop(c, handler->name, Del);
|
compiler_nameop(c, handler->v.ExceptHandler.name, Del);
|
||||||
|
|
||||||
ADDOP(c, END_FINALLY);
|
ADDOP(c, END_FINALLY);
|
||||||
compiler_pop_fblock(c, FINALLY_END, cleanup_end);
|
compiler_pop_fblock(c, FINALLY_END, cleanup_end);
|
||||||
|
@ -2051,11 +2051,11 @@ compiler_try_except(struct compiler *c, stmt_ty s)
|
||||||
else {
|
else {
|
||||||
ADDOP(c, POP_TOP);
|
ADDOP(c, POP_TOP);
|
||||||
ADDOP(c, POP_TOP);
|
ADDOP(c, POP_TOP);
|
||||||
VISIT_SEQ(c, stmt, handler->body);
|
VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
|
||||||
}
|
}
|
||||||
ADDOP_JREL(c, JUMP_FORWARD, end);
|
ADDOP_JREL(c, JUMP_FORWARD, end);
|
||||||
compiler_use_next_block(c, except);
|
compiler_use_next_block(c, except);
|
||||||
if (handler->type)
|
if (handler->v.ExceptHandler.type)
|
||||||
ADDOP(c, POP_TOP);
|
ADDOP(c, POP_TOP);
|
||||||
}
|
}
|
||||||
ADDOP(c, END_FINALLY);
|
ADDOP(c, END_FINALLY);
|
||||||
|
|
|
@ -1431,12 +1431,12 @@ symtable_visit_arguments(struct symtable *st, arguments_ty a)
|
||||||
static int
|
static int
|
||||||
symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
|
symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
|
||||||
{
|
{
|
||||||
if (eh->type)
|
if (eh->v.ExceptHandler.type)
|
||||||
VISIT(st, expr, eh->type);
|
VISIT(st, expr, eh->v.ExceptHandler.type);
|
||||||
if (eh->name)
|
if (eh->v.ExceptHandler.name)
|
||||||
if (!symtable_add_def(st, eh->name, DEF_LOCAL))
|
if (!symtable_add_def(st, eh->v.ExceptHandler.name, DEF_LOCAL))
|
||||||
return 0;
|
return 0;
|
||||||
VISIT_SEQ(st, stmt, eh->body);
|
VISIT_SEQ(st, stmt, eh->v.ExceptHandler.body);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue