
    3jSy                     "   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  SSKJ	r	  SSK
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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S4S jr) S-S\S\4   S\*S\+\,\4   S-  S\-\(\   \(\   4   4S jjr.S\S\SS4S jr/\R`                  " SS 9 " S! S"5      5       r1\R`                   " S# S$5      5       r2S%\\   S&\\   S'\\\/\34   S\(\   4S( jr4S)\-\S4   S\(\   4S* jr5 " S+ S,5      r6g).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)CallableIterable)AbstractContextManager)Anycast   )add_push_nullbytecode_from_templatecreate_binary_subscrcreate_call_functioncreate_call_function_excreate_instructioncreate_jump_absolutecreate_load_constInstructionoverwrite_instructiontransform_code_object	unique_id)ExactWeakKeyDictionary                @         i   torch_dynamo_resume_in__is_tracing_resume_prologueinstsreturnc                     [         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   )r    s    X/home/wildlama/miniconda3/lib/python3.13/site-packages/torch/_dynamo/resume_execution.py_initial_push_nullr/   ;   sN    
7"'45g%LL+F:; & #    template.stack_indexvarname_mapc                    [        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b  Uc   e[        U[        S5      /5        X5S-      R                  S:X  d   e[        X5S-      [        S5      /5        US US-    X5S-   S  4$ )Nr3   POP_TOPc              3   t   #    U  H.  u  pUR                   S ;   d  M  UR                  S:X  d  M)  X4v   M0     g7f)	LOAD_FASTLOAD_FAST_BORROWdummyNopnameargval).0iinsts      r.   	<genexpr>5_bytecode_from_template_with_split.<locals>.<genexpr>R   s=      	
3{{??  w& QI3s   88
8)NNNOPr   )	r
   r-   r   exn_tab_entrydepthnext	enumerater   r=   )r1   r2   r3   template_coderA   	dummy_idx
dummy_insts          r.   "_bytecode_from_template_with_splitrL   C   s    
 +8MM+I67 $$3$ 
 !	
$]3	
 	I  Z%;;; *'9%'@&AB Q'..);;;-A69KE9R8ST9q=)=Q+IIIr0   r;   stack_var_namec                 @     U   g !   [         R                  U5        e = fN)$__import_torch_dot__dynamo_dot_utilsset_torch_function_mode_stack)r;   rM   s     r.   _try_except_tf_mode_templaterR   f   s'    
,JJ	
 	s    T)frozenc            	           \ rS rSr% \\S'   Sr\\S4   S-  \S'   S\	\
\4   S\\   S\\   4S	 jrS\	\
\4   S\\   S\\   4S
 jrS\	\
\4   S\\   S\\\   \S-  4   4S jrSrg)ReenterWitht   r2   N.target_valuescode_optionscleanupr!   c                 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_namerM   r5   N)variables.torch_functionr[   rL   rR   r2   )selfrX   rY   r[   setup_try_exceptepilogues         r.   try_except_torch_function_mode*ReenterWith.try_except_torch_function_modey   sB     	F%G()+B+DE&
"
 '
r0   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[        [           S	[        S
S4S j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r>   ctxr;   r!   Nc                     U R                  5          U  U R                  S S S 5        g ! U R                  S S S 5        f = frO   re   rk   r;   s     r.   	_template*ReenterWith.try_finally.<locals>._template   s4    MMO/T4.T4.s   ( =r5   )rW   r   r   r2   r/   extendr   lenr   r   r   rL   )r]   rX   rY   	load_argsvalctx_namename
create_ctxrn   setup_try_finallyr_   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	
	/1#6 	/s 	/t 	/ 'I''eX5F'
# '
--; Os   Dc                 .   / nU R                   (       a%  U R                    Vs/ s H  n[        U5      PM     nn/ n[        R                  S:  a  [	        U5        UR                  / UQ[        [        U5      S5      Q5        S[        [           S[        SS4S j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)
)r$      Frk   r;   r!   Nc                 @    U    U  S S S 5        g ! , (       d  f       g = frO    rm   s     r.   rn   'ReenterWith.__call__.<locals>._template   s     s   
c              3   n   #    U  H+  nUR                   S ;   d  M  UR                  S:X  d  M'  Uv   M-     g7f)r8   rk   Nr<   r?   rA   s     r.   rB   'ReenterWith.__call__.<locals>.<genexpr>   s9      &D;;"CC  KK5( &s   55	5rD   c              3   H   #    U  H  oR                   S :X  d  M  Uv   M     g7f)PUSH_EXC_INFON)r=   r   s     r.   rB   r      s      
%T)GDDXs   "	")rW   r   r+   r,   r/   rp   r   rq   r   r   rL   r2   rG   r   r   )r]   rX   rY   rr   rs   rv   rn   
setup_withr_   load_fast_ctx_instpush_exc_info_genpush_exc_info_insts               r.   __call__ReenterWith.__call__   sM    	;?;M;MN;MC*3/;MIN(*
g%z*%c)ne<	
	1#6 	s 	t 	  B'' 

 '
!& 
 "---03Ee3L2MN
%
 ""3T:%t,444&(:::W Os   Dr}   )__name__
__module____qualname____firstlineno__int__annotations__rW   tupler   dictstrlistr   r`   rx   r   __static_attributes__r}   r0   r.   rU   rU   t   s    ,0M5c?T)0  cN 59+5F 	k	 0-. cN-.59+5F-.	k	-.^7; cN7;59+5F7;	tK +"44	57;r0   rU   c                       \ rS rSr% \R
                  \S'   \R                  " \	S9r
\	\   \S'   \R                  " \	S9r\	\   \S'   \R                  " \S9r\\\\4   \\\4   4   \S'   Srg)	ResumeFunctionMetadata   code)default_factoryinstructions prefix_block_target_offset_remapblock_target_offset_remapr}   N)r   r   r   r   typesCodeTyper   dataclassesfieldr   r   r   r   r   r   r   r   r   r}   r0   r.   r   r      s}    
..&1&7&7&ML${#M 3>2C2C3$d3i 
 	$/ tE#s(OT#s(^$CD r0   r   l1l2condc                     [        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
)iterrG   r-   StopIteration)r   r   r   itrescurrs   s          r.   _filter_iterr     sg     
bBC2hCC~~

32h  J  Js   A  A 
AAtupc                     / 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rO   )r   )r?   rs   s     r.   rB   '_load_tuple_and_call.<locals>.<genexpr>&  s     73C"3''3s   F)r/   rp   r   rq   )r   r    s     r.   _load_tuple_and_callr   #  s>    !Eu	LL7377	LL%c#h67Lr0   c            !          \ rS rSr\" 5       r\" 5       r\S\R                  S\
S\
S\S\R                  4
S j5       r\S\R                  S\
S\
S\
S	\\
S
4   S\
S\\S
4   S\\S
4   S\\S
4   S\S\\\
\\S
4   4   S
4   S\\\\\S
4   4   S
4   S\\
S
4   S\\R                     S\S\R                  4 S j5       r\S\\\4   S\\   4S j5       r\S\R                  S\
S\
S\
S	\\
S
4   S\S\R                  4S j5       rSrg)ContinueExecutionCachei+  r   linenoinit_offsetkeyr!   c                     XR                   ;  a  0 U R                   U'   [        U5      nX@R                   U   ;  a$  U R                  " XU/UQ76 U R                   U   U'   U R                   U   U   $ rO   )cacher   generate)clsr   r   r   r   s        r.   lookupContinueExecutionCache.lookup/  sg     yy  CIIdOCjiio%#&<<k#PC#PCIIdOC yys##r0   resume_offsetsetup_fn_target_offsets.nstackargnamesargnames_null	setup_fnshandle_inactive_ctxstack_ctx_varsargnames_ctx_vars
null_idxesnested_code_objspop_nested_resume_resultc                   ^ ^^^^^^^	^
^^^^^^^ Tc   eUR                   [        [        -  [        -  [        -  -  (       a   eUR                   [
        -  (       d   eU[        R                  ;   a  T R                  UTUTTTTTT	T
TTTTT5      $ [        R                  S:  m[        U5      mS[        [           S[        [        [         4   SS 4UUUU U
UUUUUUUUUU	U4S jjn[#        UU5      u  nnT[        R                  U'   U$ )Nr#   r   rX   r!   c                   >^ [         R                  " U 5      T#l        SS/mT[        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  owT;  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        U	R	                  [        SSS9[        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Sn['        T+5      n[        T%[        T&5      -   5       H  nU[        T&5      :  a)  T&U   U:X  a   U	R                  [        S5      5        US-  nOKU	R                  [        S SU 3S95        T (       a#  UU;   a  U	R	                  [)        UU   5      5        US-  nX,;   d  M  UR+                  U5      nU" X5      u  nnU	R	                  U5        T!(       d  M  UR+                  U5      nUU   nT#R,                  R                  U5        UUU'   M     T!(       a#  [/        [1        T#R,                  5      5      T#l        U(       a   eT (       aX  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  [2        R4                  S!:  d   eT H/  nUT;  d   eU	R	                  [        S5      [        SUS9/5        M1     T$(       Ga  U	R	                  / [7        [        S SS9[        SS"S9[9        5       /5      Q[        S SS9P[        SS"S9P[        S#5      P[        S SS9P[        S SS9P[        S$SS9P[        S SS9P[        SS"S9P[9        5       P[        S%SS9P[        S SS9P[        SS"S9P[        S#5      P[        S&SS9P[        S&SS9P[        SS'S9P[        S[        S9P[;        S'S'5      Q5        T'(       a  U	R                  [        S(5      5        O'U	R	                  [        SS'S9[        S[        S9/5        U	R                  [=        U5      5        U  HC  nUR$                  UR$                  :X  a    O(S Ul        [2        R4                  S):  d  M<  S Ul         ME     U
(       a1  U	R	                  U
5        U	R	                  TRC                  U5      5        U(       ai  T!(       d   eU  HZ  nURD                  (       d  M  URD                  RF                  U;   d  M2  UURD                  RF                     URD                  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__nested_resume_fns__nested_frame_values___stackc              3   6   >#    U  H  oT;  d  M
  Uv   M     g 7frO   r}   )r?   vargss     r.   rB   BContinueExecutionCache.generate.<locals>.update.<locals>.<genexpr>u  s     =8a}8   		co_cellvarsco_freevars_co_name_at_co_qualname.r   )maxsplitr   co_firstlinenor}   co_argcountr   co_posonlyargcountco_kwonlyargcountrd   co_flagsc              3   J   >#    U  H  oR                   T:X  d  M  Uv   M     g 7frO   offset)r?   r@   r   s     r.   rB   r     s     O\XX5N!!\   #	#COPY_FREE_VARSr)   RESUME
LOAD_CONSTTrj   ri   r&   r9   )r$      DELETE_SUBSCR
BUILD_LISTLIST_EXTENDDELETE_FASTFr6   r#   )$copydeepcopyr   rangerp   r   sortedTORCH_DYNAMO_RESUME_IN_PREFIXrsplitrq   "IS_TRACING_RESUME_PROLOGUE_VARNAME
CO_VARARGSCO_VARKEYWORDSrG   r-   r   r2   rH   r   r   r   popr   r   reversedr+   r,   r	   r   r   r   starts_line	positionsunreachable_codesrE   target),r   rX   r@   freevarsqualified_pathmodule_namer   r   r   prefixrY   fnhookshook_target_offsetsrA   offset_to_instold_hook_target_remapstack_inull_istack_ctx_vars_dhook
hook_insts
exn_targethook_target_offsetold_hook_targetru   valsr   r   r   r   r   r   is_py311_plusr   metar   r   r   r   r   r   r   r   s,                              @r.   update/ContinueExecutionCache.generate.<locals>.updaten  s    !%l ;D)+BCDU6];]xs^];;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=>*=9K9d]19KL 667+L' (4J'?^+C (L$ O\OOFFMM*+;XO 0qAB
 MM&|DA&$-O *,G2;<)B^^R')E< 'y1#1EA  7 ::1   # =IILDkk4/LNI %'!GF#N36C
O34C
O+
60Ba0GMM"4["ABaKFMM*;'?ST +w:J/J &:;KG;T&UVqLG: 99Q<D-1,-H*J
MM*-$}-@-D-DQ-G**89K*L==DDEWXAK-o>- 50  9=TBBC95 9 #"3JD$MM"4["NOMM"6t"<=MM"4\$"OP #4 ''7222&AD=(=MM.{;.|AF '  .& 2$/8M!" !3< K 4 6. +;?TU. +<C. +?;.  +;?TU!." +;?VW#.$ +<Q?%.( +;?VW).* +<C+., -.-.8 +=a@9.< +;?VW=.> +<C?.@ +?;A.D +=AVWE.F +)2IG.P +<FQ.R +(1SS.Z 1>[.0b ,MM"4Y"?@ *<F*(1S MM.v67
 %;;&--/#' ##w.%)DN % g&c33LAB %$$}(D*** ..559NN4I ..555**1 ) %3LOs <6 >K: =# Js/   [+	[0
[0
	[5
,[5
*[:[?3\)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   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  new_coder   r  r  s   ` ` ````````````   @@r.   r   ContinueExecutionCache.generate:  s   0 (((MMl*-BBEWWY	
 
 }}|+++)AAA=='#! ( $ ((G3%d+_	4{+_	4;?S>_	4_	4 _	4 _	4B ,D&9!CG66x@r0   rX   c                 ,    [        S5      [        SSS9/$ )zACodegen a `raise None` to make analysis work for unreachable codeNRAISE_VARARGSr   r)   )r   r   )rX   s    r.   r   (ContinueExecutionCache.unreachable_codesS  s      d#A6
 	
r0   r   c                   ^^^^^ [         R                  T   mS[        S[        4UU4S jjnU" U5      nU" U5      n	U	S:  d   S5       e[        R                  S:  ar  X4mTTR
                  ;  aI  0 =mTR
                  T'   S[        [           S[        [        [        4   SS	4UUU4S
 jjn
[        TU
5        [        UU4S jT 5       5      m[         R                  " TR                  UUU	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).

cur_offsetr!   c                    >^ ^ SmS[         [           S[        [        [        4   SS 4U UU4S jjn[        TU5        T$ )Nr   r   rX   r!   c           	      D  >^ U4S jU  5       u  m[        U4S j[        [        U 5      [        TR                  5      5       5       5      nU(       d  g [	        U5      S:X  d   eUS   nTR
                  UR
                  :X  d   eUR                  c   eUR                  mg )Nc              3   J   >#    U  H  oR                   T:X  d  M  Uv   M     g 7frO   r   )r?   r@   r  s     r.   rB   ڎContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_orig_offset.<locals>.find_orig_offset_transform.<locals>.<genexpr>x  s     O1J8NQQr   c              3   :   >#    U  H  u  pUTL d  M  Uv   M     g 7frO   r}   )r?   i1i2r   s      r.   rB   r!  z  s)      )# V|	 B#s   	r   r   )r   zipr   r   rq   opcoder   )r   rX   new_target_tuple
new_targetr   r  r  orig_offsets       @r.   find_orig_offset_transform{ContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_orig_offset.<locals>.find_orig_offset_transformt  s     PO	#( )"% .9J9J0K#) $  ( +,111-a0
}}
(9(9999!((444(//r0   )r   r   r   r   r   r   )r  r*  r)  r   r  s   ` @r.   find_orig_offsetWContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_orig_offsetq  sJ    K0";/0?CCH~00 06 "$(BCr0   r   z>resume instruction not found in original code - this is a bug.r#   r   rX   Nc           
        >^
 / 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5      S 5      5      n[	        Xv5       H!  u  pUS   R                  TU	R                  '   M#     g )Nr   r   c              3   6   >#    U  H  oT:  d  M
  Uv   M     g 7frO   r}   )r?   ncur_start_offsets     r.   rB   mContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<genexpr>  s      .#:aBR>R#:r   c                      U R                   U:H  $ rO   r   )rA   os     r.   <lambda>lContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<lambda>  s    WXHXr0   c                     U S   UL $ )Nr   r}   )v1v2s     r.   r5  r6    s    2a5B;r0   r   )rq   r   r=   r-   r%  r   r   r   r   r   r   r   )r   rX   prefix_blocksrA   r4  cur_inst_offsetstargetsorig_targetsorigr   r1  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 $,$ 6ARAR8ST$W-6$L &)%?	@DQ1#**= &@r0   c              3   H   >#    U  H  nTR                   T   U   v   M     g 7frO   )r   )r?   r0  r  
offset_keys     r.   rB   PContinueExecutionCache.generate_based_on_original_code_object.<locals>.<genexpr>  s(      ,0A ..z:1=0s   ")r   r  r   r+   r,   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r,  orig_init_offsetorig_resume_offsetr?  r   r  rB  s    `   `     @@@r.   r  =ContinueExecutionCache.generate_based_on_original_code_object[  s8   $ (>'U'U(
	 	 	 	B ,K8 .m<!B& 	
L	
& w&
 +?J !?!?? )D,J,J-
1O"&{"31OCGS>1O1O 1Of &d,?@ ', ,0, '# &,,II#
 
 	
r0   r}   N)r   r   r   r   r   r   r  classmethodr   r   r   r   r   r   r   rU   boolr   staticmethodr   r   r   r   r  r   r}   r0   r.   r   r   +  s-   "$E46$>>$+.$=@$HK$	$ $ VnnV V 	V
 V "'sCxV V S/V S#XV c)*V "V eCsCx$893>?V !sE#s(O';!<c!ABV #s(OV"  /#V* #'+V, 
-V Vp 
S#X 
4;L 
 
 R
nnR
 R
 	R

 R
 "'sCxR
 R
 
R
 R
r0   r   rO   )7__doc__r   r   r+   r   collections.abcr   r   
contextlibr   typingr   r   bytecode_transformationr	   r
   r   r   r   r   r   r   r   r   r   r   utilsr   r  CO_NEWLOCALSr   r   	CO_NESTEDr  	CO_NOFREEr  r  r  r   r   r   r/   r   r   r   r   rL   rR   	dataclassrU   r   rH  r   r   r   r}   r0   r.   <module>rT     s     
  . -     * 
		   !9 %C "<d;/ <D < *. JsCx  J J c3h$& J 4d;//0	 JF S T  d#B; B; $B;J   " C:t#
$ 
#Y	.eCHo ${2C C
 C
r0   