U
    9%e`                     @   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 rd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}ntjdk rt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/Darija-Ai-API/env/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 rt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< rd|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 qd |_tjd krhd |_qh|r|| || |	rst| 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< qd 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   