
    ȅix                     &   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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\.\)\   \)\   4   4S jjr/S\S\SS4S jr0\Rb                  " SS 9 " S! S"5      5       r2\Rb                   " S# S$5      5       r3S%\\   S&\\   S'\\\/\44   S\)\   4S( jr5S)\.\S4   S\)\   4S* jr6 " S+ S,5      r7g).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Optional   )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/james-whalen/.local/lib/python3.13/site-packages/torch/_dynamo/resume_execution.py_initial_push_nullr0   ;   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r4   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>   )r2   r3   r4   template_coderB   	dummy_idx
dummy_insts          r/   "_bytecode_from_template_with_splitrM   C   s    
 +8MM+I67 $$3$ 
 !	
$]3	
 	I  Z%;;; *'9%'@&AB Q'..);;;-A69KE9R8ST9q=)=Q+IIIr1   r<   stack_var_namec                 @     U   g !   [         R                  U5        e = fN)$__import_torch_dot__dynamo_dot_utilsset_torch_function_mode_stack)r<   rN   s     r/   _try_except_tf_mode_templaterS   f   s'    
,JJ	
 	s    T)frozenc            	           \ rS rSr% \\S'   Sr\\\	S4      \S'   S\
\\	4   S\\   S\\   4S	 jrS\
\\	4   S\\   S\\   4S
 jrS\
\\	4   S\\   S\\\   \\   4   4S jrSrg)ReenterWitht   r3   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_namerN   r6   N)variables.torch_functionr\   rM   rS   r3   )selfrY   rZ   r\   setup_try_exceptepilogues         r/   try_except_torch_function_mode*ReenterWith.try_except_torch_function_modey   sB     	F%G()+B+DE&
"
 '
r1   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rP   rf   rl   r<   s     r/   	_template*ReenterWith.try_finally.<locals>._template   s4    MMO/T4.T4.s   ( =r6   )rX   r   r   r3   r0   extendr   lenr   r   r   rM   )r^   rY   rZ   	load_argsvalctx_namename
create_ctxro   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%      Frl   r<   r"   Nc                 @    U    U  S S S 5        g ! , (       d  f       g = frP    rn   s     r/   ro   '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)r9   rl   Nr=   r@   rB   s     r/   rC   'ReenterWith.__call__.<locals>.<genexpr>   s9      &D;;"CC  KK5( &s   55	5rE   c              3   H   #    U  H  oR                   S :X  d  M  Uv   M     g7f)PUSH_EXC_INFON)r>   r   s     r/   rC   r      s      
%T)GDDXs   "	")rX   r   r,   r-   r0   rq   r   rr   r   r   rM   r3   rH   r   r   )r^   rY   rZ   rs   rt   rw   ro   
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__rX   r   tupler   dictstrlistr   ra   ry   r   __static_attributes__r~   r1   r/   rV   rV   t   s    /3M8E#s(O,3  cN 59+5F 	k	 0,. cN,.59+5F,.	k	,.\6; cN6;59+5F6;	tK (;"77	86;r1   rV   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~   r1   r/   r   r      s}    
..&1&7&7&ML${#M 3>2C2C3$d3i 
 	$/ tE#s(OT#s(^$CD r1   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
)iterrH   r.   StopIteration)r   r   r   itrescurrt   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rP   )r   )r@   rt   s     r/   rC   '_load_tuple_and_call.<locals>.<genexpr>$  s     73C"3''3s   F)r0   rq   r   rr   )r   r!   s     r/   _load_tuple_and_callr   !  s>    !Eu	LL7377	LL%c#h67Lr1   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   $ rP   )cacher   generate)clsr   r   r   r   s        r/   lookupContinueExecutionCache.lookup-  sg     yy  CIIdOCjiio%#&<<k#PC#PCIIdOC yys##r1   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   rY   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rP   r~   )r@   vargss     r/   rC   BContinueExecutionCache.generate.<locals>.update.<locals>.<genexpr>s  s     =8a}8   		co_cellvarsco_freevars_co_name_at_co_qualname.r	   )maxsplitr   co_firstlinenor~   co_argcountr   co_posonlyargcountco_kwonlyargcountre   co_flagsc              3   J   >#    U  H  oR                   T:X  d  M  Uv   M     g 7frP   offset)r@   rA   r   s     r/   rC   r     s     O\XX5N!!\   #	#COPY_FREE_VARSr*   RESUME
LOAD_CONSTTrk   rj   r'   r:   )r%      DELETE_SUBSCR
BUILD_LISTLIST_EXTENDDELETE_FASTFr7   r$   )$copydeepcopyr   rangerq   r   sortedTORCH_DYNAMO_RESUME_IN_PREFIXrsplitrr   "IS_TRACING_RESUME_PROLOGUE_VARNAME
CO_VARARGSCO_VARKEYWORDSrH   r.   r   r3   rI   r   r   r   popr   r   reversedr,   r-   r
   r   r   r   starts_line	positionsunreachable_codesrF   target),r   rY   rA   freevarsqualified_pathmodule_namer   r   r   prefixrZ   fnhookshook_target_offsetsrB   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_targetrv   valsr   r   r   r   r   r   is_py311_plusr   metar   r   r   r   r   r   r   r   s,                              @r/   update/ContinueExecutionCache.generate.<locals>.updatel  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Oq <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.generate8  s   0 (((MMl*-BBEWWY	
 
 }}|+++)AAA=='#! ( $ ((G3%d+^	4{+^	4;?S>^	4^	4 ^	4 ^	4@ ,D&9!CG66x@r1   rY   c                 ,    [        S5      [        SSS9/$ )zACodegen a `raise None` to make analysis work for unreachable codeNRAISE_VARARGSr	   r*   )r   r   )rY   s    r/   r   (ContinueExecutionCache.unreachable_codesP  s      d#A6
 	
r1   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   rY   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rP   r   )r@   rA   r  s     r/   rC   ڎContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_orig_offset.<locals>.find_orig_offset_transform.<locals>.<genexpr>u  s     O1J8NQQr   c              3   :   >#    U  H  u  pUTL d  M  Uv   M     g 7frP   r~   )r@   i1i2r   s      r/   rC   r"  w  s)      )# V|	 B#s   	r	   r   )r   zipr   r   rr   opcoder   )r   rY   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_transformq  s     PO	#( )"% .9J9J0K#) $  ( +,111-a0
}}
(9(9999!((444(//r1   )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_offsetn  sJ    K0";/0?CCH~00 06 "$(BCr1   r   z>resume instruction not found in original code - this is a bug.r$   r   rY   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rP   r~   )r@   ncur_start_offsets     r/   rC   mContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<genexpr>  s      .#:aBR>R#:r   c                      U R                   U:H  $ rP   r   )rB   os     r/   <lambda>lContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<lambda>  s    WXHXr1   c                     U S   UL $ )Nr   r~   )v1v2s     r/   r6  r7    s    2a5B;r1   r	   )rr   r   r>   r.   r&  r   r   r   r   r   r   r   )r   rY   prefix_blocksrB   r5  cur_inst_offsetstargetsorig_targetsorigr   r2  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#**= &@r1   c              3   H   >#    U  H  nTR                   T   U   v   M     g 7frP   )r   )r@   r1  r  
offset_keys     r/   rC   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  rC  s    `   `     @@@r/   r  =ContinueExecutionCache.generate_based_on_original_code_objectX  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#
 
 	
r1   r~   N)r   r   r   r   r   r   r  classmethodr   r   r   r   r   r   r   rV   boolr   staticmethodr   r   r   r   r  r   r~   r1   r/   r   r   )  s-   "$E46$>>$+.$=@$HK$	$ $ UnnU U 	U
 U "'sCxU U S/U S#XU c)*U "U eCsCx$893>?U !sE#s(O';!<c!ABU #s(OU"  /#U* #'+U, 
-U Un 
S#X 
4;L 
 
 Q
nnQ
 Q
 	Q

 Q
 "'sCxQ
 Q
 
Q
 Q
r1   r   rP   )8__doc__r   r   r,   r   collections.abcr   r   
contextlibr   typingr   r   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   r0   r   r   r   r   rM   rS   	dataclassrV   r   rI  r   r   r   r~   r1   r/   <module>rU     s     
  . - & &    * 
		   !9 %C "<d;/ <D < -1 JsCx  J J $sCx.) J 4d;//0	 JF S T  d#@; @; $@;F   " C:t#
$ 
#Y	.eCHo ${2C A
 A
r1   