
    ɯwgK                     2   d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZm	Z	 d dl
ZddlmZ ddlmZmZmZmZmZmZmZmZmZ ddlmZ ddlmZmZ ddlmZmZ dd	lm Z  dd
l!m"Z" ddl#m$Z$m%Z%m&Z&m'Z' ddl(m)Z) ejT                   G d d             Z+ G d d      Z,y)    N)CounterDictListOptional   )utils)	add_push_nulladd_push_null_call_function_excreate_call_functioncreate_call_methodcreate_dup_topcreate_instructioncreate_load_methodcreate_rot_nInstruction)unimplemented)
AttrSourceSource)is_safe_constantrot_n_helper)VariableTracker)NNModuleVariable)NumpyNdarrayVariableSymNodeVariableTensorVariableUnspecializedPythonVariable)TensorWithTFOverrideVariablec                   "    e Zd ZU eed<   eed<   y)GraphOutputEntryindexvariableN)__name__
__module____qualname__int__annotations__r        Z/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/torch/_dynamo/codegen.pyr   r   %   s    Jr(   r   c                      e Zd ZdZ	 	 	 	 d5deej                  j                     dee   ddfdZ	ddd	Z
d
 Zd Zd6dZd7dZd Zd Zd Zd Zd Zd Zd Zd Zdee   fdZdefdZdefdZdefdZd6defdZdefdZdefdZeZ d Z!d Z"defdZ#d  Z$d! Z%defd"Z&d# Z'd8d$Z(d% Z)d& Z*d' Z+d(e,d)e-fd*Z.d+ Z/d, Z0	 d8d-ed.e1jd                  d)e-fd/Z3defd0Z4d-eddfd1Z5d9d2Z6dee   fd3Z7defd4Z8y):	PyCodegenz<
    Helper class uses for constructing Python bytecode
    Nrootgraph_output_varreturnc                    || _         d | _        t        j                         | _        i | _        g | _        |xs i | _        || _        || _	        | j                  j                  j                  | _        | j                  j                  | _        | j                  j                  j                  | _        d| _        d| _        y )NFT)r,   top_of_stackcollectionsr   usesgraph_outputs_outputtempvarstxr-   outputcode_optionscell_and_freevarsnew_var mutable_side_effects_from_sourcevalue_from_source)selfr6   r,   r-   r5   s        r)   __init__zPyCodegen.__init__0   s     	7;.9.A.A.C	:<*, B 0 GGNN77!%!:!:ww~~--05-'+r(   T)r<   c                    | j                   }d| _         | j                  }| xj                  |z  c_        	 | j                  |       || _         || _        y # || _         || _        w xY w)NT)r;   r<   foreach)r=   stack_valuesr<   priorprevs        r)   restore_stackzPyCodegen.restore_stackE   sg    5504-%%"33	*LL&49D1%)D" 5:D1%)D"s   A A&c                 p    | j                   j                         D cg c]  }|j                   c}S c c}w N)r3   valuesr!   )r=   xs     r)   graph_output_varszPyCodegen.graph_output_varsP   s)    $($6$6$=$=$?@q

@@@s   3c                 >    |j                  |       }|
J d|        y )Nzreconstruct!=None )reconstruct)r=   valueress      r)   call_reconstructzPyCodegen.call_reconstructS   s)    %{8088{r(   c                    t        | j                        }t        j                  dk  r| j	                           |        | j                  |d }| j                  |d= |r%| j                  j                  t        |             n$| j                  j                  t        |             t        j                  dk\  r| j	                          yy)a  
        `gen_fn` generates instructions via PyCodegen methods
        that push a single callable to the stack.

        `add_push_null` pushes a NULL to the stack before or after the
        instructions generated by `gen_fn`, depending on Python version.

        Will attempt to use the NULL push bit for instructions
        with such bits (LOAD_GLOBAL 3.11+, LOAD_ATTR 3.12+, LOAD_SUPER_ATTR).
              N)lenr4   sysversion_info	clear_tosextendr
   r	   )r=   gen_fncall_function_exold_lenadded_instss        r)   r	   zPyCodegen.add_push_nullW   s     dll#g% NNll78,LL"LL >{ KLLLk :;w&NN 'r(   c                    	 t        |t              r" j                  |        j                          yt        |t              sJ  j
                  	 j                   j                  |u r|r	j                  t                      y j                  r9ddlm} t        |j                  |      r  |j                  j                         y|r|j                  rW|j                   j                  v r?	j                   j!                   j                  |j                                  | _        y j                  j#                  |      5	j                   j!                   j                  |                | _        y|j                  1|r/ j$                  r# j                  |j                         | _        y|j'                         rOt)        |j+                               r6	j                   j-                  |j+                                      | _        yt        |t.              r j1                  |       j3                   fd        j5                     j6                         	j                   j9                  |j;                   j<                        d             	j?                  tA        dd             | _        yt        |tB              r|jE                         tF        k(  r| j<                  jH                  sf j1                  |jK                   j<                              	 fd	} j3                  |       	j?                  tA        d
d             | _        yt        |tL        tB        tN        tP        f      r j1                  |      t        |tP              rU j3                   fd        j5                     j6                         	j?                  tA        dd             | _        yt        |tN              rH|jR                  r<	 fd} j3                  |       	j?                  tA        d
d             | _        y j5                     j6                         | _        yt        |tT              r|jV                  jY                  d      }|d
    jZ                  d   v r)	j                   j!                  |d
                |dd }n8 j\                  J 	j                   j_                   j\                               |D ]"  }	j                   ja                  |             $ | _        y jb                  |xx   dz  cc<   	  j                  |       |rB| j                  v r4 j
                  j                  t                       ji                  |       | _        y# td        $ r tg        d|        Y ew xY w)z:Generate code such that top-of-stack (TOS) is set to valueNr   )MutableSideEffectsc                  D     j                  t        j                  d      S )Nto_subclassload_import_fromr   r"   r=   s   r)   <lambda>z$PyCodegen.__call__.<locals>.<lambda>   s    --ennmL r(   Tadd   Fc                      j                      j                         j                  j                  d             y Nitemload_graph_outputr    appendcreate_load_attrr3   graph_outputs_keyr7   r=   s   r)   rX   z"PyCodegen.__call__.<locals>.gen_fn   s4    &&}5F'G'M'MNd33F;<r(   r   c                  D     j                  t        j                  d      S )Nto_numpy_helperr`   rb   s   r)   rc   z$PyCodegen.__call__.<locals>.<lambda>   s    D11%..BST r(   c                      j                      j                         j                  j                  d             y rh   rj   rn   s   r)   rX   z"PyCodegen.__call__.<locals>.gen_fn   s4    **=9J+K+Q+QRMM$"7"7"?@r(   .co_varnameszreconstruct: )5
isinstancer   rN   rV   r   r4   r3   r0   rl   r   r;   side_effectsr]   mutable_localsourcer5   create_loadgetr<   is_python_constantr   as_python_constantcreate_load_constr   add_graph_outputr	   rk   r    create_load_globalglobal_mangled_class_namer6   rW   r   r   python_typefloatexport	as_tensorr   r   r   need_unwrapr   
module_keysplitr8   r,   create_load_outputrm   r2   NotImplementedErrorr   	add_cache)
r=   rL   allow_cacher]   rX   partspartr3   ro   r7   s
   `      @@@r)   __call__zPyCodegen.__call__t   s   eV$!!%(NN%111**%+MM.*+00
 9%--/ABU((//0""u':':dmm'Kd..t}}U=P=P/QRS$)!}}  '3d..t}}U/CDE$)!<<#8N8N!!%,,/j "i %%',<$$&-
 MM$001I1I1KLMb "a ;< $ 5 5e <L ""=1B#C#I#IJMM''33DGG<$ ( 
 MM.q%89H "E uo.!!#u,GGNN !% 5 5eoodgg6N O= v&MM.q%89` "_ +$	
 !% 5 5e <%!56""T &&}5F'G'M'MN21e<=> "= E#>?EDUDUA ""6*21e<=. "+ &&}5F'G'M'MN* ") /0$$**3/EQx4,,];;d..uQx89ab	yy,,,d55dii@A ;d33D9:; " IIe!7%%e, u5##N$45u%! ' 7eW567s   0W W'&W'c                     t        |j                               }|| j                  vr,t        t	        | j                        |      | j                  |<   |S rF   )idas_proxyr3   r   rS   )r=   rL   ro   s      r)   r~   zPyCodegen.add_graph_output   sP    u~~/0D$6$664DD&&'5D01 ! r(   c                     | j                   }|j                  | j                  | j                               |j                  | j	                  |             |j                  t        d             y )NBINARY_SUBSCR)r4   rl   ry   r-   _create_load_constr   )r=   r    r7   s      r)   rk   zPyCodegen.load_graph_output   sQ    d&&t'<'<=>d--e45(9:r(   c                     | j                         }|| j                  |<   |j                  r|| j                  |j                  <   | j                  j	                  | j                  |             y rF   )r:   r5   rw   r4   rl   create_store)r=   rL   vars      r)   r   zPyCodegen.add_cache   sU    lln"e14DMM%--.D--c23r(   c                 "    |D ]
  } | |        y rF   r'   )r=   itemsis      r)   r@   zPyCodegen.foreach  s     	AG	r(   c                     t        j                  dd|      }| j                  j                  }||v rt	        ||         t	        |      k(  sJ |||<   | j                  |d      gS )zStore value in a new globalz[^a-zA-Z0-9_]+_Trd   )resubr6   	f_globalsr   r   )r=   namerL   r   s       r)   setup_globally_cachedzPyCodegen.setup_globally_cached	  si    vv'd3GG%%	9io&"U)333#IdO''$'788r(   c                     d | _         y rF   )r0   rb   s    r)   rV   zPyCodegen.clear_tos  s
     r(   c                 ~    t        |t              sJ | j                  j                  |       | j	                          y rF   )ru   r   r4   rl   rV   )r=   insts     r)   append_outputzPyCodegen.append_output  s.    $,,,D!r(   c                     t        d |D              sJ | j                  j                  |       | j                          y )Nc              3   <   K   | ]  }t        |t                y wrF   )ru   r   ).0rH   s     r)   	<genexpr>z*PyCodegen.extend_output.<locals>.<genexpr>  s     =!:a-=s   )allr4   rW   rV   )r=   instss     r)   extend_outputzPyCodegen.extend_output  s2    =u====E"r(   c                     | j                   S rF   )r4   rb   s    r)   get_instructionszPyCodegen.get_instructions   s    ||r(   c                     || j                         v rt        d|      S || j                  d   v s
J | d       t        d|      S )N
LOAD_DEREFargvalrt   z missing	LOAD_FASTr9   r   r8   r=   r   s     r)   ry   zPyCodegen.create_load#  sR    4))++%l4@@t((77JD69JJ7!+d;;r(   c                 r    || j                         v sJ t        j                  dk\  rdnd}t        ||      S )NrP   r   LOAD_CLOSUREr   )r9   rT   rU   r   )r=   r   	inst_names      r)   create_load_closurezPyCodegen.create_load_closure)  s:    t--////#&#3#3w#>KN	!)D99r(   c                     || j                         v rt        d|      S || j                  d   v sJ t        d|      S )NSTORE_DEREFr   rt   
STORE_FASTr   r   s     r)   r   zPyCodegen.create_store.  sF    4))++%mDAAt((7777!,t<<r(   c                     |r%| j                   j                  j                  |       || j                  d   v s
J | d       t	        d|      S )Nco_namesz not in co_namesLOAD_GLOBALr   )r6   r7   update_co_namesr8   r   )r=   r   re   s      r)   r   zPyCodegen.create_load_global4  sN    GGNN**40t((44O>N6OO4!-==r(   c                 N    t        |      s
J d|        | j                  |      S )Nzunsafe constant )r   r   r=   rL   s     r)   r}   zPyCodegen.create_load_const:  s.    &B*:5'(BB&&&u--r(   c                     t        d|      S )N
LOAD_CONSTr   r   r   s     r)   r   zPyCodegen._create_load_const>  s    !,u==r(   c                     | j                   j                  j                  |       | j                  t	        |             y rF   )r6   r7   r   r   r   r   s     r)   load_methodzPyCodegen.load_methodC  s,    &&t,-d34r(   c                 8    | j                  t        |             y rF   )r   r   )r=   nargss     r)   call_methodzPyCodegen.call_methodG  s    -e45r(   c                 n    || j                   d   vr| j                   dxx   |fz  cc<   t        d|      S )Nr   	LOAD_ATTRr   r8   r   r   s     r)   rm   zPyCodegen.create_load_attrJ  s:    t((44j)dW4)!+d;;r(   c                 D    | j                  | j                  |             y rF   )r   rm   r   s     r)   	load_attrzPyCodegen.load_attrO  s    40067r(   c                 h    |j                  d      D cg c]  }| j                  |       c}S c c}w )Nrs   )r   rm   )r=   namesr   s      r)   create_load_attrszPyCodegen.create_load_attrsR  s*    8=C8HI%%d+IIIs   /c                 n    || j                   d   vr| j                   dxx   |fz  cc<   t        d|      S )Nr   
STORE_ATTRr   r   r   s     r)   create_store_attrzPyCodegen.create_store_attrU  s:    t((44j)dW4)!,t<<r(   c                 D    | j                  | j                  |             y rF   )r   r   r   s     r)   
store_attrzPyCodegen.store_attrZ  s    411$78r(   c                 x   g }|r~t         j                  dk\  rk|j                  t        | j	                  |d                   |dkD  r9|j                  g | j                  |dz         | j                  |dz                |S |j                  | j	                  |d      g| j                  |dz                |S )z6Load the global fn_name on the stack num_on_stack downrQ      Trd   r   rf   r   )rT   rU   rW   r	   r   rot_n)r=   fn_name	push_nullnum_on_stackr7   s        r)   load_function_namezPyCodegen.load_function_name]  s    ))W4MM-(?(?T(?(RSTaL1$45L1$45  MM++G+>ZZq 01 r(   c                     	 t        |      S # t        $ rO t        d|      | j                  t	        |            gt        d      t        dd      t        d|      cY S w xY w)NBUILD_TUPLEargrf   CALL_FUNCTION_EXr   UNPACK_SEQUENCE)r   AttributeErrorr   r   r   )r=   ns     r)   r   zPyCodegen.rot_nr  sz    
	?" 	 #=a8''Q8 a ##51=	
 ##4!< 	s   
 AA%$A%c                     t         j                  dk\  sJ | j                  d       gt         j                  dk\  rt        dd      fndt	        dd	      t        d
      S )Nr   c                       y rF   r'   r'   r(   r)   rc   z$PyCodegen.pop_null.<locals>.<lambda>  s    r(   rP   SWAPrf   r   r'   r   FPOP_TOP)rT   rU   r   r   r   rb   s    r)   pop_nullzPyCodegen.pop_null  sw     7***##L1


 ##w. $F24

 "!U+

 y)

 
	
r(   c                 8    | j                  t        d             y )Nr   )r   r   rb   s    r)   pop_topzPyCodegen.pop_top  s    -i89r(   r   r   c                 <    | j                  t        ||             y )N)r   )r   r   )r=   r   r   s      r)   call_functionzPyCodegen.call_function  s    /KLr(   c                 6    | j                  t                      y rF   )r   r   rb   s    r)   dup_topzPyCodegen.dup_top  s    >+,r(   c                 D    | j                  | j                  |             y rF   )r   r   )r=   varnames     r)   storezPyCodegen.store  s    4,,W56r(   r   codec                     j                   sJ  j                   fd}|rkt        j                  dk\  rX j	                  |       j                   j                  |dz                j                   j                  |dz                n* |        j                   j                  |dz                 j                          y )Nc                  @   D ]I  } | j                         v sJ t        j                  dk\  rdnd}j                  t	        ||              K j                  t	        dt                           j                  j                               t        j                  dk  r j                  j                               t        j                  dk\  r(j                  t	        d      t	        d	d
      g       y j                  t	        dd
             y )NrP   r   r   r   r   r   r   MAKE_FUNCTIONSET_FUNCTION_ATTRIBUTE   )r9   rT   rU   rl   r   rS   r}   rW   )r   r   r   r   freevarsr7   r=   s     r)   rX   z4PyCodegen.make_function_with_closure.<locals>.gen_fn  s     Id446666#&#3#3w#>KN  03GHI MM,]HNOMM$0067')d44W=>7**?;*+CN 0dKLr(   r   rf   r   )co_freevarsr4   rT   rU   r	   rW   r   rV   )r=   r   r   r   r   rX   r   r7   s   ```   @@r)   make_function_with_closurez$PyCodegen.make_function_with_closure  s     ##x	M 	M* ))W4v&MM$**\A%567MM$**\A%567HMM$**\A%567r(   c                 R   | j                   j                  }|j                  }t        j                  dd|j
                        }|j                  |d      |u r| j                  |d      S d| }| j                   j                  j                  ||      }| j                  |d      S )zT
        Generate a LOAD_GLOBAL instruction to fetch a given python module.
        z^.*[.] NTrd   
___module_)	r6   r7   global_scoper   r   r"   rz   r   install_global_by_id)r=   modr7   r  r   prefixglobal_names          r)   create_load_python_modulez#PyCodegen.create_load_python_module  s     **vviS\\2D$'3.**4T*::dV$ggnn99&#F&&{&==r(   c                      j                   j                  |d              j                  j                  j                  }|D ]`  }|j
                  rA j                   fd        j                  |        j                  t        dd             P j                  |       b  j                  t        t        |      d             y)z2Call the generated code function stored in fn_nameTc                  n     j                   j                  t               j                  d      g      S )Nr   )r   r  torchrm   rb   s   r)   rc   z4PyCodegen.make_call_generated_code.<locals>.<lambda>  s3    D.. ::5A 11+> r(   r   FN)
r   r   r6   r7   	graphargspass_arg_as_tensorr	   rN   r   rS   )r=   r   r  r   s   `   r)   make_call_generated_codez"PyCodegen.make_call_generated_code  s    4227DABGGNN,,	 	+C%%"" %%c*""#75#AB%%c*	+ 	/IFGr(   c                 Z     | t        | j                  j                  |      |             y rF   )r   r6   import_source)r=   module_nameobject_names      r)   ra   zPyCodegen.load_import_from  s     Z--k:KHIr(   c                    t         j                  dk\  rSt        ||      }|d   j                  dk(  sJ |j	                  d| j                  |             t        d|      |d<   |S t         j                  dk\  r]t        ||      }t         j                  dk\  rd}d}nd}d	}||   j                  |k(  sJ t        d
|      }|j	                  ||       |S | j                  |      t        d|      gS )NrP   CALLCALL_KWr   r   )rQ      PRECALLKW_NAMESr   CALL_FUNCTION_KW)rT   rU   r   opnameinsertr}   r   )r=   r   kw_namesr   r7   idxexpected_instkw_names_insts           r)   create_call_function_kwz!PyCodegen.create_call_function_kw  s    w&)%;F":$$...MM"d44X>?+I5AF2JM()%;F7* & )#;%%666.z(KMMM#}-M""8,1u=
 	
r(   c                     t        d|      S )NDELETE_FASTr   r   r   s     r)   create_deletezPyCodegen.create_delete  s    !->>r(   )NNNN)F)T)r   )r.   N)9r"   r#   r$   __doc__r   r
  nnModulestrr>   rD   rI   rN   r	   r   r~   rk   r   r@   r   rV   r   r   r   r   r   ry   r   r   r   r}   r   r   r   r   rm   r   r   r   r   r   r   r   r   r%   boolr   r   r   typesCodeTyper   r  r  ra   r!  r$  r'   r(   r)   r+   r+   +   s    *.*., uxx', #3-	, 
,* @D 	*A9:z"x!;49!

${"3 <; <:; :
=K =>[ >.+ .>; > ,56< <
8J= =
9*
 :M3 M4 M-7 QR##"'..#=A#J> >H H H,J
T+EV 
0?k ?r(   r+   )-r1   dataclassesr   rT   r*  typingr   r   r   r   torch.nnr
  r   r   bytecode_transformationr	   r
   r   r   r   r   r   r   r   excr   rx   r   r   r   r   variables.baser   variables.nn_moduler   variables.tensorr   r   r   r   variables.torch_functionr   	dataclassr   r+   r'   r(   r)   <module>r6     s{      	 
  0 0  
 
 
  & 1 + 1  C   
T? T?r(   