
    9ilt                        S r SSKrSSKrSSKrSSKrSSKJr  SSKJr  SSK	J
r
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  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r.\R^                  " SS 9 " S! S"5      5       r0\R^                   " S# S$5      5       r1S%\\
   S&\\
   S'\\
\
/\24   S\'\
   4S( jr3S)\,\
S4   S\'\   4S* jr4 " S+ S,5      r5g).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)Iterable)AbstractContextManager)AnyCallablecastOptional   )
add_push_null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_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    ^/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/torch/_dynamo/resume_execution.py_initial_push_nullr.   8   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r2   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>O   s:      	
3{{k) .2kkW.D QI3s   88
8)NNNOPr	   )	r   r,   r   exn_tab_entrydepthnext	enumerater   r:   )r0   r1   r2   template_coder>   	dummy_idx
dummy_insts          r-   "_bytecode_from_template_with_splitrI   @   s    
 +8MM+I67 $$3$ 
 !	
$]3	

 	I  Z%;;; *'9%'@&AB Q'..);;;-A69KE9R8ST9q=)=Q+IIIr/   r8   stack_var_namec                 @     U   g !   [         R                  U5        e = fN)$__import_torch_dot__dynamo_dot_utilsset_torch_function_mode_stack)r8   rJ   s     r-   _try_except_tf_mode_templaterO   b   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)ReenterWitho   r1   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_namerJ   r4   N)variables.torch_functionrX   rI   rO   r1   )selfrU   rV   rX   setup_try_exceptepilogues         r-   try_except_torch_function_mode*ReenterWith.try_except_torch_function_modet   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[        [           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;   ctxr8   r    Nc                     U R                  5          U  U R                  S S S 5        g ! U R                  S S S 5        f = frL   rb   rh   r8   s     r-   	_template*ReenterWith.try_finally.<locals>._template   s4    MMO/T4.T4.s   ( =r4   )rT   r   r   r1   r.   extendr   lenr   r   r   rI   )rZ   rU   rV   	load_argsvalctx_namename
create_ctxrk   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[        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)
Frh   r8   r    Nc                 @    U    U  S S S 5        g ! , (       d  f       g = frL    rj   s     r-   rk   'ReenterWith.__call__.<locals>._template   s     s   
c              3   n   #    U  H+  nUR                   S :X  d  M  UR                  S:X  d  M'  Uv   M-     g7f)r7   rh   Nr9   r<   r>   s     r-   r?   'ReenterWith.__call__.<locals>.<genexpr>   s6      &D;;+- 26++2F &s   55	5rA   c              3   H   #    U  H  oR                   S :X  d  M  Uv   M     g7f)PUSH_EXC_INFON)r:   r|   s     r-   r?   r}      s      
%T)GDDXs   "	")rT   r   r.   rm   r   rn   r   r   rI   r1   rD   r   r   )rZ   rU   rV   ro   rp   rs   rk   
setup_withr\   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<	
	1#6 	s 	t 	  B'' 

 '
!&
 
 "---03Ee3L2MN
%
 ""3T:%t,444&(:::Q Os   C>ry   )__name__
__module____qualname____firstlineno__int__annotations__rT   r   tupler   dictstrlistr   r]   ru   r   __static_attributes__ry   r/   r-   rR   rR   o   s    /3M8E#s(O,3  cN 59+5F 	k	 0,. cN,.59+5F,.	k	,.\3; cN3;59+5F3;	tK (;"77	83;r/   rR   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_remapry   N)r   r   r   r   typesCodeTyper   dataclassesfieldr   r   r   r   r   r   r   r   r   ry   r/   r-   r   r      s}    
..&1&7&7&ML${#M 3>2C2C3$d3i 
 	$/ tE#s(OT#s(^$CD r/   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
)iterrD   r,   StopIteration)r   r   r   itrescurrp   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rL   )r   )r<   rp   s     r-   r?   '_load_tuple_and_call.<locals>.<genexpr>  s     73C"3''3s   F)r.   rm   r   rn   )r   r   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\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
4   4   S
4   S\\\\\S
4   4   S
4   S\\
S
4   S\\R                     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   $ rL   )cacher   generate)clsr   r   r   r   s        r-   lookupContinueExecutionCache.lookup%  sg     yy  CIIdOCjiio%#&<<k#PC#PCIIdOC yys##r/   resume_offsetsetup_fn_target_offsets.nstackargnamesargnames_null	setup_fnsstack_ctx_varsargnames_ctx_vars
null_idxesnested_code_objsc                   ^ ^^^^^^^	^
^^^^^ 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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
4S jjn[#        X5      u  nnT[        R                  U'   U$ )Nr"   r   rU   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['        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;   d  M  U	R	                  [-        UU   5      5        GM     T(       a#  [/        [1        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  [2        R4                  S!:  d   eT H/  nUT;  d   eU	R	                  [        S5      [        SUS9/5        M1     T"(       a  U	R	                  / [7        [        S SS9[        SS"S9[        S#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[        S#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S9P5        O'U	R	                  [        SS(S9[        S[        S9/5        U	R                  [9        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R?                  U5      5        U(       ai  T(       d   eU  HZ  nUR@                  (       d  M  UR@                  RB                  U;   d  M2  UUR@                  RB                     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__nested_resume_fns__nested_frame_values___stackc              3   6   >#    U  H  oT;  d  M
  Uv   M     g 7frL   ry   )r<   vargss     r-   r?   BContinueExecutionCache.generate.<locals>.update.<locals>.<genexpr>d  s     =8a}8   		co_cellvarsco_freevars_co_name_at_co_qualname.r	   )maxsplitr   co_firstlinenory   co_argcountr   co_posonlyargcountco_kwonlyargcountra   co_flagsc              3   J   >#    U  H  oR                   T:X  d  M  Uv   M     g 7frL   offset)r<   r=   r   s     r-   r?   r     s     O\XX5N!!\   #	#COPY_FREE_VARSr(   RESUME
LOAD_CONSTTrg   rf   r%   r7   )r#      BINARY_SUBSCRDELETE_SUBSCR
BUILD_LISTLIST_EXTENDDELETE_FASTFCALL_FUNCTION_EXr"   )"copydeepcopyr   rangerm   r   sortedTORCH_DYNAMO_RESUME_IN_PREFIXrsplitrn   "IS_TRACING_RESUME_PROLOGUE_VARNAME
CO_VARARGSCO_VARKEYWORDSrD   r,   r   r1   rE   r   r   popr   r   r   reversedr*   r+   r
   r   starts_line	positionsunreachable_codesrB   target))r   rU   r=   freevarsqualified_pathmodule_namer   r   r   prefixrV   fnhookshook_target_offsetsr>   offset_to_instold_hook_target_remapnull_idxes_istack_ctx_vars_dhook
hook_insts
exn_targethook_target_offsetold_hook_targetrr   valsr   r   r   r   r   is_py311_plusr   metar   r   r   r   r   r   r   s)                             @r-   update/ContinueExecutionCache.generate.<locals>.update]  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$&!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7J"KL) #,  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 '  .& 2$/8M!" !3< K 2? C. +;?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E[.0f *<F*(1S MM.v67
 %;;&--/#' ##w.%)DN % g&c33LAB %$$}(D*** ..559NN4I ..555**1 ) %3LOa <6 >K: =# Js/   [	[
[
	[
,[
*[[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	  new_coder   r  r  s   ` ` ``````````   @@r-   r   ContinueExecutionCache.generate0  s   & (((MMl*-BBEWWY	
 
 }}|+++)AAA=='!    ((G3%d+V	4{+V	4;?S>V	4V	4 V	4 V	4p ,D9!CG66x@r/   rU   c                 ,    [        S5      [        SSS9/$ )zACodegen a `raise None` to make analysis work for unreachable codeNRAISE_VARARGSr	   r(   )r   r   )rU   s    r-   r   (ContinueExecutionCache.unreachable_codes9  s      d#A6
 	
r/   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   rU   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rL   r   )r<   r=   r  s     r-   r?   ڎContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_orig_offset.<locals>.find_orig_offset_transform.<locals>.<genexpr>^  s     O1J8NQQr   c              3   :   >#    U  H  u  pUTL d  M  Uv   M     g 7frL   ry   )r<   i1i2r   s      r-   r?   r  `  s)      )# V|	 B#s   	r	   r   )r   zipr   r   rn   opcoder   )r   rU   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_transformZ  s     PO	#( )"% .9J9J0K#) $  ( +,111-a0
}}
(9(9999!((444(//r/   )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_offsetW  sJ    K0";/0?CCH~00 06 "$(BCr/   r   z>resume instruction not found in original code - this is a bug.r"   r   rU   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rL   ry   )r<   ncur_start_offsets     r-   r?   mContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<genexpr>  s      .#:aBR>R#:r   c                      U R                   U:H  $ rL   r   )r>   os     r-   <lambda>lContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<lambda>  s    WXHXr/   c                     U S   UL $ )Nr   ry   )v1v2s     r-   r0  r1    s    2a5B;r/   r	   )rn   r   r:   r,   r   r   r   r   r   r   r   r   )r   rU   prefix_blocksr>   r/  cur_inst_offsetstargetsorig_targetsorigr   r,  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#**= &@r/   c              3   H   >#    U  H  nTR                   T   U   v   M     g 7frL   )r   )r<   r+  r  
offset_keys     r-   r?   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  r=  s    `   `     @@@r-   r  =ContinueExecutionCache.generate_based_on_original_code_objectA  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#
 
 	
r/   ry   N)r   r   r   r   r   r   r  classmethodr   r   r   r   r   r   r   rR   r   staticmethodr   r   r   r   r  r   ry   r/   r-   r   r   !  s   "$E46$>>$+.$=@$HK$	$ $ FnnF F 	F
 F "'sCxF F S/F S#XF c)*F eCsCx$893>?F !sE#s(O';!<c!ABF #s(OF   /!F" 
#F FP 
S#X 
4;L 
 
 Q
nnQ
 Q
 	Q

 Q
 "'sCxQ
 Q
 
Q
 Q
r/   r   rL   )6__doc__r   r   r*   r   collections.abcr   
contextlibr   typingr   r   r   r   bytecode_transformationr
   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   rI   rO   	dataclassrR   r   boolr   r   r   ry   r/   r-   <module>rO     s     
  $ - 0 0   * 
		   !9 %C "<d;/ <D < -1JsCx JJ $sCx.)J 4d;//0	JD
 
S 
T 
 d#}; }; $};@   " C:t#
$ 
#Y	.eCHo ${2C r
 r
r/   