STINNER Victor <[email protected]> added the comment:
>>> def f():
... foo()
... try:
... bar()
... except:
... pass
...
>>> def g():
... try:
... foo()
... bar()
... except:
... pass
...
>>> dis.dis(f)
1 0 RESUME 0
2 2 LOAD_GLOBAL 1 (NULL + foo)
14 PRECALL 0
18 CALL 0
28 POP_TOP
3 30 NOP
4 32 LOAD_GLOBAL 3 (NULL + bar)
44 PRECALL 0
48 CALL 0
58 POP_TOP
60 LOAD_CONST 0 (None)
62 RETURN_VALUE
>> 64 PUSH_EXC_INFO
5 66 POP_TOP
6 68 POP_EXCEPT
70 LOAD_CONST 0 (None)
72 RETURN_VALUE
>> 74 COPY 3
76 POP_EXCEPT
78 RERAISE 1
ExceptionTable:
32 to 58 -> 64 [0]
64 to 66 -> 74 [1] lasti
>>> dis.dis(g)
1 0 RESUME 0
2 2 NOP
3 4 LOAD_GLOBAL 1 (NULL + foo)
16 PRECALL 0
20 CALL 0
30 POP_TOP
4 32 LOAD_GLOBAL 3 (NULL + bar)
44 PRECALL 0
48 CALL 0
58 POP_TOP
60 LOAD_CONST 0 (None)
62 RETURN_VALUE
>> 64 PUSH_EXC_INFO
5 66 POP_TOP
6 68 POP_EXCEPT
70 LOAD_CONST 0 (None)
72 RETURN_VALUE
>> 74 COPY 3
76 POP_EXCEPT
78 RERAISE 1
ExceptionTable:
4 to 58 -> 64 [0]
64 to 66 -> 74 [1] lasti
Oh, I didn't follow recent bytecode changes. Ok, now I see that it is not
longer possible to build the exception table just from the bytecode. The
purpose of the exception table is to handle exceptions: the opcodes related to
exception handles are simply gone in Python 3.11.
I was thinking about looking for things like PUSH_EXC_INFO or POP_EXCEPT, but
as Guido shows, it doesn't work: the start of the "try" block cannot be
detected in the bytecode anymore in Python 3.11.
> If code.replace() is not updated to recompute co_exceptiontable, at least, it
> would be nice to document the bpo-40222 changes in What's New in Python 3.11
> and in the CodeType documentation
You closed the issue. I understand that you don't want to document
CodeType.replace() changes neither. Users of this API should follow Python
development and notice that their code no longer works with Python 3.11.
----------
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue47185>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com