2016-06-18 1 views
10

Je désassemblé le code python suivantSignification de '>>' dans le code octet Python

def factorial(n): 
    if n <= 1: 
     return 1 
    elif n == 2: 
     return 2 
    elif n ==4: 
     print('hi') 
    return n * 2 

et le bytecode résultant

2  0 LOAD_FAST    0 (n) 
      3 LOAD_CONST    1 (1) 
      6 COMPARE_OP    1 (<=) 
      9 POP_JUMP_IF_FALSE   16 

3  12 LOAD_CONST    1 (1) 
     15 RETURN_VALUE   

4  >> 16 LOAD_FAST    0 (n) 
     19 LOAD_CONST    2 (2) 
     22 COMPARE_OP    2 (==) 
     25 POP_JUMP_IF_FALSE  32 

5  28 LOAD_CONST    2 (2) 
     31 RETURN_VALUE   

6  >> 32 LOAD_FAST    0 (n) 
     35 LOAD_CONST    3 (4) 
     38 COMPARE_OP    2 (==) 
     41 POP_JUMP_IF_FALSE  52 

7  44 LOAD_CONST    4 ('hi') 
     47 PRINT_ITEM   
     48 PRINT_NEWLINE  
     49 JUMP_FORWARD    0 (to 52) 

8  >> 52 LOAD_FAST    0 (n) 
     55 LOAD_CONST    2 (2) 
     58 BINARY_MULTIPLY  
     59 RETURN_VALUE   

Que signifient les symboles '>>' dans le bytecode ci-dessus représenter?

+0

Ressemble à des cibles pour 'POP_JUMP_IF_FALSE'. Voir cet article: [Understanding Python Bytecode] (http://security.coverity.com/blog/2014/Nov/understanding-python-bytecode.html) –

+0

@self: Non, un décalage vers la droite est 'BINARY_RSHIFT' ou' INPLACE_RSHIFT '. –

Répondre

12

Ce sont des cibles de saut; positions plus tôt *JUMP* bytecode saute à lorsque la condition est remplie.

Le premier saut:

  9 POP_JUMP_IF_FALSE  16 

saute à décalage 16, de manière à compenser 16 la sortie a une cible >>:

4  >> 16 LOAD_FAST    0 (n) 

De l'dis.disassemble() function docs noms chaque colonne:

[...]

  1. une instruction étiquetée, indiquée par >>,

et dis.findlabels() function:

Detect tous les décalages dans le code objet de code qui sont des cibles de saut, et renvoyez une liste de ces offsets.