
    hz*                         S SK JrJrJrJr  S SKJr  S SK Jr  S SKJ	r	  S SK
JrJr  S SKJr  S SK Jr   " S S	\5      rS
 r " S S5      r " S S5      rS rS rS rg)   )Nodes	ExprNodes	FusedNodeNaming)error)
PyrexTypes)CythonUtilityCode)TempitaUtilityCodeUtilityCode)TreeVisitor)Symtabc                   .    \ rS rSrSrSrS rS rS rSr	g)_FindCFuncDefNode   zZ
Finds the CFuncDefNode in the tree

The assumption is that there's only one CFuncDefNode
Nc                 J    U R                   (       a  g U R                  U5        g N)
found_nodevisitchildrenselfnodes     P/var/www/fran/franai/venv/lib/python3.13/site-packages/Cython/Compiler/UFuncs.py
visit_Node_FindCFuncDefNode.visit_Node   s    ??t$    c                     Xl         g r   r   r   s     r   visit_CFuncDefNode$_FindCFuncDefNode.visit_CFuncDefNode   s    r   c                 <    U R                  U5        U R                  $ r   )visitr   )r   trees     r   __call___FindCFuncDefNode.__call__!   s    

4r   r   )
__name__
__module____qualname____firstlineno____doc__r   r   r   r#   __static_attributes__ r   r   r   r      s     J%r   r   c                 "    [        5       " U 5      $ r   )r   )r"   s    r   get_cfunc_from_treer-   &   s    t$$r   c                       \ rS rSrSrS rSrg)_ArgumentInfo*   a  
Everything related to defining an input/output argument for a ufunc

type  - PyrexType
type_constant  - str such as "NPY_INT8" representing numpy dtype constants
injected_typename - str representing a name that can be used to look up the type
                    in Cython code
c                 (    Xl         X l        X0l        g r   )typetype_constantinjected_typename)r   r2   r3   r4   s       r   __init___ArgumentInfo.__init__4   s    	*!2r   )r4   r2   r3   N)r%   r&   r'   r(   r)   r5   r*   r+   r   r   r/   r/   *   s    3r   r/   c                   >    \ rS rSrS rS rS rS rS rS r	S r
S	rg
)UFuncConversion:   c                    Xl         UR                  R                  5       U l        SU l        U R                   R                  R
                  R                  U R                  5      (       aU  U =R                  S-  sl        U R                   R                  R
                  R                  U R                  5      (       a  MU  / U l        U R                  5       U l	        U R                  5       U l        g )Nufunc_typename_)r   local_scopeglobal_scoper4   entrycname
startswithinjected_typesget_in_type_infoin_definitionsget_out_type_infoout_definitionsr   s     r   r5   UFuncConversion.__init__;   s    	 ,,99;!1iioo##..t/E/EFF""c)" iioo##..t/E/EFF "335#557r   c                     UR                  5       nUR                  5       R                  SS5      R                  SS5      n[        UUUS9nU R                  R                  [        R                  " SSUS95        SU 3$ )	Nr<   __ )type_substituted_cname
macro_name
type_cnameUFuncTypedef
UFuncs_C.ccontext__Pyx_typedef_ufunc_)empty_declaration_codestripreplacedictr>   use_utility_coder
   load)r   type_rL   declsubstituted_cnamerQ   s         r   _handle_typedef_type_constant-UFuncConversion._handle_typedef_type_constantF   s    ++- JJL00d;CCCM#4!

 	**##	 &&7%899r   c                 V   UnUR                   (       a  UR                  n[        R                  " U5      nU[        R                  L a  [        USU-  5        g UR                  (       a  U R                  US5      $ UR                  (       aY  SnUR                  [        R                  :X  a  SnO UR                  [        R                  :X  a  SnU R                  USU S35      $ UR                  (       a  U R                  US5      $ UR                  (       a  g	[        USU-  5        g )
Nz,Type '%s' cannot be used as a ufunc argument__PYX_GET_NPY_COMPLEX_TYPE SU__PYX_GET_NPY_INT_TYPE__PYX_GET_NPY_FLOAT_TYPE
NPY_OBJECT)
is_typedeftypedef_base_typer   remove_cv_refc_bint_typer   
is_complexr\   is_intsignedSIGNEDUNSIGNEDis_floatis_pyobject)r   posrY   	base_typerm   s        r   _get_type_constant"UFuncConversion._get_type_constantV   s   	!33I,,Y7	
...#EMN5502 2 \\F||z000!4!4455 13 3 ^^55*, ,  	cAEIJr   c                 \   / n[        U R                  R                  5       H  u  p#U R                   SU 3nU R                  R                  U5        U R                  U R                  R                  UR                  5      nUR                  [        UR                  XT5      5        M     U$ )N_in_)
	enumerater   argsr4   rB   appendrt   rr   r2   r/   )r   definitionsnargr4   
type_consts         r   rC    UFuncConversion.get_in_type_infov   s    		/FA#'#9#9":$qc B&&'8900IJ}SXXzUV	 0
 r   c                    U R                   R                  R                  (       a!  U R                   R                  R                  nOU R                   R                  /n/ n[	        U5       Hr  u  p4U R
                   SU 3nU R                  R                  U5        U R                  U R                   R                  U5      nUR                  [        XFU5      5        Mt     U$ )N_out_)r   return_type	is_ctuple
componentsrx   r4   rB   rz   rt   rr   r/   )r   r   r{   r|   r2   r4   r~   s          r   rE   !UFuncConversion.get_out_type_info   s    99  **..99J))//0J ,GA#'#9#9":%s C&&'8900EJd0AB	 - r   c           
      \   U R                    Vs/ s H  oR                  UR                  4PM     nnU R                   Vs/ s H  oR                  UR                  4PM     nn[	        X#-   5      nSU R
                  R                  l        U R                  R                  U R
                  R                  R                  S-   5      n[        S U 5       5      =(       d    [        S U 5       5      (       + n[	        SUUUU R
                  R                  R                  U R
                  R                  R                  R                  US.UD6n[        R                  " SS U R                  R                   5      nUR#                  U R
                  R                  R                  U R
                  R                  R                  U R
                  R                  R                  U R
                  R$                  SS9  [&        R(                  " S	S
UUS9n	U	R+                  SS9n
U
$ s  snf s  snf )NT
_ufunc_defc              3   >   #    U  H  u  pUR                   v   M     g 7fr   rq   .0r<   ts      r   	<genexpr>;UFuncConversion.generate_cy_utility_code.<locals>.<genexpr>   s     -R	amm	   c              3   >   #    U  H  u  pUR                   v   M     g 7fr   r   r   s      r   r   r      s     4)$!)r   )
func_cnamein_types	out_typesinline_func_callnogilwill_be_called_without_gilufunc_moduleextern)namer@   r2   rr   
visibilityUFuncDefinitionz
UFuncs.pyx)rQ   
from_scope)entries_onlyr+   )rD   r4   r2   rF   rV   r   r?   usedr>   next_idr   anyr@   r   r   ModuleScoperQ   declare_cfunctionrr   r	   rX   get_tree)r   a	arg_typesr   context_typesufunc_cnamer   rQ   ufunc_global_scopecoder"   s              r   generate_cy_utility_code(UFuncConversion.generate_cy_utility_code   s   <@<O<OP<Oq))1662<O	P<@<P<PQ<Pq))1662<P	QY23#		''//		0D0D|0ST*--R	-R*R +54)44&6"  
"!YY__22))//&&,,'A
 
 $//D$"3"3";";
 	,,&&))//''%%		 	- 	
 !%%+	
 }}$}/Q QQs   !H$ !H)c                 $   U R                   R                  [        R                  " SS5      5        U R                   R                  [        R                  " SS5      5        U R                   R                  [        R                  " SS5      5        g )N
UFuncsInitrO   UFuncTypeHandlingNumpyImportUFunczNumpyImportArray.c)r>   rW   r   load_cached)r   s    r   use_generic_utility_code(UFuncConversion.use_generic_utility_code   su    **##L,?	
 	**##$7F	
 	**##$68LM	
r   )r>   rD   r4   rB   r   rF   N)r%   r&   r'   r(   r5   r\   rt   rC   rE   r   r   r*   r+   r   r   r8   r8   :   s(    	8: K@)V

r   r8   c                 D   [        U [        R                  5      (       aL  U R                  R                  R
                  (       a  [        U R                  S5        U $ [        U 5      /nU nO[        U [        R                  5      (       a  [        U R                  [        R                  5      (       ay  U R                  R                  R                  R
                  (       a  [        U R                  S5        U $ U R                   Vs/ s H  n[        U5      PM     nnU R                  nO[        U R                  S5        U $ U(       d  g US   R                  R                  UR                  R                   	 US   R#                  5         U /[%        X5      -   $ s  snf )Nz0Methods cannot currently be converted to a ufuncz,Only C functions can be converted to a ufunc    )
isinstancer   CFuncDefNoder=   parent_scopeis_c_class_scoper   rr   r8   r   FusedCFuncDefNoder   nodesr>   entriesr?   r   r   _generate_stats_from_converters)r   
convertersoriginal_noder|   s       r   convert_to_ufuncr      s9   $**++((99$((NOK%d+,
	D)55	6	6:		5%%< < 99  -->>$((NOK26**=*Qoa(*
=		dhhFG1""**=+>+>+C+CDqM**,63JNNN >s   	Fc                    U S   R                   nUR                  [        R                  S-   5      nUR                  [        R                  S-   5      nUR                  [        R                  S-   5      n/ nS nS n	U  H  n
U
R                   Vs/ s H  oR
                  PM     nnUb  U[        U5      :X  d   eO[        U5      nUR                  U5        U
R                   Vs/ s H  oR
                  PM     nnU	b  U	[        U5      :X  d   eO[        U5      n	UR                  U5        M     U Vs/ s H  oR                  R                  PM     nn[        UUUUUS9nUR                  [        R                  " SSUS95        UR                  nUR                  R                   nUR"                  nU< S	U< S
U< S	[        U5      < S
U< S
U	< SU< SU(       a  UR%                  5       OS< S3n[&        R(                  " US[*        R,                  " [*        R.                  [*        R0                  " S[*        R2                  S 5      /5      [&        R4                  " U[*        R2                  US9/S9nUR7                  U[*        R.                  U5      n[8        R:                  " U[&        R<                  " UU[*        R.                  US9US9nU$ s  snf s  snf s  snf )Nr   funcstypesdata)ufunc_funcs_namefunc_cnamesufunc_types_nametype_constantsufunc_data_nameUFuncConstsrO   rP   z(), z, z, PyUFunc_None, "z", NULLz, 0PyUFunc_FromFuncAndDatadummy)r2   value)function_name	func_typery   )r   r2   r?   )lhsrhs)r>   r   r   pyrex_prefixrD   r3   lenextendrF   r?   r@   rV   rW   r
   rX   rr   r   docas_c_string_literalr   PythonCapiCallNoder   	CFuncTypepy_object_typeCFuncTypeArgc_void_ptr_type	ConstNodedeclare_varr   SingleAssignmentNodeNameNode)r   cfunc_nodesr   r>   r   r   r   r   narg_innarg_outcdin_const	out_constcfnoder   rQ   rr   	func_namedocstrargs_to_func	call_node	lhs_entry
assgn_nodes                           r   generate_ufunc_initializationr      s   a=--L#++F,?,?',IJ#++F,?,?',IJ"**6+>+>+GHONGH-.-=-=>-=OO-=>c(m+++(mGh'./.?.?@.?__.?	@s9~---9~Hi(  5@@K&<<%%KK@))%'G !!|WM 

C##((IF 	K(.""$F:	L ,,/&&%%$$Wj.H.H$OP

 *44L
I ((J4M4MsSI++ij&?&?y
 J  ? A As   K%K5K c                    / nU  Hh  nUR                  5       n[        U5      nUR                  R                  R	                  UR
                  R                  5        UR                  U5        Mj     UR                  [        XU5      5        U$ r   )r   r-   r>   utility_code_listr   scoperz   r   )r   r   stats	converterr"   
ufunc_nodes         r   r   r   -  st    E	113(.
0077

8T8TUZ    
LL.z$GHLr   N)r`   r   r   r   r   Errorsr   r   r   r	   Coder
   Visitorr   r   r   r-   r/   r8   r   r   r   r+   r   r   <module>r      s]       * 1    .%3 3 I
 I
XO8HV
r   