
    ^jd                       d dl mZ d dlZ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
 e
rd dlZd dlmZ ddlmZ ddlmZmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZm Z   ejB                  e"      Z#ejH                  dd       Z%ejH                  dd       Z&ejN                   G d d             Z(ddZ)ddZ*ddZ+	 	 	 	 	 	 ddZ,	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ-	 	 	 	 	 	 	 	 ddZ.	 	 	 	 	 	 ddZ/y)     )annotationsN)AnyTYPE_CHECKING)Callable   )InstructionTranslatorBase)create_copycreate_dup_topcreate_instructioncreate_swapInstruction	unique_id)	PyCodegen)unimplemented)GraphCompileReasonStackLocalsMetadata)NullVariableUnknownVariablec                 B   t         j                  dk  rt        dt         j                         d	d} t        j                  |       D cg c]  }|j
                   }}t        |      dz
  |ddd   j                  d      z
  }|j                  d      }||| S c c}w )
zNGet the bytecode instructions that precede BUILD_LIST in a list comprehension.      z9comprehension bytecode prefix requires Python 3.12+, got c                 >    t        d      D  cg c]  } |  c} S c c} w Nr   rangeis    r/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_dynamo/comprehension_graph_break.pyfnz._get_comprehension_bytecode_prefix.<locals>.fn-        8$a$$$   	r   NLOAD_FAST_AND_CLEAR
BUILD_LISTreturnz	list[int])sysversion_infoAssertionErrordisget_instructionsopnamelenindex)r    instinsts	start_idxend_idxs        r   "_get_comprehension_bytecode_prefixr4   $   s     '!GHXHXGYZ
 	
% &)%9%9"%=>TT[[>E>E
Qtt!2!23H!IIIkk,'G7## ?s   Bc                    t         j                  dk  rt        dt         j                         dd} dd}dd}dd}dd} ||       } ||      } ||      } ||      }|d   |d	   d
|d   |d	   d
|d   |d	   d
|d   g d
dS )a  Discover bytecode patterns for comprehension result handling.

    Analyzes sample functions to extract the opcode sequences that appear
    after END_FOR for each result disposition (stored, discarded, returned, consumed).

    Returns patterns with:
        - pre_store_ops: opcodes between END_FOR and first STORE_FAST
        - post_store_op: first opcode after all STORE_FASTs (for disambiguation)
    r   z8comprehension result patterns require Python 3.12+, got c                 @    t        d      D  cg c]  } |  }} |S c c} w r   r   )r   results     r   	fn_storedz5_get_comprehension_result_patterns.<locals>.fn_storedH   s#    "1X&!&& '   	c                 @    t        d      D  cg c]  } |  c}  yc c} w r   r   r   s    r   fn_discardedz8_get_comprehension_result_patterns.<locals>.fn_discardedL   s    !Hq 	r9   c                 >    t        d      D  cg c]  } |  c} S c c} w r   r   r   s    r   fn_returnedz7_get_comprehension_result_patterns.<locals>.fn_returnedP   r!   r"   c                 P    t        t        d      D  cg c]  } |  c}       S c c} w r   )sumr   r   s    r   fn_consumedz7_get_comprehension_result_patterns.<locals>.fn_consumedS   s    uQx(!A())(s   	#c                   t        t        j                  | j                              d   d   }g }d}t        j                  |       D ]e  }|r|j
                  r nU|j                  }|s"|j                  |k(  s2|xs t        |j
                        }|j                  |j                         g ||j                  d      dz   d }d}g }|t        |      k  r8||   dk7  r0|j                  ||          |dz  }|t        |      k  r	||   dk7  r0|t        |      k  r$||   dk(  r|dz  }|t        |      k  r	||   dk(  r||t        |      k  r||   fS dfS )zCExtract (pre_store_ops, post_store_op) from comprehension bytecode.r   FEND_FORNr   
STORE_FAST)listr+   findlinestarts__code__r,   starts_line	positionslinenoboolappendr-   r/   r.   )	r    target_liner1   startedinstrposopsidxpre_store_opss	            r   extract_patternz;_get_comprehension_result_patterns.<locals>.extract_patternV   s_   3--bkk:;A>qA))"- 	+E5,,//Cszz[0!<T%*;*;%<U\\*	+ EKK	*Q.01CHnS\!9  S*1HC CHnS\!9 CHnS\!91HC CHnS\!9 #C.c#hBBdBB    r   r   )rR   post_store_op)stored	discardedreturnedconsumedr&   )r'   int)r    zCallable[..., Any]r'   ztuple[list[str], str | None])r(   r)   r*   )	r8   r;   r=   r@   rS   rV   rW   rX   rY   s	            r   "_get_comprehension_result_patternsr[   8   s     '!FsGWGWFXY
 	
%*C4 Y'F-I{+H{+H %+1Iq	J'0|iPQlS&.qkHQKP&.qkBG	 rT   c                  N    e Zd ZU dZded<   ded<   ded<   ded	<   ded
<   ded<   y)ComprehensionAnalysisa9  Metadata about a comprehension's bytecode structure.

    Attributes:
        end_ip: Instruction pointer after all comprehension bytecode
        result_var: Name of result variable, or None if result stays on stack
        result_on_stack: True if result stays on stack (discarded, returned, or in expression)
        iterator_vars: Variables from LOAD_FAST_AND_CLEAR (need restoration)
        walrus_vars: Variables assigned via walrus operator (:=) inside comprehension
        captured_vars: Variables read from outer scope via LOAD_FAST inside comprehension
    rZ   end_ipz
str | None
result_varrJ   result_on_stack	list[str]iterator_varswalrus_varscaptured_varsN)__name__
__module____qualname____doc____annotations__ rT   r   r]   r]   }   s,    	 KrT   r]   c                8   t         j                  dk  rt        dt         j                         | j                  t        d      | j                  dz
  }t	               }| j
                  |t        |      z
  | D cg c]  }|j                   }}||k(  S c c}w )zDetect if we're at the start of a list/dict comprehension in 3.12+.

    In Python 3.12+, comprehensions are inlined with a bytecode pattern that
    precedes BUILD_LIST/BUILD_MAP.
    r   z9comprehension start detection requires Python 3.12+, got $instruction_pointer must not be Noner   )r(   r)   r*   instruction_pointerr4   instructionsr.   r-   )txippatternr0   prefixs        r   _is_comprehension_startrs      s     '!GHXHXGYZ
 	
 
%CDD			!	#B02G&(oob3w<6G"&MNddkkNFNW Os   =Bc                t   t         j                  dk  rt        dt         j                         | j                  t        d      d}t	        | j                  t        | j                              D ]D  }| j                  |   }|j                  dk(  r|dz  }'|j                  dk(  s7|dz  }|dk(  sB|c S  y)	zPFind the instruction pointer of the outermost END_FOR for current comprehension.r   z8comprehension END_FOR search requires Python 3.12+, got rl   r   FOR_ITERr   rB   r#   )r(   r)   r*   rm   r   r.   rn   r-   )ro   nesting_depth	search_ipr0   s       r   _find_comprehension_end_for_iprx      s    
'!FsGWGWFXY
 	
 
%CDDM2113r3GH !	y);;*$QM[[I%QM!  ! rT   c                Z    t         j                  dk  rt        dt         j                          j                  t        d      t	                j                  dz
  }g }g }g }t               }|dz
  }|dk\  r[ j                  |   }|j                  dk(  r"|j                  d|j                         |dz  }n|j                  dv r|dz  }nn|dk\  r[|j                  |       t               }|d	k(  rt        d
ddg        t         fdt        ||      D              }	t        |	dz   |      D ]+  }
 j                  |
   }|j                  dk(  rn|j                  dk(  r_|
dz   |k  rW j                  |
dz      }|j                  dk(  r6|j                  }||vr&||vr"|j!                  |       |j#                  |       |j                  dk(  r|j#                  |j                         |j                  j%                  d      st'        |j                  t(              r|j                  n|j                  f}|D ]  }||vs||vs|j!                  |        . g |dz   }|t+         j                        k  r~ j                  |   j                  dk7  rbj!                   j                  |   j                         |dz  }|t+         j                        k  r j                  |   j                  dk7  rb|}|t+         j                        k  rV j                  |   j                  dk(  r:|dz  }|t+         j                        k  r j                  |   j                  dk(  r:|t+         j                        k  r j                  |   j                  ndd fd}d} |d      r j                  |   j                  }d}nI |d      rd}d}d   d   r|dz   n|}n- |d      sd   d   k(  rd}d}nt        dd d dg        t-        |||||      S )!zDAnalyze comprehension bytecode to determine result handling pattern.r   z2comprehension analysis requires Python 3.12+, got Nrl   r   r   r$   )SWAPGET_ITERr#   z)Comprehension analysis failed: No END_FOR z=Could not find END_FOR instruction in comprehension bytecode.)gb_typecontextexplanationhintsc              3  Z   K   | ]"  }j                   |   j                  d k(  r| $ yw)ru   N)rn   r-   ).0r   ro   s     r   	<genexpr>z)_analyze_comprehension.<locals>.<genexpr>   s0      ??1$$
2 	
s   (+COPYrC   	LOAD_FASTc                B    |    }|d   k(  xr |d   k(  xs |d    S )NrR   rU   rj   )namepatpatternsrU   rR   s     r   matchesz'_analyze_comprehension.<locals>.matches  s=    tnO 44 
S11M_9M5M	
rT   rV   FrW   rU   rX   rY   rR   Tz)Comprehension analysis failed: No matcheszpre_store_ops=z, post_store_op=z8Comprehension does not match any known bytecode pattern.)r^   r_   r`   rb   rc   rd   )r   strr'   rJ   )r(   r)   r*   rm   r[   setrn   r-   insertargvalupdaterx   r   nextr   argrK   add
startswith
isinstancetupler.   r]   )ro   start_iprb   rc   rd   defined_insideiter_scan_ipr0   
end_for_ipfor_iter_ipbody_ip	next_instvar_name	var_namesscan_ipstore_fast_ipr   r_   r`   r   rU   rR   s   `                  @@@r   _analyze_comprehensionr      s6   
'!@AQAQ@RS
 	
 
%CDD13H%%)H!MK!M"uN a<L
!
|,;;//  DKK0AL[[00AL !
 -(/3JR?W		
  x, K q*5 3w' ;;& TXX]w{Z7O!4I</$++=0X[5P&&x0"&&x0 ;;,&t{{+ [[##K0)$++u=DKK>  & 3>1hm6S!((23+34  "M1nG#boo&&OOG$++|;R__W5<<=1	 	#boo&&OOG$++|;
 M 	#boo&&OOG$++|;1 	#boo&&OOG$++|;
 ,3S5I+I ''t 
 "Jx__]3::
		
!)+!6!G'A+W		*1Eo1V V
?$]O3CM?SR		
 !'## rT   c           	        t         j                  dk  rt        dt         j                         | j                  t        d      | j                  dz
  }t	        |       }dt        |j                        z   }t        d| j                         g      }t        j                  d       | j                  j                  | ||      }t        |      D cg c]8  }t        | j                  t        | j                        |z
  |z      t               : }}| j#                  |       |d	   }	t%        | j                  j&                        }
t)        d
 |D              }t        | j                        t        |	j*                        z
  }|
j-                  g t/        ||z   dz         |
j1                  d	      |
j3                                t5        t        |            D ]^  }|
j-                  t7        d             ||   r |
j-                  |
j9                                B|
j-                  t;        dd      g       ` |
j-                  t;        d      g       t=        | ||||||	      \  }}|
j-                  g t/        |dz         |
j1                  d	      |
j3                         t;        dd      t/        |dz         |
j1                  d	      |
j3                         t;        dd             | j?                  |g|g|
       |d	kD  r|dz   dz   }|
j-                  g t/        |      |
j1                  d	      |
j3                         tA               |
j1                  |       |
j1                  d      t;        dd      t;        d      t;        d             |jB                  |jD                  r|jD                  gng z   }i }|D ]\  }tG               | jH                  |<   ||	jJ                  v r|	jJ                  |   ||<   ;t        |	jJ                        |	jJ                  |<   ^ |dz   }|jB                  r1|
j-                  g t/        |      |
j1                  d	      |
j3                                tM        |jB                        D ]  \  }}|
j-                  g t/        d      |
j1                  |dz         |
j3                                ||v r<|
j-                  g t/        d      |
j1                  ||         t;        d             |
j-                  t;        dd      g        |
j-                  t;        d      |
j1                  d	      |
j3                         g       |jN                  r| jQ                  tG                      n|jD                  r|
j-                  g t/        |      |
j1                  d	      |
j3                                |jD                  |v r9|
j-                  |
j1                  ||jD                           t;        d      g       nP|
j-                  g t7        d      t;        dd      t;        d             n|
j-                  t;        d      g       | j                  jS                  |
jU                                | jV                  |jX                     }| j                  jS                  | j[                  ||             d| _        yc c}w )zHandle list/dict comprehension graph break.

    Builds a synthetic function wrapping the comprehension bytecode,
    calls it via codegen_call_resume, then chains into the resume
    function for the post-comprehension code.
    r   z5comprehension graph break requires Python 3.12+, got Nrl   r   comprehension_graph_breakzcomprehension triggered compile)reason
stack_popsr   c              3  &   K   | ]	  }|rd   yw)r   Nrj   )r   ms     r   r   z4_handle_comprehension_graph_break.<locals>.<genexpr>k  s     AaqAs      LIST_APPENDr   POP_TOPr%   BUILD_SLICEDELETE_SUBSCRSTORE_SUBSCR).r(   r)   r*   rm   r   r.   rb   r   frame_summarylogdebugoutputcompile_subgraphr   r   stackr   popnr   root_txr?   stack_null_idxesextend_outputr	   create_load_constcreate_binary_subscrreversedr   pop_nullr   _build_comprehension_fncodegen_call_resumer
   rc   r_   r   symbolic_localslocals_names	enumerater`   pushadd_output_instructionsr,   rn   r^   create_call_resume_at)ro   r0   r   analysisr   r   all_stack_locals_metadatar   stack_pops_null_maskmetacgnonnull_countlive_stack_depthnew_codefn_nameframe_values_posvars_to_passexisting_varsr   fv_depthj
walrus_varresume_insts                          r   !_handle_comprehension_graph_breakr   ?  sT    '!CCDTDTCUV
 	
 
%CDD%%)H%b)HS//00J ;b>N>N>P=QRFII/0 !#		 : :
 !; ! z" 	288CMJ6:;\J 
 GGJ$Q'D	299$$	%B A#7AAM 288}s4+@+@'AA 	
)J6:;	
   #	
 ##%		
 eJ'( I
Q("R[[]+0AFGHI (345
 0
Hg 		
)A-.		
  #		
 ##%		
 |3			

 )A-.		
   #		
 ##%		
 |3		
  H:y"5
 q+a/!3
-.$$Q' '')
   $$m^4 $$T* #=a8 #?3 #9-	
& ''!)!4!4		"L %'M  A'6'88$t(((&*&7&7&AM(#*-d.?.?*@Dh'A  !#H 
X&$$Q' '')	
 'x';';< 	MMAz ^((Q/ ++- ]*  $Q,,]:-FG +>:   "4]"J!KL'	M* 	"9-$$Q''')		
 
!"			
X&$$Q' '')	
 -/((x7J7J)KL&~6  ^&}!< 'y1 	,Y789 II%%b&9&9&;< //(//2KII%%
  .GH "Bs   =[-c                v    ddl m} ddlm} ddlmm t         fd|j                  D              }	ddgt        |	      z   t              D 
cg c]  }
d|
 	 c}
z   t        t        t         j                  j                  xs g       t         j                  j                  xs g       z                j                   j                  n j                  j                   t#        d	 j                  j$                   d
       j&                  j(                  z   j*                  rj*                  gng z   j,                  z   d fd} | j                  |      \  }} ||        j.                  j1                  | j2                         |fS c c}
w )a  Build a synthetic function wrapping comprehension bytecode.

    Uses the same calling convention as resume functions created by
    create_resume / ContinueExecutionCache.generate: the first two args
    are __nested_resume_fns and __nested_frame_values (ignored here),
    followed by stack items and live locals.

    Returns (code, name) where name is the global name for the function.
    r   )transform_code_object)	skip_code)
CO_VARARGSCO_VARKEYWORDSc              3  H   K   | ]  }|j                         vs|  y wN)cell_and_freevars)r   kro   s     r   r   z*_build_comprehension_fn.<locals>.<genexpr>9  s!     U1Qb>R>R>T5TQUs   ""__nested_resume_fns__nested_frame_values___stack__comprehension__at_c           	     B   |d<   t         j                  dk\  r|d<   |d<   d|d<   |d<   t              |d<   d	|d
<   d	|d<   t        D cg c]	  }|vs| c}z         |d<   |d   	
z   z  |d<   g }r%|j	                  t        dt                           |j	                  t        dd	             dz
  }t              D ]F  }|   r|j	                  t        d             #|j	                  t        dd|              |dz  }H t        j                        }g }j                  sOj                  r'|j	                  t        dj                               n|j	                  t        dd              j                  r_j                  D ]  }|j	                  t        d|               |j	                  t        ddt        j                        z                |j	                  t        d             ||z   |z   | d d  y c c}w )Nco_name)r      co_qualnameco_firstlinenorj   co_cellvarsco_freevarsco_argcountr   co_posonlyargcountco_kwonlyargcountco_varnamesco_flagsCOPY_FREE_VARSr   RESUMEr   	PUSH_NULLr   r   )r   
LOAD_CONSTBUILD_TUPLERETURN_VALUE)r(   r)   r.   r   rK   r   r   _copy_comprehension_bytecoder^   r`   r_   rc   )rn   code_optionsvrr   	nonnull_ir   
comp_instsepiloguer   r   r   r   argscomprehension_body_varsr   freevarsrI   r   r   r   r   ro   s            r   r   z'_build_comprehension_fn.<locals>.updateN  s8   ")Yw&*1L')/%&&(]#&.]#&)$i]#-.)*,-()&+6H!!4-AHH'
]# $0
#;'?
 $
Z  %'MM,-=3x=QR(q9: "A%	z" 	A#A&0=>&{Xi[;QR Q		 2"hP
 ')''""&{8;N;NO  2< MN$00 R 2;x PQROO"!C 4 455 	*>:; :-8Qa Is   	H
H
)rn   list[Instruction]r   zdict[str, Any]r'   None)bytecode_transformationr   
eval_framer   resume_executionr   r   r   r   rD   r   sortedf_coder   r   rI   r   r   r   rb   rc   r_   rd   r   install_resume_function_global	f_globals)ro   r   r   r   r   r   r   r   r   argnamesr   r   r   _r   r   r   r   r   r   rI   s   ``````        @@@@@@@r   r   r      s   $ ?%<
 U 1 1UUH	 78
x.	#(#7
8aXaS>
8	9 	 tBII))/R04		8M8M8SQS3TTUH ))/RYYRYY5M5MF*299+<+<*=T&JKG 	


	$,$7$7H R	A 
 
 	! ;9 ;9 ;9z (		6:KHah II,,WhMWi 9s   F6c                    i }g }t        ||      D ]C  }| j                  |   }t        j                  |      }d|_        |||<   |j	                  |       E |D ]2  }|j
                  |j
                  |v s||j
                     |_        4 |S )z@Copy comprehension bytecode instructions, updating jump targets.N)r   rn   copyexn_tab_entryrK   target)ro   r   r^   inst_mapcopied_instsrp   original_instcopied_insts           r   r   r     s     02H&(LHf% )+ii.$(!"-K() $ >)k.@.@H.L!)+*<*<!=K> rT   c                   t         j                  dk\  r|j                  dk(  syt        |       syt	        d | j
                  D              xr^ | j                   xrO | j                   xr@ | j                   xr1 | j                   xr" | j                  j                  j                  du }|r| j                  | j                         }|rD| j                  dk(  r5| j                         }|j!                  |       rt#        | |       y|| _        t'        |       }|dk  rt)        d      | j*                  j-                  |       | xj                  dz  c_        y)	z
    Handle comprehension start for Python 3.12+ BUILD_LIST/BUILD_MAP with argval 0.
    Returns True if a graph break was triggered and the caller should return early.
    r   r   Fc              3  <   K   | ]  }|j                           y wr   )can_restore)r   bs     r   r   z8maybe_setup_comprehension_speculation.<locals>.<genexpr>  s     4AMMO4s   NTz(failed to find END_FOR for comprehensionr   )r(   r)   r   rs   allblock_stack	one_grapherror_on_graph_breakis_tracing_resume_prologueactive_generic_context_managersr   current_tracerparent#_can_speculate_comprehension_nested_comprehension_depth	speculatefailedr   current_speculationrx   r*   _comprehension_end_for_ipsr   )ro   r0   can_speculatespeculationr   s        r   %maybe_setup_comprehension_speculationr&    sH    'DKK1,<"2& 	4R^^44 	4	4'''	4 ---	4 222		4
 II$$++t3  .>>@00A5llnb!-b$7!,/3JA~GHH!!%%j1q rT   )r'   ra   )r'   zdict[str, dict[str, Any]])ro   r   r'   rJ   )ro   r   r'   rZ   )ro   r   r'   r]   )ro   r   r0   r   r'   r   )ro   r   r   r]   r   rZ   r   rZ   r   z
list[bool]r   rZ   r   r   r'   ztuple[types.CodeType, str])ro   r   r   rZ   r^   rZ   r'   r   )ro   r   r0   r   r'   rJ   )0
__future__r   r  dataclassesr+   	functoolsloggingr(   typingr   r   typescollections.abcr   symbolic_convertr   r  r	   r
   r   r   r   r   codegenr   excr   output_graphr   r   variables.miscr   r   	getLoggerre   r   cacher4   r[   	dataclassr]   rs   rx   r   r   r   r   r&  rj   rT   r   <module>r6     sy   "   
   
 % (;    A 9 g! $ $& A AH   (**@F^"!^")4^"	^"Bq!q#q q 	q
 %q q q  qh!-0:=*$!$)4$	$rT   