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'
continue_stmt: 'continue'
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)*)
dotted_name: NAME ('.' NAME)*
global_stmt: 'global' NAME (',' NAME)*

View File

@ -1090,6 +1090,7 @@ eval_code2(co, globals, locals,
/* Fallthrough */
case 1:
w = POP(); /* exc */
case 0: /* Fallthrough */
why = do_raise(w, v, u);
break;
default:
@ -1967,6 +1968,17 @@ static enum why_code
do_raise(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:
raise <class>, <classinstance>
raise <class>, <argument tuple>

View File

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

View File

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