3
/*^Q                 @   s   d Z ddlmZ ddlmZ ddlmZ ddlZeej	ej
gZddlmZ G dd deZed	krdd
lmZ edkrddlZej jZe je\ZZx"eD ]Zee qW nede  dS )z
Python 3.0 bytecode scanner/deparser

This sets up opcodes Python's 3.0 and calls a generalized
scanner routine for Python 3.
    )print_function)	opcode_30)instruction_sizeN)Scanner3c               @   s   e Zd ZdddZdd ZdS )	Scanner30NFc             C   s   t j| d|| d S )Ng      @)r   __init__)selfZshow_asmis_pypy r
   Z/home/psgendb/BIRCHDEV/python/lib/python3.6/site-packages/uncompyle6/scanners/scanner30.pyr      s    zScanner30.__init__c       ,      C   s(  | j }| j| j}| jd }|d }|d }xR| jD ]H}	|	d }
|	d }|
|  koZ|k n  r4|
|kr4||kr4|
}|}|	}q4W || jjkr|t|| j7 }| j|}| j||}|| j	|< ||kr|| j
|< | j| \}}| j||| jj|d}|rtj|| | j|}nd}| j| j|  }|r|| j| kr| j|r|| j|  | jjks|| j|  | jjkr|| | jjkrd}|s| j||| jj}|sdS | j|}| j|j|}d}|| j|  tkr| j| }|r d}| jj| nd}|}|d }n:| j||kr:| j||| jj|d}| j|}| j|j|}||kr| j|r| j|r| j|d	 | j|kr|d	 | j
|< |}n||k r|d	 | j
|< |}| j|}|| | jj| jjfkrd}nZd}| j| }||krd
}n<| j | | jjkrB| jj| | j|}||d krB|}| jj| | jj| | jj|d ||d tj|| | j|}| j|jdkrtj|| | j|}||kr$| jj|d ||d nR|| j k
rn|t|| j }| j|}| j||}| j}||kr0|d dkr0|| j
|< dS |||  | j!kr||kr|| |kr|| | j
|< | jjd||| d dS || }|tj"kr| j#|| j$| tj"|}|r^| j|}|rl|| j%krl| j| j|||krl|||  | jjkrr| j&|grr|| j|| krr|| | j%ksL| j|| || krrdt'| j&| j#||| t|krrn|||  | jjkr| j&|grdt't(| j&| j#||| t|t(| j&| j#||| tj"tj)tjf|dB krn~d}| j*|| j$| tj"}d} xF|D ]>}!|| j|!krH| j|! j+|!d krL| rL|!}P nd} qW |p^|d | j
|< dS n|d | j
|< dS n| j$| }"||" |krn| j|"r|| j|"kr|||"  tj"kr^||" | jj,ks||ks|||  | jj| jjfkr^||" | j
|< dS nF||" | jjkr^| j|r^| j|| j|"kr^||" | j
|< dS || jkrndS || | jjkr|| j%kr||kr|| |kr|| | jjko||d  | jjko|||  | jjk r|}| j|r^| j|d}#|#|k r.|||#  | jjkr.|#|kr.dS | j|#|}| jjd||d | jj| q$| j-|dr|}#| jjd||d | jj| q$|| | jj| jj.fkr$| jjd||d || }$| j/	r||$ | jj0k	r| jj1||$d   dk	rdS | j2dk	r|| | jj3k	r$dS |}%||% | jjk	rP|%t| j |% | j7 }%||% | jjk	rx|%t| j |% | j7 }%|%|k	rx,||% D ] }&||& }'|'| jj3k	rdS 	qW || | jjk
rT| j2dk
rF|}%||% | jj4k	r|}%x0| jD ]&}(|(d dk	r|(d |%k	rdS 	qW |%t| j |% | j7 }%||% | jjk
rFdS | j5j| n|| j
|< | jj| n|| jj3k
r| j|}| j||}|| j
|< n|| jj6k
r| j|}| j||}|| j
|< nR|| j7krB| j|}||kr$| j||| jj,|})|)r.||)d  | jj8kr.|)| j
|< n| j||| j
|< n| j2dkr$|| jjkr|d t'|k r$||d  | jjkr$|| j5kr$| j5j9| n|| jj,kr$| j|}| j| }*||* | jjkr$|*| j5kr$|*}+x4|+|kr||+ tj,tjgkrdS | j|+ }+qW | j5j9|* dS )z
        Detect structures and their boundaries to fix optimized jumps
        Python 3.0 is more like Python 2.6 than it is Python 3.x.
        So we have a special routine here.
        r   startendFNwhilefor      zwhile 1z-loop)typer   r   POP_TOPz-elser   zand/or   Tzif-thenzexception-matchg      @g      @z
while-loopr   ):codeZinstsopcodeZstructsopc
SETUP_LOOPr   Z
get_targetZrestrict_to_parentZsetup_loopsZfixed_jumpslinesZ
last_instrJUMP_ABSOLUTExdisZnext_offsetprevprev_opis_jump_forwardRETURN_VALUE	POP_BLOCKZget_instJUMP_TFZ	ignore_ifaddFOR_ITERGET_ITERZJUMP_OPsZnot_continueZloopsappendopnameZpop_jump_tfZpop_jump_if_popJUMP_IF_FALSEZrem_orZ	next_stmtZstmtsZremove_mid_line_ifslensetJUMP_IF_TRUEZinst_matchesnextJUMP_FORWARDZis_jump_back
BREAK_LOOPr	   
COMPARE_OPcmp_opversionSETUP_EXCEPTr   Zreturn_end_ifsSETUP_FINALLYZjump_if_popROT_TWOremove),r   offsettargetsZ
inst_indexr   opparentr   r   structZcurrent_startZcurrent_endtargetZline_noZnext_line_byteZ	jump_backZjump_forward_offsetZreturn_val_offset1Zjb_instZ	if_offsetZ	loop_typeZjb_next_offsettestZtest_targetZafter_jump_offsetZrtargetr   Zpre_rtargetmatchr   ZfixZjump_ifsZlast_jump_goodjr,   Zif_endZ	jump_prevZnext_opZtry_opZcome_from_opblockZunop_targetZrtarget_previr
   r
   r   detect_control_flow   s$   

































zScanner30.detect_control_flow)NF)__name__
__module____qualname__r   rA   r
   r
   r
   r   r      s   
r   __main__)PYTHON_VERSIONg      @z'Need to be Python 3.0 to demo; I am %s.)__doc__
__future__r   Zxdis.opcodesr   r   r   r   	frozensetr(   r+   r"   Zuncompyle6.scanners.scanner3r   r   rB   
uncompyle6rF   inspectcurrentframef_codecoZingesttokensZ	customizetprintr
   r
   r
   r   <module>   s(      G

