a
    d3                     @   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 ddl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G dd dZ dS )    N)AnyDictListOptionalTuple   )create_instructioncreate_jump_absoluteInstructiontransform_code_object)	PyCodegen)ExactWeakKeyDictionary                @         i   T)frozenc                   @   s2   e Zd ZU dZeed< dZee ed< dd Z	dS )ReenterWithNstack_indextarget_valuesc           
         s  g }| j r fdd| j D }tjdk rtd}td}td||tdtdg| |d d < g |td	t|td
|dtdS tjdk rPtd}td}td}tdtdt d d tdtdt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|td
|dtdS td}td}td} fdd}	td|	 |	 |	 t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	dtd
|dtdgS d S )Nc                    s    g | ]}t d t ||qS )
LOAD_CONSTr   r   get_const_index).0valcode_options g/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torch/_dynamo/resume_execution.py
<listcomp>%   s   
z(ReenterWith.__call__.<locals>.<listcomp>)   	   ZWITH_CLEANUP_STARTZBEGIN_FINALLY	POP_BLOCKZWITH_CLEANUP_FINISHZEND_FINALLYCALL_FUNCTION
SETUP_WITHtargetPOP_TOPr$      WITH_EXCEPT_STARTNOPr   DUP_TOPr$   JUMP_FORWARDPOP_JUMP_IF_TRUERERAISE
POP_EXCEPTc                      s   t dt d d S )Nr   r   r!   r   r!   r"   create_load_nonei   s    z.ReenterWith.__call__.<locals>.create_load_noneZPOP_JUMP_FORWARD_IF_TRUEr   )r   sysversion_infor   lenr   r   )
selfr    cleanupZ	load_argsZwith_cleanup_startZbegin_finallyZwith_except_startZpop_top_after_with_except_startZcleanup_complete_jump_targetr5   r!   r   r"   __call__"   s    




	

zReenterWith.__call__)
__name__
__module____qualname__r   int__annotations__r   r   r   r;   r!   r!   r!   r"   r      s   
r   c                   @   s(   e Zd ZU ejed< dZee ed< dS )ResumeFunctionMetadatacodeNinstructions)	r<   r=   r>   typesCodeTyper@   rC   r   r
   r!   r!   r!   r"   rA      s   

rA   c                   @   sb   e Zd Ze Ze Zedd Zeeee	e
 e	e dddZedd Zeedd	d
ZdS )ContinueExecutionCachec                 G   sX   || j vrt | j |< t|}|| j | vrJ| j||g|R  | j | |< | j | | S N)cachedicttuplegenerate)clsrB   linenokeyr!   r!   r"   lookup   s    
zContinueExecutionCache.lookup)offsetnstackargnames	setup_fnsc           	         s   d usJ |j ttB tB tB @ r&J |j t@ s4J |tjv rR| S t	|t
t tttf d fdd}t||}tj|< |S )NrC   r    c           
         s  t | _dd tD    fddD  t|d pBg t|d pPg  }d|d  d	|d< tjd
k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< fdd| D \}g }g }dd D }tD ]<}|tdd|  ||v r(||||| q(|rpJ |t| t|jd }| d| D ]}	d |	_q|r|| || ||  | d d < d S )Nc                 S   s   g | ]}d | qS )___stackr!   r   ir!   r!   r"   r#          zCContinueExecutionCache.generate.<locals>.update.<locals>.<listcomp>c                 3   s   | ]}| vr|V  qd S rG   r!   r   vargsr!   r"   	<genexpr>   rX   zBContinueExecutionCache.generate.<locals>.update.<locals>.<genexpr>co_cellvarsco_freevarsz<graph break in co_name>r,   Zco_qualnameco_firstlinenoco_argcountr   co_posonlyargcountco_kwonlyargcountc                    s   g | ]}| vr|qS r!   r!   rY   r[   r!   r"   r#      rX   co_varnamesco_flagsc                    s   g | ]}|j  kr|qS r!   rP   rV   rh   r!   r"   r#      rX   c                 S   s   i | ]}|j |qS r!   )r   )r   fnr!   r!   r"   
<dictcomp>   rX   zCContinueExecutionCache.generate.<locals>.update.<locals>.<dictcomp>	LOAD_FASTrU   r   )copydeepcopyrC   rangeextendrJ   r6   r7   r8   
CO_VARARGSCO_VARKEYWORDSappendr   popr	   r?   rP   starts_lineunreachable_codes)
rC   r    Zfreevarsr*   prefixr:   hooksrW   Z
target_indinstrR   rL   rM   metarQ   rP   rS   r[   r"   update   sR    







z/ContinueExecutionCache.generate.<locals>.update)rg   CO_GENERATORCO_COROUTINECO_ITERABLE_COROUTINECO_ASYNC_GENERATORCO_OPTIMIZEDrF   generated_code_metadata&generate_based_on_original_code_objectrA   r   r
   r   strr   r   )	rL   rB   rM   rP   rQ   rR   rS   r{   Znew_coder!   ry   r"   rK      s    

,5

zContinueExecutionCache.generatec                 C   sB   d| d vr t | d d | d< tdd| d ddtddgS )zACodegen a `raise None` to make analysis work for unreachable codeN	co_constsrG   r   )argvalargRAISE_VARARGSr   )rJ   r   indexr   r!   r!   r"   ru      s    z(ContinueExecutionCache.unreachable_codesrh   c                    sT   t j|  dtt tttf d fdd}t|| 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).
        NrT   c                    sR   fdd| D \  fddt t| tjD \} j|jksHJ |jd S )Nc                    s   g | ]}|j  kr|qS r!   rh   rV   rh   r!   r"   r#     rX   zjContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_new_offset.<locals>.<listcomp>c                    s   g | ]\}}| u r|qS r!   r!   )r   i1i2r)   r!   r"   r#     s   )zipreversedrC   opcoderP   )rC   r    
new_targetrz   Z
new_offsetrP   r)   r"   find_new_offset
  s    
zVContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_new_offset)
rF   r   r   r
   r   r   r   r   rO   rB   )rL   rB   rM   rP   r\   r   r!   r   r"   r      s    

z=ContinueExecutionCache.generate_based_on_original_code_objectN)r<   r=   r>   r   rH   r   classmethodrO   r?   r   r   r   rK   staticmethodru   r   r!   r!   r!   r"   rF      s   
O
rF   )!rl   Zdataclassesr6   rD   typingr   r   r   r   r   Zbytecode_transformationr   r	   r
   r   Zcodegenr   utilsr   r   ZCO_NEWLOCALSrp   rq   	CO_NESTEDr|   Z	CO_NOFREEr}   r~   r   Z	dataclassr   rA   rF   r!   r!   r!   r"   <module>   s0   
l 