Strange disassembly

Rob Cliffe rob.cliffe at btinternet.com
Sat Jun 19 02:14:33 EDT 2021



On 18/06/2021 11:04, Chris Angelico wrote:
>>>> sys.version
> '3.10.0b2+ (heads/3.10:33a7a24288, Jun  9 2021, 20:47:39) [GCC 8.3.0]'
>>>> def chk(x):
> ...     if not(0 < x < 10): raise Exception
> ...
>>>> dis.dis(chk)
>    2           0 LOAD_CONST               1 (0)
>                2 LOAD_FAST                0 (x)
>                4 DUP_TOP
>                6 ROT_THREE
>                8 COMPARE_OP               0 (<)
>               10 POP_JUMP_IF_FALSE       11 (to 22)
>               12 LOAD_CONST               2 (10)
>               14 COMPARE_OP               0 (<)
>               16 POP_JUMP_IF_TRUE        14 (to 28)
>               18 LOAD_GLOBAL              0 (Exception)
>               20 RAISE_VARARGS            1
>          >>   22 POP_TOP
>               24 LOAD_GLOBAL              0 (Exception)
>               26 RAISE_VARARGS            1
>          >>   28 LOAD_CONST               0 (None)
>               30 RETURN_VALUE
> Why are there two separate bytecode blocks for the "raise Exception"?
> I'd have thought that the double condition would still be evaluated as
> one thing, or at least that the jump destinations for both the
> early-abort and the main evaluation should be the same.
>
> ChrisA
As an ornery human I could refactor this to avoid the code duplication as

   2           0 LOAD_CONST               1 (0)
               2 LOAD_FAST                0 (x)
               4 DUP_TOP
               6 ROT_THREE
               8 COMPARE_OP               0 (<)
              10 POP_JUMP_IF_TRUE        10 (to 18)
              12 POP_TOP
         >>   14 LOAD_GLOBAL              0 (Exception)
              16 RAISE_VARARGS            1
         >>   18 LOAD_CONST               2 (10)
              20 COMPARE_OP               0 (<)
              22 POP_JUMP_IF_FALSE       21 (to 14)
              24 LOAD_CONST               0 (None)
              26 RETURN_VALUE
 >>>

(there may be mistakes in this) but this is probably too much to expect 
of the compiler.
Rob Cliffe


More information about the Python-list mailing list