
    [Th_                     B   S r SSKrSSKrSSKrSSKrSSKJrJrJr  SSK	J
r
JrJrJrJrJrJrJrJr  SSKJr  SrSrSrS	rS
rSrSrSrSrSrSrS r SS jr!S r"\RF                  " SS9 " S S5      5       r$\RF                   " S S5      5       r%S r&S r' " S S5      r(g)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                     [         R                  S:  aI  U R                  [        S5      5        [         R                  S:  a  U R                  [        SSS95        g g g )N      	PUSH_NULL)r      SWAPr   arg)sysversion_infoappendr	   )instss    V/var/www/auris/envauris/lib/python3.13/site-packages/torch/_dynamo/resume_execution.py_initial_push_nullr(   6   sN    
7"'45g%LL+F:; & #    c                    [        XS9nUR                  [        S5      5        U H5  nUR                  (       d  M  UR                  =R                  U-  sl        M7     [        S [        U5       5       S5      u  pVUc   e[        U[        S5      /5        X5S-      R                  S:X  d   e[        X5S-      [        S5      /5        US US-    X5S-   S  4$ )Nvarname_mapPOP_TOPc              3   t   #    U  H.  u  pUR                   S :X  d  M  UR                  S:X  d  M)  X4v   M0     g7f)	LOAD_FASTdummyNopnameargval).0iinsts      r'   	<genexpr>5_bytecode_from_template_with_split.<locals>.<genexpr>I   s:      	
3{{k) .2kkW.D QI3s   88
8)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_splitrC   >   s    *8MM+I67 $$3$ 
 !	
$]3	

 	I     *'9%'@&AB Q'..);;;-A69KE9R8ST9q=)=Q+IIIr)   c                 @     U   g !   [         R                  U5        e = fN)$__import_torch_dot__dynamo_dot_utilsset_torch_function_mode_stack)r0   stack_var_names     r'   _try_except_tf_mode_templaterI   \   s'    ,JJ	
 	s    T)frozenc                   l    \ rS rSr% \\S'   Sr\\\	S4      \S'   S\
\   4S jrS\
\   4S jrS	 rS
rg)ReenterWithi   r?   N.target_valuescleanupc                 d    SSK Jn  [        [        U R                  SU" 5       0S9u  pEXR-   USS& U$ )z^
Codegen based off of:
try:
    (rest)
except:
    (restore previous tf mode stack)
    raise
r   )get_prev_stack_var_namerH   r+   N)variables.torch_functionrQ   rC   rI   r?   )selfcode_optionsrO   rQ   setup_try_exceptepilogues         r'   try_except_torch_function_mode*ReenterWith.try_except_torch_function_moden   sB     	F%G()+B+DE&
"
 '
r)   c                    / nU R                   (       a%  U R                    Vs/ s H  n[        U5      PM     nn[        SU R                   35      nXQS   ;  a  US==   U4-  ss'   S H  nXaS   ;  d  M  US==   U4-  ss'   M     / n[	        U5        UR                  / UQ[        [        U5      S5      Q[        SUS9P5        S n[        XR                  S	U0S
9u  pX-   USS& Xy-   $ s  snf )zY
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                     U R                  5          U  U R                  S S S 5        g ! U R                  S S S 5        f = frE   r\   ctxr0   s     r'   	_template*ReenterWith.try_finally.<locals>._template   s4    MMO/T4.T4.s   ( =rd   r+   N)
rN   r   r   r?   r(   extendr   lenr	   rC   )rS   rT   rO   	load_argsvalctx_namename
create_ctxre   setup_try_finallyrV   s              r'   try_finallyReenterWith.try_finally   s"    	;?;M;MN;MC*3/;MIN243C3C2DEF66'H;6'-D
33Z(TG3( . )+
:&%c)ne< #<A	
	/ 'I''eX5F'
# '
--; Os   C-c                    / nU R                   (       a%  U R                    Vs/ s H  n[        U5      PM     nn/ n[        U5        UR                  / UQ[	        [        U5      S5      Q5        S n[        X`R                  5      u  pxX-   USS& [        S U 5       S5      n	U	c   e[        U	[        S5      /5        S U 5       n
[        U
S5      n[        U
S5      b   eXW-   U4$ s  snf )z2
Codegen based off of:
with ctx(args):
    (rest)
Fc                 @    U    U  S S S 5        g ! , (       d  f       g = frE    rc   s     r'   re   'ReenterWith.__call__.<locals>._template   s     s   
Nc              3   n   #    U  H+  nUR                   S :X  d  M  UR                  S:X  d  M'  Uv   M-     g7f)r/   rd   Nr1   r4   r6   s     r'   r7   'ReenterWith.__call__.<locals>.<genexpr>   s6      &D;;+- 26++2F &s   55	5r9   c              3   H   #    U  H  oR                   S :X  d  M  Uv   M     g7f)PUSH_EXC_INFON)r2   rv   s     r'   r7   rw      s      
%T)GDDXs   "	")rN   r   r(   rg   r   rh   rC   r?   r<   r   r	   )rS   rT   rO   ri   rj   rm   re   
setup_withrV   load_fast_ctx_instpush_exc_info_genpush_exc_info_insts               r'   __call__ReenterWith.__call__   s$    	;?;M;MN;MC*3/;MIN(*
:&%c)ne<	
	  B'' 

 '
!&
 
 "---03Ee3L2MN
%
 ""3T:%t,444&(:::Q Os   C'rs   )__name__
__module____qualname____firstlineno__int__annotations__rN   r   tupler   listr   rW   ro   r~   __static_attributes__rs   r)   r'   rL   rL   i   sG    /3M8E#s(O,3 DDU  ,*.k1B *.X1;r)   rL   c                       \ rS rSr% \R
                  \S'   \R                  " \	S9r
\	\   \S'   \R                  " \	S9r\	\   \S'   Sr\\\\4      \S'   Srg)	ResumeFunctionMetadata   code)default_factoryinstructions prefix_block_target_offset_remapNblock_target_offset_remaprs   )r   r   r   r   typesCodeTyper   dataclassesfieldr   r   r   r   r   r   r   dictr   rs   r)   r'   r   r      sa    
..&1&7&7&ML${#M 3>2C2C3$d3i  ;?xS#X7>r)   r   c                     [        U5      n/ n [        U5      nU  H.  nU" Xe5      (       d  M  UR                  U5        [        U5      nM0     U$ ! [         a     U$ f = f)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currj   s          r'   _filter_iterr      sg     
bBC2hCC~~

32h  J  Js   A  A 
AAc                     / n[        U5        UR                  S U  5       5        UR                  [        [        U 5      S5      5        U$ )Nc              3   8   #    U  H  n[        U5      v   M     g 7frE   )r   )r4   rj   s     r'   r7   '_load_tuple_and_call.<locals>.<genexpr>
  s     73C"3''3s   F)r(   rg   r   rh   )tupr&   s     r'   _load_tuple_and_callr     s>    !Eu	LL7377	LL%c#h67Lr)   c                   :   \ rS rSr\" 5       r\" 5       r\S 5       r\S\	S\
\	S4   S\	S\
\S4   S\
\S4   S	\
\S4   S
\
\
\	\
\   4   S4   S\
\
\\
\   4   S4   S\
\	S4   S\R                  4S j5       r\S\\   4S j5       r\S\	S\
\	S4   4S j5       rSrg)ContinueExecutionCachei  c                     XR                   ;  a  0 U R                   U'   [        U5      nX0R                   U   ;  a#  U R                  " X/UQ76 U R                   U   U'   U R                   U   U   $ rE   )cacher   generate)clsr   linenokeys       r'   lookupContinueExecutionCache.lookup  sc    yy  CIIdOCjiio%#&<<#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                   ^ ^^^^^^^^	^
^^^ Tc   eUR                   [        [        -  [        -  [        -  -  (       a   eUR                   [
        -  (       d   eU[        R                  ;   a  T R                  UTTTTTTTT	T
T5      $ [        R                  S:  m[        U5      mS[        [           S[        [        [         4   4UU
UU UUUUUUUUU	4S jjn[#        X5      nT[        R                  U'   U$ )Nr   r   rT   c           	      6  >^ [         R                  " U 5      T"l        [        T#5       Vs/ s H  nSU 3PM
     snmTR	                  U4S jT 5       5        [        US   =(       d    / 5      [        US   =(       d    / 5      -   n[        [        U5      5      n[         SUS    ST! 3US'   T (       aT  US   R                  S	S
S9n[        U5      S
:X  a	  US   US'   O)[        U5      S:X  d   eUu  pVU S	[         SU ST! 3US'   T!US'   SUS'   X1S'   [        T5      US'   SUS'   SUS'   [        TT Vs/ s H  owT;  d  M
  UPM     sn-   US    Vs/ s H  nUT;  d  M  Xs;  d  M  UPM     sn-   5      US'   US   [        [        -  ) -  US'   [        U%4S jU  5       5      n/ n	T (       aB  U(       a"  U	R                  [        S[        U5      S95        U	R                  [        SSS95        / n
T' Vs0 s H  oR                  U_M     nn[!        T'5       VVs0 s H  u  p+UR                  T&U   _M     nnnU  Vs0 s H  oR"                  U_M     nn0 nSn[%        T(5      n[        T#5       GH  nU[        T$5      :  aH  T$U   UU-   :X  a<  U	R                  [        S5      5        US
-  nU[        T$5      :  a  T$U   UU-   :X  a  M<  U	R                  [        SSU 3S95        X,;   aj  UR'                  U5      nU" X5      u  nnU	R	                  U5        T (       a6  UR'                  U5      nUU   nT"R(                  R                  U5        UUU'   UU-   nUU;   d  M  U	R	                  [+        UU   5      5        GM     T (       a#  [-        [/        T"R(                  5      5      T"l        U(       a   eT HR  u  nnU	R                  [        SUS95        U	R	                  [+        U5      5        U	R                  [        SUS95        MT     T(       aK  [0        R2                  S:  d   eT H/  nUT;  d   eU	R	                  [        S5      [        SUS9/5        M1     U	R                  [5        U5      5        U  HC  nUR"                  UR"                  :X  a    O(S Ul        [0        R2                  S:  d  M<  S Ul        ME     U
(       a1  U	R	                  U
5        U	R	                  TR;                  U5      5        U(       ai  T (       d   eU  HZ  nUR<                  (       d  M  UR<                  R>                  U;   d  M2  UUR<                  R>                     UR<                  l        M\     X-   U S S & g s  snf s  snf s  snf s  snf s  snnf s  snf )N___stackc              3   6   >#    U  H  oT;  d  M
  Uv   M     g 7frE   rs   )r4   vargss     r'   r7   BContinueExecutionCache.generate.<locals>.update.<locals>.<genexpr>G  s     =8a}8   		co_cellvarsco_freevars_co_name_at_co_qualname.r   )maxsplitr   co_firstlinenors   co_argcountr   co_posonlyargcountco_kwonlyargcountr[   co_flagsc              3   J   >#    U  H  oR                   T:X  d  M  Uv   M     g 7frE   r   r4   r5   r   s     r'   r7   r   k  s     H\XX5G!!\   #	#COPY_FREE_VARSr!   RESUMEr   r/   ra   r`   )r      r   ) copydeepcopyr   rangerg   r   sortedTORCH_DYNAMO_RESUME_IN_PREFIXrsplitrh   
CO_VARARGSCO_VARKEYWORDSr<   r%   r	   r?   r=   r   r   popr   r   r   reversedr#   r$   r
   starts_line	positionsunreachable_codesr:   target))r   rT   r5   freevarsqualified_pathmodule_namer   r   r   prefixrO   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_irl   valsr   r   r   r   r   is_py311_plusr   metar   r   r   r   r   r   s)                              @r'   update/ContinueExecutionCache.generate.<locals>.updateC  s    $l ;D,1&M:MqhqcNM: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'*2'*-d)L'12L-.01L,-*/+=m}1m=> *-88} )*): 8+L' (4J'?^+C (L$ H\HHFFMM*+;XO 0qAB)+G2;<)B^^R')E< 'y1#1EA  7 ::1   # =IILDkk4/LNI$&!L#N36] 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+ #.  9=TBBC95 9 0
d0TJK24890dKL 0 ''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s5   U<:	V
V

V
&V
-V
<V"VV)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   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^ )6CG66x@r)   c                 ,    [        S5      [        SSS9/$ )zACodegen a `raise None` to make analysis work for unreachable codeNRAISE_VARARGSr   r!   )r   r	   )rT   s    r'   r   (ContinueExecutionCache.unreachable_codes  s      d#A6
 	
r)   c                   ^^^^	^
 [         R                  U   m	Sm
S[        [           S[        [
        [        4   4U	U
U4S jjn[        X5        [        R                  S:  ad  T	R                  (       d>  0 =mT	l
        S[        [           S[        [
        [        4   4UU	U4S jjn[        X5        [        U	4S jT 5       5      m[         R                  " T	R                  UT
T/UQ76 $ )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   rT   c                    >^ U4S jU  5       u  mU4S j[        [        U 5      [        TR                  5      5       5       u  nTR                  UR                  :X  d   eUR                  mg )Nc              3   J   >#    U  H  oR                   T:X  d  M  Uv   M     g 7frE   r   r   s     r'   r7   iContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_new_offset.<locals>.<genexpr>  s     GLqHH4FLr   c              3   :   >#    U  H  u  pUTL d  M  Uv   M     g 7frE   rs   )r4   i1i2r   s      r'   r7   r	    s#      VFB< Vs   	)zipr   r   opcoder   )r   rT   
new_targetr   r   
new_offsetr   s      @r'   find_new_offsetVContinueExecutionCache.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                 |  >^
 / nU  HJ  n[        U5      [        TR                  5      :X  a    O'UR                  S:X  d  M9  UR                  U5        ML     [	        UTR                  5       H"  u  p4UT[        [        UR                  5      '   M$     U(       a  [        [        US   R                  5      OSm
[        U
4S jT 5       5      n[        XS 5      n[        [	        [        U 5      [        TR                  5      5      US 5      n[	        Xv5       H!  u  pUS   R                  TU	R                  '   M#     g )Nry   c              3   6   >#    U  H  oT:  d  M
  Uv   M     g 7frE   rs   )r4   nold_start_offsets     r'   r7   mContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<genexpr>#  s      .#:aBR>R#:r   c                      U R                   U:H  $ rE   r   )r6   os     r'   <lambda>lContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<lambda>'  s    WXHXr)   c                     U S   UL $ )Nr   rs   )v1v2s     r'   r  r  ,  s    r!u{r)   r   )rh   r   r2   r%   r  r   r   r   r   r   r   r   )r   rT   prefix_blocksr6   r  old_inst_offsetstargetsnew_targetsnewoldr  r   r   r   s             @r'   remap_block_offsetsZContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets  s-    8:M ,}- AA2  ";;/9)006 !- $'%t'L'L$ MN1$sDKK2HI$ @MS-"3":":;RT % (. .#:. ($ +$8XG #/H\2HT=N=N4OP2#K
 %($=@CA1#**= %>r)   c              3   B   >#    U  H  nTR                   U   v   M     g 7frE   )r   )r4   r  r   s     r'   r7   PContinueExecutionCache.generate_based_on_original_code_object.<locals>.<genexpr>4  s       ,;Ra..q1;Rs   )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   =ContinueExecutionCache.generate_based_on_original_code_object  s     (>'U'U(
 
	+{+	+;?S>	+ 	+ 	d4w&
 11MOO)D,J(N"&{"3(NCGS>(N (NT &d@ ', ,;R, '# &,,IIvz+B
EI
 	
r)   rs   N)r   r   r   r   r   r   r   classmethodr   r   r   r   rL   r   r   r   r   staticmethodr   r   r   r   r   rs   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   rE   ))__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(   rC   rI   	dataclassrL   r   r   r   r   rs   r)   r'   <module>r5     s      
  & &
 
 
 * 
		   !9 <J<
 d#w; w; $w;t ? ? ?&j
 j
Z	Hr)   