]> granicus.if.org Git - python/commitdiff
Make first raise argument optional
authorGuido van Rossum <guido@python.org>
Thu, 9 Apr 1998 21:39:57 +0000 (21:39 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 9 Apr 1998 21:39:57 +0000 (21:39 +0000)
Grammar/Grammar
Python/ceval.c
Python/compile.c
Python/graminit.c

index 73c298ff1fc8add94edf5a0e8624b13bff1936e5..dabf88e5aaa52af3f717df3f96bed3d706640f8f 100644 (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)*
index b29b5f973b2ea6687102f4d4f0fce14051abe3a3..28360f444b2370611218d870d882df8ec07d2932 100644 (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>
index b4658e4fc9eaddb85752f50b023a8d206e0e006b..312600d896a6731c59c928cb5152174eecb5ab8c 100644 (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,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);
index ca08e00ad8b7742b801d405aa410fcba3a3ecf1b..ba9359e839224d9a7e4924691e44ff31a16ca3d1 100644 (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},