@@ -180,8 +180,8 @@ def bug708901():
180180
181181%3d JUMP_BACKWARD 5 (to L1)
182182
183- %3d L2: END_FOR
184- POP_ITER
183+ %3d END_FOR
184+ L2: POP_ITER
185185 LOAD_COMMON_CONSTANT 7 (None)
186186 RETURN_VALUE
187187""" % (bug708901 .__code__ .co_firstlineno ,
@@ -849,8 +849,8 @@ def foo(x):
849849 L1: FOR_ITER 3 (to L2)
850850 LIST_APPEND 3
851851 JUMP_BACKWARD 5 (to L1)
852- L2: END_FOR
853- POP_ITER
852+ END_FOR
853+ L2: POP_ITER
854854 RETURN_VALUE
855855 L3: PUSH_NULL
856856 LOAD_FAST_BORROW 0 (x)
@@ -893,8 +893,8 @@ def foo(x):
893893 RESUME 9
894894 POP_TOP
895895 JUMP_BACKWARD 17 (to L2)
896- L3: END_FOR
897- POP_ITER
896+ END_FOR
897+ L3: POP_ITER
898898 LOAD_COMMON_CONSTANT 7 (None)
899899 RETURN_VALUE
900900
@@ -947,8 +947,8 @@ def loop_test():
947947 POP_TOP
948948 JUMP_BACKWARD_{: <6} 16 (to L1)
949949
950- %3d L2: END_FOR
951- POP_ITER
950+ %3d END_FOR
951+ L2: POP_ITER
952952 LOAD_COMMON_CONSTANT 7 (None)
953953 RETURN_VALUE
954954""" % (loop_test .__code__ .co_firstlineno ,
@@ -1858,7 +1858,7 @@ def _prepare_test_cases():
18581858 make_inst (opname = 'LOAD_SMALL_INT' , arg = 10 , argval = 10 , argrepr = '' , offset = 14 , start_offset = 14 , starts_line = False , line_number = 3 ),
18591859 make_inst (opname = 'CALL' , arg = 1 , argval = 1 , argrepr = '' , offset = 16 , start_offset = 16 , starts_line = False , line_number = 3 , cache_info = [('counter' , 1 , b'\x00 \x00 ' ), ('func_version' , 2 , b'\x00 \x00 \x00 \x00 ' )]),
18601860 make_inst (opname = 'GET_ITER' , arg = 0 , argval = 0 , argrepr = '' , offset = 24 , start_offset = 24 , starts_line = False , line_number = 3 , cache_info = [('counter' , 1 , b'\x00 \x00 ' )]),
1861- make_inst (opname = 'FOR_ITER' , arg = 33 , argval = 98 , argrepr = 'to L4' , offset = 28 , start_offset = 28 , starts_line = False , line_number = 3 , label = 1 , cache_info = [('counter' , 1 , b'\x00 \x00 ' )]),
1861+ make_inst (opname = 'FOR_ITER' , arg = 33 , argval = 100 , argrepr = 'to L4' , offset = 28 , start_offset = 28 , starts_line = False , line_number = 3 , label = 1 , cache_info = [('counter' , 1 , b'\x00 \x00 ' )]),
18621862 make_inst (opname = 'STORE_FAST' , arg = 0 , argval = 'i' , argrepr = 'i' , offset = 32 , start_offset = 32 , starts_line = False , line_number = 3 ),
18631863 make_inst (opname = 'LOAD_GLOBAL' , arg = 3 , argval = 'print' , argrepr = 'print + NULL' , offset = 34 , start_offset = 34 , starts_line = True , line_number = 4 , cache_info = [('counter' , 1 , b'\x00 \x00 ' ), ('index' , 1 , b'\x00 \x00 ' ), ('module_keys_version' , 1 , b'\x00 \x00 ' ), ('builtin_keys_version' , 1 , b'\x00 \x00 ' )]),
18641864 make_inst (opname = 'LOAD_FAST_BORROW' , arg = 0 , argval = 'i' , argrepr = 'i' , offset = 44 , start_offset = 44 , starts_line = False , line_number = 4 ),
@@ -1879,8 +1879,8 @@ def _prepare_test_cases():
18791879 make_inst (opname = 'POP_TOP' , arg = None , argval = None , argrepr = '' , offset = 92 , start_offset = 92 , starts_line = True , line_number = 8 , label = 3 ),
18801880 make_inst (opname = 'POP_TOP' , arg = None , argval = None , argrepr = '' , offset = 94 , start_offset = 94 , starts_line = False , line_number = 8 ),
18811881 make_inst (opname = 'JUMP_FORWARD' , arg = 13 , argval = 124 , argrepr = 'to L5' , offset = 96 , start_offset = 96 , starts_line = False , line_number = 8 ),
1882- make_inst (opname = 'END_FOR' , arg = None , argval = None , argrepr = '' , offset = 98 , start_offset = 98 , starts_line = True , line_number = 3 , label = 4 ),
1883- make_inst (opname = 'POP_ITER' , arg = None , argval = None , argrepr = '' , offset = 100 , start_offset = 100 , starts_line = False , line_number = 3 ),
1882+ make_inst (opname = 'END_FOR' , arg = None , argval = None , argrepr = '' , offset = 98 , start_offset = 98 , starts_line = True , line_number = 3 ),
1883+ make_inst (opname = 'POP_ITER' , arg = None , argval = None , argrepr = '' , offset = 100 , start_offset = 100 , starts_line = False , line_number = 3 , label = 4 ),
18841884 make_inst (opname = 'LOAD_GLOBAL' , arg = 3 , argval = 'print' , argrepr = 'print + NULL' , offset = 102 , start_offset = 102 , starts_line = True , line_number = 10 , cache_info = [('counter' , 1 , b'\x00 \x00 ' ), ('index' , 1 , b'\x00 \x00 ' ), ('module_keys_version' , 1 , b'\x00 \x00 ' ), ('builtin_keys_version' , 1 , b'\x00 \x00 ' )]),
18851885 make_inst (opname = 'LOAD_CONST' , arg = 1 , argval = 'I can haz else clause?' , argrepr = "'I can haz else clause?'" , offset = 112 , start_offset = 112 , starts_line = False , line_number = 10 ),
18861886 make_inst (opname = 'CALL' , arg = 1 , argval = 1 , argrepr = '' , offset = 114 , start_offset = 114 , starts_line = False , line_number = 10 , cache_info = [('counter' , 1 , b'\x00 \x00 ' ), ('func_version' , 2 , b'\x00 \x00 \x00 \x00 ' )]),
@@ -2200,6 +2200,13 @@ def test_jump_target(self):
22002200 positions = None )
22012201 self .assertEqual (10 + 2 + 1 * 2 + 100 * 2 , instruction .jump_target )
22022202
2203+ # FOR_ITER uses JUMPBY(oparg + 1) at runtime, skipping END_FOR to land
2204+ # on POP_ITER; the reported target must reflect the extra +2 bytes.
2205+ instruction = make_inst (opname = "FOR_ITER" , arg = delta , argval = delta ,
2206+ argrepr = '' , offset = 10 , start_offset = 10 , starts_line = True , line_number = 1 , label = None ,
2207+ positions = None )
2208+ self .assertEqual (10 + 2 + 1 * 2 + 100 * 2 + 2 , instruction .jump_target )
2209+
22032210 def test_argval_argrepr (self ):
22042211 def f (opcode , oparg , offset , * init_args ):
22052212 arg_resolver = dis .ArgResolver (* init_args )
0 commit comments