U
    ªÊ¹j‚`  ã                   @   sä   d dl Z d dlZd dlZd dlZd dlmZmZmZmZm	Z	 ddl
mZmZmZmZmZmZmZmZmZ ddlmZ dZdZdZdZd	Zd
ZdZdZdZdZej dd�G dd„ dƒƒZ!ej G dd„ dƒƒZ"dd„ Z#G dd„ dƒZ$dS )é    N)ÚAnyÚDictÚListÚOptionalÚTupleé   )	Úcreate_call_functionÚcreate_call_methodÚcreate_dup_topÚcreate_instructionÚcreate_jump_absoluteÚInstructionÚInstructionExnTabEntryÚtransform_code_objectÚ	unique_id)ÚExactWeakKeyDictionaryé   é   é   é   é    é@   é€   é   i   T)Úfrozenc                   @   sD   e Zd ZU dZeed< dZee ed< e	e
 dœdd„Zdd„ ZdS )	ÚReenterWithNÚstack_indexÚtarget_values)Úcleanupc                    s  g }| j rdd„ | j D ƒ}td| j› �ƒ‰ ˆ |d krH|d  ˆ f7  < dD ]"}||d krL|d  |f7  < qLttjdk r€dnd	ƒ}tdƒ}|tt|ƒd
ƒtdˆ d�tdˆ d�tddd�ftdƒtdƒf•}tjdk rì| 	td|d�¡ n2tdƒ}tdƒ}	t
||	|| jd dƒ|_| 	|¡ ‡ fdd„}
tjdk �rXtdƒtdƒ|f|
ƒ tdƒf•}n tjdk �r’tdƒf|
ƒ td|d�|f|
ƒ tdƒ|f•}nftddd�}tdd d�}t
|||| jd! d
ƒ|_|	f|
ƒ td|d�|f|
ƒ ||td"ƒtddd�|f•}|| |d#d#…< |S )$z™
        Codegen based off of:
        load args
        enter context
        try:
            (rest)
        finally:
            exit context
        c                 S   s   g | ]}t d |d�‘qS ©Ú
LOAD_CONST©Úargval©r   ©Ú.0Úval© r'   ú]/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_dynamo/resume_execution.pyÚ
<listcomp>4   s   ÿz*ReenterWith.try_except.<locals>.<listcomp>Z___context_manager_Úco_varnames)Ú	__enter__Ú__exit__Úco_names©é   é   ÚNOPÚPUSH_EXC_INFOTÚ
STORE_FASTr!   Ú	LOAD_FASTÚLOAD_METHODr+   r   ÚPOP_TOPÚSETUP_FINALLY©Útargetr   Fc                      s:   t dˆ d�t ddd�t dd d�tƒ tƒ ftdƒt dƒf•S )Nr4   r!   r5   r,   r    r/   r6   )r   r
   r	   r'   ©Zctx_namer'   r(   Úcreate_reset^   s    


ûùz,ReenterWith.try_except.<locals>.create_reset©r/   é	   Ú	POP_BLOCKÚBEGIN_FINALLYÚEND_FINALLYÚJUMP_FORWARDÚRERAISE©ÚargÚCOPYr/   r   Ú
POP_EXCEPTN)r   r   r   r   ÚsysÚversion_infor   Úlenr	   Úappendr   Úexn_tab_entry)ÚselfÚcode_optionsr   Ú	load_argsÚnameZexcept_jump_targetÚcleanup_complete_jump_targetZsetup_finallyZexn_tab_beginZexn_tab_endr;   ÚepilogueZfinally_exn_tab_endZfinally_exn_tab_targetr'   r:   r(   Ú
try_except(   s¤    
þÿ


ûù


ÿû
ýûÿ
üù
ûÿ
ü
özReenterWith.try_exceptc                 C   sp  g }| j rdd„ | j D ƒ}tjdk r„tdƒ}tdƒ}tdƒ||tdƒtdƒg| |d	d	…< |td
t|ƒd�td|d�tdƒf•d	fS tjdk �rFtdƒ}tdƒ}tdƒ}tdƒtdd	d�tdƒtdƒtd
dd�tdƒtd|d�|td|d�tdƒ|tdƒtdƒtdƒtdƒ|g| |d	d	…< |td
t|ƒd�td|d�tdƒf•d	fS tdƒ}tdƒ}dd„ }	tdƒ}
tdƒ}tdƒ}tddd�}tddd�}t|
||| jd d ƒ|
_t|||| jd d ƒ|_t|||| jd d ƒ|_||	ƒ |	ƒ |	ƒ ftdd!ƒtdƒtd|d�|tdƒtd"|d�||tdƒtddd�|tdƒtdƒtdƒ|f•| |d	d	…< |tt|ƒd ƒtd#ƒ|
f•|fS d	S )$zR
        Codegen based off of:
        with ctx(args):
            (rest)
        c                 S   s   g | ]}t d |d�‘qS r   r#   r$   r'   r'   r(   r)   �   s   ÿz(ReenterWith.__call__.<locals>.<listcomp>r<   ÚWITH_CLEANUP_STARTr?   r>   ÚWITH_CLEANUP_FINISHr@   NÚCALL_FUNCTIONrC   Ú
SETUP_WITHr8   r6   r.   ZWITH_EXCEPT_STARTr1   r    r!   ÚDUP_TOPr/   rA   ÚPOP_JUMP_IF_TRUErB   rF   c                   S   s   t dd d�S )Nr    r!   r#   r'   r'   r'   r(   Úcreate_load_none×   s    z.ReenterWith.__call__.<locals>.create_load_noner2   r   rE   r   TFZPOP_JUMP_FORWARD_IF_TRUEZBEFORE_WITH)	r   rG   rH   r   rI   r   r   rK   r   )rL   rM   r   rN   Zwith_cleanup_startZbegin_finallyZwith_except_startZpop_top_after_with_except_startrP   rY   Zexn_tab_1_beginZexn_tab_1_endZexn_tab_1_targetZexn_tab_2_endZexn_tab_2_targetr'   r'   r(   Ú__call__•   sì    þ
ûú	
üû


 ÿîí
üûûûû	ü
þ
êéüûzReenterWith.__call__)Ú__name__Ú
__module__Ú__qualname__r   ÚintÚ__annotations__r   r   r   r   r   rR   rZ   r'   r'   r'   r(   r   !   s   
mr   c                   @   sL   e Zd ZU ejed< dZee ed< dZ	ee
 ed< dZee
e
f ed< dS )ÚResumeFunctionMetadataÚcodeNÚinstructionsÚ prefix_block_target_offset_remapÚblock_target_offset_remap)r[   r\   r]   ÚtypesÚCodeTyper_   rb   r   r   rc   r^   rd   r   r'   r'   r'   r(   r`     s   

r`   c                 C   sX   t |ƒ}g }z2t|ƒ}| D ] }|||ƒr| |¡ t|ƒ}qW n tk
rR   Y nX |S )z®
    Two-pointer conditional filter.
    e.g. _filter_iter(insts, sorted_offsets, lambda i, o: i.offset == o)
    returns the instructions with offsets in sorted_offsets
    )ÚiterÚnextrJ   ÚStopIteration)Úl1Úl2ZcondÚitÚresÚcurr&   r'   r'   r(   Ú_filter_iter%  s    

ro   c                   @   st   e Zd Zeƒ Zeƒ Zedd„ ƒZeee	e ee	e
 e	e e	e dœdd„ƒZedd„ ƒZeee	e dœd	d
„ƒZdS )ÚContinueExecutionCachec                 G   sV   || j krtƒ | j |< t|ƒ}|| j | krH| j||f|žŽ | j | |< | j | | S ©N)ÚcacheÚdictÚtupleÚgenerate)Úclsra   ÚlinenoÚkeyr'   r'   r(   Úlookup<  s    
zContinueExecutionCache.lookup)ÚoffsetÚsetup_fn_target_offsetsÚnstackÚargnamesÚ	setup_fnsÚ
null_idxesc	                    s¼   ˆd k	st ‚|jttB tB tB @ r&t ‚|jt@ s4t ‚|tjkrVˆ 	|ˆˆˆˆˆ ˆ	ˆ¡S t
jdk‰t|ƒ‰ˆrrg ˆ_tt tttf dœ‡ ‡‡‡‡‡‡‡‡‡	f
dd„}	t||	ƒ}
ˆtj|
< |
S )Nr.   ©rb   rM   c                    s  t  | ¡ˆ_dd„ tˆƒD ƒ‰ ˆ  ‡ fdd„ˆD ƒ¡ t|d pBg ƒt|d pPg ƒ }d|d › d	�|d< ˆr‚d|d
 › d	�|d
< ˆ|d< tƒ |d< ||d< tˆ ƒ|d< d|d< d|d< tˆ ‡ fdd„|d D ƒ ƒ|d< |d ttB  @ |d< t	‡fdd„| D ƒƒ}g }ˆ�r>|�r,| 
tdt|ƒd�¡ | 
tddd�¡ g }dd„ ˆ
D ƒ}‡	fdd„tˆ
ƒD ƒ}dd„ | D ƒ}i }	d}
tˆƒD ]°}|
tˆƒk �rÂˆ|
 ||
 k�rÂ| 
tdƒ¡ |
d7 }
�qˆ| 
tdd|› �d�¡ ||k�r„| |¡}|||ƒ\}}| |¡ ˆ�r„| |¡}|| }ˆj 
|¡ ||	|< �q„ˆ�rLttˆjƒƒˆ_|�rVt‚| 
t|ƒ¡ | D ]2}|j|jk�r€ �qœd |_tjd k�rhd |_�qh|�r¼| |¡ | ˆ |¡¡ |	�rþˆ�sÌt‚| D ],}|j�rÐ|jj|	k�rÐ|	|jj |j_�qÐ||  | d d …< d S )!Nc                 S   s   g | ]}d |› �‘qS )Ú___stackr'   ©r%   Úir'   r'   r(   r)   k  s     zCContinueExecutionCache.generate.<locals>.update.<locals>.<listcomp>c                 3   s   | ]}|ˆ kr|V  qd S rq   r'   ©r%   Úv©Úargsr'   r(   Ú	<genexpr>l  s      zBContinueExecutionCache.generate.<locals>.update.<locals>.<genexpr>Úco_cellvarsÚco_freevarsz<resume in Úco_nameú>Zco_qualnameÚco_firstlinenoÚco_argcountr   Úco_posonlyargcountÚco_kwonlyargcountc                    s   g | ]}|ˆ kr|‘qS r'   r'   r„   r†   r'   r(   r)   |  s      r*   Úco_flagsc                 3   s   | ]}|j ˆ kr|V  qd S rq   ©rz   r‚   r’   r'   r(   rˆ   �  s     
 ZCOPY_FREE_VARSrC   ÚRESUMEc                 S   s   i | ]}|j |“qS r'   ©r   )r%   Úfnr'   r'   r(   Ú
<dictcomp>Œ  s      zCContinueExecutionCache.generate.<locals>.update.<locals>.<dictcomp>c                    s   i | ]\}}|j ˆ | “qS r'   r”   )r%   rƒ   r•   )r{   r'   r(   r–   �  s   ÿ c                 S   s   i | ]}|j |“qS r'   r’   )r%   Úinstr'   r'   r(   r–   ‘  s      Z	PUSH_NULLr   r4   r�   r!   r.   )ÚcopyÚdeepcopyrb   ÚrangeÚextendrt   rI   Ú
CO_VARARGSÚCO_VARKEYWORDSrh   rJ   r   Ú	enumerateÚpoprc   ÚlistÚreversedÚAssertionErrorr   rz   Ústarts_linerG   rH   Z	positionsÚunreachable_codesrK   r9   )rb   rM   Zfreevarsr9   Úprefixr   ÚhooksZhook_target_offsetsZoffset_to_instZold_hook_target_remapZnull_idxes_irƒ   ÚhookZ
hook_instsZ
exn_targetZhook_target_offsetZold_hook_targetr—   ©
r}   rv   Zis_py311_plusrw   Úmetar|   r   rz   r{   r~   r†   r(   Úupdateh  s¦    
ÿþÿ
ÿÿ
ÿ
þ
ÿþ



ÿ



ÿ
þÿz/ContinueExecutionCache.generate.<locals>.update)r¢   r‘   ÚCO_GENERATORÚCO_COROUTINEÚCO_ITERABLE_COROUTINEÚCO_ASYNC_GENERATORÚCO_OPTIMIZEDrp   Úgenerated_code_metadataÚ&generate_based_on_original_code_objectrG   rH   r`   rc   r   r   r   Ústrr   r   )rv   ra   rw   rz   r{   r|   r}   r~   r   rª   Znew_coder'   r¨   r(   ru   E  s2    ÿÿ
ø
2f

zContinueExecutionCache.generatec                 C   s   t ddd�t ddd�gS )zACodegen a `raise None` to make analysis work for unreachable coder    Nr!   ÚRAISE_VARARGSr   rC   r#   )rM   r'   r'   r(   r¤   Ò  s    

þz(ContinueExecutionCache.unreachable_codes)rz   r{   c                    s¬   t j| ‰ d‰tt tttf dœ‡ ‡‡fdd„}t||ƒ tj	dkr”ˆ j
s~i ˆ _
tt tttf dœ‡ ‡fdd„}t||ƒ t‡ fdd	„ˆD ƒƒ‰t jˆ j|ˆˆf|žŽ S )
a>  
        This handles the case of generating a resume into code generated
        to resume something else.  We want to always generate starting
        from the original code object so that if control flow paths
        converge we only generated 1 resume function (rather than 2^n
        resume functions).
        Nr€   c                    sR   ‡fdd„| D ƒ\‰ ‡ fdd„t t| ƒtˆjƒƒD ƒ\}ˆ j|jksHt‚|j‰d S )Nc                 3   s   | ]}|j ˆ kr|V  qd S rq   r’   r‚   r’   r'   r(   rˆ   ï  s     
 ziContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_new_offset.<locals>.<genexpr>c                 3   s   | ]\}}|ˆ kr|V  qd S rq   r'   )r%   Úi1Úi2r8   r'   r(   rˆ   ñ  s   þ)Úzipr¡   rb   Úopcoder¢   rz   )rb   rM   Ú
new_target)r©   Ú
new_offsetrz   r8   r(   Úfind_new_offsetë  s    
þzVContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_new_offsetr.   c                    sä   g }t | ƒD ]2\}}t|ƒtˆjƒkr* q@|jdkr| |¡ qt|ˆjƒD ]\}}|ˆj|j< qL|rp|d jnd‰ t‡ fdd„ˆD ƒƒ}t	| |dd„ ƒ}t	tt
| ƒt
ˆjƒƒ|dd„ ƒ}t||ƒD ]\}	}
|	d jˆj|
j< qÄd S )	Nr2   éÿÿÿÿc                 3   s   | ]}|ˆ kr|V  qd S rq   r'   ©r%   Ún©Zold_start_offsetr'   r(   rˆ     s     zmContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<genexpr>c                 S   s
   | j |kS rq   r’   )r—   Úor'   r'   r(   Ú<lambda>!  ó    zlContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<lambda>c                 S   s   | d |kS )Nr   r'   )Zv1Zv2r'   r'   r(   rÀ   &  rÁ   r   )rž   rI   rc   ÚopnamerJ   r¶   rd   rz   Úsortedro   r¡   rb   )rb   rM   Zprefix_blocksÚidxr—   r¿   Zold_inst_offsetsÚtargetsZnew_targetsÚnewÚold)r©   r{   r¾   r(   Úremap_block_offsets  s:    ÿ
 ÿÿ  ÿýzZContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsetsc                 3   s   | ]}ˆ j | V  qd S rq   )rd   r¼   )r©   r'   r(   rˆ   .  s    zPContinueExecutionCache.generate_based_on_original_code_object.<locals>.<genexpr>)rp   r°   r   r   r   r²   r   r   rG   rH   rd   rt   ry   ra   )rv   ra   rw   rz   r{   r‡   rº   rÈ   r'   )r©   r¹   rz   r{   r(   r±   Ú  s4    ÿ 
ÿ

 
ÿ(
ÿ   ÿÿz=ContinueExecutionCache.generate_based_on_original_code_objectN)r[   r\   r]   r   rr   r°   Úclassmethodry   r^   r   r²   r   ru   Ústaticmethodr¤   r±   r'   r'   r'   r(   rp   8  s&   
÷ 
 ÿrp   )%r˜   ÚdataclassesrG   re   Útypingr   r   r   r   r   Zbytecode_transformationr   r	   r
   r   r   r   r   r   r   Úutilsr   r¯   ZCO_NEWLOCALSrœ   r�   Ú	CO_NESTEDr«   Z	CO_NOFREEr¬   r­   r®   Ú	dataclassr   r`   ro   rp   r'   r'   r'   r(   Ú<module>   s4   ,
 v   