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