The RAISE_VARARGS opcode in Python 3

Peter Otten __peter__ at web.de
Sat Aug 27 02:49:53 EDT 2011


Arnaud Delobelle wrote:

> Here is an extract from the dis module doc [1]
> 
> """
> RAISE_VARARGS(argc)
> Raises an exception. argc indicates the number of parameters to the
> raise statement, ranging from 0 to 3. The handler will find the
> traceback as TOS2, the parameter as TOS1, and the exception as TOS.
> """
> 
> OTOH, looking at PEP 3109:
> 
> """
> In Python 3, the grammar for raise statements will change from [2]
> 
> raise_stmt: 'raise' [test [',' test [',' test]]]
> to
> 
> raise_stmt: 'raise' [test]
> """
> 
> So it seems that RAISE_VARARGS's argument can only be 0 or 1 in Python
> 3, whereas it could be up to 3 in Python 2.  

It can be up to 2 in Python 3,

>>> help("raise")                                                                                                                                        
The ``raise`` statement                                                                                                                                  
***********************                                                                                                                                  
                                                                                                                                                         
   raise_stmt ::= "raise" [expression ["from" expression]]                                                                                               
...

confirmed by a quick look into ceval.c:

        TARGET(RAISE_VARARGS)
            v = w = NULL;
            switch (oparg) {
            case 2:
                v = POP(); /* cause */
            case 1:
                w = POP(); /* exc */
            case 0: /* Fallthrough */
                why = do_raise(w, v);
                break;
            default:
                PyErr_SetString(PyExc_SystemError,
                           "bad RAISE_VARARGS oparg");
                why = WHY_EXCEPTION;
                break;
            }
            break;

> Can anyone confirm that
> this is the case?  In this case, I guess the dis docs need to be
> updated.

Indeed.



More information about the Python-list mailing list