summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Grammar/Grammar2
-rw-r--r--Python/ceval.c12
-rw-r--r--Python/compile.c16
-rw-r--r--Python/graminit.c5
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},