
    9j`                       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                    t         j                  dk\  s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.      c                 >    t        d      D  cg c]  } |  c} S c c} w Nr   rangeis    g/media/conek/DATA/Code/OCR/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disget_instructionsopnamelenindex)r    instinsts	start_idxend_idxs        r   "_get_comprehension_bytecode_prefixr3   $   s     w&&&% &)%9%9"%=>TT[[>E>E
Qtt!2!23H!IIIkk,'G7## ?s   Bc                     t         j                  dk\  s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   c                 @    t        d      D  cg c]  } |  }} |S c c} w r   r   )r   results     r   	fn_storedz5_get_comprehension_result_patterns.<locals>.fn_storedB   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_discardedF   s    !Hq 	r8   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_returnedJ   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_consumedM   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_liner0   startedinstrposopsidxpre_store_opss	            r   extract_patternz;_get_comprehension_result_patterns.<locals>.extract_patternP   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   )rQ   post_store_op)stored	discardedreturnedconsumedr&   )r'   int)r    zCallable[..., Any]r'   ztuple[list[str], str | None])r(   r)   )	r7   r:   r<   r?   rR   rU   rV   rW   rX   s	            r   "_get_comprehension_result_patternsrZ   5   s     w&&&%*C4 Y'F-I{+H{+H %+1Iq	J'0|iPQlS&.qkHQKP&.qkBG	 rS   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
    rY   end_ipz
str | None
result_varrI   result_on_stack	list[str]iterator_varswalrus_varscaptured_varsN)__name__
__module____qualname____doc____annotations__ rS   r   r\   r\   w   s,    	 KrS   r\   c                    t         j                  dk\  sJ | j                  J | 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   r   )r(   r)   instruction_pointerr3   instructionsr-   r,   )txippatternr/   prefixs        r   _is_comprehension_startrq      s~     w&&&!!---			!	#B02G&(oob3w<6G"&MNddkkNFNW Os   A4c                .   t         j                  dk\  sJ | j                  J 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   r   FOR_ITERr   rA   r#   )r(   r)   rk   r   r-   rl   r,   )rm   nesting_depth	search_ipr/   s       r   _find_comprehension_end_for_iprv      s    w&&&!!---M2113r3GH !	y);;*$QM[[I%QM!  ! rS   c                    t         j                  dk\  sJ  j                  J 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   Nr   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)rs   N)rl   r,   ).0r   rm   s     r   	<genexpr>z)_analyze_comprehension.<locals>.<genexpr>   s0      ??1$$
2 	
s   (+COPYrB   	LOAD_FASTc                B    |    }|d   k(  xr |d   k(  xs |d    S )NrQ   rT   ri   )namepatpatternsrT   rQ   s     r   matchesz'_analyze_comprehension.<locals>.matches	  s=    tnO 44 
S11M_9M5M	
rS   rU   FrV   rT   rW   rX   rQ   Tz)Comprehension analysis failed: No matcheszpre_store_ops=z, post_store_op=z8Comprehension does not match any known bytecode pattern.)r]   r^   r_   ra   rb   rc   )r   strr'   rI   )r(   r)   rk   rZ   setrl   r,   insertargvalupdaterv   r   nextr   argrJ   add
startswith
isinstancetupler-   r\   )rm   start_ipra   rb   rc   defined_insideiter_scan_ipr/   
end_for_ipfor_iter_ipbody_ip	next_instvar_name	var_namesscan_ipstore_fast_ipr   r^   r_   r   rT   rQ   s   `                  @@@r   _analyze_comprehensionr      s   w&&&!!---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		
 !'## rS   c           	        t         j                  dk\  sJ | j                  J | 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         |
j/                  d      |
j1                                t3        t        |            D ]^  }|
j+                  t5        d	             ||   r |
j+                  |
j7                                B|
j+                  t9        d
d      g       ` |
j+                  t9        d      g       t;        | ||||||	      \  }}|
j+                  g t-        |d	z         |
j/                  d      |
j1                         t9        dd      t-        |d	z         |
j/                  d      |
j1                         t9        dd             | j=                  |g|g|
       |dkD  r|dz   dz   }|
j+                  g t-        |      |
j/                  d      |
j1                         t?               |
j/                  |       |
j/                  d      t9        dd	      t9        d      t9        d             |j@                  |jB                  r|jB                  gng z   }i }|D ]\  }tE               | jF                  |<   ||	jH                  v r|	jH                  |   ||<   ;t	        |	jH                        |	jH                  |<   ^ |d	z   }|j@                  r1|
j+                  g t-        |      |
j/                  d      |
j1                                tK        |j@                        D ]  \  }}|
j+                  g t-        d	      |
j/                  |dz         |
j1                                ||v r<|
j+                  g t-        d	      |
j/                  ||         t9        d             |
j+                  t9        d
d      g        |
j+                  t9        d      |
j/                  d      |
j1                         g       |jL                  r| jO                  tE                      n|jB                  r|
j+                  g t-        |      |
j/                  d      |
j1                                |jB                  |v r9|
j+                  |
j/                  ||jB                           t9        d      g       nP|
j+                  g t5        d	      t9        d
d      t9        d             n|
j+                  t9        d      g       | j                  jQ                  |
jS                                | jT                  |jV                     }| j                  jQ                  | jY                  ||             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   Nr   comprehension_graph_breakzcomprehension triggered compile)reason
stack_popsr   c              3  &   K   | ]	  }|rd   yw)r   Nri   )r   ms     r   r   z4_handle_comprehension_graph_break.<locals>.<genexpr>U  s     AaqAs      LIST_APPENDr   POP_TOPr%   BUILD_SLICEDELETE_SUBSCRSTORE_SUBSCR)-r(   r)   rk   r   r-   ra   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
   rb   r^   r   symbolic_localslocals_names	enumerater_   pushadd_output_instructionsr+   rl   r]   create_call_resume_at)rm   r/   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   -  s4    w&&&!!---%%)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   1=[
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   krm   s     r   r   z*_build_comprehension_fn.<locals>.<genexpr>#  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_firstlinenori   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   rJ   r   r   _copy_comprehension_bytecoder]   r_   r^   rb   )rl   code_optionsvrp   	nonnull_ir   
comp_instsepiloguer   r   r   r   argscomprehension_body_varsr   freevarsrH   r   r   r   r   rm   s            r   r   z'_build_comprehension_fn.<locals>.update8  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
)rl   list[Instruction]r   zdict[str, Any]r'   None)bytecode_transformationr   
eval_framer   resume_executionr   r   r   r   rC   r   sortedf_coder   r   rH   r   r   r   ra   rb   r^   rc   r   install_resume_function_global	f_globals)rm   r   r   r   r   r   r   r   r   argnamesr   r   r   _r   r   r   r   r   r   rH   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   rl   copyexn_tab_entryrJ   target)rm   r   r]   inst_mapcopied_instsrn   original_instcopied_insts           r   r   r   ~  s     02H&(LHf% )+ii.$(!"-K() $ >)k.@.@H.L!)+*<*<!=K> rS   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\  sJ | 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   NTr   )r(   r)   r   rq   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_speculationrv   _comprehension_end_for_ipsr   )rm   r/   can_speculatespeculationr   s        r   %maybe_setup_comprehension_speculationr$    sA    'DKK1,<"2& 	4R^^44 	4	4'''	4 ---	4 222		4
 II$$++t3  .>>@00A5llnb!-b$7!,/3J??!!%%j1q rS   )r'   r`   )r'   zdict[str, dict[str, Any]])rm   r   r'   rI   )rm   r   r'   rY   )rm   r   r'   r\   )rm   r   r/   r   r'   r   )rm   r   r   r\   r   rY   r   rY   r   z
list[bool]r   rY   r   r   r'   ztuple[types.CodeType, str])rm   r   r   rY   r]   rY   r'   r   )rm   r   r/   r   r'   rI   )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   	getLoggerrd   r   cacher3   rZ   	dataclassr\   rq   rv   r   r   r   r   r$  ri   rS   r   <module>r4     sw   "   
   
 % (;    A 9 g! $ $  > >B   (""|~Z"!Z")4Z"	Z"zq!q#q q 	q
 %q q q  qh!-0:=*#!#)4#	#rS   