
    Vh_                     F   d Z 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 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dZd Z ddZ!d Z" ejF                  d       G d d             Z$ejF                   G d d             Z%d Z&d Z' G d d      Z(y)a  
This module provides functionality for resuming Python execution at specific points in code,
primarily used by PyTorch Dynamo for control flow handling and optimization. It implements
bytecode transformation and execution state management to enable:

- Resuming execution at arbitrary points in Python bytecode
- Managing context managers and their state across execution boundaries
- Transforming and generating new code objects with preserved execution state
- Supporting Python 3.11+ exception handling and block management
- Restoring torch function mode stacks and other execution context

The module is critical for PyTorch Dynamo's ability to optimize code while preserving
Python semantics and execution state.
    N)AnycastOptional   )	bytecode_from_templatecreate_call_functioncreate_instructioncreate_jump_absolutecreate_load_constInstructionoverwrite_instructiontransform_code_object	unique_id)ExactWeakKeyDictionary                @         i   torch_dynamo_resume_inc                     t         j                  dk\  rK| j                  t        d             t         j                  dk  r| j                  t        dd             y y y )N      	PUSH_NULL)r      SWAPr   arg)sysversion_infoappendr	   )instss    N/home/dcms/DCMS/lib/python3.12/site-packages/torch/_dynamo/resume_execution.py_initial_push_nullr(   6   sN    
7"'45g%LL+F:; & #    c                    t        | |      }|j                  t        d             |D ].  }|j                  s|j                  xj                  |z  c_        0 t        d t        |      D        d      \  }}|J t        |t        d      g       ||dz      j                  dk(  sJ t        ||dz      t        d      g       |d |dz    ||dz   d  fS )Nvarname_mapPOP_TOPc              3   f   K   | ])  \  }}|j                   d k(  r|j                  dk(  r||f + yw)	LOAD_FASTdummyNopnameargval).0iinsts      r'   	<genexpr>z5_bytecode_from_template_with_split.<locals>.<genexpr>I   s7      	
4{{k)dkkW.D I	
s   /1)NNNOPr   )	r   r%   r	   exn_tab_entrydepthnext	enumerater   r2   )templatestack_indexr,   template_coder6   	dummy_idx
dummy_insts          r'   "_bytecode_from_template_with_splitrB   >   s    *8MM+I67  4$$3$4
 !	
$]3	

 	Iz     *'9%'@&AB Q'..);;;-	A69KE9R8ST9q=)=Q+IIIr)   c                 @    	 |  y #  t         j                  |        xY wN)$__import_torch_dot__dynamo_dot_utilsset_torch_function_mode_stack)r0   stack_var_names     r'   _try_except_tf_mode_templaterH   \   s'    ,JJ	
 	s    T)frozenc                   `    e Zd ZU eed<   dZeeedf      ed<   de	e
   fdZde	e
   fdZd Zy)	ReenterWithr>   N.target_valuescleanupc                 n    ddl m} t        t        | j                  d |       i      \  }}||z   |dd |S )z
        Codegen based off of:
        try:
            (rest)
        except:
            (restore previous tf mode stack)
            raise
        r   )get_prev_stack_var_namerG   r+   N)variables.torch_functionrO   rB   rH   r>   )selfcode_optionsrM   rO   setup_try_exceptepilogues         r'   try_except_torch_function_modez*ReenterWith.try_except_torch_function_moden   sF     	F%G()+B+DE&
"(
 '
r)   c                    g }| j                   r"| j                   D cg c]  }t        |       }}t        d| j                         }||d   vr|dxx   |fz  cc<   dD ]  }||d   vs|dxx   |fz  cc<    g }t	        |       |j                  g |t        t        |      d      t        d|             d }t        || j                  d	|i
      \  }	}
|
|z   |dd ||	z   S c c}w )z
        Codegen based off of:
        load args
        enter context
        try:
            (rest)
        finally:
            exit context
        ___context_manager_co_varnames	__enter____exit__co_namesF
STORE_FASTr3   c                     | j                          	 | | j                  d d d        y # | j                  d d d        w xY wrD   rY   ctxr0   s     r'   	_templatez*ReenterWith.try_finally.<locals>._template   s4    MMO/T4.T4.s   ( =ra   r+   N)
rL   r   r   r>   r(   extendr   lenr	   rB   )rQ   rR   rM   	load_argsvalctx_namename
create_ctxrb   setup_try_finallyrT   s              r'   try_finallyzReenterWith.try_finally   s1    	;?;M;MNC*3/NIN243C3C2DEF<66'H;6'- 	4D<
33Z(TG3(	4 )+
:&%c)ne< #<A	
	/ 'It''eX5F'
#8 '
---; Os   C*c                    g }| j                   r"| j                   D cg c]  }t        |       }}g }t        |       |j                  g |t	        t        |      d             d }t        || j                        \  }}||z   |dd t        d |D        d      }	|	J t        |	t        d      g       d |D        }
t        |
d      }t        |
d      J ||z   |fS c c}w )zR
        Codegen based off of:
        with ctx(args):
            (rest)
        Fc                 6    | 5  | d d d        y # 1 sw Y   y xY wrD    r`   s     r'   rb   z'ReenterWith.__call__.<locals>._template   s       s   Nc              3   \   K   | ]$  }|j                   d k(  r|j                  dk(  r| & yw)r/   ra   Nr1   r4   r6   s     r'   r7   z'ReenterWith.__call__.<locals>.<genexpr>   s/      ;;+-$++2F s   *,r8   c              3   @   K   | ]  }|j                   d k(  s|  yw)PUSH_EXC_INFON)r2   rp   s     r'   r7   z'ReenterWith.__call__.<locals>.<genexpr>   s       
)GD
s   )rL   r   r(   rc   r   rd   rB   r>   r;   r   r	   )rQ   rR   rM   re   rf   ri   rb   
setup_withrT   load_fast_ctx_instpush_exc_info_genpush_exc_info_insts               r'   __call__zReenterWith.__call__   s)    	;?;M;MNC*3/NIN(*
:&%c)ne<	
	  Bt'' 

H '
!&
 
 "---03Ee3L2MN
%
 ""3T:%t,444J&(:::Q Os   C!)__name__
__module____qualname__int__annotations__rL   r   tupler   listr   rU   rk   rw   rn   r)   r'   rK   rK   i   sG    /3M8E#s(O,3 DDU  ,*.k1B *.X1;r)   rK   c                       e Zd ZU ej                  ed<    ej                  e      Z	ee
   ed<    ej                  e      Zee   ed<   dZeeeef      ed<   y)ResumeFunctionMetadatacode)default_factoryinstructions prefix_block_target_offset_remapNblock_target_offset_remap)rx   ry   rz   typesCodeTyper|   dataclassesfieldr~   r   r   r   r{   r   r   dictrn   r)   r'   r   r      sf    
..&7k&7&7&ML${#M 3D+2C2C3$d3i  ;?xS#X7>r)   r   c                     t        |      }g }	 t        |      }| D ](  } |||      s|j                  |       t        |      }* 	 |S # t        $ r Y |S w xY 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
    )iterr;   r%   StopIteration)l1l2conditrescurrf   s          r'   _filter_iterr      sl     
bBC2h 	CC~

32h	 J  Js   A
 A
 
	AAc                     g }t        |       |j                  d | D               |j                  t        t        |       d             |S )Nc              3   2   K   | ]  }t        |        y wrD   )r   )r4   rf   s     r'   r7   z'_load_tuple_and_call.<locals>.<genexpr>
  s     7C"3'7s   F)r(   rc   r   rd   )tupr&   s     r'   _load_tuple_and_callr     s>    !Eu	LL7377	LL%c#h67Lr)   c                   ,   e Zd Z e       Z e       Zed        Zedede	edf   dede	e
df   de	e
df   de	edf   d	e	e	ee	e   f   df   d
e	e	e
e	e   f   df   de	edf   dej                  fd       Zedee   fd       Zedede	edf   fd       Zy)ContinueExecutionCachec                     || j                   vri | j                   |<   t        |      }|| j                   |   vr$ | j                  ||g| | j                   |   |<   | j                   |   |   S rD   )cacher}   generate)clsr   linenokeys       r'   lookupzContinueExecutionCache.lookup  sk    syy  CIIdOCjciio%#/3<<f#Cs#CCIIdOC yys##r)   offsetsetup_fn_target_offsets.nstackargnamesargnames_null	setup_fnsstack_ctx_varsargnames_ctx_vars
null_idxesreturnc                    	
 J |j                   t        t        z  t        z  t        z  z  rJ |j                   t
        z  sJ |t        j                  v r j                  |	
      S t        j                  dk\  t        |      dt        t           dt        t        t         f   f
 	fd}t#        ||      }t        j                  |<   |S )Nr   r   rR   c                 r
   t        j                  |       "_        t        #      D cg c]  }d| 	 c}j	                  fdD               t        |d   xs g       t        |d   xs g       z   }t        t        |            }t         d|d    d! |d<    rV|d   j                  d	d
      }t        |      d
k(  r	|d   |d<   n)t        |      dk(  sJ |\  }}| d	t         d| d! |d<   !|d<   d|d<   ||d<   t              |d<   d|d<   d|d<   t        D cg c]	  }|vs| c}z   |d   D cg c]  }|vr||vr| c}z         |d<   |d   t        t        z   z  |d<   t        %fd| D              }g }	 rC|r%|	j                  t        dt        |                   |	j                  t        dd             g }
'D ci c]  }|j                  | }}t!        '      D ci c]  \  }}|j                  &|    }}}| D ci c]  }|j"                  | }}i }d}t%        (      }t        #      D ]  }|t        $      k  rD$|   ||z   k(  r9|	j                  t        d             |d
z  }|t        $      k  r$|   ||z   k(  r9|	j                  t        dd|              ||v rf|j'                  |      } |||
      \  }}|	j	                  |        r6|j'                  |      }||   }"j(                  j                  |       |||<   ||z   }||v s|	j	                  t+        ||                  r#t-        t/        "j(                              "_        |rJ D ]W  \  }}|	j                  t        d|             |	j	                  t+        |             |	j                  t        d|             Y rIt0        j2                  dk\  sJ D ]/  }|vsJ |	j	                  t        d      t        d|      g       1 |	j                  t5        |             | D ]?  }|j"                  |j"                  k(  r n$d |_        t0        j2                  dk\  s9d |_        A |
r1|	j	                  |
       |	j	                  j;                  |             |rY sJ | D ]P  }|j<                  s|j<                  j>                  |v s)||j<                  j>                     |j<                  _        R |	| z   | d d  y c c}w c c}w c c}w c c}w c c}}w c c}w )N___stackc              3   ,   K   | ]  }|vs|  y wrD   rn   )r4   vargss     r'   r7   zBContinueExecutionCache.generate.<locals>.update.<locals>.<genexpr>G  s     =aq}=s   	co_cellvarsco_freevars_co_name_at_co_qualname.r   )maxsplitr   co_firstlinenorn   co_argcountr   co_posonlyargcountco_kwonlyargcountrX   co_flagsc              3   B   K   | ]  }|j                   k(  s|  y wrD   r   r4   r5   r   s     r'   r7   zBContinueExecutionCache.generate.<locals>.update.<locals>.<genexpr>k  s     HQXX5G!H   COPY_FREE_VARSr!   RESUMEr   r/   r^   r]   )r      r   ) copydeepcopyr   rangerc   r}   sortedTORCH_DYNAMO_RESUME_IN_PREFIXrsplitrd   
CO_VARARGSCO_VARKEYWORDSr;   r%   r	   r>   r<   r   r   popr   r   r~   reversedr#   r$   r
   starts_line	positionsunreachable_codesr9   target))r   rR   r5   freevarsqualified_pathmodule_namer   r   r   prefixrM   fnhookshook_target_offsetsr6   offset_to_instold_hook_target_remapnull_idxes_istack_ctx_vars_dhook
hook_insts
exn_targethook_target_offsetold_hook_targetreal_irh   valsr   r   r   r   r   is_py311_plusr   metar   r   r   r   r   r   s)                              @r'   updatez/ContinueExecutionCache.generate.<locals>.updateC  s    $l ;D,1&M:qhqcN:DKK=8==\-8>B?%]+1rC H VH-.H01<	3J2K4PVxX # !-m!<!C!CCRS!C!T~&!+2>y2IL/~.!333+9(K&-q)F(Gq	QUV\U]^ !/ .4L)**,L'*2L'*-d)L'12L-.01L,-*/+=q}1=> *-8}(): +L' (4J'?^+C (L$ H\HHFFMM*+;XO 0qAB)+G2;<BR^^R'<E< 'y1#Ar  7 ::# # =IIDdkk4/INI$&!L#N36] R 3z?2"<0A4DDMM"4["AB A%L	 !3z?2"<0A4DD 0xPQs^TU: 99Q<D-1,-H*J
MM*-$-@-D-DQ-G**89K*L==DDEWXAK-o>\)-- MM"67G7O"PQ+R.  9=TBBC95 9 0 M
d0TJK24890dKLM ''7222& AD=(=MM.{;.|AF MM.v67
 % *;;&--/#' ##w.%)DN* g&c33LAB %$$}( D** ..559NN4I ..555**1 %|3LOU ;6 >( =# Js)   T)	T
3T
T$
T);T.T4)r   CO_GENERATORCO_COROUTINECO_ITERABLE_COROUTINECO_ASYNC_GENERATORCO_OPTIMIZEDr   generated_code_metadata&generate_based_on_original_code_objectr#   r$   r   r~   r   r   strr   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   new_coder   r   s   ` ``````````  @@r'   r   zContinueExecutionCache.generate  s    !!!MMl*-BBEWWY	
 
 }}|+++)AAA=='!  ((G3%d+M	4k!2 M	4$sCx. M	4 M	4 M	4^ )v6CG66x@r)   c                 2    t        d      t        dd      gS )zACodegen a `raise None` to make analysis work for unreachable codeNRAISE_VARARGSr   r!   )r   r	   )rR   s    r'   r   z(ContinueExecutionCache.unreachable_codes  s      d#A6
 	
r)   c                   	
 t         j                  |   	d
dt        t           dt        t
        t        f   f	
fd}t        ||       t        j                  dk\  r]	j                  s=i x	_
        dt        t           dt        t
        t        f   f	fd}t        ||       t        	fdD              t        j                  	j                  |
g| 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   rR   c                     fd| D        \  fdt        t        |       t        j                              D        \  }j                  |j                  k(  sJ |j                  y )Nc              3   B   K   | ]  }|j                   k(  s|  y wrD   r   r   s     r'   r7   ziContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_new_offset.<locals>.<genexpr>  s     GqAHH4FGr   c              3   0   K   | ]  \  }}|u r|  y wrD   rn   )r4   i1i2r   s      r'   r7   ziContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_new_offset.<locals>.<genexpr>  s$      B< s   )zipr   r   opcoder   )r   rR   
new_targetr   r   
new_offsetr   s      @r'   find_new_offsetzVContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_new_offset  s_     HLGIV!(<"8(4CTCT:UVMZ
 ==J$5$5555#**Jr)   r   c                 f  
 g }| D ]F  }t        |      t        j                        k(  r n#|j                  dk(  s6|j                  |       H t	        |j                        D ]"  \  }}|t        t        |j                        <   $ |rt        t        |d   j                        nd
t        
fdD              }t        | |d       }t        t	        t        |       t        j                              |d       }t	        ||      D ]!  \  }}	|d   j                  |	j                  <   # y )Nrr   c              3   .   K   | ]  }|kD  s	|  y wrD   rn   )r4   nold_start_offsets     r'   r7   zmContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<genexpr>#  s      .aBR>R.s   
c                      | j                   |k(  S rD   r   )r6   os     r'   <lambda>zlContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<lambda>'  s    WXHX r)   c                     | d   |u S )Nr   rn   )v1v2s     r'   r  zlContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<lambda>,  s    r!u{ r)   r   )rd   r   r2   r%   r   r   r{   r   r   r   r   r   )r   rR   prefix_blocksr6   r  old_inst_offsetstargetsnew_targetsnewoldr  r   r   r   s             @r'   remap_block_offsetszZContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets  sI    8:M , 7}- AA2  ";;/9)0067 $'%t'L'L$ Na MN1$sDKK2HIN @MS-"3":":;RT % (. .#:. ($ +$&68XG #/H\2HT=N=N4OP2#K
 %(W$= NS@CA1#**=Nr)   c              3   <   K   | ]  }j                   |     y wrD   )r   )r4   r  r   s     r'   r7   zPContinueExecutionCache.generate_based_on_original_code_object.<locals>.<genexpr>4  s!      ,67..q1,s   )r   r   r~   r   r   r   r   r   r#   r$   r   r}   r   r   )r   r   r   r   r   r   r   r  r   r   r   s      ``   @@@r'   r   z=ContinueExecutionCache.generate_based_on_original_code_object  s     (>'U'U(
 
	+{+	+;?S>	+ 	dO4w&
 11MOO)D,J(N"&{"3(NCGS>(NT &d,?@ ', ,;R, '# &,,IIvz+B
EI
 	
r)   N)rx   ry   rz   r   r   r   classmethodr   r{   r}   r   rK   r   r   r   r   staticmethodr~   r   r   r   rn   r)   r'   r   r     sV   "$E46$ $ w 	w
 "'sCxw w S/w S#Xw c)*w eCsO4c9:w !sE#J!7!<=w #s(Ow 
w wr 
4+< 
 
 Z
#&Z
AFsCxZ
 Z
r)   r   rD   ))__doc__r   r   r#   r   typingr   r   r   bytecode_transformationr   r   r	   r
   r   r   r   r   r   utilsr   r   CO_NEWLOCALSr   r   	CO_NESTEDr   	CO_NOFREEr   r   r   r   r(   rB   rH   	dataclassrK   r   r   r   r   rn   r)   r'   <module>r     s      
  & &
 
 
 * 
		   !9 <J<
 d#w; w; $w;t ? ? ?&j
 j
Z	Hr)   