a
    ÇÀhM!  ã                   @   sŽ  d Z ddlZddlZddlZddlZddlmZmZ ejd ejd ejd hZ	e	 
ejd ¡ ejdkrŒe	 
ejd	 ¡ e	 
ejd ¡ ne	 
ejd
 ¡ ejdkr¶e	 
ejd ¡ ejdkrÐe	 
ejd ¡ eejej ƒZdd„ eD ƒZeejƒZeejƒZejZdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZejG dd„ dƒƒZdd„ ZejG dd „ d ƒƒZejG d!d"„ d"ƒƒZee e!f d#œd$d%„Z"dS )&a¹  
This module provides utilities for analyzing and optimizing Python bytecode.
Key functionality includes:
- Dead code elimination
- Jump instruction optimization
- Stack size analysis and verification
- Live variable analysis
- Line number propagation and cleanup
- Exception table handling for Python 3.11+

The utilities in this module are used to analyze and transform bytecode
for better performance while maintaining correct semantics.
é    N)ÚAnyÚUnionÚRETURN_VALUEÚJUMP_FORWARDÚRAISE_VARARGSÚRERAISE©é   é   ZJUMP_BACKWARDÚJUMP_ABSOLUTE)r	   é   ZRETURN_CONST)r	   é   ZJUMP_BACKWARD_NO_INTERRUPTc                 C   s   h | ]}t j| ’qS © )ÚdisÚopname)Ú.0Úopcoder   r   ú[/var/www/html/assistant/venv/lib/python3.9/site-packages/torch/_dynamo/bytecode_analysis.pyÚ	<setcomp>)   ó    r   c                 C   s.   i }t | ƒD ]\}}||vs J ‚|||< q|S )z¢
    Get a mapping from instruction memory address to index in instruction list.
    Additionally checks that each instruction only appears once in the list.
    )Ú	enumerate)ZinstsÚindexofÚiÚinstr   r   r   Úget_indexof0   s
    
r   c                    sú   t ˆƒ‰tƒ ‰‡ ‡‡‡fdd„‰ ˆ dƒ tjdkrätˆƒ}tˆƒD ] \}}|ˆv rB|jrBt |ˆ|jj	 ¡}|t
|ƒk s|J ‚t |ˆ|jj ¡d }|dks J ‚|| |  kr¼|| ksÂn J ‚ˆ||  |j_	ˆ||  |j_qB‡fdd„tˆƒD ƒS )zDead code eliminationc                    sv   t | tˆƒƒD ]b}|ˆv r  d S ˆ |¡ ˆ| }|jrHˆ ˆ|jj ƒ |jtv r`ˆ ˆ|j ƒ |jtv r d S qd S ©N)ÚrangeÚlenÚaddÚexn_tab_entryÚtargetr   ÚJUMP_OPCODESÚTERMINAL_OPCODES)Ústartr   r   ©Úfind_live_coder   ÚinstructionsÚ	live_coder   r   r%   A   s    


z(remove_dead_code.<locals>.find_live_coder   r   é   c                    s   g | ]\}}|ˆ v r|‘qS r   r   )r   r   r   )r'   r   r   Ú
<listcomp>f   r   z$remove_dead_code.<locals>.<listcomp>)r   ÚsetÚsysÚversion_infoÚsortedr   r   ÚbisectÚbisect_leftr#   r   Úbisect_rightÚend)r&   Zlive_idxr   r   Z	start_idxZend_idxr   r$   r   Úremove_dead_code<   s&    
ÿÿ"r2   c                    s.   dd„ t | | dd… ƒD ƒ‰ ‡ fdd„| D ƒS )z'Eliminate jumps to the next instructionc                 S   s,   h | ]$\}}|j d kr|j|u rt|ƒ’qS )r   )r   r    Úid)r   ÚaÚbr   r   r   r   k   s   þz)remove_pointless_jumps.<locals>.<setcomp>r(   Nc                    s   g | ]}t |ƒˆ vr|‘qS r   )r3   ©r   r   ©Zpointless_jumpsr   r   r)   p   r   z*remove_pointless_jumps.<locals>.<listcomp>)Úzip)r&   r   r7   r   Úremove_pointless_jumpsi   s    þr9   c                    s&   d‰ ‡ fdd„}| D ]}||ƒ qdS )zEEnsure every instruction has line number set in case some are removedNc                    s   | j r| j ‰ ˆ | _ d S r   ©Ústarts_line©r   ©Zcur_line_nor   r   Úpopulate_line_numw   s    z.propagate_line_nums.<locals>.populate_line_numr   )r&   r>   r   r   r=   r   Úpropagate_line_numss   s    r?   c                    s&   d‰ ‡ fdd„}| D ]}||ƒ qdS )z;Remove extra starts line properties before packing bytecodeNc                    s*   | j d u rd S | j ˆ kr d | _ n| j ‰ d S r   r:   r<   r=   r   r   Úremove_line_num‡   s
    

z/remove_extra_line_nums.<locals>.remove_line_numr   )r&   r@   r   r   r=   r   Úremove_extra_line_nums‚   s    	rA   c                   @   s2   e Zd ZU ee ed< ee ed< ee ed< dS )ÚReadsWritesÚreadsÚwritesÚvisitedN)Ú__name__Ú
__module__Ú__qualname__r*   r   Ú__annotations__r   r   r   r   rB   ”   s   
rB   c                    sZ   t ˆƒ‰ ttƒ tƒ tƒ ƒ‰ttƒ tƒ tƒ ƒ‰‡ ‡‡‡‡fdd„‰ˆˆˆ | ƒ ˆjˆjB S )Nc                    sú   || j v rd S | j  |¡ t|tˆƒƒD ]Ì}ˆ| }|jtv sH|jtv r®d|jv s\d|jv rx|jˆj	vr®| j
 |j¡ n6d|jv r’| j	 |j¡ n|jdkržntd|j› ƒ‚|jrÆˆˆˆ |jj ƒ |jtv räˆˆˆ |j ƒ ˆ} |jtv r( d S q(d S )NZLOADÚDELETEZSTOREZ	MAKE_CELLz
unhandled )rE   r   r   r   r   ÚHASLOCALÚHASFREEr   ÚargvalrD   rC   ÚNotImplementedErrorr   r    r!   r"   )Ústater#   r   r   ©r   r&   ÚmayZmustÚwalkr   r   rR       s*    




zlivevars_analysis.<locals>.walk)r   rB   r*   rC   )r&   Zinstructionr   rP   r   Úlivevars_analysis›   s    rS   c                   @   s   e Zd ZU dZeed< dS )ÚFixedPointBoxTÚvalueN)rF   rG   rH   rU   ÚboolrI   r   r   r   r   rT   ½   s   
rT   c                   @   sN   e Zd ZU eeef ed< eeef ed< eed< dd„ Zdd„ Z	dd	„ Z
d
S )Ú	StackSizeÚlowÚhighÚfixed_pointc                 C   s   d| _ d| _d| j_d S )Nr   F)rX   rY   rZ   rU   )Úselfr   r   r   ÚzeroÈ   s    zStackSize.zeroc                 C   sP   | j | jf}t| j |j | ƒ| _ t| j|j| ƒ| _| j | jf|krLd| j_d S ©NF©rX   rY   ÚminÚmaxrZ   rU   )r[   ÚotherÚnÚpriorr   r   r   Ú	offset_ofÍ   s
    zStackSize.offset_ofc                 C   sD   | j | jf}t| j |ƒ| _ t| j|ƒ| _| j | jf|kr@d| j_d S r]   r^   )r[   Údepthrc   r   r   r   Úexn_tab_jumpÔ   s
    zStackSize.exn_tab_jumpN)rF   rG   rH   r   ÚintÚfloatrI   rT   r\   rd   rf   r   r   r   r   rW   Â   s   
rW   )Úreturnc           
   
      sd  | sJ ‚t ƒ ‰ ‡ fdd„| D ƒ}|| d   ¡  tdƒD ]Ü}ˆ jrH qdˆ _t| | dd … d g ƒD ]¬\}}|| }|jtvr¸|d us–J d|› ƒ‚t|j|jdd	}||  	||¡ |jt
v râ||j  	|t|j|jdd	¡ |jrf|jjt|jjƒ d }||jj  |¡ qfq8td
d„ | ¡ D ƒƒ}tdd„ | ¡ D ƒƒ}	ˆ jsRJ dƒ‚|dks`J ‚|	S )Nc                    s"   i | ]}|t td ƒtdƒˆ ƒ“qS )Úinfz-inf)rW   rh   r6   ©rZ   r   r   Ú
<dictcomp>ß   s   ÿz&stacksize_analysis.<locals>.<dictcomp>r   éd   Tr(   zmissing next inst: F)Zjumpc                 s   s   | ]}|j V  qd S r   )rX   ©r   Úxr   r   r   Ú	<genexpr>ÿ   r   z%stacksize_analysis.<locals>.<genexpr>c                 s   s   | ]}|j V  qd S r   )rY   rn   r   r   r   rp      r   zfailed to reach fixed point)rT   r\   r   rU   r8   r   r"   Ústack_effectÚargrd   r!   r    r   re   rg   Úlastirf   Úprintr_   Úvaluesr`   )
r&   Zstack_sizesÚ_r   Z	next_instÚ
stack_sizeZeffre   rX   rY   r   rk   r   Ústacksize_analysisÜ   s8    
þ 


ÿrx   )#Ú__doc__r.   Údataclassesr   r+   Útypingr   r   Úopmapr"   r   r,   r*   ÚhasjrelÚhasjabsr!   ZJUMP_OPNAMESÚhaslocalrK   ÚhasfreerL   rq   r   r2   r9   r?   rA   Ú	dataclassrB   rS   rT   rW   rg   rh   rx   r   r   r   r   Ú<module>   sH   ý




-
"