Make first raise argument optional

This commit is contained in:
Guido van Rossum 1998-04-09 21:39:57 +00:00
parent 926f13a081
commit d295f120ae
4 changed files with 26 additions and 9 deletions

View File

@ -40,7 +40,7 @@ flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
break_stmt: 'break' break_stmt: 'break'
continue_stmt: 'continue' continue_stmt: 'continue'
return_stmt: 'return' [testlist] return_stmt: 'return' [testlist]
raise_stmt: 'raise' test [',' test [',' test]] raise_stmt: 'raise' [test [',' test [',' test]]]
import_stmt: 'import' dotted_name (',' dotted_name)* | 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) import_stmt: 'import' dotted_name (',' dotted_name)* | 'from' dotted_name 'import' ('*' | NAME (',' NAME)*)
dotted_name: NAME ('.' NAME)* dotted_name: NAME ('.' NAME)*
global_stmt: 'global' NAME (',' NAME)* global_stmt: 'global' NAME (',' NAME)*

View File

@ -1090,6 +1090,7 @@ eval_code2(co, globals, locals,
/* Fallthrough */ /* Fallthrough */
case 1: case 1:
w = POP(); /* exc */ w = POP(); /* exc */
case 0: /* Fallthrough */
why = do_raise(w, v, u); why = do_raise(w, v, u);
break; break;
default: default:
@ -1967,6 +1968,17 @@ static enum why_code
do_raise(type, value, tb) do_raise(type, value, tb)
PyObject *type, *value, *tb; PyObject *type, *value, *tb;
{ {
if (type == NULL) {
/* Reraise */
PyThreadState *tstate = PyThreadState_Get();
type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
value = tstate->exc_value;
tb = tstate->exc_traceback;
Py_XINCREF(type);
Py_XINCREF(value);
Py_XINCREF(tb);
}
/* We support the following forms of raise: /* We support the following forms of raise:
raise <class>, <classinstance> raise <class>, <classinstance>
raise <class>, <argument tuple> raise <class>, <argument tuple>

View File

@ -659,6 +659,8 @@ com_add(c, list, v)
{ {
int n = PyList_Size(list); int n = PyList_Size(list);
int i; int i;
/* XXX This is quadratic in the number of names per compilation unit.
XXX Should use a dictionary. */
for (i = n; --i >= 0; ) { for (i = n; --i >= 0; ) {
PyObject *w = PyList_GetItem(list, i); PyObject *w = PyList_GetItem(list, i);
if (v->ob_type == w->ob_type && PyObject_Compare(v, w) == 0) if (v->ob_type == w->ob_type && PyObject_Compare(v, w) == 0)
@ -2050,12 +2052,14 @@ com_raise_stmt(c, n)
node *n; node *n;
{ {
int i; int i;
REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */ REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
com_node(c, CHILD(n, 1)); if (NCH(n) > 1) {
if (NCH(n) > 3) { com_node(c, CHILD(n, 1));
com_node(c, CHILD(n, 3)); if (NCH(n) > 3) {
if (NCH(n) > 5) com_node(c, CHILD(n, 3));
com_node(c, CHILD(n, 5)); if (NCH(n) > 5)
com_node(c, CHILD(n, 5));
}
} }
i = NCH(n)/2; i = NCH(n)/2;
com_addoparg(c, RAISE_VARARGS, i); com_addoparg(c, RAISE_VARARGS, i);

View File

@ -331,8 +331,9 @@ static state states_18[3] = {
static arc arcs_19_0[1] = { static arc arcs_19_0[1] = {
{48, 1}, {48, 1},
}; };
static arc arcs_19_1[1] = { static arc arcs_19_1[2] = {
{21, 2}, {21, 2},
{0, 1},
}; };
static arc arcs_19_2[2] = { static arc arcs_19_2[2] = {
{22, 3}, {22, 3},
@ -353,7 +354,7 @@ static arc arcs_19_6[1] = {
}; };
static state states_19[7] = { static state states_19[7] = {
{1, arcs_19_0}, {1, arcs_19_0},
{1, arcs_19_1}, {2, arcs_19_1},
{2, arcs_19_2}, {2, arcs_19_2},
{1, arcs_19_3}, {1, arcs_19_3},
{2, arcs_19_4}, {2, arcs_19_4},