I got to the point of trying to implement continue in my own interpreter 
project and was surprised when my for-loop just used some jumps to manage its 
control flow. Actually, I hoped for something else; I don't have logic in my 
code generation to track jump positions. I kind of hoped there was some 
CONTINUE opcode with some extra logic I could add at run time to just kind of 
do it.

(that is my own problem and I know there is no such thing as a free lunch, but 
it's 2AM and I want to hope!)

Well, I found CONTINUE_LOOP, which applies for for-loops, but 3.6.8 sure 
doesn't emit it for pretty basic stuff:

>>> def for_continue():
...   a = 0
...   for i in range(0, 3, 1):
...     if i == 2:
...       continue
...     a += i
...   else:
...     a += 10
...   return a
...
>>> for_continue()
11
>>> dis(for_continue)
  2           0 LOAD_CONST               1 (0)
              2 STORE_FAST               0 (a)

  3           4 SETUP_LOOP              46 (to 52)
              6 LOAD_GLOBAL              0 (range)
              8 LOAD_CONST               1 (0)
             10 LOAD_CONST               2 (3)
             12 LOAD_CONST               3 (1)
             14 CALL_FUNCTION            3
             16 GET_ITER
        >>   18 FOR_ITER                22 (to 42)
             20 STORE_FAST               1 (i)

  4          22 LOAD_FAST                1 (i)
             24 LOAD_CONST               4 (2)
             26 COMPARE_OP               2 (==)
             28 POP_JUMP_IF_FALSE       32

  5          30 JUMP_ABSOLUTE           18

  6     >>   32 LOAD_FAST                0 (a)
             34 LOAD_FAST                1 (i)
             36 INPLACE_ADD
             38 STORE_FAST               0 (a)
             40 JUMP_ABSOLUTE           18
        >>   42 POP_BLOCK

  8          44 LOAD_FAST                0 (a)
             46 LOAD_CONST               5 (10)
             48 INPLACE_ADD
             50 STORE_FAST               0 (a)

  9     >>   52 LOAD_FAST                0 (a)
             54 RETURN_VALUE

The place where a CONTINUE_LOOP could have made sense would be at address 30 
for that JUMP_ABSOLUTE. That'll go back to a FOR_ITER, as CONTINUE_LOOP implies 
it *must* do. I'm just guessing that at some point, somebody concluded there 
wasn't anything special about having that opcode over absolute jumps and it got 
abandoned. I wanted to check if my notions were correct or if there's some 
gotcha where having that over other things makes sense.
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to