U
    Ç9%eæ   ã                   @   sN  d dl Z d dlZd dlZd dlZd dlmZ ejd ejd ejd hZejdkrbe 	ejd ¡ ejdkrŽe 	ejd	 ¡ e 	ejd ¡ n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dd „ ZdS )!é    N)ÚRealÚRETURN_VALUEÚJUMP_FORWARDÚRAISE_VARARGS©é   é	   ZRERAISE©r   é   ZJUMP_BACKWARDÚJUMP_ABSOLUTEc                 C   s   h | ]}t j| ’qS © )ÚdisÚopname)Ú.0Úopcoder   r   ú^/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/_dynamo/bytecode_analysis.pyÚ	<setcomp>   s     r   c                 C   s.   i }t | ƒD ]\}}||ks t‚|||< 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ÚAssertionError)ZinstsÚindexofÚiÚinstr   r   r   Úget_indexof   s
    
r   c                    sú   t ˆƒ‰tƒ ‰‡ ‡‡‡fdd„‰ ˆ dƒ tjdkrätˆƒ}tˆƒD ] \}}|ˆkrB|jrBt |ˆ|jj	 ¡}|t
|ƒk s|t‚t |ˆ|jj ¡d }|dks t‚|| |  kr¼|| ksÂn t‚ˆ||  |j_	ˆ||  |j_qB‡fdd„tˆƒD ƒS )zDead code eliminationc                    sv   t | tˆƒƒD ]b}|ˆkr  d S ˆ |¡ ˆ| }|jrHˆ ˆ|jj ƒ |jtkr`ˆ ˆ|j ƒ |jtk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#   -   s    


z(remove_dead_code.<locals>.find_live_coder   r	   é   c                    s   g | ]\}}|ˆ kr|‘qS r   r   )r   r   r   )r%   r   r   Ú
<listcomp>R   s      z$remove_dead_code.<locals>.<listcomp>)r   ÚsetÚsysÚversion_infoÚsortedr   r   ÚbisectÚbisect_leftr!   r   r   Úbisect_rightÚend)r$   Zlive_idxr   r   Z	start_idxZend_idxr   r"   r   Úremove_dead_code(   s(    
 
ÿÿ"r0   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|krt|ƒ’qS )r   )r   r   Úid)r   ÚaÚbr   r   r   r   W   s   
 
þz)remove_pointless_jumps.<locals>.<setcomp>r&   Nc                    s   g | ]}t |ƒˆ kr|‘qS r   )r1   ©r   r   ©Zpointless_jumpsr   r   r'   \   s      z*remove_pointless_jumps.<locals>.<listcomp>)Úzip)r$   r   r5   r   Úremove_pointless_jumpsU   s    þr7   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_numc   s    z.propagate_line_nums.<locals>.populate_line_numr   )r$   r<   r   r   r;   r   Úpropagate_line_nums_   s    r=   c                    s&   d‰ ‡ fdd„}| D ]}||ƒ qdS )z;Remove extra starts line properties before packing bytecodeNc                    s*   | j d krd S | j ˆ kr d | _ n| j ‰ d S r   r8   r:   r;   r   r   Úremove_line_nums   s
    

z/remove_extra_line_nums.<locals>.remove_line_numr   )r$   r>   r   r   r;   r   Úremove_extra_line_numsn   s    	r?   c                   @   s&   e Zd ZU eed< eed< eed< dS )ÚReadsWritesÚreadsÚwritesÚvisitedN)Ú__name__Ú
__module__Ú__qualname__r(   Ú__annotations__r   r   r   r   r@   €   s   
r@   c                    sZ   t ˆƒ‰ ttƒ tƒ tƒ ƒ‰ttƒ tƒ tƒ ƒ‰‡ ‡‡‡‡fdd„‰ˆˆˆ | ƒ ˆjˆjB S )Nc                    sú   || j krd S | j  |¡ t|tˆƒƒD ]Ì}ˆ| }|jtksH|jtkr®d|jks\d|jkrx|jˆj	kr®| j
 |j¡ n6d|jkr’| j	 |j¡ n|jdkržntd|j› ƒ‚|jrÆˆˆˆ |jj ƒ |jtkräˆˆˆ |j ƒ ˆ} |jtkr( d S q(d S )NZLOADÚDELETEZSTOREZ	MAKE_CELLz
unhandled )rC   r   r   r   r   ÚHASLOCALÚHASFREEr   ÚargvalrB   rA   ÚNotImplementedErrorr   r   r   r    )Ústater!   r   r   ©r   r$   ÚmayZmustÚwalkr   r   rP   Œ   s*    




zlivevars_analysis.<locals>.walk)r   r@   r(   rA   )r$   Zinstructionr   rN   r   Úlivevars_analysis‡   s    rQ   c                   @   s   e Zd ZU dZeed< dS )ÚFixedPointBoxTÚvalueN)rD   rE   rF   rS   ÚboolrG   r   r   r   r   rR   ©   s   
rR   c                   @   s>   e Zd ZU eed< e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)rV   rW   rX   rS   )Ú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©rV   rW   ÚminÚmaxrX   rS   )rY   Ú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\   )rY   Údepthra   r   r   r   Úexn_tab_jumpÀ   s
    zStackSize.exn_tab_jumpN)	rD   rE   rF   r   rG   rR   rZ   rb   rd   r   r   r   r   rU   ®   s   
rU   c           
   
      s~  | st ‚tƒ ‰ ‡ fdd„| D ƒ}|| d   ¡  tdƒD ]ö}ˆ jrH q0dˆ _t| | dd … d g ƒD ]Æ\}}|| }tjdk oŽ|jt	j
d k}|jtkrÎ|d k	s°t d	|› ƒ‚||  |t|j|j|d
¡ |jtkrü|sü||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slt dƒ‚|dkszt ‚|	S )Nc                    s"   i | ]}|t td ƒtdƒˆ ƒ“qS )Úinfz-inf)rU   Úfloatr4   ©rX   r   r   Ú
<dictcomp>Ë   s   ÿ z&stacksize_analysis.<locals>.<dictcomp>r   éd   Tr&   r   ÚCALL_FINALLYzmissing next inst: )Zjumpc                 S   s   g | ]
}|j ‘qS r   )rV   ©r   Úxr   r   r   r'   õ   s     z&stacksize_analysis.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r   )rW   rk   r   r   r   r'   ö   s     zfailed to reach fixed point)r   rR   rZ   r   rS   r6   r)   r*   r   r   Úopmapr    rb   Ústack_effectÚargr   r   r   rc   ÚintÚlastird   Úprintr]   Úvaluesr^   )
r$   Zstack_sizesÚ_r   Z	next_instÚ
stack_sizeZis_call_finallyrc   rV   rW   r   rg   r   Ústacksize_analysisÈ   sB    
þ ÿ
þ
 ÿrv   )r,   Údataclassesr   r)   Únumbersr   rm   r    r*   r   r(   ÚhasjrelÚhasjabsr   ZJUMP_OPNAMESÚhaslocalrI   ÚhasfreerJ   rn   r   r0   r7   r=   r?   Ú	dataclassr@   rQ   rR   rU   rv   r   r   r   r   Ú<module>   s@   ý



-
"