diff options
-rw-r--r-- | Grammar/Grammar | 2 | ||||
-rw-r--r-- | Python/ceval.c | 12 | ||||
-rw-r--r-- | Python/compile.c | 16 | ||||
-rw-r--r-- | Python/graminit.c | 5 |
4 files changed, 26 insertions, 9 deletions
diff --git a/Grammar/Grammar b/Grammar/Grammar index 73c298f..dabf88e 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 b29b5f9..28360f4 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 <class>, <classinstance> raise <class>, <argument tuple> diff --git a/Python/compile.c b/Python/compile.c index b4658e4..312600d 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 ca08e00..ba9359e 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}, |