From d295f120ae6bd624eaac9032b70fad0aec110597 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Thu, 9 Apr 1998 21:39:57 +0000 Subject: [PATCH] Make first raise argument optional --- Grammar/Grammar | 2 +- Python/ceval.c | 12 ++++++++++++ Python/compile.c | 16 ++++++++++------ Python/graminit.c | 5 +++-- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/Grammar/Grammar b/Grammar/Grammar index 73c298ff1fc..dabf88e5aaa 100644 --- a/Grammar/Grammar +++ b/Grammar/Grammar @@ -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)* diff --git a/Python/ceval.c b/Python/ceval.c index b29b5f973b2..28360f444b2 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -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 , raise , diff --git a/Python/compile.c b/Python/compile.c index b4658e4fc9e..312600d896a 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -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,12 +2052,14 @@ com_raise_stmt(c, n) node *n; { int i; - REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */ - 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)); + 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); diff --git a/Python/graminit.c b/Python/graminit.c index ca08e00ad8b..ba9359e8392 100644 --- a/Python/graminit.c +++ b/Python/graminit.c @@ -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},