
    9jSy                        d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	 ddl
mZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZ dZd	Zd
ZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'de(e   ddfdZ)	 d-dedef   de*de+e,ef   dz  de-e(e   e(e   f   fdZ.dededdfdZ/ ej`                  d        G d! d"             Z1ej`                   G d# d$             Z2d%ee   d&ee   d'eeege3f   de(e   fd(Z4d)e-edf   de(e   fd*Z5 G d+ d,      Z6y).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                     t         j                  dk\  rK| j                  t        d             t         j                  dk  r| j                  t        dd             y y y )N      	PUSH_NULL)r$      SWAPr   arg)sysversion_infoappendr   )r    s    ^/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/_dynamo/resume_execution.py_initial_push_nullr/   ;   sN    
7"'45g%LL+F:; & #    template.stack_indexvarname_mapc                    t        | |      }|j                  t        d             |D ].  }|j                  s|j                  xj                  |z  c_        0 t        d t        |      D        d      \  }}||J t        |t        d      g       ||dz      j                  dk(  sJ t        ||dz      t        d      g       |d |dz    ||dz   d  fS )Nr3   POP_TOPc              3   d   K   | ](  \  }}|j                   d v r|j                  dk(  r||f * yw)	LOAD_FASTLOAD_FAST_BORROWdummyNopnameargval).0iinsts      r.   	<genexpr>z5_bytecode_from_template_with_split.<locals>.<genexpr>R   s9      	
4{{??w& I	
s   .0)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_splitrK   C   s   
 +8MM+I67  4$$3$4
 !	
$]3	
 	Iz  Z%;;; *'9%'@&AB Q'..);;;-	A69KE9R8ST9q=)=Q+IIIr0   r;   stack_var_namec                 @    	 |  y #  t         j                  |        xY wN)$__import_torch_dot__dynamo_dot_utilsset_torch_function_mode_stack)r;   rL   s     r.   _try_except_tf_mode_templaterQ   f   s'    
,JJ	
 	s    T)frozenc            	           e Zd ZU eed<   dZeedf   dz  ed<   dee	ef   de
e   de
e   fdZdee	ef   de
e   de
e   fd	Zdee	ef   de
e   dee
e   edz  f   fd
Zy)ReenterWithr2   N.target_valuescode_optionscleanupr!   c                 n    ddl m} t        t        | j                  d |       i      \  }}||z   |dd |S )z
        Codegen based off of:
        try:
            (rest)
        except:
            (restore previous tf mode stack)
            raise
        r   )get_prev_stack_var_namerL   r5   N)variables.torch_functionrY   rK   rQ   r2   )selfrV   rW   rY   setup_try_exceptepilogues         r.   try_except_torch_function_modez*ReenterWith.try_except_torch_function_modey   sF     	F%G()+B+DE&
"(
 '
r0   c                 
   g }| j                   r"| j                   D cg c]  }t        |       }}t        d| j                         }||d   vr|dxx   |fz  cc<   dD ]  }||d   vs|dxx   |fz  cc<    g }t	        |       |j                  g |t        t        |      d      t        d|             dt        t           d	t        d
dfd}t        || j                  d|i      \  }	}
|
|z   |dd ||	z   S c c}w )z
        Codegen based off of:
        load args
        enter context
        try:
            (rest)
        finally:
            exit context
        ___context_manager_co_varnames	__enter____exit__co_namesF
STORE_FASTr>   ctxr;   r!   Nc                     | j                          	 | | j                  d d d        y # | j                  d d d        w xY wrN   rb   rh   r;   s     r.   	_templatez*ReenterWith.try_finally.<locals>._template   s4    MMO/T4.T4.s   ( =r5   )rU   r   r   r2   r/   extendr   lenr   r   r   rK   )r[   rV   rW   	load_argsvalctx_namename
create_ctxrk   setup_try_finallyr]   s              r.   try_finallyzReenterWith.try_finally   sL    	;?;M;MNC*3/NIN243C3C2DEF<66'H;6'- 	4D<
33Z(TG3(	4 )+
:&%c)ne< #<A	
	/1#6 	/s 	/t 	/ 'It''eX5F'
#8 '
---; Os   D c                    g }| j                   r"| j                   D cg c]  }t        |       }}g }t        j                  dk  rt	        |       |j                  g |t        t        |      d             dt        t           dt        ddfd}t        || j                        \  }}||z   |dd t        d |D        d      }	|	J t        |	t        d	      g       d
 |D        }
t        |
d      }t        |
d      J ||z   |fS c c}w )zR
        Codegen based off of:
        with ctx(args):
            (rest)
        )r$      Frh   r;   r!   Nc                 6    | 5  | d d d        y # 1 sw Y   y xY wrN    rj   s     r.   rk   z'ReenterWith.__call__.<locals>._template   s       s   c              3   Z   K   | ]#  }|j                   d v r|j                  dk(  r| % yw)r8   rh   Nr<   r?   rA   s     r.   rB   z'ReenterWith.__call__.<locals>.<genexpr>   s1      ;;"CCKK5( s   )+rC   c              3   @   K   | ]  }|j                   d k(  s|  yw)PUSH_EXC_INFON)r=   rz   s     r.   rB   z'ReenterWith.__call__.<locals>.<genexpr>   s       
)GD
s   )rU   r   r+   r,   r/   rl   r   rm   r   r   rK   r2   rF   r   r   )r[   rV   rW   rn   ro   rr   rk   
setup_withr]   load_fast_ctx_instpush_exc_info_genpush_exc_info_insts               r.   __call__zReenterWith.__call__   sR    	;?;M;MNC*3/NIN(*
g%z*%c)ne<	
	1#6 	s 	t 	  Bt'' 

H '
!& 
 "---03Ee3L2MN
%
 ""3T:%t,444J&(:::W Os   D
)__name__
__module____qualname__int__annotations__rU   tupler   dictstrlistr   r^   rt   r   rx   r0   r.   rT   rT   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   rT   c                       e Zd ZU ej                  ed<    ej                  e      Z	ee
   ed<    ej                  e      Zee   ed<    ej                  e      Zeeeef   eeef   f   ed<   y)ResumeFunctionMetadatacode)default_factoryinstructions prefix_block_target_offset_remapblock_target_offset_remapN)r   r   r   typesCodeTyper   dataclassesfieldr   r   r   r   r   r   r   r   rx   r0   r.   r   r      s    
..&7k&7&7&ML${#M 3D+2C2C3$d3i 
 	$/ tE#s(OT#s(^$CD r0   r   l1l2condc                     t        |      }g }	 t        |      }| D ](  } |||      s|j                  |       t        |      }* 	 |S # t        $ r Y |S w xY w)z
    Two-pointer conditional filter.
    e.g. _filter_iter(insts, sorted_offsets, lambda i, o: i.offset == o)
    returns the instructions with offsets in sorted_offsets
    )iterrF   r-   StopIteration)r   r   r   itrescurro   s          r.   _filter_iterr     sl     
bBC2h 	CC~

32h	 J  Js   A
 A
 
	AAtupc                     g }t        |       |j                  d | D               |j                  t        t        |       d             |S )Nc              3   2   K   | ]  }t        |        y wrN   )r   )r?   ro   s     r.   rB   z'_load_tuple_and_call.<locals>.<genexpr>&  s     7C"3'7s   F)r/   rl   r   rm   )r   r    s     r.   _load_tuple_and_callr   #  s>    !Eu	LL7377	LL%c#h67Lr0   c            !          e Zd Z e       Z e       Zedej                  de	de	de
dej                  f
d       Zedej                  de	de	de	dee	d	f   d
e	deed	f   deed	f   deed	f   dedeee	ee
d	f   f   d	f   deeeee
d	f   f   d	f   dee	d	f   deej                     dedej                  f d       Zedeee
f   dee   fd       Zedej                  de	de	de	dee	d	f   de
dej                  fd       Zy)ContinueExecutionCacher   linenoinit_offsetkeyr!   c                     || j                   vri | j                   |<   t        |      }|| j                   |   vr% | j                  |||g| | j                   |   |<   | j                   |   |   S rN   )cacher   generate)clsr   r   r   r   s        r.   lookupzContinueExecutionCache.lookup/  so     syy  CIIdOCjciio%#/3<<fk#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                    	
 J |j                   t        t        z  t        z  t        z  z  rJ |j                   t
        z  sJ |t        j                  v r j                  ||	
      S t        j                  dk\  t        |      dt        t           dt        t        t         f   dd f 
	fd}t#        ||      \  }}t        j                  |<   |S )Nr#   r   rV   r!   c           
         t        j                  |       #_        ddgt        %      D cg c]  }d| 	 c}z  j	                  fdD               t        |d   xs g       t        |d   xs g       z   }t        t        |            }t         d|d    d	" |d<   !rV|d
   j                  dd      }t        |      dk(  r	|d   |d
<   n)t        |      dk(  sJ |\  }}| dt         d| d	" |d
<   "|d<   d|d<   ||d<   t              |d<   d|d<   d|d<   t        D cg c]	  }|vs| c}z   |d   D cg c]	  }|vs| c}z   t        gz         |d<   |d   t        t        z   z  |d<   t        (fd| D              }g }	!rC|r%|	j                  t        dt        |                   |	j                  t        dd             |	j	                  t        dd      t        dt              g       g }
*D ci c]  }|j                   | }}t#        *      D ci c]  \  }}|j                   )|    }}}| D ci c]  }|j$                  | }}i }d}d}t'        +      }t        %t        &      z         D ]  }|t        &      k  r(&|   |k(  r |	j                  t        d             |dz  }nG|	j                  t        d d|               r!||v r|	j	                  t)        ||                |dz  }||v s|j+                  |      } |||
      \  }}|	j	                  |       !s|j+                  |      }||   }#j,                  j                  |       |||<    !r#t/        t1        #j,                              #_        |rJ  r\D ]W  \  }}|	j                  t        d |             |	j	                  t)        |             |	j                  t        d|             Y rIt2        j4                  d!k\  sJ D ]/  }|vsJ |	j	                  t        d      t        d|      g       1 $r@|	j	                  g t7        t        d d      t        dd"      t9               g      t        d d      t        dd"      t        d#      t        d d      t        d d      t        d$d      t        d d      t        dd"      t9               t        d%d      t        d d      t        dd"      t        d#      t        d&d      t        d&d      t        dd'      t        dt              t;        d'd'             'rH|	j                  t        d(             n-|	j	                  t        dd'      t        dt              g       |	j                  t=        |             | D ]?  }|j$                  |j$                  k(  r n$d |_        t2        j4                  d)k\  s9d |_         A |
r1|	j	                  |
       |	j	                  jC                  |             |rY!sJ | D ]P  }|jD                  s|jD                  jF                  |v s)||jD                  jF                     |jD                  _#        R |	| z   | d d  y c c}w c c}w c c}w c c}w c c}}w c c}w )*N__nested_resume_fns__nested_frame_values___stackc              3   ,   K   | ]  }|vs|  y wrN   rx   )r?   vargss     r.   rB   zBContinueExecutionCache.generate.<locals>.update.<locals>.<genexpr>u  s     =aq}=s   	co_cellvarsco_freevars_co_name_at_co_qualname.r   )maxsplitr   co_firstlinenorx   co_argcountr   co_posonlyargcountco_kwonlyargcountra   co_flagsc              3   B   K   | ]  }|j                   k(  s|  y wrN   offset)r?   r@   r   s     r.   rB   zBContinueExecutionCache.generate.<locals>.update.<locals>.<genexpr>  s     OQXX5N!O   COPY_FREE_VARSr)   RESUME
LOAD_CONSTTrg   rf   r&   r9   )r$      DELETE_SUBSCR
BUILD_LISTLIST_EXTENDDELETE_FASTFr6   r#   )$copydeepcopyr   rangerl   r   sortedTORCH_DYNAMO_RESUME_IN_PREFIXrsplitrm   "IS_TRACING_RESUME_PROLOGUE_VARNAME
CO_VARARGSCO_VARKEYWORDSrF   r-   r   r2   rG   r   r   r   popr   r   reversedr+   r,   r	   r   r   r   starts_line	positionsunreachable_codesrD   target),r   rV   r@   freevarsqualified_pathmodule_namer   r   r   prefixrW   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_targetrq   valsr   r   r   r   r   r   is_py311_plusr   metar   r   r   r   r   r   r   r   s,                              @r.   updatez/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'*2L'*-d)L'12L-.01L,-*/+=q}1=>*=9KQd]1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;<BR^^R'<E< 'y1#Ar  7 ::# # =IIDdkk4/INI %'!GF#N36C
O34 L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>-L0  9=TBBC95 9 #"3 QJD$MM"4["NOMM"6t"<=MM"4\$"OPQ ''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/   Z80	Z=
:Z=
		[
[
[4[[)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   z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   rV   c                 2    t        d      t        dd      gS )zACodegen a `raise None` to make analysis work for unreachable codeNRAISE_VARARGSr   r)   )r   r   )rV   s    r.   r   z(ContinueExecutionCache.unreachable_codesS  s      d#A6
 	
r0   r   c                    t         j                     dt        dt        ffd} ||      } ||      }	|	dkD  sJ d       t        j                  dk\  rn||	fj
                  vrGi xj
                  <   dt        t           dt        t        t        f   dd	ffd
}
t        |
       t        fdD              t        j                  j                  |||	g| S )a>  
        This handles the case of generating a resume into code generated
        to resume something else.  We want to always generate starting
        from the original code object so that if control flow paths
        converge we only generated 1 resume function (rather than 2^n
        resume functions).
        
cur_offsetr!   c                 |     ddt         t           dt        t        t        f   dd f fd}t        |       S )Nr   r   rV   r!   c           	      0   fd| D        \  t        fdt        t        |       t        j                              D              }|sy t	        |      dk(  sJ |d   }j
                  |j
                  k(  sJ |j                  J |j                  y )Nc              3   B   K   | ]  }|j                   k(  s|  y wrN   r   )r?   r@   r  s     r.   rB   zContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_orig_offset.<locals>.find_orig_offset_transform.<locals>.<genexpr>x  s     O1J8NQOr   c              3   0   K   | ]  \  }}|u r|  y wrN   rx   )r?   i1i2r   s      r.   rB   zContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_orig_offset.<locals>.find_orig_offset_transform.<locals>.<genexpr>z  s&      )B V|	 )s   r   r   )r   zipr   r   rm   opcoder   )r   rV   new_target_tuple
new_targetr   r  r   orig_offsets       @r.   find_orig_offset_transformz{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_offsetzWContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_orig_offsetq  sE    K0";/0?CCH~006 "$(BCr0   r   z>resume instruction not found in original code - this is a bug.r#   r   rV   Nc           
        
 g }| D ]F  }t        |      t        j                        k(  r n#|j                  dk(  s6|j                  |       H t	        |j                        D ]"  \  }}|t        t        |j                        <   $ |rt        t        |d   j                        nd
t        
fdD              }t        | |d       }t        t        t	        t        |       t        j                              t        |      d             }t	        ||      D ]!  \  }}	|d   j                  |	j                  <   # y )Nr|   r   c              3   .   K   | ]  }|kD  s	|  y wrN   rx   )r?   ncur_start_offsets     r.   rB   zmContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<genexpr>  s      .aBR>R.s   
c                      | j                   |k(  S rN   r   )rA   os     r.   <lambda>zlContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<lambda>  s    WXHX r0   c                     | d   |u S )Nr   rx   )v1v2s     r.   r  zlContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<lambda>  s    2a5B; r0   r   )rm   r   r=   r-   r  r   r   r   r   r   r   r   )r   rV   prefix_blocksrA   r  cur_inst_offsetstargetsorig_targetsorigr   r  r   r   r   s             @r.   remap_block_offsetszZContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets  sX    8:M , 
7
 }- AA2  ";;/9)006
7 $'%t'L'L$ Na MN1$sDKK2HIN @MS-"3":":;RT % (. .#:. ($ +$&68XG $,$ 6ARAR8ST$W-6$L &)w%? O	c@DQ1#**=Or0   c              3   B   K   | ]  }j                      |     y wrN   )r   )r?   r  r   
offset_keys     r.   rB   zPContinueExecutionCache.generate_based_on_original_code_object.<locals>.<genexpr>  s)      , ..z:1=,s   )r   r  r   r+   r,   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r  orig_init_offsetorig_resume_offsetr(  r   r   r*  s    `   `     @@@r.   r  z=ContinueExecutionCache.generate_based_on_original_code_object[  s0   $ (>'U'U(
	 	 	B ,K8 .m<!B& 	
L	
& w&
 +,>?J !?!?? )D,J,J-
1O"&{"31OCGS>1O1Of &d,?@ ', ,0, '# &,,II#
 
 	
r0   N)r   r   r   r   r   r  classmethodr   r   r   r   r   r   r   rT   boolr   staticmethodr   r   r   r   r  rx   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   rN   )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   rK   rQ   	dataclassrT   r   r.  r   r   r   rx   r0   r.   <module>r:     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   