o
    IAf4N                     @   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dUd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.		 dVd>d?Z/dWdddAdBZ0ddddCdDZ1		dXdd dEdFdGZ2dHdI Z3e0Z4dJdK Z5dLdM Z6dNdO Z7G dPdQ dQZ8dRdS Z9e:dTkre9  dS dS )Y    N)*)__all__)	code_infodisdisassembledistbdiscofindlinestarts
findlabels	show_codeget_instructionsInstructionBytecodeFORMAT_VALUE)N strreprasciiMAKE_FUNCTION)defaultsZ
kwdefaultsZannotationsZclosurec                 C   s6   	 z	t | |d}W |S  ty   t | |d}Y |S w )Nevalexec)compileSyntaxError)sourcenamec r   /usr/lib/python3.10/dis.py_try_compile   s   r   filedepthc                C   sj  	 | d u rt |d d S t| dr| j} t| dr| j} nt| dr&| j} nt| dr/| j} nt| dr7| j} t| drt| j	 }|D ]9\}}t
|tr~td| |d z	t|||d	 W n tyx } ztd
||d W Y d }~nd }~ww t|d qEd S t| drt| ||d	 d S t
| ttfrt| |d d S t
| trt| ||d	 d S tdt| j )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"   r.   r   Zx1msgr   r   r   r   +   sJ   










r   r#   c                C   sX   	 | d u r zt j} W n ty   tdd w | jr | j} | jst| 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   sb   	 g }t dD ]}d|> }| |@ r$|t|t| | |N } | s$ nq|t|  d|S )NrJ   rE   , )rangeappendCOMPILER_FLAG_NAMESgethexjoin)flagsnamesiflagr   r   r   pretty_flagsr   s   
rY   c                 C   s   	 t | dr	| j} t | dr| j} nt | dr| j} nt | dr$| j} nt | dr,| j} t| tr6t| d} t | dr=| S t	dt
| j )	Nr$   r%   r&   r'   r(   z<disassembly>r*   r+   )r,   r$   r%   r&   r'   r(   r/   r   r   r2   r8   r9   r:   r   r   r   _get_code_object   s$   







r[   c                 C   s   	 t t| S N)_format_code_infor[   rZ   r   r   r   r      s   r   c                 C   sx  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
|  qQ| jrr| d t| jD ]	}| d|  qh| jr| d t| jD ]	}| d|  q| jr| d t| jD ]	}| d|  q| jr| d t| jD ]	}| d|  qd|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:
)rP   co_nameco_filenameco_argcountco_posonlyargcountco_kwonlyargcount
co_nlocalsco_stacksizerY   co_flags	co_consts	enumerateco_namesco_varnamesco_freevarsco_cellvarsrT   )colinesZi_cZi_nr   r   r   r]      s<   





r]   c                C   s   	 t t| |d d S Nr#   )r1   r   )rm   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      FrG   c                 C   s   	 g }|r| j d urd| }||| j   n|d|  |r&|d n|d | jr4|d n|d |t| j| || jt | j	d urj|t| j	t
 | jrj|d| j d  d| S )	Nz%%%dd z-->z   z>>z  ())starts_linerP   is_jump_targetr   offsetrjustopnameljust_OPNAME_WIDTHarg_OPARG_WIDTHargreprrT   rstrip)selflineno_widthZmark_as_currentoffset_widthfieldsZ
lineno_fmtr   r   r   _disassemble   s(   



zInstruction._disassembleN)rs   FrG   )r9   
__module____qualname__r   r   r   r   r   r      s    r   )
first_linec                C   sV   	 t | }|j|j }tt|}|d ur||j }nd}t|j|j|j	|j
|||S Nr   )r[   rl   rk   dictr	   co_firstlineno_get_instructions_bytesr*   rj   ri   rg   )r:   r   rm   
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   s2   	 | }|d ur||  }|}||fS 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 ]\}	}
 |d ur#||	d }|d ur#||7 }|	|v }d }d} d urÈ }|
tv r=t |\}}n|
tv rIt |\}}nz|
tv rX d }dt| }nk|
t	v rk|	d  d  }dt| }nX|
t
v rwt |\}}nL|
tv rt  }|}nA|
tv rt |\}}n5|
tkrt d@  \}}|t d@ f}|d r|r|d7 }|d7 }n|
tkrd fd	d
ttD }tt|
 |
 |||	||V  qd S )Nr   rF   zto rs   rG   rE   rN   zwith formatc                 3   s$    | ]\}} d |> @ r|V  qdS )rE   Nr   ).0rW   sr~   r   r   	<genexpr>j  s   
 
z*_get_instructions_bytes.<locals>.<genexpr>)r
   _unpack_opargsrR   Zhasconstr   Zhasnamer   hasjabsr   hasjrelZhaslocalZ
hascompareZcmp_opZhasfreer   FORMAT_VALUE_CONVERTERSboolr   rT   rh   MAKE_FUNCTION_FLAGSr   r{   )codevarnamesrV   	constantscellsr   r   labelsrw   ry   oprx   r   r   r   r   r   r   7  s\   
r   c             
   C   s>   	 | j | j }tt| }t| j|| j| j| j|||d d S ro   )	rl   rk   r   r	   r6   r*   rj   ri   rg   )rm   lastir!   r   r   r   r   r   r   p  s   

r   c                C   st   t | |d |d u s|dkr6|d ur|d }| jD ]}t|dr5t|d td|f |d t|||d qd S d S )Nr#   r   rE   r*   zDisassembly of %r:r    )r   rg   r,   r1   r3   )rm   r!   r"   r:   r   r   r   r3   w  s   


r3   )r!   r   c             	   C   s   t |}	|	rt| | }
|
dkrtt|
}nd}nd}t| d }|dkr/tt|}nd}t| ||||||dD ]%}|	oI|jd uoI|jdk}|rQt|d |j|k}t|	||||d q<d S )	Ni  rs   r   rF   i'  rG   r   r#   )
r   maxvalueslenr   r   rw   ry   r1   r   )r   r   r   rV   r   r   r   r!   r   Zshow_linenoZ	maxlinenor   Z	maxoffsetr   ZinstrZnew_source_lineZis_current_instrr   r   r   r6     s6   


r6   c                 K   s   	 t t| dfi | d S )Nz<dis>)r3   r   )r   kwargsr   r   r   r7     s   r7   c                 c   sj    d}t dt| dD ]'}| | }|tkr(| |d  |B }|tkr%|d> nd}nd }d}|||fV  qd S )Nr   rF   rE   rH   )rO   r   ZHAVE_ARGUMENTZEXTENDED_ARG)r   Zextended_argrW   r   r~   r   r   r   r     s   r   c                 C   sf   	 g }t | D ])\}}}|d ur0|tv r|d |d  }n
|tv r&|d }nq||vr0|| q|S )NrF   )r   r   r   rP   )r   r   ry   r   r~   Zlabelr   r   r   r
     s   

r
   c                 c   s>    	 d }|   D ]\}}}|d ur||kr|}||fV  qd S r\   )co_lines)r   Zlastlinestartendliner   r   r   r	     s   
r	   c                   @   sJ   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_offsetrl   rk   _cell_namesr   r	   _linestarts_original_objectr   )r   r:   r   r   rm   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*   rj   ri   rg   r   r   r   )r   rm   r   r   r   __iter__  s   zBytecode.__iter__c                 C   s   d | jj| jS )Nz{}({!r}))format	__class__r9   r   r   r   r   r   __repr__  s   
zBytecode.__repr__c                 C   s&   	 |j r
|j }|j s| |jj|jdS )N)r   )r@   rA   rB   rC   )clsrD   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   sz   	 | j }| jd ur| j}nd}t  }t|j|j|j|j| j	| j
| j||d	 | W  d    S 1 s6w   Y  d S )Nr   )r   rV   r   r   r   r   r!   r   )r   r   ioStringIOr6   r*   rj   ri   rg   r   r   r   getvalue)r   rm   ry   outputr   r   r   r     s    


$zBytecode.dis)
r9   r   r   r   r   r   classmethodr   r   r   r   r   r   r   r     s    
r   c                  C   s|   	 dd l } |  }|jd| dddd | }|j}| }W d    n1 s+w   Y  t||jjd}t	| d S )Nr   infilerb?-)r8   nargsdefaultr   )
argparseArgumentParseradd_argumentFileType
parse_argsr   readr   r   r   )r   parserargsr   r   r   r   r   r   _test  s   
r   __main__r\   )NNNNNr   )r   )r   NNNNN);r<   typescollectionsr   Zopcoder   Z_opcodes_all
MethodTypeFunctionTypeCodeTyper   staticmethodr8   r0   Zopmapr   r   r   r   r   r   r   r   r   r   rQ   rY   r[   r   r]   r   
namedtuplerp   r{   __doc__r~   r   r   ry   rw   rx   r}   r   r   r   r   r   r   r   r3   r6   r7   r   r   r
   r	   r   r   r9   r   r   r   r   <module>   s    - 4
9=

