3
/*^8M                 @   s  d Z ddlmZ ddlZddlZddljZddlm	Z	 ddl
Z
ddlmZmZ ddl
mZ ddlmZmZmZmZmZ erejZddlmZ nejZd	d
 Zejejeejejejejej ej!ej"ej#ej$ej%dZ&da'G dd de(Z)G dd de)Z*G dd de)Z+G dd de)Z,G dd de)Z-G dd de)Z.G dd de)Z/dddddgZ0d.d d!Z1G d"d# d#eZd$d% Z2d&d' Z3e4d(kred)dd*d+Z5ed)d/d*d-Z6e7e8e5 e7e8e6 e7e5j9e6j9ke5j:e6j:k dS )0z
byte-code verification
    )print_functionN)call)Tokenget_scanner)PYTHON3)iscode	load_fileload_modulepretty_code_flagsPYTHON_MAGIC_INT)reducec             C   s   | j |j kS )N)co_code)ab r   N/home/psgendb/BIRCHDEV/python/lib/python3.6/site-packages/uncompyle6/verify.py
code_equal(   s    r   )BINARY_POWERBINARY_MULTIPLYZBINARY_DIVIDEBINARY_FLOOR_DIVIDEBINARY_TRUE_DIVIDEBINARY_MODULO
BINARY_ADDZBINARY_SUBRACTBINARY_LSHIFTBINARY_RSHIFT
BINARY_AND
BINARY_XOR	BINARY_ORc               @   s   e Zd ZdS )VerifyCmpErrorN)__name__
__module____qualname__r   r   r   r   r   A   s   r   c               @   s    e Zd ZdZdd Zdd ZdS )CmpErrorConstsz*Exception to be raised when consts differ.c             C   s   || _ || _d S )N)nameindex)selfr#   r$   r   r   r   __init__H   s    zCmpErrorConsts.__init__c             C   s   dt | j| jf S )Nz-Compare Error within Consts of %s at index %i)reprr#   r$   )r%   r   r   r   __str__L   s    zCmpErrorConsts.__str__N)r   r    r!   __doc__r&   r(   r   r   r   r   r"   E   s   r"   c               @   s    e Zd ZdZdd Zdd ZdS )CmpErrorConstsTypez*Exception to be raised when consts differ.c             C   s   || _ || _d S )N)r#   r$   )r%   r#   r$   r   r   r   r&   V   s    zCmpErrorConstsType.__init__c             C   s   dt | j| jf S )Nz$Consts type differ in %s at index %i)r'   r#   r$   )r%   r   r   r   r(   Z   s    zCmpErrorConstsType.__str__N)r   r    r!   r)   r&   r(   r   r   r   r   r*   S   s   r*   c               @   s    e Zd ZdZdd Zdd ZdS )CmpErrorConstsLenz8Exception to be raised when length of co_consts differs.c             C   s   || _ ||f| _d S )N)r#   consts)r%   r#   Zconsts1Zconsts2r   r   r   r&   a   s    zCmpErrorConstsLen.__init__c             C   s@   dt | jt| jd t | jd t| jd t | jd f S )Nz.Consts length differs in %s:

%i:	%s

%i:	%s

r      )r'   r#   lenr,   )r%   r   r   r   r(   e   s    zCmpErrorConstsLen.__str__N)r   r    r!   r)   r&   r(   r   r   r   r   r+   ^   s   r+   c               @   s    e Zd ZdZdd Zdd ZdS )CmpErrorCodez)Exception to be raised when code differs.c             C   s&   || _ || _|| _|| _||g| _d S )N)r#   r$   token1token2tokens)r%   r#   r$   r0   r1   tokens1tokens2r   r   r   r&   r   s
    zCmpErrorCode.__init__c             C   s^   t dd ttdd | jd | jd dt| j }dt| j| jt| jt| j	f | S )Nc             S   s   d| |d |d f S )Nz%s%-37s	%-37s
r   r-   r   )str   r   r   <lambda>{   s    z&CmpErrorCode.__str__.<locals>.<lambda>c             S   s   | |fS )Nr   )r   r   r   r   r   r7   |   s    r   r-   zCode differs in %s
z.Code differs in %s at offset %s [%s] != [%s]

)
r   listmapr2   strr#   r'   r$   r0   r1   )r%   r5   r   r   r   r(   y   s     zCmpErrorCode.__str__N)r   r    r!   r)   r&   r(   r   r   r   r   r/   o   s   r/   c               @   s    e Zd ZdZdd Zdd ZdS )CmpErrorCodeLenz0Exception to be raised when code length differs.c             C   s   || _ ||g| _d S )N)r#   r2   )r%   r#   r3   r4   r   r   r   r&      s    zCmpErrorCodeLen.__init__c             C   s6   t dd ttdd | jd | jd dt| j S )Nc             S   s   d| |d |d f S )Nz%s%-37s	%-37s
r   r-   r   )r5   r6   r   r   r   r7      s    z)CmpErrorCodeLen.__str__.<locals>.<lambda>c             S   s   | |fS )Nr   )r   r   r   r   r   r7      s    r   r-   zCode len differs in %s
)r   r8   r9   r2   r:   r#   )r%   r   r   r   r(      s    zCmpErrorCodeLen.__str__N)r   r    r!   r)   r&   r(   r   r   r   r   r;      s   r;   c               @   s    e Zd ZdZdd Zdd ZdS )CmpErrorMemberz1Exception to be raised when other members differ.c             C   s   || _ || _||f| _d S )N)r#   memberdata)r%   r#   r=   Zdata1Zdata2r   r   r   r&      s    zCmpErrorMember.__init__c             C   s0   dt | jt | jt | jd t | jd f S )Nz!Member %s differs in %s:
	%s
	%s
r   r-   )r'   r=   r#   r>   )r%   r   r   r   r(      s
    zCmpErrorMember.__str__N)r   r    r!   r)   r&   r(   r   r   r   r   r<      s   r<   co_filenameco_firstlineno	co_lnotabco_stacksizeco_names c             C   s	  t |stdt| t |s0tdt| t|trPt|t|kstn4t||jksbtt||jkstt|j|jkst|dkr|j}nd||jf }|dkrd}t|trt||rt|trdd t|D }nt|}|j	  d}x|D ]}|t
k	s
|d	krq|d
kr,|dkr.qt| |dd}	ttjdg a|	jt z$|	j|\}}
~
|	j|\}}
~
W d|	j  X tj|j}dd |D }dd |D }d}d}i }i }xd|t|k r$|t|krDt|t|d kr8|d0 jdkr8|d1 jdkr8|d2 jdkr8|d3 jdkr8P nt||||| j||| j< xR|j|| jg D ]<\}}}||| jkrlt||| j|| || ||qlW || j|| jkr>|| jd  ko|| jkn  rhd}x"|||  jdkr|d7 }qW |||  jjd4r|t|||  jjdd5 krt dd ||||  D }||| jkrt||| j|| || ||||d 7 }|d7 }qn|dkr|||  jdkr||d  jdkr|d7 }|d7 }qnj|dkr<|||  jt!kr<t!|||  j }||| j||d  j|| jkr<|d7 }|d7 }qq|| jdkr|| jdkr||d  jdkr|d7 }|d7 }qn8|| jdkr<||d  jdkr<|d7 }|d7 }qq|| jd6krJ||d  jdkrJ||d  jd7krJt|| j|krJ|d7 }qq|| jdkr|| jd"kr|d7 }|d7 }qq|| jd kr&|| jdkr&||d  jdkr&||d  jdkr&t|| jt|| jd kr&t|| jt||d  jkr<|d7 }|d7 }qq|| jd#krh|| jdkrh|| jd$krh|| jdkrhn|| jd%kr|| jd#kr|| j|| jkrn|| jd&kr|| jd#kr|| j|| jkrnd|| jdkr|| jd!krnB|| jd'kr|| jf krn t||| j|| || ||n|| jtkr|| j|| jkr|| jdkrt|| j}t|| j}|| |krt||| j|| || ||nPyBt|| j}||kr|| j"|||f n|||fg||< W n   Y nX |d7 }|d7 }qW ~~q|d(krd)d* |j#D }d+d* |j#D }xt$||D ]\}}t%| |||||d, qbW q|d-kr|j&}|j&}|r|d8M }|d9M }|d:M }||k	r
t'|d-t(|t(|qt)||t)||krt'||t)||t)||qW dS );zN
    Compare two code-objects.

    This is the main part of this module.
    z1cmp_code_object first object type is %s, not codez2cmp_code_object second object type is %s, not code__main__z%s.%sz.?c             S   s   g | ]}|j d r|qS )Zco_)
startswith).0xr   r   r   
<listcomp>   s    z$cmp_code_objects.<locals>.<listcomp>Nverifyr   ZstrongF)Zshow_asm	JUMP_BACKc             S   s   g | ]}|j d kr|qS )	COME_FROM)kind)rG   r6   r   r   r   rI      s    c             S   s   g | ]}|j d kr|qS )rL   )rM   )rG   r6   r   r   r   rI      s    r      r-   RETURN_VALUE
LOAD_CONST   BUILD_TUPLE
BUILD_LIST_c             S   s   g | ]
}|j qS r   )pattr)rG   elemr   r   r   rI   "  s    ROT_TWOZUNPACK_SEQUENCE_2	UNARY_NOTPOP_JUMP_IF_TRUEPOP_JUMP_IF_FALSEJUMP_FORWARDRETURN_END_IFZCONTINUE	LOAD_NAMENoneLOAD_GLOBALZLOAD_ASSERTBUILD_TUPLE_0	co_constsc             s   s   | ]}t |d r|V  qdS )ra   N)hasattr)rG   cr   r   r   	<genexpr>  s    z#cmp_code_objects.<locals>.<genexpr>c             s   s   | ]}t |d r|V  qdS )ra   N)rb   )rG   rc   r   r   r   rd     s    )r#   co_flags      ri   )rR   rS   rh   )r[   rK   )rO   r\   ii_i_)*r   AssertionErrortype
isinstanceobjectdir__members__co_namer   sort__IGNORE_CODE_MEMBERS__r   r8   scanJUMP_OPSZsetTokenClassr   ZingestZresetTokenClassdis
findlabelsr   r.   rM   rU   r;   offsetgetr/   rF   intsplittupleBIN_OP_FUNCSappendra   zipcmp_code_objectsre   r<   r
   getattr)versionis_pypy	code_obj1	code_obj2rJ   r#   membersr3   r=   scannerZ	customizer4   Ztargets1Zi1Zi2Z
offset_mapZcheck_jumpsZidx1Zidx2Zoffset2ir6   fZdest1Zdest2Zcodes1Zcodes2c1Zc2Zflags1flags2r   r   r   r      s   
	




("
"" 



r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r   z/Token class with changed semantics for 'cmp()'.c             C   s   | j }|dkr&|j dkr&|jf kr&dS |d  ko:|j kn  rDdS |dkrZ|j dkrZdS |dkrp|j dkrpdS |d	kr|j d
krdS tr|tkr||j kS ||j kp| j|jkS )Nr`   rP   r   rL   ZPRINT_ITEM_CONTZ
PRINT_ITEMrO   r\   JUMP_IF_FALSE_OR_POPrZ   )rM   rU   ru   )r%   or6   r   r   r   __cmp__  s    
zToken.__cmp__c             C   s    dt | jt | jt| jf S )Nz
%s %s (%s))r:   rM   attrr'   rU   )r%   r   r   r   __repr__  s    zToken.__repr__c             C   s   d| j | j| jf S )Nz%s	%-17s %r)rx   rM   rU   )r%   r   r   r   r(     s    zToken.__str__N)r   r    r!   r)   r   r   r(   r   r   r   r   r     s   r   c             C   s   t | \}}}}}}}	|tkr.dt|f }
|
S yt|}W n, tk
rf } zt|j|| S d}~X nX t||||| |dkry*tdtj	|f dd}|dkrd| S W n$ t
k
r } zd	| S d}~X nX dS )
zCompare a .pyc with a source code file. If everything is okay, None
    is returned. Otherwise a string message describing the mismatch is returned.
    zKCan't compare code - Python is running with magic %s, but code is magic %s Nz
verify-runz%s %sT)shellr   z!Child was terminated by signal %dzExecution failed: %s)r	   r   r   SyntaxErrorr:   replacer   r   sys
executableOSError)Zpyc_filenameZsrc_filenamerJ   r   	timestampZ	magic_intr   r   source_sizesip_hashmsgr   eretcoder   r   r   compare_code_with_srcfile  s&    
r   c             C   sX   t j| \}}}}}}}	t j|\}
}}}}}}	||krD|dkrDd}t||||| dS )zCompare two .pyc files.rJ   Zweak_verifyN)
uncompyle6r	   r   )Zpyc_filename1Zpyc_filename2rJ   Zversion1r   Z
magic_int1r   r   r   r   Zversion2Z
magic_int2r   r   r   r   compare_files	  s
    
	r   rE   rP   zcode_object _expandLang4   i  7   )rD   i[);r)   
__future__r   operatorr   Zxdis.stdZstdrv   
subprocessr   r   Zuncompyle6.scannerr   ZScannerTokenr   r   Zxdisr   r   r	   r
   r   truediv	functoolsr   Zdivr   powmulfloordivmodaddsublshiftrshiftand_xoror_r}   ru   	Exceptionr   r"   r*   r+   r/   r;   r<   rs   r   r   r   r   t1t2printr'   rM   r   r   r   r   r   <module>   sf   


  %
