a
    zeZP                     @   s  d dl Z d dlZd dlZd dlZd dlT d dlmZ g de Z[ejejej	e
eefZed Zdedfedfed	ffZed
 ZdZdd ZdUdddddZdVddddZddddddddddd
Zdd  Zd!d" Zd#d$ Zd%d& Zddd'd(Zed)d*Z d+e j!_"d,e j_"d-e j#_"d.e j$_"d/e j%_"d0e j&_"d1e j'_"d2e j(_"d3Z)d4Z*G d5d6 d6e Z+dd7d8d9Z,d:d; Z-d<d= Z.dWd>d?Z/dXdddAdBZ0ddddCdDZ1dYdd dEdFdGZ2dHdI Z3e0Z4dJdK Z5dLdM Z6dNdO Z7G dPdQ dQZ8dRdS Z9e:dTkre9  dS )Z    N)*)__all__)	code_infodisdisassembledistbdiscofindlinestarts
findlabels	show_codeget_instructionsInstructionBytecodeFORMAT_VALUE)N strreprasciiMAKE_FUNCTION)defaults
kwdefaultsannotationsZclosurec                 C   s4   zt | |d}W n ty.   t | |d}Y n0 |S )Nevalexec)compileSyntaxError)sourcenamec r   /usr/lib/python3.9/dis.py_try_compile   s
    r!   filedepthc                C   sj  | d u rt |d d S t| dr&| j} t| dr8| j} n4t| drJ| j} n"t| dr\| j} nt| drl| j} t| drt| j	 }|D ]r\}}t
|trtd| |d zt|||d	 W n2 ty } ztd
||d W Y d }~n
d }~0 0 t|d qnht| drt| ||d	 nLt
| ttfr8t| |d n.t
| trTt| ||d	 ntdt| j d S )Nr#   __func____code__gi_codeag_codecr_code__dict__zDisassembly of %s:r"   zSorry:co_code(don't know how to disassemble %s objects)r   hasattrr&   r'   r(   r)   r*   sortedr+   items
isinstance
_have_codeprintr   	TypeError_disassemble_recursivebytes	bytearray_disassemble_bytesr   _disassemble_strtype__name__)xr#   r$   r0   r   Zx1msgr   r   r    r   +   s@    	







$r   r%   c                C   sV   | d u r>z
t j} W n ty.   tdd Y n0 | jr>| j} q0t| jj| j|d d S )Nz no last traceback to disassembler%   )	syslast_tracebackAttributeErrorRuntimeErrortb_nextr   tb_framef_codetb_lasti)tbr#   r   r   r    r   X   s    
r   Z	OPTIMIZEDZ	NEWLOCALSZVARARGSZVARKEYWORDSZNESTEDZ	GENERATORZNOFREEZ	COROUTINEZITERABLE_COROUTINEZASYNC_GENERATOR)
                   @         i   c                 C   s`   g }t dD ]:}d|> }| |@ r|t|t| | |N } | s qVq|t|  d|S )NrL   rG   , )rangeappendCOMPILER_FLAG_NAMESgethexjoin)flagsnamesiflagr   r   r    pretty_flagsr   s    r[   c                 C   s   t | dr| j} t | dr"| j} n4t | dr4| j} n"t | drF| j} nt | drV| j} t| trjt| d} t | drx| S t	dt
| j d S )	Nr&   r'   r(   r)   r*   z<disassembly>r,   r-   )r.   r&   r'   r(   r)   r*   r1   r   r!   r4   r:   r;   r<   r   r   r    _get_code_object   s"    







r]   c                 C   s   t t| S N)_format_code_infor]   r\   r   r   r    r      s    r   c                 C   s  g }| d| j  | d| j  | d| j  | d| j  | d| j  | d| j  | d| j  | dt| j	  | j
r| d	 t| j
D ]}| d
|  q| jr| d t| jD ]}| d|  q| jr| d t| jD ]}| d|  q | jrH| d t| jD ]}| d|  q2| jrz| d t| jD ]}| d|  qdd|S )NzName:              %szFilename:          %szArgument count:    %szPositional-only arguments: %szKw-only arguments: %szNumber of locals:  %szStack size:        %szFlags:             %sz
Constants:z%4d: %rzNames:z%4d: %szVariable names:zFree variables:zCell variables:
)rR   co_nameco_filenameco_argcountco_posonlyargcountco_kwonlyargcount
co_nlocalsco_stacksizer[   co_flags	co_consts	enumerateco_namesco_varnamesco_freevarsco_cellvarsrV   )colinesZi_cZi_nr   r   r    r_      s<    




r_   c                C   s   t t| |d d S Nr%   )r3   r   )ro   r#   r   r   r    r      s    r   _InstructionzBopname opcode arg argval argrepr offset starts_line is_jump_targetz!Human readable name for operationzNumeric code for operationz6Numeric argument to operation (if any), otherwise Nonez4Resolved arg value (if known), otherwise same as argz0Human readable description of operation argumentz1Start index of operation within bytecode sequencez4Line started by this opcode (if any), otherwise Nonez1True if other code jumps to here, otherwise False      c                   @   s   e Zd ZdddZdS )r      FrI   c                 C   s   g }|r:| j d ur,d| }||| j   n|d|  |rJ|d n
|d | jrf|d n
|d |t| j| || jt | j	d ur|t| j	t
 | jr|d| j d  d| S )	Nz%%%dd z-->z   z>>z  ())starts_linerR   is_jump_targetr   offsetrjustopnameljust_OPNAME_WIDTHarg_OPARG_WIDTHargreprrV   rstrip)selflineno_widthZmark_as_currentoffset_widthfieldsZ
lineno_fmtr   r   r    _disassemble   s&    



zInstruction._disassembleN)ru   FrI   )r;   
__module____qualname__r   r   r   r   r    r      s   r   )
first_linec                C   sT   t | }|j|j }tt|}|d ur4||j }nd}t|j|j|j	|j
|||S Nr   )r]   rn   rm   dictr	   co_firstlineno_get_instructions_bytesr,   rl   rk   ri   )r<   r   ro   
cell_names
linestartsline_offsetr   r   r    r     s    r   c                 C   s    | }|d ur||  }|t |fS r^   r   )Zconst_indexZ
const_listargvalr   r   r    _get_const_info  s    r   c                 C   s*   | }|d ur||  }|}nt |}||fS r^   r   )Z
name_indexZ	name_listr   r   r   r   r    _get_name_info'  s    r   c              
   #   s  t | }d }t| D ]r\}	}
 |d urD||	d }|d urD||7 }|	|v }d }d} d url }|
tv rzt |\}}n|
tv rt |\}}n|
tv r|	d   }dt| }n|
t	v rt |\}}n|
t
v rt  }|}n|
tv rt |\}}nr|
tkrFt d@  \}}|t d@ f}|d rl|r<|d7 }|d7 }n&|
tkrld fd	d
ttD }tt|
 |
 |||	||V  qd S )Nr   rH   zto ru   rI   rG   rP   zwith formatc                 3   s"   | ]\}} d |> @ r|V  qdS )rG   Nr   ).0rY   sr   r   r    	<genexpr>g  s   
z*_get_instructions_bytes.<locals>.<genexpr>)r
   _unpack_opargsrT   Zhasconstr   Zhasnamer   hasjrelr   ZhaslocalZ
hascompareZcmp_opZhasfreer   FORMAT_VALUE_CONVERTERSboolr   rV   rj   MAKE_FUNCTION_FLAGSr   r}   )codevarnamesrX   	constantscellsr   r   labelsry   r{   oprz   r   r   r   r   r    r   7  sN    






r   c             
   C   s<   | j | j }tt| }t| j|| j| j| j|||d d S rq   )	rn   rm   r   r	   r8   r,   rl   rk   ri   )ro   lastir#   r   r   r   r   r    r   m  s
    
r   c                C   sp   t | |d |d u s|dkrl|d ur,|d }| jD ]8}t|dr2t|d td|f |d t|||d q2d S )Nr%   r   rG   r,   zDisassembly of %r:r"   )r   ri   r.   r3   r5   )ro   r#   r$   r<   r   r   r    r5   t  s    


r5   )r#   r   c             	   C   s   |d u}	|	r8t | | }
|
dkr2tt|
}q<d}nd}t| d }|dkr^tt|}nd}t| ||||||dD ]J}|	o|jd uo|jdk}|rt|d |j|k}t|||||d qxd S )	Ni  ru   r   rH   i'  rI   r   r%   )	maxvalueslenr   r   ry   r{   r3   r   )r   r   r   rX   r   r   r   r#   r   Zshow_linenoZ	maxlinenor   Z	maxoffsetr   ZinstrZnew_source_lineZis_current_instrr   r   r    r8     s4    


r8   c                 K   s   t t| dfi | d S )Nz<dis>)r5   r!   )r   kwargsr   r   r    r9     s    r9   c                 c   sd   d}t dt| dD ]J}| | }|tkrN| |d  |B }|tkrH|d> nd}nd }|||fV  qd S )Nr   rH   rG   rJ   )rQ   r   ZHAVE_ARGUMENTZEXTENDED_ARG)r   Zextended_argrY   r   r   r   r   r    r     s    r   c                 C   s\   g }t | D ]J\}}}|d ur|tv r4|d | }n|tv r|}nq||vr|| q|S )NrH   )r   r   ZhasjabsrR   )r   r   r{   r   r   Zlabelr   r   r    r
     s    r
   c           	      c   s   | j dd d }| j dd d }t| j}d }| j}d}t||D ]P\}}|rz||krd||fV  |}||7 }||krz d S |dkr|d8 }||7 }qB||kr||fV  d S )Nr   rH   rG   rN   rO   )	co_lnotabr   r,   r   zip)	r   Zbyte_incrementsZline_incrementsZbytecode_lenZ
lastlinenolinenoaddrZ	byte_incrZ	line_incrr   r   r    r	     s&    


r	   c                   @   sH   e Zd ZdddddZdd Zdd Zed	d
 Zdd Zdd Z	dS )r   N)r   current_offsetc                C   sd   t | | _}|d u r&|j| _d| _n|| _||j | _|j|j | _tt	|| _
|| _|| _d S r   )r]   codeobjr   r   _line_offsetrn   rm   _cell_namesr   r	   _linestarts_original_objectr   )r   r<   r   r   ro   r   r   r    __init__  s    zBytecode.__init__c              	   C   s*   | j }t|j|j|j|j| j| j| jdS )Nr   )	r   r   r,   rl   rk   ri   r   r   r   )r   ro   r   r   r    __iter__  s    zBytecode.__iter__c                 C   s   d | jj| jS )Nz{}({!r}))format	__class__r;   r   r   r   r   r    __repr__  s    
zBytecode.__repr__c                 C   s    |j r|j }q | |jj|jdS )N)r   )rB   rC   rD   rE   )clsrF   r   r   r    from_traceback  s    zBytecode.from_tracebackc                 C   s
   t | jS r^   )r_   r   r   r   r   r    info  s    zBytecode.infoc                 C   sx   | j }| jd ur| j}nd}t @}t|j|j|j|j| j	| j
| j||d	 | W  d    S 1 sj0    Y  d S )Nr   )r   rX   r   r   r   r   r#   r   )r   r   ioStringIOr8   r,   rl   rk   ri   r   r   r   getvalue)r   ro   r{   outputr   r   r    r   
  s    


zBytecode.dis)
r;   r   r   r   r   r   classmethodr   r   r   r   r   r   r    r     s   
r   c                  C   sz   dd l } |  }|jd| dddd | }|j}| }W d    n1 sT0    Y  t||jjd}t	| d S )Nr   infilerb?-)r:   nargsdefaultr   )
argparseArgumentParseradd_argumentFileType
parse_argsr   readr   r   r   )r   parserargsr   r   r   r   r   r    _test  s    &r   __main__)N)N)NNNNNr   )r   )r   NNNNN);r>   typescollectionsr   Zopcoder   Z_opcodes_all
MethodTypeFunctionTypeCodeTyper   staticmethodr:   r2   Zopmapr   r   r   r   r   r   r   r!   r   r   rS   r[   r]   r   r_   r   
namedtuplerr   r}   __doc__r   r   r   r{   ry   rz   r   r   r   r   r   r   r   r   r5   r8   r9   r   r   r
   r	   r   r   r;   r   r   r   r    <module>   s   - 4  
6  =
