mirror of
https://github.com/licsber/micropython.git
synced 2024-09-20 17:10:24 +08:00
e1fb03f3e2
This patch fixes a bug in the VM when breaking within a try-finally. The
bug has to do with executing a break within the finally block of a
try-finally statement. For example:
def f():
for x in (1,):
print('a', x)
try:
raise Exception
finally:
print(1)
break
print('b', x)
f()
Currently in uPy the above code will print:
a 1
1
1
segmentation fault (core dumped) micropython
Not only is there a seg fault, but the "1" in the finally block is printed
twice. This is because when the VM executes a finally block it doesn't
really know if that block was executed due to a fall-through of the try (no
exception raised), or because an exception is active. In particular, for
nested finallys the VM has no idea which of the nested ones have active
exceptions and which are just fall-throughs. So when a break (or continue)
is executed it tries to unwind all of the finallys, when in fact only some
may be active.
It's questionable whether break (or return or continue) should be allowed
within a finally block, because they implicitly swallow any active
exception, but nevertheless it's allowed by CPython (although almost never
used in the standard library). And uPy should at least not crash in such a
case.
The solution here relies on the fact that exception and finally handlers
always appear in the bytecode after the try body.
Note: there was a similar bug with a return in a finally block, but that
was previously fixed in b735208403
547 lines
11 KiB
Plaintext
547 lines
11 KiB
Plaintext
File cmdline/cmd_showbc.py, code block '<module>' (descriptor: \.\+, bytecode @\.\+ bytes)
|
|
Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+):
|
|
########
|
|
\.\+5b
|
|
arg names:
|
|
(N_STATE 3)
|
|
(N_EXC_STACK 0)
|
|
bc=-1 line=1
|
|
########
|
|
bc=\\d\+ line=155
|
|
00 MAKE_FUNCTION \.\+
|
|
\\d\+ STORE_NAME f
|
|
\\d\+ MAKE_FUNCTION \.\+
|
|
\\d\+ STORE_NAME f
|
|
\\d\+ LOAD_CONST_SMALL_INT 1
|
|
\\d\+ BUILD_TUPLE 1
|
|
\\d\+ LOAD_NULL
|
|
\\d\+ MAKE_FUNCTION_DEFARGS \.\+
|
|
\\d\+ STORE_NAME f
|
|
\\d\+ MAKE_FUNCTION \.\+
|
|
\\d\+ STORE_NAME f
|
|
\\d\+ LOAD_BUILD_CLASS
|
|
\\d\+ MAKE_FUNCTION \.\+
|
|
\\d\+ LOAD_CONST_STRING 'Class'
|
|
\\d\+ CALL_FUNCTION n=2 nkw=0
|
|
\\d\+ STORE_NAME Class
|
|
\\d\+ DELETE_NAME Class
|
|
\\d\+ MAKE_FUNCTION \.\+
|
|
\\d\+ STORE_NAME f
|
|
\\d\+ LOAD_CONST_NONE
|
|
\\d\+ RETURN_VALUE
|
|
File cmdline/cmd_showbc.py, code block 'f' (descriptor: \.\+, bytecode @\.\+ bytes)
|
|
Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+):
|
|
########
|
|
\.\+rg names:
|
|
(N_STATE 22)
|
|
(N_EXC_STACK 2)
|
|
(INIT_CELL 14)
|
|
(INIT_CELL 15)
|
|
(INIT_CELL 16)
|
|
bc=-4 line=1
|
|
########
|
|
bc=\\d\+ line=126
|
|
00 LOAD_CONST_NONE
|
|
01 LOAD_CONST_FALSE
|
|
02 BINARY_OP 26 __add__
|
|
03 LOAD_CONST_TRUE
|
|
04 BINARY_OP 26 __add__
|
|
05 STORE_FAST 0
|
|
06 LOAD_CONST_SMALL_INT 0
|
|
07 STORE_FAST 0
|
|
08 LOAD_CONST_SMALL_INT 1000
|
|
11 STORE_FAST 0
|
|
12 LOAD_CONST_SMALL_INT -1000
|
|
15 STORE_FAST 0
|
|
16 LOAD_CONST_SMALL_INT 1
|
|
17 STORE_FAST 0
|
|
18 LOAD_CONST_SMALL_INT 1
|
|
19 LOAD_CONST_SMALL_INT 2
|
|
20 BUILD_TUPLE 2
|
|
22 STORE_DEREF 14
|
|
24 LOAD_CONST_SMALL_INT 1
|
|
25 LOAD_CONST_SMALL_INT 2
|
|
26 BUILD_LIST 2
|
|
28 STORE_FAST 1
|
|
29 LOAD_CONST_SMALL_INT 1
|
|
30 LOAD_CONST_SMALL_INT 2
|
|
31 BUILD_SET 2
|
|
33 STORE_FAST 2
|
|
34 BUILD_MAP 0
|
|
36 STORE_DEREF 15
|
|
38 BUILD_MAP 1
|
|
40 LOAD_CONST_SMALL_INT 2
|
|
41 LOAD_CONST_SMALL_INT 1
|
|
42 STORE_MAP
|
|
43 STORE_FAST 3
|
|
44 LOAD_CONST_STRING 'a'
|
|
47 STORE_FAST 4
|
|
48 LOAD_CONST_OBJ \.\+
|
|
\\d\+ STORE_FAST 5
|
|
\\d\+ LOAD_CONST_SMALL_INT 1
|
|
\\d\+ STORE_FAST 6
|
|
\\d\+ LOAD_CONST_SMALL_INT 2
|
|
\\d\+ STORE_FAST 7
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ BINARY_OP 26 __add__
|
|
\\d\+ STORE_FAST 8
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ UNARY_OP 1
|
|
\\d\+ STORE_FAST 9
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ UNARY_OP 3
|
|
\\d\+ STORE_FAST 10
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ DUP_TOP
|
|
\\d\+ ROT_THREE
|
|
\\d\+ BINARY_OP 2 __eq__
|
|
\\d\+ JUMP_IF_FALSE_OR_POP \\d\+
|
|
\\d\+ LOAD_FAST 1
|
|
\\d\+ BINARY_OP 2 __eq__
|
|
\\d\+ JUMP \\d\+
|
|
\\d\+ ROT_TWO
|
|
\\d\+ POP_TOP
|
|
\\d\+ STORE_FAST 10
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ BINARY_OP 2 __eq__
|
|
\\d\+ JUMP_IF_FALSE_OR_POP \\d\+
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ LOAD_FAST 1
|
|
\\d\+ BINARY_OP 2 __eq__
|
|
\\d\+ UNARY_OP 3
|
|
\\d\+ STORE_FAST 10
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ LOAD_ATTR c (cache=0)
|
|
\\d\+ STORE_FAST 11
|
|
\\d\+ LOAD_FAST 11
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ STORE_ATTR c (cache=0)
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ LOAD_CONST_SMALL_INT 0
|
|
\\d\+ LOAD_SUBSCR
|
|
\\d\+ STORE_FAST 12
|
|
\\d\+ LOAD_FAST 12
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ LOAD_CONST_SMALL_INT 0
|
|
\\d\+ STORE_SUBSCR
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ LOAD_CONST_SMALL_INT 0
|
|
\\d\+ DUP_TOP_TWO
|
|
\\d\+ LOAD_SUBSCR
|
|
\\d\+ LOAD_FAST 12
|
|
\\d\+ BINARY_OP 14 __iadd__
|
|
\\d\+ ROT_THREE
|
|
\\d\+ STORE_SUBSCR
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ LOAD_CONST_NONE
|
|
\\d\+ LOAD_CONST_NONE
|
|
\\d\+ BUILD_SLICE 2
|
|
\\d\+ LOAD_SUBSCR
|
|
\\d\+ STORE_FAST 0
|
|
\\d\+ LOAD_FAST 1
|
|
\\d\+ UNPACK_SEQUENCE 2
|
|
\\d\+ STORE_FAST 0
|
|
\\d\+ STORE_DEREF 14
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ UNPACK_EX 1
|
|
\\d\+ STORE_FAST 0
|
|
\\d\+ STORE_FAST 0
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ ROT_TWO
|
|
\\d\+ STORE_FAST 0
|
|
\\d\+ STORE_DEREF 14
|
|
\\d\+ LOAD_FAST 1
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ ROT_THREE
|
|
\\d\+ ROT_TWO
|
|
\\d\+ STORE_FAST 0
|
|
\\d\+ STORE_DEREF 14
|
|
\\d\+ STORE_FAST 1
|
|
\\d\+ DELETE_FAST 0
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ STORE_GLOBAL gl
|
|
\\d\+ DELETE_GLOBAL gl
|
|
\\d\+ LOAD_FAST 14
|
|
\\d\+ LOAD_FAST 15
|
|
\\d\+ MAKE_CLOSURE \.\+ 2
|
|
\\d\+ LOAD_FAST 2
|
|
\\d\+ GET_ITER
|
|
\\d\+ CALL_FUNCTION n=1 nkw=0
|
|
\\d\+ STORE_FAST 0
|
|
\\d\+ LOAD_FAST 14
|
|
\\d\+ LOAD_FAST 15
|
|
\\d\+ MAKE_CLOSURE \.\+ 2
|
|
\\d\+ LOAD_FAST 2
|
|
\\d\+ CALL_FUNCTION n=1 nkw=0
|
|
\\d\+ STORE_FAST 0
|
|
\\d\+ LOAD_FAST 14
|
|
\\d\+ LOAD_FAST 15
|
|
\\d\+ MAKE_CLOSURE \.\+ 2
|
|
\\d\+ LOAD_FAST 2
|
|
\\d\+ CALL_FUNCTION n=1 nkw=0
|
|
\\d\+ STORE_FAST 0
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ CALL_FUNCTION n=0 nkw=0
|
|
\\d\+ POP_TOP
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ LOAD_CONST_SMALL_INT 1
|
|
\\d\+ CALL_FUNCTION n=1 nkw=0
|
|
\\d\+ POP_TOP
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ LOAD_CONST_STRING 'b'
|
|
\\d\+ LOAD_CONST_SMALL_INT 1
|
|
\\d\+ CALL_FUNCTION n=0 nkw=1
|
|
\\d\+ POP_TOP
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ LOAD_NULL
|
|
\\d\+ CALL_FUNCTION_VAR_KW n=0 nkw=0
|
|
\\d\+ POP_TOP
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ LOAD_METHOD b
|
|
\\d\+ CALL_METHOD n=0 nkw=0
|
|
\\d\+ POP_TOP
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ LOAD_METHOD b
|
|
\\d\+ LOAD_CONST_SMALL_INT 1
|
|
\\d\+ CALL_METHOD n=1 nkw=0
|
|
\\d\+ POP_TOP
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ LOAD_METHOD b
|
|
\\d\+ LOAD_CONST_STRING 'c'
|
|
\\d\+ LOAD_CONST_SMALL_INT 1
|
|
\\d\+ CALL_METHOD n=0 nkw=1
|
|
\\d\+ POP_TOP
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ LOAD_METHOD b
|
|
\\d\+ LOAD_FAST 1
|
|
\\d\+ LOAD_NULL
|
|
\\d\+ CALL_METHOD_VAR_KW n=0 nkw=0
|
|
\\d\+ POP_TOP
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ POP_JUMP_IF_FALSE \\d\+
|
|
\\d\+ LOAD_DEREF 16
|
|
\\d\+ POP_TOP
|
|
\\d\+ JUMP \\d\+
|
|
\\d\+ LOAD_GLOBAL y (cache=0)
|
|
\\d\+ POP_TOP
|
|
\\d\+ JUMP \\d\+
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ POP_TOP
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ POP_JUMP_IF_TRUE \\d\+
|
|
\\d\+ JUMP \\d\+
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ POP_TOP
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ POP_JUMP_IF_FALSE \\d\+
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ JUMP_IF_TRUE_OR_POP \\d\+
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ STORE_FAST 0
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ GET_ITER_STACK
|
|
\\d\+ FOR_ITER \\d\+
|
|
\\d\+ STORE_FAST 0
|
|
\\d\+ LOAD_FAST 1
|
|
\\d\+ POP_TOP
|
|
\\d\+ JUMP \\d\+
|
|
\\d\+ SETUP_FINALLY \\d\+
|
|
\\d\+ SETUP_EXCEPT \\d\+
|
|
\\d\+ JUMP \\d\+
|
|
\\d\+ JUMP \\d\+
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ POP_JUMP_IF_TRUE \\d\+
|
|
\\d\+ POP_BLOCK
|
|
\\d\+ JUMP \\d\+
|
|
\\d\+ POP_TOP
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ POP_TOP
|
|
\\d\+ POP_EXCEPT
|
|
\\d\+ JUMP \\d\+
|
|
\\d\+ END_FINALLY
|
|
\\d\+ LOAD_CONST_NONE
|
|
\\d\+ LOAD_FAST 1
|
|
\\d\+ POP_TOP
|
|
\\d\+ END_FINALLY
|
|
\\d\+ JUMP \\d\+
|
|
\\d\+ SETUP_EXCEPT \\d\+
|
|
\\d\+ UNWIND_JUMP \\d\+ 1
|
|
\\d\+ POP_BLOCK
|
|
\\d\+ JUMP \\d\+
|
|
\\d\+ POP_TOP
|
|
\\d\+ POP_EXCEPT
|
|
\\d\+ JUMP \\d\+
|
|
\\d\+ END_FINALLY
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ POP_JUMP_IF_TRUE \\d\+
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ SETUP_WITH \\d\+
|
|
\\d\+ POP_TOP
|
|
\\d\+ LOAD_DEREF 14
|
|
\\d\+ POP_TOP
|
|
\\d\+ LOAD_CONST_NONE
|
|
\\d\+ WITH_CLEANUP
|
|
\\d\+ END_FINALLY
|
|
\\d\+ LOAD_CONST_SMALL_INT 1
|
|
\\d\+ STORE_DEREF 16
|
|
\\d\+ LOAD_FAST_N 16
|
|
\\d\+ MAKE_CLOSURE \.\+ 1
|
|
\\d\+ STORE_FAST 13
|
|
\\d\+ LOAD_CONST_SMALL_INT 0
|
|
\\d\+ LOAD_CONST_NONE
|
|
\\d\+ IMPORT_NAME 'a'
|
|
\\d\+ STORE_FAST 0
|
|
\\d\+ LOAD_CONST_SMALL_INT 0
|
|
\\d\+ LOAD_CONST_STRING 'b'
|
|
\\d\+ BUILD_TUPLE 1
|
|
\\d\+ IMPORT_NAME 'a'
|
|
\\d\+ IMPORT_FROM 'b'
|
|
\\d\+ STORE_DEREF 14
|
|
\\d\+ POP_TOP
|
|
\\d\+ LOAD_CONST_SMALL_INT 0
|
|
\\d\+ LOAD_CONST_STRING '*'
|
|
\\d\+ BUILD_TUPLE 1
|
|
\\d\+ IMPORT_NAME 'a'
|
|
\\d\+ IMPORT_STAR
|
|
\\d\+ RAISE_VARARGS 0
|
|
\\d\+ LOAD_CONST_SMALL_INT 1
|
|
\\d\+ RAISE_VARARGS 1
|
|
\\d\+ LOAD_CONST_NONE
|
|
\\d\+ RETURN_VALUE
|
|
\\d\+ LOAD_CONST_SMALL_INT 1
|
|
\\d\+ RETURN_VALUE
|
|
File cmdline/cmd_showbc.py, code block 'f' (descriptor: \.\+, bytecode @\.\+ bytes)
|
|
Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+):
|
|
########
|
|
\.\+rg names:
|
|
(N_STATE 22)
|
|
(N_EXC_STACK 0)
|
|
bc=-1 line=1
|
|
########
|
|
bc=\\d\+ line=132
|
|
00 LOAD_CONST_SMALL_INT 1
|
|
01 DUP_TOP
|
|
02 STORE_FAST 0
|
|
03 DUP_TOP
|
|
04 STORE_FAST 1
|
|
05 DUP_TOP
|
|
06 STORE_FAST 2
|
|
07 DUP_TOP
|
|
08 STORE_FAST 3
|
|
09 DUP_TOP
|
|
10 STORE_FAST 4
|
|
11 DUP_TOP
|
|
12 STORE_FAST 5
|
|
13 DUP_TOP
|
|
14 STORE_FAST 6
|
|
15 DUP_TOP
|
|
16 STORE_FAST 7
|
|
17 DUP_TOP
|
|
18 STORE_FAST 8
|
|
19 STORE_FAST 9
|
|
20 LOAD_CONST_SMALL_INT 2
|
|
21 DUP_TOP
|
|
22 STORE_FAST 10
|
|
23 DUP_TOP
|
|
24 STORE_FAST 11
|
|
25 DUP_TOP
|
|
26 STORE_FAST 12
|
|
27 DUP_TOP
|
|
28 STORE_FAST 13
|
|
29 DUP_TOP
|
|
30 STORE_FAST 14
|
|
31 DUP_TOP
|
|
32 STORE_FAST 15
|
|
33 DUP_TOP
|
|
34 STORE_FAST_N 16
|
|
36 DUP_TOP
|
|
37 STORE_FAST_N 17
|
|
39 DUP_TOP
|
|
40 STORE_FAST_N 18
|
|
42 STORE_FAST_N 19
|
|
44 LOAD_FAST 9
|
|
45 LOAD_FAST_N 19
|
|
47 BINARY_OP 26 __add__
|
|
48 POP_TOP
|
|
49 LOAD_CONST_NONE
|
|
50 RETURN_VALUE
|
|
File cmdline/cmd_showbc.py, code block 'f' (descriptor: \.\+, bytecode @\.\+ bytes)
|
|
Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+):
|
|
########
|
|
\.\+5b
|
|
arg names: a
|
|
(N_STATE 5)
|
|
(N_EXC_STACK 0)
|
|
(INIT_CELL 0)
|
|
########
|
|
bc=\\d\+ line=138
|
|
00 LOAD_CONST_SMALL_INT 2
|
|
01 BUILD_TUPLE 1
|
|
03 LOAD_NULL
|
|
04 LOAD_FAST 0
|
|
05 MAKE_CLOSURE_DEFARGS \.\+ 1
|
|
\\d\+ STORE_FAST 1
|
|
\\d\+ LOAD_CONST_NONE
|
|
\\d\+ RETURN_VALUE
|
|
File cmdline/cmd_showbc.py, code block 'f' (descriptor: \.\+, bytecode @\.\+ bytes)
|
|
Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+):
|
|
########
|
|
\.\+5b
|
|
arg names:
|
|
(N_STATE 2)
|
|
(N_EXC_STACK 0)
|
|
bc=-1 line=1
|
|
bc=0 line=143
|
|
bc=3 line=144
|
|
bc=6 line=145
|
|
00 LOAD_CONST_NONE
|
|
01 YIELD_VALUE
|
|
02 POP_TOP
|
|
03 LOAD_CONST_SMALL_INT 1
|
|
04 YIELD_VALUE
|
|
05 POP_TOP
|
|
06 LOAD_CONST_SMALL_INT 1
|
|
07 GET_ITER
|
|
08 LOAD_CONST_NONE
|
|
09 YIELD_FROM
|
|
10 POP_TOP
|
|
11 LOAD_CONST_NONE
|
|
12 RETURN_VALUE
|
|
File cmdline/cmd_showbc.py, code block 'Class' (descriptor: \.\+, bytecode @\.\+ bytes)
|
|
Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+):
|
|
########
|
|
\.\+5b
|
|
arg names:
|
|
(N_STATE 1)
|
|
(N_EXC_STACK 0)
|
|
bc=-1 line=1
|
|
bc=13 line=149
|
|
00 LOAD_NAME __name__ (cache=0)
|
|
04 STORE_NAME __module__
|
|
07 LOAD_CONST_STRING 'Class'
|
|
10 STORE_NAME __qualname__
|
|
13 LOAD_CONST_NONE
|
|
14 RETURN_VALUE
|
|
File cmdline/cmd_showbc.py, code block 'f' (descriptor: \.\+, bytecode @\.\+ bytes)
|
|
Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+):
|
|
########
|
|
\.\+5b
|
|
arg names: self
|
|
(N_STATE 4)
|
|
(N_EXC_STACK 0)
|
|
bc=-1 line=1
|
|
bc=0 line=156
|
|
00 LOAD_GLOBAL super (cache=0)
|
|
\\d\+ LOAD_GLOBAL __class__ (cache=0)
|
|
\\d\+ LOAD_FAST 0
|
|
\\d\+ LOAD_SUPER_METHOD f
|
|
\\d\+ CALL_METHOD n=0 nkw=0
|
|
\\d\+ POP_TOP
|
|
\\d\+ LOAD_CONST_NONE
|
|
\\d\+ RETURN_VALUE
|
|
File cmdline/cmd_showbc.py, code block '<genexpr>' (descriptor: \.\+, bytecode @\.\+ bytes)
|
|
Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+):
|
|
########
|
|
\.\+5b
|
|
arg names: * * *
|
|
(N_STATE 9)
|
|
(N_EXC_STACK 0)
|
|
bc=-\\d\+ line=1
|
|
00 LOAD_NULL
|
|
01 LOAD_FAST 2
|
|
02 LOAD_NULL
|
|
03 LOAD_NULL
|
|
04 FOR_ITER 20
|
|
07 STORE_FAST 3
|
|
08 LOAD_DEREF 1
|
|
10 POP_JUMP_IF_FALSE 4
|
|
13 LOAD_DEREF 0
|
|
15 YIELD_VALUE
|
|
16 POP_TOP
|
|
17 JUMP 4
|
|
20 LOAD_CONST_NONE
|
|
21 RETURN_VALUE
|
|
File cmdline/cmd_showbc.py, code block '<listcomp>' (descriptor: \.\+, bytecode @\.\+ bytes)
|
|
Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+):
|
|
########
|
|
\.\+5b
|
|
arg names: * * *
|
|
(N_STATE 10)
|
|
(N_EXC_STACK 0)
|
|
bc=-\\d\+ line=1
|
|
00 BUILD_LIST 0
|
|
02 LOAD_FAST 2
|
|
03 GET_ITER_STACK
|
|
04 FOR_ITER 20
|
|
07 STORE_FAST 3
|
|
08 LOAD_DEREF 1
|
|
10 POP_JUMP_IF_FALSE 4
|
|
13 LOAD_DEREF 0
|
|
15 STORE_COMP 20
|
|
17 JUMP 4
|
|
20 RETURN_VALUE
|
|
File cmdline/cmd_showbc.py, code block '<dictcomp>' (descriptor: \.\+, bytecode @\.\+ bytes)
|
|
Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+):
|
|
########
|
|
\.\+5b
|
|
arg names: * * *
|
|
(N_STATE 11)
|
|
(N_EXC_STACK 0)
|
|
bc=-\\d\+ line=1
|
|
########
|
|
00 BUILD_MAP 0
|
|
02 LOAD_FAST 2
|
|
03 GET_ITER_STACK
|
|
04 FOR_ITER 22
|
|
07 STORE_FAST 3
|
|
08 LOAD_DEREF 1
|
|
10 POP_JUMP_IF_FALSE 4
|
|
13 LOAD_DEREF 0
|
|
15 LOAD_DEREF 0
|
|
17 STORE_COMP 25
|
|
19 JUMP 4
|
|
22 RETURN_VALUE
|
|
File cmdline/cmd_showbc.py, code block 'closure' (descriptor: \.\+, bytecode @\.\+ bytes)
|
|
Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+):
|
|
########
|
|
\.\+5b
|
|
arg names: *
|
|
(N_STATE 4)
|
|
(N_EXC_STACK 0)
|
|
bc=-\\d\+ line=1
|
|
########
|
|
bc=\\d\+ line=113
|
|
00 LOAD_DEREF 0
|
|
02 LOAD_CONST_SMALL_INT 1
|
|
03 BINARY_OP 26 __add__
|
|
04 STORE_FAST 1
|
|
05 LOAD_CONST_SMALL_INT 1
|
|
06 STORE_DEREF 0
|
|
08 DELETE_DEREF 0
|
|
10 LOAD_CONST_NONE
|
|
11 RETURN_VALUE
|
|
File cmdline/cmd_showbc.py, code block 'f' (descriptor: \.\+, bytecode @\.\+ bytes)
|
|
Raw bytecode (code_info_size=\\d\+, bytecode_size=\\d\+):
|
|
########
|
|
\.\+5b
|
|
arg names: * b
|
|
(N_STATE 4)
|
|
(N_EXC_STACK 0)
|
|
bc=-\\d\+ line=1
|
|
########
|
|
bc=\\d\+ line=139
|
|
00 LOAD_FAST 1
|
|
01 LOAD_DEREF 0
|
|
03 BINARY_OP 26 __add__
|
|
04 RETURN_VALUE
|
|
mem: total=\\d\+, current=\\d\+, peak=\\d\+
|
|
stack: \\d\+ out of \\d\+
|
|
GC: total: \\d\+, used: \\d\+, free: \\d\+
|
|
No. of 1-blocks: \\d\+, 2-blocks: \\d\+, max blk sz: \\d\+, max free sz: \\d\+
|