The RAISE_VARARGS opcode in Python 3

Arnaud Delobelle arnodel at gmail.com
Sat Aug 27 09:00:34 CEST 2011


On 27 August 2011 07:49, Peter Otten <__peter__ at web.de> wrote:
> 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;

Thanks again, Peter!  I'm out of Python practice, and I've forgotten
some things like help("keyword"). Also PEP 3109 does indeed mention
the raise .. from .. syntax in an example at the end.

-- 
Arnaud



More information about the Python-list mailing list