o
    "il                     @   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	m
Z
 ddlmZ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!dZ"ej#ddG dd dZ$ej#G dd dZ%dd Z&dd Z'G dd dZ(dS )    N)AnycastDictListOptionalTuple   )
create_call_functioncreate_call_methodcreate_dup_topcreate_instructioncreate_jump_absolutecreate_load_methodInstructionInstructionExnTabEntrytransform_code_object	unique_id)ExactWeakKeyDictionary                @         i   torch_dynamo_resume_inT)frozenc                   @   sH   e Zd ZU eed< dZeeedf  ed< de	e
 fddZdd	 ZdS )
ReenterWithstack_indexN.target_valuescleanupc                    s   g }| j rdd | j D }td| j   |d vr$|d   f7  < dD ]}||d vr7|d  |f7  < q&ttjdk r@dnd	}td}g |tt|d
td dtd dtdt	dtd}tjdk ry|
td|d ntd}td}	t||	|| jd d|_|
|  fdd}
tjdk rtdtd|g|
 td}nXtjdk rtdg|
 td|d||
 td|}n9tddd}tddd}t|||| jd  d
|_|	g|
 td|d||
 ||td!tddd|}|| |d"d"< |S )#z
        Codegen based off of:
        load args
        enter context
        try:
            (rest)
        finally:
            exit context
        c                 S      g | ]}t d |dqS 
LOAD_CONSTargvalr   .0val r+   \/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/_dynamo/resume_execution.py
<listcomp>:       
z*ReenterWith.try_except.<locals>.<listcomp>___context_manager_co_varnames)	__enter____exit__co_names      NOPPUSH_EXC_INFOT
STORE_FASTr%   	LOAD_FASTr1   r   POP_TOPSETUP_FINALLYtargetr   Fc                      s6   t d dtdt dd dt t gtdt dS )Nr:   r%   r2   r$   r5   r;   )r   r   r   r
   r+   ctx_namer+   r,   create_resetd   s   

z,ReenterWith.try_except.<locals>.create_resetr5   	   	POP_BLOCKBEGIN_FINALLYEND_FINALLYJUMP_FORWARDRERAISEargCOPYr5   r   
POP_EXCEPTN)r    r   r   r   sysversion_infor	   lenr   r
   appendr   exn_tab_entry)selfcode_optionsr!   	load_argsnameexcept_jump_targetcleanup_complete_jump_targetsetup_finallyexn_tab_beginexn_tab_endrA   epiloguefinally_exn_tab_endfinally_exn_tab_targetr+   r?   r,   
try_except-   s   











	
zReenterWith.try_exceptc                 C   s  g }| j rdd | j D }tjdk rEtd}td}td||tdtdg| |d	d	< g |td
t|dtd|dtdd	fS tjdk rt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	< g |td
t|dtd|dtd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 |_||	 |	 |	 gtdd!tdtd|d|tdttjd"k rd#nd|d||tdtddd|tdtdtd|| |d	d	< g |tt|d td$|
|fS )%zR
        Codegen based off of:
        with ctx(args):
            (rest)
        c                 S   r"   r#   r'   r(   r+   r+   r,   r-      r.   z(ReenterWith.__call__.<locals>.<listcomp>rB   WITH_CLEANUP_STARTrE   rD   WITH_CLEANUP_FINISHrF   NCALL_FUNCTIONrI   
SETUP_WITHr=   r;   r4   WITH_EXCEPT_STARTr7   r$   r%   DUP_TOPr5   rG   POP_JUMP_IF_TRUErH   rL   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_noner8   r   rK   r   TFr5      POP_JUMP_FORWARD_IF_TRUEBEFORE_WITH)	r    rM   rN   r   rO   r   r   rQ   r	   )rR   rS   r!   rT   with_cleanup_startbegin_finallywith_except_startpop_top_after_with_except_startrW   rf   exn_tab_1_beginexn_tab_1_endexn_tab_1_targetexn_tab_2_endexn_tab_2_targetr+   r+   r,   __call__   s"  






	
	

zReenterWith.__call__)__name__
__module____qualname__int__annotations__r    r   r   r   r   r   r^   rt   r+   r+   r+   r,   r   &   s
   
 nr   c                   @   s`   e Zd ZU ejed< ejedZ	e
e ed< ejedZe
e ed< dZeeeef  ed< dS )ResumeFunctionMetadatacode)default_factoryinstructions prefix_block_target_offset_remapNblock_target_offset_remap)ru   rv   rw   typesCodeTypery   dataclassesfieldlistr}   r   r   r~   rx   r   r   r   r+   r+   r+   r,   rz      s   
 
rz   c                 C   sV   t |}g }zt|}| D ]}|||r|| t|}qW |S  ty*   Y |S w )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nextrP   StopIteration)l1l2conditrescurr*   r+   r+   r,   _filter_iter0  s   

r   c                 C   sb   g }t jdkr|td |tddd | D ]}|td|d q|tt| d |S )	Nr4   	PUSH_NULLSWAPr   rI   r$   r%   F)rM   rN   rP   r   extendr	   rO   )tupinstsr*   r+   r+   r,   _load_tuple_and_callC  s   
r   c                   @   s   e Zd Ze Ze Zedd Zedede	e dede	e
 de	e
 de	e d	e	ee	e f d
e	e
e	e f de	e dejfddZedee fddZedede	edf fddZdS )ContinueExecutionCachec                 G   sX   || j vrt | j |< t|}|| j | vr%| j||g|R  | j | |< | j | | S N)cachedicttuplegenerate)clsr{   linenokeyr+   r+   r,   lookupR  s   
zContinueExecutionCache.lookupoffsetsetup_fn_target_offsetsnstackargnamesargnames_null	setup_fnsstack_ctx_varsargnames_ctx_vars
null_idxesreturnc                    s   	d usJ |j ttB tB tB @ rJ |j t@ sJ |tjv r.|	
 S t	j
dkt|dtt dtttf f 	
fdd}t||}tj|< |S )Nr4   r}   rS   c                    sR  t | _dd tD    fddD  t|d p!g t|d p(g  }tt|}t d|d  d	 |d< rr|d
 jddd}t	|dkrW|d |d
< nt	|dks_J |\}}| dt d| d	 |d
< |d< t |d< ||d< t	 |d< d|d< d|d< t  fddD   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}tD ]w}|t		k r+	| || kr+|td  |d7 }|t		k r+	| || ks|td!d"| d# ||	v rc|	|}|||\}}|| rc|
|}|| }j| |||< || }||v ru|t||  qrttj_|	rJ D ]\}}|td!|d# |t| |td$|d# qrtjd%ksJ D ]}| vsJ |td td$|d#g q|t| | D ]}|j|jkr nd |_tjd&krd |_q|r|| || |rsJ | D ]}|jr|jj|v r||jj |j_q||  | d d < d S )'Nc                 S   s   g | ]}d | qS )___stackr+   r)   ir+   r+   r,   r-     s    zCContinueExecutionCache.generate.<locals>.update.<locals>.<listcomp>c                 3   s    | ]	}| vr|V  qd S r   r+   r)   vargsr+   r,   	<genexpr>  s    zBContinueExecutionCache.generate.<locals>.update.<locals>.<genexpr>co_cellvarsco_freevars_co_name_at_co_qualname.r   )maxsplitr   co_firstlinenoco_argcountr   co_posonlyargcountco_kwonlyargcountc                       g | ]}| vr|qS r+   r+   r   r   r+   r,   r-         c                    r   r+   r+   r   r   r+   r,   r-     r   r0   co_flagsc                 3       | ]
}|j  kr|V  qd S r   r   r   r   r+   r,   r         COPY_FREE_VARSrI   RESUMEc                 S      i | ]}|j |qS r+   r   )r)   fnr+   r+   r,   
<dictcomp>      zCContinueExecutionCache.generate.<locals>.update.<locals>.<dictcomp>c                    s   i | ]
\}}|j  | qS r+   r   )r)   r   r   )r   r+   r,   r     s    
c                 S   r   r+   r   )r)   instr+   r+   r,   r     r   r   r:   r   r%   r9   rg   r4   )copydeepcopyr}   ranger   r   sortedTORCH_DYNAMO_RESUME_IN_PREFIXrsplitrO   
CO_VARARGSCO_VARKEYWORDSr   rP   r   	enumerater   popr~   r   r   reversedrM   rN   r   r   starts_line	positionsunreachable_codesrQ   r>   )r}   rS   freevarsqualified_pathmodule_namer   r>   prefixr!   hookshook_target_offsetsoffset_to_instold_hook_target_remapnull_idxes_istack_ctx_vars_dr   hook
hook_insts
exn_targethook_target_offsetold_hook_targetreal_irU   valsr   r   r   r   r   r   is_py311_plusr   metar   r   r   r   r   r   r   r,   update  s   












z/ContinueExecutionCache.generate.<locals>.update)r   CO_GENERATORCO_COROUTINECO_ITERABLE_COROUTINECO_ASYNC_GENERATORCO_OPTIMIZEDr   generated_code_metadata&generate_based_on_original_code_objectrM   rN   rz   r   r   r   strr   r   )r   r{   r   r   r   r   r   r   r   r   r   r   r   new_coder+   r   r,   r   [  s6   

: 

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   rI   r'   )rS   r+   r+   r,   r     s   

z(ContinueExecutionCache.unreachable_codes.c                    s   t j| ddtt dtttf ffdd}t|| tj	dkrOj
sDi   _
dtt dtttf f fdd}t|| tfd	d
D t jj|g|R  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}   rS   c                    sR   fdd| D \  fddt t| tjD \} j|jks$J |jd S )Nc                 3   r   r   r   r   r   r+   r,   r   .  r   ziContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_new_offset.<locals>.<genexpr>c                 3   s     | ]\}}| u r|V  qd S r   r+   )r)   i1i2r=   r+   r,   r   0  s    )zipr   r}   opcoder   )r}   rS   
new_target)r   
new_offsetr   r=   r,   find_new_offset*  s   

zVContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_new_offsetr4   c           
         s   g }| D ]}t |t jkr n|jdkr|| qt|jD ]\}}|tt|j< q"|r9tt|d jnd t fddD }t	| |dd }t	tt
| t
j|dd }t||D ]\}}	|d j|	j< qcd S )	Nr8   c                 3   s    | ]	}| kr|V  qd S r   r+   r)   n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 r   r   )r   or+   r+   r,   <lambda>b  s   
 zlContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<lambda>c                 S   s   | d |u S )Nr   r+   )v1v2r+   r+   r,   r  g  s    r   )rO   r~   opnamerP   r   r   rx   r   r   r   r   r}   )
r}   rS   prefix_blocksr   r  old_inst_offsetstargetsnew_targetsnewold)r   r   r   r  r,   remap_block_offsetsB  s:   


zZContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsetsc                 3   s    | ]} j | V  qd S r   )r   r   )r   r+   r,   r   o  s    

zPContinueExecutionCache.generate_based_on_original_code_object.<locals>.<genexpr>)r   r   r   r   r   r   r   r   rM   rN   r   r   r   r{   )r   r{   r   r   r   r   r   r  r+   )r   r   r   r   r   r,   r     s6   





*
z=ContinueExecutionCache.generate_based_on_original_code_objectN)ru   rv   rw   r   r   r   classmethodr   rx   r   r   r   r   r   r   r   staticmethodr   r   r   r   r+   r+   r+   r,   r   N  sH    
	
 6
r   ))r   r   rM   r   typingr   r   r   r   r   r   bytecode_transformationr	   r
   r   r   r   r   r   r   r   r   utilsr   r   CO_NEWLOCALSr   r   	CO_NESTEDr   	CO_NOFREEr   r   r   r   	dataclassr   rz   r   r   r   r+   r+   r+   r,   <module>   s:    0
 z  +