2016-06-18 784 views
10

Mam zdemontowany następujący kod PythonaSens „>>” w Pythonie kodu bajtowego

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

i wynikającą z kodu bajtowego

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   

Co robić „>>” symboli w powyższym kodu bajtowego oznaczać?

+0

Wygląda jak cele dla 'POP_JUMP_IF_FALSE'. Zobacz ten artykuł: [Understanding Python Bytecode] (http://security.coverity.com/blog/2014/Nov/understanding-python-bytecode.html) –

+0

@self: Nie, prawą zmianą jest 'BINARY_RSHIFT' lub' INPLACE_RSHIFT '. –

Odpowiedz

12

Są to cele skoku; pozycje wcześniej *JUMP* kod bajtowy przeskakuje, gdy warunek zostanie spełniony.

Pierwszy skok:

  9 POP_JUMP_IF_FALSE  16 

skacze do offsetu 16, więc na przesunięcie 16 wyjście ma cel >>:

4  >> 16 LOAD_FAST    0 (n) 

od nazw dis.disassemble() function docs każda kolumna:

[...]

  1. znakowany instrukcji, oznaczone >>,

i dis.findlabels() function:

Wykrywanie wszystkie przesunięcia w kodzie kodu wynikowego, które są celem skoku, i zwróć listę tych przesunięć.