3
Xw^2                 @   s   d Z ddlZddlmZ er"ejZddljjZddl	m
Z
 ddlmZ ddlmZ ddl	mZ ejZG dd	 d	ejZed
krddlmZ edkrddlZej jZeddje\ZZnede  dS )z
Python 2.6 bytecode scanner

This overlaps Python's 2.6's dis module, but it can be run from Python 3 and
other versions of Python. Also, we save token information for later
use in deparsing.
    N)PYTHON3)L65536)	opcode_26)_get_const_info)Tokenc                   s.   e Zd Zd fdd	Zdi dfddZ  ZS )	Scanner26Fc                s,   t t| jd| t| jj| jjg| _d S )Ng@)superr   __init__	frozensetopcSETUP_EXCEPTSETUP_FINALLYZ	setup_ops)selfshow_asm)	__class__ Z/home/psgendb/BIRCHDEV/python/lib/python3.6/site-packages/uncompyle6/scanners/scanner26.pyr	   *   s    zScanner26.__init__Nc       !      C   sX  |s
| j }| j|}|d)kr<x|j|D ]}t|j  q(W g }i }| jrRd|d< t| j}	| j||\}
}}|| _	t
 | _x| jd|	D ]t}| j| | jjko|d |	k o| j|d  | jjko| j|d  | jjkr|| j|d  dkr| jj|d  qW | j|}| jd }| j| }i }x||	d k r| j| j|kr| j| | jjkr| j| | jjkrxd	||< n| j| | jjkrd
||< |}| j| }q&W d}xp| jd|	D ]^}| j| }| j| }d}d}||krHd}d*}xt|| ddD ]@}||kr|jtd|t|d||f dd |d7 }|}qW n.|| jkrv|jtdd| j| d| dd || jjk}|rH| j|| }d}|| jj kr|t! }q|| jj"krn|j#| }t$|drH|}|j%dkr|dkst&d}n<|j%| j'krd}n(|j%dkr"d}n|j%dkr4d}nd}d|j% d }n$|t|j#k rht(||j#\}}|}n|| jj)kr|| }n|| jj*krt|d | }|| jj+krH| j,|}t|rH|d+ j-dkrHt.d |d, _-nb|| jj/krt|}nJ|| jj0kr|| }n2|| jj1kr2| jj2| }n|| jj3krH|
| }|| j4kr| j5d!kr|| jj6kr| j| j7|  | jj8krqnd||f }|||< n| j5d"kr|| jj9krd||< n|d#j: krd||< n|| jj;kr| j,|}||krd}|| j<krb| j|d  | jj=| jj>fkrb|| j?krP|d- j-dks\|| j@krd }n|d. j-dkrt.d |d/ _-n>|| jjkr|| jkrd$}n|| jjAkr|| jBkrd%}| j?jC|d}||kr|jt|||||||| j n"|jt|| ||||||| j qW |d0krPx|D ]} t| jDd'd( q0W t  ||fS )1a  
        Pick out tokens from an uncompyle6 code object, and transform them,
        returning a list of uncompyle6 'Token's.

        The transformations are made to assist the deparsing grammar.
        Specificially:
           -  various types of LOAD_CONST's are categorized in terms of what they load
           -  COME_FROM instructions are added to assist parsing control structures
           -  MAKE_FUNCTION and FUNCTION_CALLS append the number of positional arguments

        Also, when we encounter certain tokens, we add them to a set which will cause custom
        grammar rules. Specifically, variable arg tokens like MAKE_FUNCTION or BUILD_LIST
        cause specific rules for the specific number of arguments they take.
        bothbefore   PyPyr         AssertionErrorZPRINT_ITEM_CONTZPRINT_NEWLINE_CONTNT)reverseZ	COME_FROMz%s_%d)offsethas_argZTHENz%s_0co_namez<lambda>
LOAD_CONSTZLOAD_LAMBDAZLOAD_GENEXPRz
<dictcomp>ZLOAD_DICTCOMPz	<setcomp>ZLOAD_SETCOMPZ	LOAD_CODEz<code_object >Z	JUMP_BACKZCONTINUEg      @g       @zW
                 CONTINUE_LOOP EXEC_STMT LOAD_LISTCOMP LOAD_SETCOMP
                  ZLOAD_ASSERTZRETURN_END_IFafter )Zline_prefix)r   r   r"   r"   r"   r"   r"   )r   r    )Er   Zbuild_instructionsget_instructionsprintdisassembleZis_pypylencodeZunmangle_code_namesnamessetZload_assertsZop_ranger   ZJUMP_IF_TRUEPOP_TOPLOAD_GLOBALZget_argumentaddZfind_jump_targetsZ	next_stmtlinesnextZ
PRINT_ITEMZPRINT_NEWLINEopnamesortedappendr   reprZthensHAVE_ARGUMENTEXTENDED_ARGr   Z	CONST_OPS	co_constshasattrr   r   Zgenexpr_namer   ZNAME_OPSZJREL_OPSJUMP_FORWARDZ
get_targetkindinternZJABS_OPSZ	LOCAL_OPSZCOMPARE_OPScmp_opZFREE_OPSZvarargs_opsversionBUILD_TUPLEprevLOAD_CLOSURECONTINUE_LOOPsplitJUMP_ABSOLUTEZstmtsEND_FINALLY	POP_BLOCK
linestartsZnot_continueRETURN_VALUEZreturn_end_ifsgetformat)!r   co	classnameZcode_objectsr   bytecodeinstrtokens	customizeZcodelenfreer(   varnamesiZjump_targetsZ	last_stmtreplaceextended_argr   opZop_nameZopargZpattrZjump_idxZlast_jump_offsetZjump_offsetr   constargval_targetZ	linestarttr   r   r   ingest4   s   







 

















zScanner26.ingest)F)__name__
__module____qualname__r	   rY   __classcell__r   r   )r   r   r   )   s   
r   __main__)PYTHON_VERSIONg@T)r   z'Need to be Python 2.6 to demo; I am %s.)__doc__sys
uncompyle6r   r9   Zuncompyle6.scanners.scanner2ZscannersZscanner2scanZuncompyle6.scannerr   Zxdis.opcodesr   Zxdis.bytecoder   r   ZJUMP_OPSZScanner2r   rZ   r_   inspectcurrentframef_coderH   rY   rL   rM   r$   r   r   r   r   <module>   s(    v
