
    Ae6                         d dl mZ d dlZd dlmZ ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
 dd	lmZ d
 Zd Zd Zd Zd Zd ZddZd Zd Zd ZddZddZd Zd Zd ZddZi ZddZy)     )absolute_importN)time   )Errors)
DebugFlags)Options)CompileErrorInternalError
AbortError)Namingc                 8    t        | j                                | S N)printdump)ts    8lib/python3.12/site-packages/Cython/Compiler/Pipeline.pydumptreer      s    	!&&(OH    c                 B    t         j                  dk7  rt        d      | S )Nr   zpipeline break)r   
num_errorsr   )nodes    r   abort_on_errorsr      s!    A)**Kr   c                       fd}|S )Nc                    | j                   }| j                  }|ddf}t        j                  dc}t        _        j	                  ||d      }|t        _        j                  ||d|      }| |_        ||_        d|_        |S )Nr   r   F)posneed_pxdpxdfull_module_name)	source_descr   r   cimport_from_pyxfind_moduleparsecompilation_sourcescopeis_pxd)compsrcr    r   initial_possaved_cimport_from_pyxr%   treecontexts          r   r#   z"parse_stage_factory.<locals>.parse   s    ))"33"Aq);B;S;SUZ8 8##$4KTU#V#9 }}[%qM]}^")
r    )r+   r#   s   ` r   parse_stage_factoryr-      s     Lr   c                       fd}|S )Nc                 N    j                  | d      }|_        d|_        |S )NTr   )r#   r%   r&   )r    r*   r+   module_namer%   s     r   r#   z&parse_pxd_stage_factory.<locals>.parse*   s2    }}[%T.9  ;
r   r,   )r+   r%   r0   r#   s   ``` r   parse_pxd_stage_factoryr1   )   s     Lr   c                       fd}|S )Nc                 N    | j                         | j                  _        S r   )process_implementationr$   )module_nodeoptionsresults    r   generate_pyx_code_stagez@generate_pyx_code_stage_factory.<locals>.generate_pyx_code_stage3   s&    **7F;$/$B$B!r   r,   )r6   r7   r8   s   `` r   generate_pyx_code_stage_factoryr9   2   s     #"r   c                       fd}|S )Nc                 v    j                   j                         D ]  \  }\  }}| j                  ||        | S r   )pxdsitemsmerge_in)r5   namestatlistnoder%   r+   s       r   inject_pxd_code_stagez<inject_pxd_code_stage_factory.<locals>.inject_pxd_code_stage;   s?    +2<<+=+=+? 	6'D'<  u5	6r   r,   )r+   rA   s   ` r   inject_pxd_code_stage_factoryrB   :   s     ! r   c                    |
t               }| j                  j                         D ]  }||v r|j                  |       |j                  rT|j
                  rH|j                  |j
                         |j
                  j                  D ]  }|j                  |        y|j                  st        |j                  ||        y r   )
setentriesvaluesaddusedutility_code_definitionuse_utility_coderequires	as_moduleuse_utility_code_definitions)r%   targetseenentryrequired_utilitys        r   rM   rM   B   s    |u%%' 
HD=::%77##E$A$AB$)$A$A$J$J : ''(89:__(&$G
Hr   c                     i fd| D ]
  } |        t        j                         d       D cg c]  \  }}|	 c}}S c c}}w )Nc           	          | vrNd| <   t              }dt        | j                  xs dD cg c]
  } |       c}xs dg      z   |dz  z   | <   |    S c c}w )Nr   r   r,   g:0yE>)lenminrK   )utilcodeoriginal_orderdepget_rankrankss      r   rZ   z$sort_utility_codes.<locals>.get_rankU   sp    5 E(O ZN#@Q@Q@WUW&Xx}&X&`]_\`"aadruydyyE(OX 'Ys   A
c                     | d   S )Nr   r,   )kvs    r   <lambda>z$sort_utility_codes.<locals>.<lambda>]   s    RPQU r   )key)sortedr=   )	utilcodesrW   _rZ   r[   s      @@r   sort_utility_codesrc   S   sL    E  (.u{{}BR(ST1HTTTs   A	c                     i | D ]  }||<   	 fd}| D ]+  }|j                   xs dD cg c]
  } ||       c}|_         - y c c}w )Nc                 $    | v r|    S | | <   | S r   r,   )rY   depss    r   	unify_depz!normalize_deps.<locals>.unify_depe   s"    $;9DIJr   r,   )rK   )ra   rW   rg   rY   rf   s       @r   normalize_depsrh   `   s]    D "!X"  P7?7H7H7NBOYs^OPOs   Ac                       fd}|S )Nc                    | j                          t        j                  | j                         t	        | j                  j
                        | j                  _        t        | j                  j
                         g }| j                  j
                  D ]  }||v r|j                  |       |j                  rT|j                  D ]E  }||vs|| j                  j
                  vs!| j                  j
                  j                  |       G |j                  j                        }|s| j                  |j                  |j                  d        | S )N)cython_scopeT)merge_scope)prepare_utility_coderM   rk   r%   rc   utility_code_listrh   appendrK   get_treer>   body)r5   addedrW   rY   r*   r+   s        r   inject_utility_code_stagezDinject_utility_code_stage_factory.<locals>.inject_utility_code_stageq   s+   ((*$W%9%9;;L;LM.@ARARAdAd.e+{((::; $));; 
	NH5 LL"  #,, HC%'C{7H7H7Z7Z,Z#));;BB3GH $$'2F2F$GD$$TYY

$M
	N r   r,   )r+   rs   s   ` r   !inject_utility_code_stage_factoryrt   p   s    ( %$r   c                 j   |dv sJ ddl m} ddlm}m}m}m} ddlm}m}	m	}
 ddlm
}m} ddlm}m}m} ddlm}m}m} dd	lm}m} dd
lm} ddlm}m} ddlm}m} ddlm}m} ddlm} ddlm} ddl m!} ddl"m#}m$} m%}! ddl"m&}"m'}# ddl"m(}$ ddl"m)}%m*}& ddl"m+}' ddl"m,}( ddl-m.}) ddl/m0}*m1}+ |dk(  r|+}, ||       }-n|*},d }-|dk(  r	 ||       }.nd }.g  ||        ||       |- |        || | jd                         ||        ||        ||        ||       |. ||        |%        |        ||        ||        |	        |
|        ||        ||        |"|        ||        ||        ||        ||        ||        |)|       |, |$|        ||        ||        ||        |!|        | |        |#|        ||        ||        |(|        |'        |&|        |       }/g }0|/D ]"  }1|1jf                  |vs|0ji                  |1       $ |0S )N)pyxpyr   r   	PrintTree)WithTransformNormalizeTree	PostParsePxdPostParse)ForwardDeclareTypesInjectGilHandlingAnalyseDeclarationsTransform)AnalyseExpressionsTransformFindInvalidUseOfFusedTypes)CreateClosureClassesMarkClosureVisitorDecoratorTransform)TrackNumpyAttributesInterpretCompilerDirectivesTransformBuiltinMethods)ExpandInplaceOperatorsParallelRangeTransform) CalculateQualifiedNamesTransform)MarkParallelAssignmentsMarkOverflowingArithmetic)AdjustDefByDirectivesAlignFunctionDefinitions)RemoveUnreachableCodeGilCheck)ControlFlowAnalysis)AutoTestDictTransform)EmbedSignature)FlattenInListTransformSwitchTransformIterationTransform)EarlyReplaceBuiltinCallsOptimizeBuiltinCalls)InlineDefNodeCalls)ConstantFoldingFinalOptimizePhase)DropRefcountingTransform)ConsolidateOverflowCheck)IntroduceBufferAuxiliaryVars)check_c_declarationscheck_c_declarations_pxdr   rw   )5Visitorry   ParseTreeTransformsrz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   TypeInferencer   r   r   r   r   r   FlowControlr   AnalysedTreeTransformsr   AutoDocTransformsr   Optimizer   r   r   r   r   r   r   r   r   r   Bufferr   
ModuleNoder   r   compiler_directives	__class__ro   )2r+   modeexclude_classesry   rz   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   r   r   r   r   r   r   r   r   r   r   r   r   r   r   _check_c_declarations_specific_post_parse_align_function_definitionsstagesfiltered_stagesss2                                                     r   create_pipeliner      s1   '''"ZZii\aaooSEQTD0=1UUH,=224J u} 8+G4 4#t|&>w&G#&*#
*
g*
'*
 	*
 		*

 	$GW-H-HI*
 	w'*
 	g&*
 	g*
 	7#*
 	$*
 	g&*
 	*
 	 *
 	7#*
 	G$*
  	!*
" 	%W-#*
$ 	g&%*
& 	w'*
( 	!))*
* 	 (+*
, 	 (-*
. 	G$/*
0 	g&1*
4 	"'*5*
6 	%W-7*
8 	9*
: 	7#;*
< 	$G,=*
> 	#7+?*
@ 	w'A*
B 	7#C*
D 	 E*
F 	W%G*
H 	W%I*
J 	)1K*
L 	!)M*
N 	!"O*
P 	7#Q*
R 	
S*
FV O &;;o-""1%& r   c                    |rd}nd}g }|j                   rddlm} |j                   |              |j                  r8ddlm} ddlm}	 |j                  |j                        | _         |	| ||      g}
ng }
t        t        j                  t        |       gt!        | ||      |t#        |       t%        |       t&        g|
t)        ||      g            S )	Nrw   rv      )TreeAssertVisitor)DebugWriterr   )DebugTransformr   )evaluate_tree_assertions	TestUtilsr   ro   	gdb_debugDebuggerr   r   r   CythonDebugWriter
output_dirgdb_debug_outputwriterlist	itertoolschainr-   r   rB   rt   r   r9   )r+   r6   r7   rw   r   r   test_supportr   r   r   debug_transforms              r   create_pyx_pipeliner      s    	L''1-/0*7)4)F)F* &)'7FCD		W	%&G	&w	/	*7	3		 		(&	9:< = =r   c                 V    ddl m} t        | ||      gt        | d      z    |       gz   S )Nr   )ExtractPxdCoder   )CodeGenerationr   r1   r   )r+   r%   r0   r   s       r   create_pxd_pipeliner     s>    .
 	 <
GU+, 	/

 
r   c                      t        | ||d      S )NT)rw   )r   )r+   r6   r7   s      r   create_py_pipeliner     s    wDAAr   c           
          ddl m}m}m}m} ddlm}m} ddlm	 g }t        | | j                  ||||||g      }	|	D ]!  }
|j                  |
       t        |
|      s! n fd}|j                  |       |S )Nr   )r   r   rz   r   )r   r   )StatListNoder   c                    | j                   j                  j                         D ]y  }|j                  rd|_        |j
                  |j                  k(  s1|j                  dk7  sA|j                   j                  t        j                  |j
                        |_        {  | j                  g       | j                   fS )Nr   extern)stats)r%   rE   rF   in_cincludedefined_in_pxdr?   cname
visibilitymangler   func_prefixr   )rootrP   r   s     r   fake_pxdz,create_pyx_as_pxd_pipeline.<locals>.fake_pxd$  s    ZZ''..0 	UE$$'($::,1A1AX1M"'++"4"4V5G5G"TEK	U DHHB/;;r   )r   r   r   rz   r   r   r   r   Nodesr   r   r6   ro   
isinstance)r+   r7   r   r   rz   r   r   r   pipelinepyx_pipelinestager   r   s               @r   create_pyx_as_pxd_pipeliner     s    H HA#H&w+C+=+:+A+88-.L  e9:	
< OOHOr   c                     |s|sJ |xs |}t        |       D ]  \  }}t        ||      s n |rdz  }| d |gz   | |d z   S )z
    Insert a new transform into the pipeline after or before an instance of
    the given class. e.g.

        pipeline = insert_into_pipeline(pipeline, transform,
                                        after=AnalyseDeclarationsTransform)
    r   N)	enumerater   )r   	transformbeforeafterclsir   s          r   insert_into_pipeliner   /  sf     U
/EC(# 1a 	QBQ<9+%44r   c                    ddl m} t        j                  rt	               j                         nd }d }d }|}	 	 | D ]  }||st        ||      rt        j                  rBt               }	t        d|z         t        |dt        |      j                        }
	 t        |
   } |||      }t        j                  st        dt               	z
  z          	 ||fS # t        $ r  t        d|
z  |       ||
   x}t        |
<   Y bw xY w# t        $ r#}t!        j"                  |d	       |}Y d }~Wd }~ww xY w# t$        $ r#}t         j&                  d
k(  r |}Y d }~||fS d }~wt(        $ r}|}Y d }~||fS d }~ww xY w)Nr   rx   c                      | |      S r   r,   )phasedatas     r   runzrun_pipeline.<locals>.runN  s    T{r   zEntering pipeline phase %r__name__z'def %s(phase, data): return phase(data)z    %.3f secondsF)	use_stackr   )r   ry   r   debug_verbose_pipelineglobalscopyr   r   r   getattrtyper   _pipeline_entry_pointsKeyErrorexecr	   r   report_errorr
   r   r   )r   source	printtreery   exec_nsr   errorr   r   r   
phase_nameerrs               r   run_pipeliner   J  s   "","C"CginnG ED	! A$$E9)E !88 F:UBC%,UJU@T@T%U
["8"DC ud+D!880DFQJ?@!A8 4=#  ( [ !JZ!WY`aGNzGZZC"8"D[  	u5E	  ! 4=  4=sx   D	 AD	 	C#D	 =D	 D8 &DD	 DD	 		D5D0+D8 0D55D8 8	E:EE:+E55E:r   )r,   )Fr,   )NN)T)
__future__r   r   r    r   r   r   r	   r
   r   r   r   r   r-   r1   r9   rB   rM   rc   rh   rt   r   r   r   r   r   r   r   r   r,   r   r   <module>r     s    &      ; ; 

#!H"
UP %8Xt=:	
B<50  'r   