
    -Phi                       d dl Z  e j        di dededededededed	ed
ededededededededede d dlZd dlmZ d dlZddlmZ ddl	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 ddlmZmZ ddlmZmZ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# 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,m-Z- d%d&hZ. G d' d(ej/                  Z0d) Z1d* Z2d+ Z3 G d, d-e4          Z5 G d. d/e4          Z6d0 Z7e7 G d1 d2                      Z8 G d3 d4e8          Z9 G d5 d6          Z: G d7 d8e8          Z; G d9 d:e8          Z< G d; d<e<          Z= G d= d>e8          Z> G d? d@e>          Z? G dA dBe>          Z@ G dC dDe>          ZA G dE dFeA          ZB G dG dHeA          ZC G dI dJe>          ZD G dK dLe>          ZE G dM dNe>          ZF G dO dPe8          ZG G dQ dRe8          ZH G dS dTe8          ZI G dU dVeH          ZJ G dW dXeH          ZK G dY dZeH          ZL G d[ d\eH          ZM G d] d^eH          ZN G d_ d`eH          ZO G da dbeH          ZP G dc ddeH          ZQ G de dfe<          ZR G dg dhe<          ZS G di djeSe:          ZT G dk dle<          ZU G dm dne<          ZV G do dpe<          ZW G dq dre<e:          ZX G ds dteX          ZY G du dve8          ZZ G dw dxe8          Z[ G dy dzeX          Z\ G d{ d|eX          Z] G d} d~e\          Z^ G d de^          Z_ G d de_          Z` G d de_          Za G d de\          Zb G d de<          Zc G d de<e:          Zd G d ded          Ze G d ded          Zf G d de<          Zg G d de<          Zh G d de<          Zi G d de<          Zj G d de<          Zk G d de<          Zl G d del          Zm G d del          Zn G d del          Zo G d del          Zp G d de<          Zq G d de<          Zr G d de<          Zs G d de<          Zt G d de;          Zu G d de<          Zv G d de<          Zw G d de<          Zx G d de<          Zy G d de<          Zz G d de<          Z{ G d de<          Z| G d de8          Z} G d de<          Z~ G d de<          Z G d d¦          Z G dÄ dee<          Z G dń de8          Z G dǄ de8          ZdɄ Z G dʄ dee<          Z G d̄ de          Z G d΄ de          Z G dЄ dee<          Z G d҄ de<          Z G dԄ del          Z G dք de<          Z G d؄ de8          Z G dڄ de<          Z G d܄ de          Z G dބ de          Z G d de<          Z G d de          Z G d de          Z G d de<          Z G d de          Z G d de<          Zd Zd d edZd Z G d de<          Z G d de<          Z G d de<          Z G d de8          Z G d de<e          Z G d de          Z G d de          Z G d d e<          Z G d de8          Ze%j        rdZndZ e!j        dd          Z e!j        dd          Z e!j        dd	          Z e!j        d
d	          Z e!j        dd	          Z e!j        dd	          Z e!j        dd	          Z e!j        dd	          ZdS (      NoscopychainBuiltinerrorwarningNaming
PyrexTypespy_object_typeModuleScope
LocalScopeClosureScopeStructOrUnionScopePyClassScopeCppClassScopeUtilityCodeEncodedString
error_type)r      )r   )r   r   InternalErrorCompileErrorCannotSpecialize)r	   )r
   )	TypeSlots)r   r   )r   r   r   PropertyScoper   r   r   TemplateScopeGeneratorExpressionScopeCppScopedEnumScopepunycodify_name)r   r   )Future)Options)
DebugFlags)has_np_pythranpythran_typeis_pythran_buffer   )add_metaclassstr_to_number__init_subclass____class_getitem__c                       e Zd ZdZdZdZdS )
NoGilStater   r   r&   N)__name__
__module____qualname__HasGilNoGil
NoGilScope     U/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/Cython/Compiler/Nodes.pyr,   r,   (   s        FE JJJr4   r,   c                 F    | d                                          | d         fS Nr   r   )get_filenametable_entryposs    r5   relative_positionr;   0   s!    F**,,c!f55r4   c                 (   t           j        s|S dt          |           z  }|t          |          S |j        }|)	 |                    |           n# t          $ r d }Y nw xY w|st          |          }nt          |dz   |z             }||_        |S )NzFile: %s (starting at line %s)
)r!   embed_pos_in_docstringr;   r   encodingencodeUnicodeEncodeError)r:   	docstringpos_liner?   docs        r5   embed_positionrE   4   s    ) /2CC2H2HHHX&&& !H	OOH%%%%! 	 	 	HHH	  9H%%HtOi788CLJs   A A! A!c                       fd}|S )Nc            
      b   t          |           dk    rt          | d                   r| d d         \  }}dd|j        z  d|j        j        d	j        d|j        dd          d	}|                                }|j        j        	                                }|xj        dz  c_         	| i |}|xj        dz  c_        ||j        j        	                                k    r?|
                    |                    d	d
d                     |
                    |           |S  	| i |S )Nr   r&   z                    /*  z -> .z */   ->z<-)len
isinstance
call_level	__class__r-   r:   insertion_pointbufferstreamtellputlnreplace)
argskwdsnodecodemarkerrP   startrescodewriter_classfuncs
           r5   fzwrite_func_call.<locals>.fO   sB   t99q==ZQ1ABB= bqbJD$$do%%%'''	F #2244OK&++--EOOq OO$%%%COOq OO*//1111

6>>$a88999%%f---J4&&&&r4   r3   )r^   r]   r_   s   `` r5   write_func_callr`   N   s)    ' ' ' ' ' ', Hr4   c                        e Zd Z fdZ xZS )VerboseCodeWriterc                     ddl m} ddlm} t	          |          }|                                D ](\  }}t          ||          rt          ||          ||<   )t                      	                    | |||          S )Nr   FunctionTyper   )CCodeWriter)
typesre   Coderf   dictitemsrM   r`   super__new__)	clsnamebasesattrsre   rf   mnamemrO   s	           r5   rl   zVerboseCodeWriter.__new__k   s    &&&&&&%%%%%%U 	? 	?HE1!\** ?.q+>>ewwsD%777r4   )r-   r.   r/   rl   __classcell__rO   s   @r5   rb   rb   h   s8        8 8 8 8 8 8 8 8 8r4   rb   c                   <     e Zd ZdZ eh d          Z fdZ xZS )CheckAnalyserszCMetaclass to check that type analysis functions return a node.
    >   analyse_typesanalyse_expressionsanalyse_target_typesc                     ddl m} d }t          |          }|                                D ]-\  }}t	          ||          r|| j        v r |||          ||<   .t                                          | |||          S )Nr   rd   c                       fd}|S )Nc                  J     | i |}|t          d| d|           |S )NrH   )print)rV   kwargsretvalr^   rn   s      r5   callz3CheckAnalysers.__new__.<locals>.check.<locals>.call   s@    t.v..>dddFF;<<<r4   r3   )rn   r^   r   s   `` r5   checkz%CheckAnalysers.__new__.<locals>.check   s)         
 Kr4   )rg   re   ri   rj   rM   methodsrk   rl   )	rm   rn   ro   rp   re   r   rq   rr   rO   s	           r5   rl   zCheckAnalysers.__new__~   s    &&&&&&	 	 	 U 	/ 	/HE1!\** /u/C/C$uUAewwsD%777r4   )r-   r.   r/   __doc__	frozensetr   rl   rs   rt   s   @r5   rv   rv   u   sb         i     G8 8 8 8 8 8 8 8 8r4   rv   c                 X    t           j        r t          t                    |           S | S N)r"   debug_trace_code_generationr'   rb   )rm   s    r5   _with_metaclassr      s+    - 5/}.//444Jr4   c                       e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZd ZdZdZdZddZdZd Zd Zd	 Zd
 Zd Zd Zd Zd ZddZddZdS )Noder   FNc                 H    || _         | j                            |           d S r   )r:   __dict__update)selfr:   kws      r5   __init__zNode.__init__   s%    R     r4   	Operationc                 @    t          | j        d| j        z             d S )Nz%s not allowed without gil)r   r:   gil_messager   envs     r5   	gil_errorzNode.gil_error   s#    dh4t7GGHHHHHr4   c                 Z    |                                 s|                                  d S d S r   )is_cpp	cpp_errorr   s     r5   	cpp_checkzNode.cpp_check   s2    zz|| 	NN	 	r4   c                 @    t          | j        d| j        z             d S )Nz%s only allowed in c++)r   r:   cpp_messager   s    r5   r   zNode.cpp_error   s#    dh043CCDDDDDr4   c                     t          j         |           }|j        D ]B}t          ||          }t          |t                    rt          ||d |D                        C|S )ac  Clone the node. This is defined as a shallow copy, except for member lists
           amongst the child attributes (from get_child_accessors) which are also
           copied. Lists containing child nodes are thus seen as a way for the node
           to hold multiple children directly; the list is not treated as a separate
           level in the tree.c                     g | ]}|S r3   r3   .0xs     r5   
<listcomp>z#Node.clone_node.<locals>.<listcomp>   s    *<*<*<1*<*<*<r4   )r   child_attrsgetattrrM   listsetattr)r   resultattrnamevalues       r5   
clone_nodezNode.clone_node   sk     4* 	> 	>HFH--E%&& >*<*<e*<*<*<===r4   c                     d S r   r3   r   s     r5   analyse_declarationszNode.analyse_declarations       r4   c                 :    t          d| j        j        z            )Nz*analyse_expressions not implemented for %sr   rO   r-   r   s     r5   rx   zNode.analyse_expressions   s$    HN#$ % % 	%r4   c                 :    t          d| j        j        z            )Nz$generate_code not implemented for %sr   r   rY   s     r5   generate_codezNode.generate_code   s$    BN#$ % % 	%r4   c                 h    t          | t                    r| j                            |           d S d S r   )rM   	BlockNodebodyannotater   s     r5   r   zNode.annotate   s:    dI&& 	%It$$$$$	% 	%r4   c                 n   	 | j         S # t          $ r | j        }| j        s|| _         |cY S | j        D ]t}t	          | |          }|t          |t                    r(|D ]$}t          ||                                          }%Rt          ||                                          }u|| _         |cY S w xY wr   )	_end_posAttributeErrorr:   r   r   rM   r   maxend_pos)r   r:   attrchildcs        r5   r   zNode.end_pos   s    	=  	 	 	(C#  #


( 	4 	4d++=t,, 4" 4 4!#qyy{{334 c5==??33CCDMJJJ!	s   	 !B4BB43B4r9   d   c                 8  
 dk    rdS t                      t          |           v rd| j        j        t          |           fz  S                     t          |                      
fd
fd| j                                        D             }t          |          dk    rd| j        j        t          |           fz  S d|z  }d	| j        j        t          |           fz  }|D ] \  }}	||d|d
 
|	|dz             dz  }!|d|z  z  }|S )zYDebug helper method that returns a recursive string representation of this node.
        r   z<...nesting level cutoff...>Nz<%s (0x%x) -- already output>c                     t          | t                    r|                     dz
            S t          | t                    r%dd                    fd| D                       z  S t          |           S )Nr   z[%s], c                 (    g | ]} |          S r3   r3   )r   item
dump_childlevels     r5   r   z1Node.dump.<locals>.dump_child.<locals>.<listcomp>$  s%    *Q*Q*Qt::dE+B+B*Q*Q*Qr4   )rM   r   dumpr   joinrepr)r   r   cutoffr   encountered
filter_outs    `r5   r   zNode.dump.<locals>.dump_child   s~    !T"" vveZ;GGGAt$$ 		*Q*Q*Q*Q*Qq*Q*Q*Q R RRRAwwr4   c                 &    g | ]\  }}|v	||fS r3   r3   )r   keyr   r   s      r5   r   zNode.dump.<locals>.<listcomp>(  s,    ___*#uT^I^I^#uI^I^I^r4   z<%s (0x%x)>z  z<%s (0x%x)
: r   r=   z%s>)setidrO   r-   addr   rj   rL   )r   r   r   r   r   rp   indentr\   r   r   r   s     ```     @r5   r   z	Node.dump  sd    Q;;11%%Kd88{""2dn6MrRVxx5XXX4!!!	 	 	 	 	 	 	 	 `___0C0C0E0E___u::?? DN$;RXX#FFFE\F DN$;RXX#FFC# T T
UjjPQ	6R6R6R6RSS56>!CJr4   (#)c                    | j         sdS | j         \  }}}|                    dd          }|t          d|dz
            |         }|d         }|r|d|         |z   ||d         z   }|                                d	z   |d<   ||||d
z            z  }d|                                ||d                    |          fz  S )z[Debug helper method that returns the source code context of this node as a string.
         ASCIIignore)r?   error_handlingr      Nz             # <<<<<<<<<<<<<<
r&   z"%s":%d:%d
%s
)r:   	get_linesr   rstripget_escaped_descriptionr   )	r   mark_columnrZ   source_desclinecolcontentslinescurrents	            r5   dump_poszNode.dump_pos3  s     x 	2!%T3(('((SSQQ,-) 	=dsdmf,wstt}<GNN$$'HHb	$tAv+&&!//114bggenn%N N 	Nr4   r   )r   r9   r   N)Fr   ) r-   r.   r/   is_nameis_noneis_nonecheck
is_literalis_terminator
is_wrapperis_cpropertyis_templated_type_nodetempsr   outer_attrscf_statecoercion_typer   r   nogil_checkin_nogil_contextr   r   r   r   r   r   rx   r   r   r   r   r   r3   r4   r5   r   r      sH        GGLJMJL"E
 K KH M! ! ! KKI I I I K  E E E  J  % % %% % %% % %
  *   <N N N N N Nr4   r   c                   b    e Zd ZdZdgZed             Zed             Zd Zd Z	d Z
d Zd	 Zd
S )CompilerDirectivesNodez9
    Sets compiler directives for the children nodes
    r   c                 b    t          j        |j        fi |} | |j        |||j                  S N)r   
directivesr   )r!   copy_inherited_directivesr   r:   r   )rm   r   r   r   new_directivess        r5   for_directivesz%CompilerDirectivesNode.for_directivesN  s;     :3>XXZXXs48$>QUQcddddr4   c                 f    t          j        |j                  } | |j        |||j                  S r   )r!   copy_for_internalr   r:   r   )rm   r   r   r   s       r5   for_internalz#CompilerDirectivesNode.for_internalS  s3     23>BBs48$>QUQcddddr4   c                 n    |j         }| j         |_         | j                            |           ||_         d S r   )r   r   r   r   r   olds      r5   r   z+CompilerDirectivesNode.analyse_declarationsX  s3    n	&&s+++r4   c                 x    |j         }| j         |_         | j                            |          | _        ||_         | S r   )r   r   rx   r  s      r5   rx   z*CompilerDirectivesNode.analyse_expressions^  s5    nI11#66	r4   c                     |j         }|j        j         }| j         |j        _         | j                            ||           ||_         ||j        _         d S r   )r   globalstater   generate_function_definitions)r   r   rY   env_oldcode_olds        r5   r  z4CompilerDirectivesNode.generate_function_definitionse  sQ    .#.&*o#	//T::: &.###r4   c                     |j         j        }| j        |j         _        | j                            |           ||j         _        d S r   )r  r   r   generate_execution_coder   rY   r  s      r5   r  z.CompilerDirectivesNode.generate_execution_codem  sA    )&*o#	))$///&)###r4   c                     |j         j        }| j        |j         _        | j                            |           ||j         _        d S r   )r  r   r   r   r  s      r5   r   zCompilerDirectivesNode.annotates  sA    )&*o#	4   &)###r4   N)r-   r.   r/   r   r   classmethodr   r   r   rx   r  r  r   r3   r4   r5   r   r   E  s          (Ke e [e e e [e    / / /* * ** * * * *r4   r   c                       e Zd Zd Zd ZdS )r   c                     |                                 j        }|D ]}|j                            |           |d d = d S r   )global_scopeundeclared_cached_builtinsr  add_cached_builtin_decl)r   r   rY   entriesentrys        r5   generate_cached_builtins_declsz(BlockNode.generate_cached_builtins_decls}  sN    ""$$? 	< 	<E44U;;;;AAAJJJr4   c                 F    |j         D ]}|                    ||           d S r   )lambda_defsr  )r   r   rY   rX   s       r5   generate_lambda_definitionsz%BlockNode.generate_lambda_definitions  s6    O 	: 	:D..sD9999	: 	:r4   N)r-   r.   r/   r  r  r3   r4   r5   r   r   z  s2          : : : : :r4   r   c                   H    e Zd ZdgZed             Zd Zd Zd Zd Z	d Z
dS )	StatListNodestatsc                      t          | fi |}|S r   )r  )r:   r   r   rX   s       r5   create_analysedzStatListNode.create_analysed  s    C&&2&&r4   c                 D    | j         D ]}|                    |           d S r   r  r   r   r   stats      r5   r   z!StatListNode.analyse_declarations  s4    J 	+ 	+D%%c****	+ 	+r4   c                 8    fd| j         D             | _         | S )Nc                 :    g | ]}|                               S r3   rx   r   r"  r   s     r5   r   z4StatListNode.analyse_expressions.<locals>.<listcomp>  s7     . . . ..s33 . . .r4   r  r   s    `r5   rx   z StatListNode.analyse_expressions  s4    . . . ."&*. . .
r4   c                 F    | j         D ]}|                    ||           d S r   r  r  r   r   rY   r"  s       r5   r  z*StatListNode.generate_function_definitions  s6    J 	: 	:D..sD9999	: 	:r4   c                 x    | j         D ]1}|                    |j                   |                    |           2d S r   )r  mark_posr:   r  r   rY   r"  s      r5   r  z$StatListNode.generate_execution_code  sH    J 	/ 	/DMM$(###((....	/ 	/r4   c                 D    | j         D ]}|                    |           d S r   r  r   r-  s      r5   r   zStatListNode.annotate  2    J 	  	 DMM$	  	 r4   N)r-   r.   r/   r   staticmethodr  r   rx   r  r  r   r3   r4   r5   r  r    s         )K  \+ + +
  : : :
/ / /         r4   r  c                       e Zd Zd Zd ZdS )StatNodec                     d S r   r3   r   r   rY   s      r5   r  z&StatNode.generate_function_definitions  r   r4   c                 :    t          d| j        j        z            )Nz.generate_execution_code not implemented for %sr   r   s     r5   r  z StatNode.generate_execution_code  s$    LN#$ % % 	%r4   N)r-   r.   r/   r  r  r3   r4   r5   r3  r3    s2          % % % % %r4   r3  c                   2    e Zd ZdgZd Zd Zd Zd Zd ZdS )CDefExternNoder   c                 :   |j         }d|_         | j                            |           ||_         | j        s| j        r]| j        j        }|j        d         sd}n|sd}nt          d |D                       }|                    | j        | j        |           d S d S )Nr   preliminary_late_includes_cy28Fc              3   @   K   | ]}t          |t                    V  d S r   )rM   CVarDefNode)r   rX   s     r5   	<genexpr>z6CDefExternNode.analyse_declarations.<locals>.<genexpr>  s,      KKT:dK88KKKKKKr4   )	in_cincluder   r   include_fileverbatim_includer  r   alladd_include_file)r   r   old_cinclude_flagr  lates        r5   r   z#CDefExternNode.analyse_declarations  s    O	&&s++++ 
	Q 5 
	QIOE>"BC L LKKUKKKKK  !2D4I4PPPPP
	Q 
	Qr4   c                 D    | j                             |          | _         | S r   r   rx   r   s     r5   rx   z"CDefExternNode.analyse_expressions  s    I11#66	r4   c                 <    | j                             ||           d S r   r   r  r5  s      r5   r  z,CDefExternNode.generate_function_definitions       	//T:::::r4   c                     d S r   r3   r   s     r5   r  z&CDefExternNode.generate_execution_code  r   r4   c                 :    | j                             |           d S r   r   r   r   s     r5   r   zCDefExternNode.annotate      	4     r4   N	r-   r.   r/   r   r   rx   r  r  r   r3   r4   r5   r8  r8    sk        
 (KQ Q Q$  
; ; ;  ! ! ! ! !r4   r8  c                   "    e Zd Zg ZdZd Zd ZdS )CDeclaratorNoder   c                     d S r   r3   r   s    r5   declared_namezCDeclaratorNode.declared_name  s    tr4   c                     d S r   r3   r   s    r5   analyse_templatesz!CDeclaratorNode.analyse_templates  s    tr4   N)r-   r.   r/   r   calling_conventionrR  rT  r3   r4   r5   rP  rP    s?         K      r4   rP  c                   &    e Zd ZdgZdZd ZddZdS )CNameDeclaratorNodedefaultNc                     | j         S r   rn   r   s    r5   rR  z!CNameDeclaratorNode.declared_name  
    yr4   r   Fc                    |rw| j         dk    rl|j        s|j        s|j        rt	          | j        d           nA|j        rt	          | j        d           n$|                    ddd          | _         t          }|j	        rP|j
        rI	 |                    |j
                  }n-# t          $ r  t	          | j        d| j         z             Y nw xY w|| _        | |fS )Nr   Missing argument nameJUse spam() rather than spam(void) to declare a function with no arguments.r   )for_displaypyrexR'%s' cannot be specialized since its type is not a fused argument to this function)rn   is_ptris_array	is_bufferr   r:   is_voiddeclaration_coder   is_fusedfused_to_specific
specializer   type)r   	base_typer   nonempty
visibilityin_pxds         r5   analysezCNameDeclaratorNode.analyse  s    	+	R +9#5 +9L +dh 78888" +dh lmmmm%66rqPQ6RR	*	 	!#"7 	!!%001FGG		# ! ! !dhji ! ! ! ! !!
 	Ys   	B$ $'CCr   NF)r-   r.   r/   r   rX  rR  ro  r3   r4   r5   rW  rW    sE        
 +KG       r4   rW  c                   (    e Zd ZdgZd Zd ZddZdS )	CPtrDeclaratorNodebasec                 4    | j                                         S r   rs  rR  r   s    r5   rR  z CPtrDeclaratorNode.declared_name+      y&&(((r4   c                 4    | j                                         S r   rs  rT  r   s    r5   rT  z$CPtrDeclaratorNode.analyse_templates.      y**,,,r4   r   NFc                     |j         rt          | j        d           t          j        |          }| j                            |||||          S )Nz+Pointer base type cannot be a Python objectrl  rm  rn  )is_pyobjectr   r:   r
   
c_ptr_typers  ro  )r   rk  r   rl  rm  rn  ptr_types          r5   ro  zCPtrDeclaratorNode.analyse1  sS      	K$(IJJJ(33y  3jag hhhr4   rp  )r-   r.   r/   r   rR  rT  ro  r3   r4   r5   rr  rr  &  sU         (K) ) )- - -i i i i i ir4   rr  c                        e Zd ZdgZd Zd ZdS )_CReferenceDeclaratorBaseNoders  c                 4    | j                                         S r   ru  r   s    r5   rR  z+_CReferenceDeclaratorBaseNode.declared_name;  rv  r4   c                 4    | j                                         S r   rx  r   s    r5   rT  z/_CReferenceDeclaratorBaseNode.analyse_templates>  ry  r4   N)r-   r.   r/   r   rR  rT  r3   r4   r5   r  r  8  s9        (K) ) )- - - - -r4   r  c                       e Zd ZddZdS )CReferenceDeclaratorNoder   NFc                     |j         rt          | j        d           t          j        |          }| j                            |||||          S )Nz-Reference base type cannot be a Python objectr{  )r|  r   r:   r
   
c_ref_typers  ro  r   rk  r   rl  rm  rn  ref_types          r5   ro  z CReferenceDeclaratorNode.analyseC  sS      	M$(KLLL(33y  3jag hhhr4   rp  r-   r.   r/   ro  r3   r4   r5   r  r  B  .        i i i i i ir4   r  c                       e Zd ZddZdS ) CppRvalueReferenceDeclaratorNoder   NFc                     |j         rt          | j        d           t          j        |          }| j                            |||||          S )Nz4Rvalue-reference base type cannot be a Python objectr{  )r|  r   r:   r
   cpp_rvalue_ref_typers  ro  r  s          r5   ro  z(CppRvalueReferenceDeclaratorNode.analyseK  sS      	T$(RSSS1)<<y  3jag hhhr4   rp  r  r3   r4   r5   r  r  J  r  r4   r  c                       e Zd ZddgZddZdS )CArrayDeclaratorNoders  	dimensionr   NFc                    |j         r|                                s|j        s|j        rddlm} t          | j        |          r| j        j        }n| j        f}fd|D             }d |v r8|	                    d           }	t          ||	         j        d           t          }n|                    | j        |          }| j                            ||||          S | j        r| j                                      | _        | j        j        j        st          | j        j        d           | j        j        j        r/| j        j        j        dk    rt          | j        j        d           | j                                        }
|
!	 t/          |
          }
n# t0          $ r Y nw xY wnd }
|                                st          | j        d	|z             |j        rt          | j        d
           |j        rt          | j        d           t7          j        ||
          }| j                            ||||          S )Nr   	TupleNodec                 :    g | ]}|                               S r3   )analyse_as_type)r   vr   s     r5   r   z0CArrayDeclaratorNode.analyse.<locals>.<listcomp>a  s'    ;;;a'',,;;;r4   zTemplate parameter not a typer{  zArray dimension not integerexternz(Array dimension cannot be const variablez%Array element type '%s' is incompletez'Array element cannot be a Python objectz"Array element cannot be a function)is_cpp_classis_template_typeis_cfunctionpython_type_constructor_name	ExprNodesr  rM   r  rV   indexr   r:   r   specialize_herers  ro  analyse_const_expressionrj  is_intis_constr  rm  get_constant_c_result_codeint
ValueErroris_completer|  r
   c_array_type)r   rk  r   rl  rm  rn  r  rV   valuesixsize
array_types     `         r5   ro  zCArrayDeclaratorNode.analyseX  s~   # 	n	(B(B(D(D 	n&	n6	n -,,,,,$.)44 '~*~;;;;d;;;Fv~~\\$''d2hl$CDDD&		%55dhVLL	9$$YhS]fl$mmm> 	!^DDSIIDN>&- Idn(*GHHH~"+ V0D0OS[0[0[dn(*TUUU><<>>Dt99DD!   D   D$$&& 	Q$(CiOPPP  	G$(EFFF! 	B$(@AAA,Y==
y  S8PZci jjjs   F 
F*)F*rp  r-   r.   r/   r   ro  r3   r4   r5   r  r  R  s:         ;'K(k (k (k (k (k (kr4   r  c                   B    e Zd Zg dZdZdZdZdZd Zd Z	d	dZ
d
dZdS )CFuncDeclaratorNode)rs  rV   exception_valuer   Nc                 4    | j                                         S r   ru  r   s    r5   rR  z!CFuncDeclaratorNode.declared_name  rv  r4   c                    t          | j        t                    rddlm}m} | j        j        }t          ||          r|j        }n+t          ||          r|g}nt          |j	        d           d S g | _
        |D ]Y}t          ||          r2| j
                            t          j        |j                             Dt          |j	        d           Z| j        j        | _        | j
        S d S )Nr   )r  NameNodez*Template arguments must be a list of names)rM   rs  r  r  r  r  r  rV   r   r:   	templatesappendr
   TemplatePlaceholderTypern   )r   r  r  template_nodetemplate_nodestemplates         r5   rT  z%CFuncDeclaratorNode.analyse_templates  s   di!566 	66666666 I/M-33 !.!3M844 "/m')UVVVtDN* V Vh11 VN))**LX]*[*[\\\\(,(TUUUU	DI>!4r4   Fc                     |i }|r|dz  }g }t           j                  D ]\  }}	|	                    ||dk    oj        odj        v          \  }
}|
j        }||v r||         }|                              }|t          |j        d           nU|t          j
        urE|                    |          s0t           j        j        d           t          |j        d           n|}|
j        rt           j        d           |dk    rj        r|j        rj        }|j        rt          j        |j                  }|j        rt          |	j        d	           t          j        |||	j                  }|	j        rd
|_        |	j        rd
|_        |                    |           |	j        r xj        dz  c_         j        rt           j        d           d }d}j        d         r9|j        s2 j        s+ j        r$|dk    rd _        t;           j        dd            j        dk    rU                    d                               d                               d                               d           n|j        r j        rd _        |j        r0 j        s j        r" j        dk    rt           j        d           n|j        r, j        s%|dk    r j        rt;           j        dd           nW j         j        r{ j        dk    rp|j        i|dk    rc|saj        sZtA           j        tB                    s@ddl"m#} |$                     j        tK          |j                  ||j                   _         j         j        dk    r j        &                               _         j        j'        }|j(        s[|j        sT|j)        r|j*        j        s|j        r:|t          j+        k    r j        j,        dk    st           j        j        d            j        }n j        -                              .                    |          &                               _         j        /                              }|0                     j        j'                  st           j        j        d           |dk    r|j1        s|j2        rq j        3                                rX	 ti          |j5                  } j        j6        |k    r"t;           j        d j        j6        z             n# tn          $ r Y nw xY w j        }|j)        rt           j        d           t          j8        || j9         j        || j        j:         j;         j<         j=         j>         j?                   } j        r+|j@        r fd!}||_A        n B                    |           j        d"         }|r2|j:        }|r"||k    rt           j        d#|d$|d%           ||_:        |j*        jC        rt;           j        d&d           |j        D ]8}|j'        jC        r*|D                                st;           j        d'd           9 j                            |||(          S ))Nr   r   r1  rl  is_self_arg
Not a type2Signature does not agree with previous declarationPrevious declaration herez2Function argument cannot have C name specificationr^  Tz-Non-default argument follows default argumentlegacy_implicit_noexceptr  FzdImplicit noexcept declaration is deprecated. Function declaration should contain 'noexcept' keyword.r&   r   +iosnew	stdexcepttypeinfozAException clause not allowed for function returning Python objectz?noexcept clause is ignored for function returning Python object	ConstNoder   rj  constant_result*zTException value must be a Python exception, or C++ function with no arguments, or *.z6Exception value incompatible with function return typez;Ambiguous exception value, same as default return value: %rz!Function cannot return a function)	optional_arg_countr  exception_checkrU  nogilwith_gilis_overridableis_const_methodr  c                 6                         | |           d S r   )declare_optional_arg_struct)	func_typefused_cnamer   r   s     r5   declare_opt_arg_structz;CFuncDeclaratorNode.analyse.<locals>.declare_opt_arg_struct>  s!    44Y[QQQQQr4   callspeczcannot have both 'z' and 'z' calling conventionsz6Rvalue-reference as function return type not supportedz3Rvalue-reference as function argument not supportedrm  rn  )E	enumeraterV   ro  is_c_class_scoper   rn   r  r   r:   r
   r   same_asrs  cnameis_unspecifiedparent_typerc  r}  rk  re  CFuncTypeArgnot_noneor_noner  rX  r  r|  has_explicit_exc_clauser  r   rB  r  rM   rr  r  r  for_typestrr  rj  is_errorr  return_typec_char_typer   rw   	coerce_toas_exception_valueassignable_fromr  is_floathas_constant_resultfloatdefault_valuer  r  	CFuncTypehas_varargsrU  r  r  overridabler  r  rg  r  r  is_rvalue_referenceis_forwarding_reference)r   r  r   rl  directive_localsrm  rn  func_type_argsiarg_nodename_declaratorrj  rn   	type_node
other_typefunc_argexc_val	exc_checkr  exc_val_typetype_default_valuer  r  r  r   args   ` `                       r5   ro  zCFuncDeclaratorNode.analyse  s7   #! 	MH$TY// $	Q $	QKAx$,$4$4h!Ve(<eWZWeAe %5 %h %h!OT #'D''',T2	&66s;;
%)-6666*";;;"ll:66 <$)-)]^^^)-)DEEEE%D$ Vdh TUUUAvv#.v43Fv} =!,T^<<| rhl$pqqq!.tT8<HHH  )$(! (#' !!(+++ Q''1,'''( Qdh OPPP	N56 
	#/
	4
	 (
	 (**#(D DHO   
 3&&  '''  '''  ---  ,,,,$ 	))= 	) $)D # 8	-)8	--1-A8	-(C//$(_````$ 4	-T-A 4	-jT\F\F\aea}F\DH_abcccc#+0D+I]adIdId  /;xAWAW`fAW / I
49N`8a8a I888888/8/A/A HC0K,L,LS^,7,G 0B 0I 0I, #/'3..+/+?+X+XY\+]+]D(#'#7#<L(1 v$0$<v%1%>v .:-E-Qv .:->	v
 &2Z5K%K%K)-)=)Cs)J)Jd26tv v v"2GG+/+?+M+Mc+R+R+\+\#S,* ,**B*B3*G*G ("2EEcJJG&66t7K7PQQ Xd26VX X X"h..!,!3 /7B7K / $ 4 H H J J /N16{7P1Q1Q.  $3CGYYY '2o(,(<(L3M !N !N !N	  * ! ! ! D! ,I# 	A$(?@@@()9#6#Y#y;*t}TEU 0n& & &	 " 
	A! 	AR R R R R R 4J	0000C@@@>*- 	42G C7h..dhh/6ww!B C C C+3I( 4 	[DHVXYZZZ> 	\ 	\Cx+ \C4O4O4Q4Q \"WYZ[[[y  CJv VVVs   U 
UUc                 t   t                      }dt          j        z  }|                    |t          j        | j                   |j        t          |j                  | j	        z
  d         D ]+}|                    |j
        |j        |j        dd           ,|                    t          j        | j        j
                  }|t	          j        ||          }|                                                    |d|d| j        |          }d|_        d|_        t	          j        |j                  |_        dS )	a  
        Declares the optional argument struct (the struct used to hold the
        values for optional arguments). For fused cdef functions, this is
        deferred as analyse_declarations is called only once (on the fused
        cdef function).
        z%snNT)allow_pyobjectallow_memoryviewstructr   )rn   kindscopetypedef_flagr:   r  r   )r   r	   pyrex_prefixdeclare_varr
   
c_int_typer:   rV   rL   r  rn   rj  mangleopt_arg_prefixrs  get_fused_cnamer  declare_struct_or_uniondefined_in_pxdusedr}  op_arg_struct)	r   r  r   r  r  arg_count_memberr  struct_cnameop_args_structs	            r5   r  z/CFuncDeclaratorNode.declare_optional_arg_structU  s/    #$$ 6#66*J,A48LLL>#in"5"58O"O"P"PQ 	g 	gCch#'$aeffffzz&"7HH"%5k<PPL))++CC D     )*%","78K"L"L	r4   )r   NNFr   )r-   r.   r/   r   r  r  r  r  rR  rT  ro  r  r3   r4   r5   r  r    s         655KKOI) ) )  ,dW dW dW dWLM M M M M Mr4   r  c                       e Zd ZdgZddZdS )CConstDeclaratorNoders  r   NFc                     |j         rt          | j        d           t          j        |          }| j                            |||||          S )Nz)Const base type cannot be a Python objectr{  )r|  r   r:   r
   c_const_typers  ro  )r   rk  r   rl  rm  rn  consts          r5   ro  zCConstDeclaratorNode.analyse{  sX      	?$(=? ? ?'	22y  h:^d eeer4   rp  r  r3   r4   r5   r  r  v  s7         (Kf f f f f fr4   r  c                       e Zd Zg dZddgZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZdZd Zed	             Zed
             ZddZd Zd Zd ZddZdS )CArgDeclNode)rk  
declaratorrX  
annotationrX  r  r   r   FNc                 4    | j                                         S r   r  rR  r   s    r5   rR  zCArgDeclNode.declared_name      ,,...r4   c                 4    | j                                         S r   )rn   as_c_string_literalr   s    r5   name_cstringzCArgDeclNode.name_cstring  s    y,,...r4   c                     | j         r&t          t          j        | j        j        z             S t          t          j        | j        j        z             S r   )needs_conversionr   r	   
arg_prefixr  rn   
var_prefixr   s    r5   	hdr_cnamezCArgDeclNode.hdr_cname  sD       	H"6#4tz#FGGG"6#4tz#FGGGr4   c                 2   |r|x| j         _        | _        | j        | j        | j        fS t	          | j        t                    r| j        j        dk    r|rz| j         j        r1| j         	                    |d          }|
                                }n| j         j        }t          |          | j        _        d | j         _        d| j         _        d}nd}d| j         _        | j         	                    ||          }t          | j         dd           }|r|| j        _        |j        rt	          | j         t                    rtt	          | j        t                     rZ| j        }	t	          |	j        t                     r!|	j        }	t	          |	j        t                     !| j         j        |	_        |j         }| j        r>|r<|j        d         r/t          | j         dd           |                     |          }
|
|
}| j        	                    |||          S )	Nr   T)could_be_nameFarg_nameannotation_typingrn   rl  )rk  r  rj  r  rM   r  rW  rn   is_basic_c_typero  empty_declaration_coder   is_argr   rc  TemplatedTypeNoder  rs  array_declaratorr  r   inject_type_from_annotations)r   r   rl  r  rj  r*  r)  rk  base_arg_namer  arg_types              r5   ro  zCArgDeclNode.analyse  s    	H<GGDN&)99 '22 do':;; 	"@TXZ@Z@Z 	7>1 3>11#T1JJD#::<<HH#~2H'4X'>'>$&*#16. MM!M $N**3m*LL	
DAA 	1#0DO 
  	,t~/@AA	,t0DEE	, JZ_.BCC -'_
 Z_.BCC -"n=JO!+I O 	% 	%7J(K 	% DNFD99A88==H#$	&&y#&IIIr4   c                 Z   | j         }|sd S |                    || j                  \  }}|t          |j        |d          | _        |rd|v r3|                                }|r|                                snd| _        n|t          u rd| _        n| j        rf| j        j
        rZ|                                s|j        r?|                                s|j        }| j        st          | j        d           d| _        n"| j        s|                                rd| _        |rd| _        |S )N)assigned_valueT)rj  r/  ztyping.OptionalzIPEP-484 recommends 'typing.Optional[...]' for arguments that can be None.)r  analyse_type_annotationrX  CAnalysedBaseTypeNoder:   rk  resolvecan_be_optionalr  r   r   equivalent_typer   r  type_from_annotation)r   r   r  	modifiersr4  s        r5   r2  z)CArgDeclNode.inject_type_from_annotations  sm   _
 	4(@@UYUa@bb	82Xd< < <DN  	% I--#++-- (H$<$<$>$> ( #'DLL^++# %$,"6 %H<T<T<V<V %ZbZr %//11 8'7H| (DH&qrrr#'DL\ %h&>&>&@&@ % $ 	-(,D%r4   c                    | j         }| j        rv| j        j        rK| j                            |           | j                            | j                                                  S |                    | j                  | _         | j         S r   )r  rX  r   generate_evaluation_coderj  	cast_coder   get_argument_default_constr   s     r5   calculate_default_value_codez)CArgDeclNode.calculate_default_value_code  s    %| P<* FL99$???9..t|/B/B/D/DEEE%)%D%DTY%O%O"!!r4   c                 L    | j         r| j                             |           d S d S r   )rX  r   r   s     r5   r   zCArgDeclNode.annotate  s2    < 	(L!!$'''''	( 	(r4   c                    | j         }||j        rd S ||                     |          }|                    |           |                    |           |r|                                n|                    | j                  }|                    |d|d           |	                    |                                | j                   |
                    |           |                    |           d S N = ;)rX  r   rB  r?  make_owned_referencer   	result_asrj  rT   put_giverefgenerate_post_assignment_code
free_temps)r   rY   targetoverloaded_assignmentrX  r   s         r5   generate_assignment_codez%CArgDeclNode.generate_assignment_code"  s    ,?g0?F>66t<<F((...$$T***%:\!!!@Q@QRVR[@\@\

0111))49555--d3334     r4   )r   FNF)r-   r.   r/   r   r   r  is_type_arg
is_genericis_special_method_optionalkw_onlypos_onlyr  r  rj  r  r  r  
is_dynamicdefaults_class_keyr<  rR  propertyr"  r'  ro  r2  rB  r   rO  r3   r4   r5   r  r    s       , GFFKl+KKKJ!&GHHGDOMJJ / / / / / X/ H H XH0J 0J 0J 0Jd# # #J" " "( ( (! ! ! ! ! !r4   r  c                       e Zd Zd ZdS )CBaseTypeNodec                 ,    |                      |          S r   ro  r   s     r5   r  zCBaseTypeNode.analyse_as_type9  s    ||C   r4   N)r-   r.   r/   r  r3   r4   r5   rZ  rZ  1  s#        ! ! ! ! !r4   rZ  c                       e Zd Zg ZddZdS )r8  Fc                     | j         S r   rj  )r   r   r)  s      r5   ro  zCAnalysedBaseTypeNode.analyseB  r[  r4   NFr  r3   r4   r5   r8  r8  =  s/         K     r4   r8  c                   .    e Zd Zg ZdZg ZdZdZdZddZ	dS )CSimpleBaseTypeNodeNFc                    d }| j         r>t          j        | j        | j        | j                  }|st          | j        d           n| j        dk    r| j        s	t          }n| j         | j
        r|j        r	|j        }nt          }n|}| j        r| j        D ]S}|                    |          }|'|j        s|j        r|j        j        r|j        j        }@|r|j        r|j        }Qd } |Wt'          | j                  dk    r?ddlm} |                    | j        d                   }|r|j        r ||j                  }| |                    | j        | j                  }|r|j        r|                                }|                    | j                  }|n|r7| j
        r|j        r|j        }nt          }t5          | j                  | _        ni| j        rE| j        | j        vrt          | j        d| j        z             t          j        | j                  }nt          | j        d| j        z             |r(|j        r!|j        r|                     |j                  }| j!        rM|j"        r|j#        rt          | j        d           t          j$        |          }|%                    |           n6|t(          j&        u r(t          j'        }|%                    |           d| _!        |st          j(        }|S )	Nz&Unrecognised type modifier combinationobjectr   )'get_known_standard_library_module_scoper   z'%s' is not a type identifierz#can only complexify c numeric typesT))r-  r
   simple_c_typesignedlongnessrn   r   r:   module_pathr   r  r  r  lookupr  is_typerj  r  	as_modulerL   r   re  known_standard_library_importfind_imported_moduler  lookup_typer   r*  r  r  rg  rh  ri  complex
is_numeric
is_complexCComplexTypecreate_declaration_utility_codecomplex_typec_double_complex_typer   )	r   r   r)  rj  r  r   r  re  found_entrys	            r5   ro  zCSimpleBaseTypeNode.analyseW  sg     >	U+DK	RRD Jdh HIIIY(""4+;"!DDY &C$8 & &E Q ,  D!LL..E(* ) )*/**A ) !&
 0 5?  % $=S)9%:%:a%?%? QPPPPP"%**T-=a-@"A"AK" s{'P s G GHq r r=44T5EtxPPE U) 1!..00E((33#" U' .C,@ ."  .$1$)$<$<DMM~ U9DN::!$(,Kdi,WXXX)A$)LLdh(G$)(STTT 	:DM 	:c&; 	:??3#899D< 	 ? Gdo Gdh EFFF*400D005555W)))
 3D00555DL 	)(Dr4   r`  )
r-   r.   r/   r   r*  ri  r-  rp  r  ro  r3   r4   r5   rb  rb  F  sN         KHKOGKT T T T T Tr4   rb  c                   (    e Zd ZdZddgZddZd ZdS )	MemoryViewSliceTypeNode
memoryviewbase_type_nodeaxesFc                 (   | j                             |          }|j        r|S ddlm} 	 |                    || j                  }nP# t          $ rC}t          |j	        |j
                   t          j                    | _        | j        cY d }~S d }~ww xY w|                    | j        |          st           | _        nNt          j        ||          | _        | j                            | j                   |                     |           | j        S Nr   
MemoryView)r{  ro  r  r   r  get_axes_specsr|  r   r   positionmessage_onlyr
   	ErrorTyperj  validate_axesr:   r   MemoryViewSliceTypevalidate_memslice_dtypeuse_memview_utilities)r   r   r)  rk  r  
axes_specses          r5   ro  zMemoryViewSliceTypeNode.analyse  s   '//44	/i/      	#223	BBJJ 	 	 	!*an---",..DI9	
 ''*== 	,"DII"6y*MMDII--dh777&&s+++ys   A 
B8B	BBc                 v    ddl m} |                    |                    |j        j                             d S r~  )r   r  use_utility_codeget_view_utility_codecontextshared_utility_qualified_name)r   r   r  s      r5   r  z-MemoryViewSliceTypeNode.use_memview_utilities  sQ          ,,9 	
 	
 	
 	
 	
r4   Nr`  )r-   r.   r/   rn   r   ro  r  r3   r4   r5   ry  ry    sF        D#V,K   .
 
 
 
 
r4   ry  c                       e Zd ZdgZddZdS )CNestedBaseTypeNoderk  Nc                 x   | j                             |          }|t          j        u rt          j        S |j        s$t          | j        d|z             t          j        S |j                            | j	                  }|r|j
        s-t          | j        d|d| j	        d           t          j        S |j        S )Nz'%s' is not a valid type scope'rI   z' is not a type identifier)rk  ro  r
   r   r  r   r:   r  lookup_herern   rk  rj  )r   r   r)  rk  
type_entrys        r5   ro  zCNestedBaseTypeNode.analyse  s    N**3//	
---((% 	)$(<yHIII((_00;;
 	)!3 	)$(()))TYYYWXXX((r4   r   r  r3   r4   r5   r  r    s1         -K     r4   r  c                   6    e Zd Zg dZdZdZdZd ZddZd Z	dS )	r0  )r{  positional_argskeyword_args
dtype_nodeTNc                    |j         dk    }|j        o| }g }| j        D ]}|j        r
|                    |pt          |t                              5  |                    |          }d d d            n# 1 swxY w Y   |#|j        rt          |j
        d           t          }|                    |           |j         rC|j         dk    r#t          d | j        D                       |_        |                                }nd}t!          |          D ]v\  }	}||r|j        r|rc|                                sO|j        r|                                s|j        ||	<   Mt          |j
        |j         d|           t          ||	<   w|S )Nzdataclasses.ClassVarz!unknown type in template argumentztyping.Unionc              3   $   K   | ]}|j         V  d S r   )r   r   s     r5   r=  z<TemplatedTypeNode._analyse_template_types.<locals>.<genexpr>  s$      -V-VAai-V-V-V-V-V-Vr4   Fz [...] cannot be applied to type )r  in_c_type_contextr  r   new_c_type_contextrM   rZ  r  r  r   r:   r   r  anycontains_noneallows_noner  r|  r:  r;  as_cython_attribute)
r   r   rk  require_python_typesr  template_typesr  ttyperequire_optional_typesr  s
             r5   _analyse_template_typesz)TemplatedTypeNode._analyse_template_types  s,   (EI__1N:N6N!1 	) 	)M$ ''(9(eZWd=e=eff ; ;%55c::; ; ; ; ; ; ; ; ; ; ; ; ; ; ;}) '-+-PQQQ&E!!%((((1 	+5GG*--V-VAU-V-V-V*V*V	'%.%:%:%<%<""%*"!.11 	3 	3HAu}# 3E,= 3AW 3`e`u`u`w`w 3( 31R1R1T1T 3(-(=N1%%-+!>>>.    )3N1% s   A55A9	<A9	Fc                 H   || j                             |          }|j        r|S |j        r|                                s|j        r| j        rG| j        j        r;|j        rdnd}t          | j	        d|z             t          j        | _        | j        S |                     ||          }|                    | j	        ||          | _        na|j        rddlm} |                    | j	        || j        | j        |j                  }t          j        |fi || _        t-          |          rEt/          | j                  r1t          j        t3          | j                  | j                  | _        nt5          | j	        dd           }t7          | j                  dk    s| j        j        r't          | j	        d           t          j        | _        nY| j        sd }	n| j        d	         }	t9          | j	        ||	
          | _        | j                            ||          d         | _        | j        rf| j        j        rZ|j        rS	 | j                             |j                  | _        n-# tB          $ r  t          | j	        d| j"        z             Y nw xY w| j        S )Nzc++ templateszindexed typesz %s cannot take keyword argumentsr   Bufferr   rn   r  zinvalid array declarationr   )rs  r  ra  )#r{  ro  r  r  r  r  r  key_value_pairsr   r:   r
   r   rj  r  r  r|  r   r  analyse_buffer_optionsr  buffer_defaults
BufferTyper#   r%   PythranExprr$   rW  rL   r  r1  rg  rh  ri  r   rn   )
r   r   r)  rk  tpr  r  optionsempty_declaratorr  s
             r5   ro  zTemplatedTypeNode.analyse"  s   +33C88I/i/# ,	M	(B(B(D(D ,	M6,	M   !T%6%F !(1(>S__Odh BR GHHH&1	y !99#yIIN!11$(CPPDII"  	M      33$!)+ +G #-iCC7CCDIc"" W'8'C'C W&2<	3J3JDIVV	  348"DQQQ4'((1,,0A0Q,dh ;<<<&1		 + 8 $II $ 4Q 7I(<H)')) )) ))% !199)SII!L	9 	!+ 	!0E 	!! I001FGG		# ! ! !dhji ! ! ! ! !!
 ys   $I0 0'JJc                 D   g }| }|j         r|j        rt          |j                  dk    ru| j                            |          }|j        r!|j        r|                    |j                   |j        d         }|j         r|j        rt          |j                  dk    u|S )Nr   r   )r   r{  rL   r  r  r  modifier_namer  )r   r   r=  modifier_nodemodifier_types        r5   analyse_pytyping_modifiersz,TemplatedTypeNode.analyse_pytyping_modifiers_  s     	2 	=}7S 	=X[\i\yXzXz~XX /??DDM9 >m>Y >  !<===)9!<M	 2 	=}7S 	=X[\i\yXzXz~XX r4   )FN)
r-   r.   r/   r   r   r  rn   r  ro  r  r3   r4   r5   r0  r0    sk        1 1 1K "JD( ( (T; ; ; ;z    r4   r0  c                       e Zd ZddgZddZdS )CComplexBaseTypeNoderk  r  Fc                 x    | j                             ||          }| j                            ||          \  }}|S r   )rk  ro  r  )r   r   r)  rs  _rj  s         r5   ro  zCComplexBaseTypeNode.analyses  s9    ~%%c=99/))$444r4   Nr`  r  r3   r4   r5   r  r  m  s4         -K     r4   r  c                       e Zd ZdgZddZdS )CTupleBaseTypeNode
componentsFc                 
   g }| j         D ]Q}|                    |          }|j        rt          |j        d           t
          c S |                    |           R|                    | j        |          }d|_        |j	        S )Nz/Tuple types can't (yet) contain Python objects.T)
r  ro  r|  r   r:   r   r  declare_tuple_typer  rj  )r   r   r)  component_typesr   rj  r  s          r5   ro  zCTupleBaseTypeNode.analyse~  s     	) 	)A99S>>D "aeNOOO!!!!""4((((&&txAA
zr4   Nr`  r  r3   r4   r5   r  r  y  s1          .K
 
 
 
 
 
r4   r  c                   $    e Zd ZdZg Zd ZddZdS )FusedTypeNodea  
    Represents a fused type in a ctypedef statement:

        ctypedef cython.fused_type(int, long, long long) integral

    name            str                     name of this fused type
    types           [CSimpleBaseTypeNode]   is the list of types to be fused
    c                     |                      |          }|                    | j        || j                  }d|_        d S )NT)ro  declare_typedefrn   r:   r>  )r   r   rj  r  s       r5   r   z"FusedTypeNode.analyse_declarations  s>    ||C  ##DItTX>> !r4   Fc                    g }| j         D ]^}|                    |          }|st          |j        d           /||v rt          |j        d           I|                    |           _t          j        || j                  S )Nr  zType specified multiple timesrZ  )rg   r  r   r:   r  r
   	FusedTypern   )r   r   r)  rg   r  rj  s         r5   ro  zFusedTypeNode.analyse  s     
	# 
	#I,,S11D im\222u}}im%DEEEET""""
 #E	::::r4   Nr`  )r-   r.   r/   r   r   r   ro  r3   r4   r5   r  r    sH          K! ! !; ; ; ; ; ;r4   r  c                       e Zd ZdgZddZdS )CConstOrVolatileTypeNoderk  Fc                     | j                             ||          }|j        rt          | j        d           t          j        || j        | j                  S )Nz2Const/volatile base type cannot be a Python object)	rk  ro  r|  r   r:   r
   c_const_or_volatile_typer  is_volatile)r   r   r)  rs  s       r5   ro  z CConstOrVolatileTypeNode.analyse  s[    ~%%c=99 	H$(FH H H24HXYYYr4   Nr`  r  r3   r4   r5   r  r    s7        
 -KZ Z Z Z Z Zr4   r  c                   &    e Zd ZddgZdZdZddZdS )r<  rk  declaratorsNc                    | j         i | _         |s|}|| _        | j        r | j        d                                         }nd }|| j        dk    rt          | j        d           t          | j                  dk    r t          | j        d         j        d           t          d|          }|j	        j
        |_
        |D ]#}|                    |j        || j                   $| j                            |          }d }| j        j        r| j                            |          }|j        r1| j        s*|j        s|j        rt          | j        d           t*          S d | _        | j        }| j        D ]}t          | j                  dk    r8t/          |t0                    s#|j
        d         rt3          |j        d	d           | j        o| j        dk    o|j        }	|	rd
|_        t/          |t6                    r(|                    ||| j         || j                  \  }
}n!|                    |||| j                  \  }
}|                                s1| j        dk    r|j        s|j        st          |j        d|z             | j        dk    r|j        rt          |j        d           |
j        }|
j         }|dk    rt          |j        d            d S |j!        r | j        dk    rt          |j        d           |j"        r | j        dk    rt          |j        d           |j#        rd|j
        v rd|_$        |%                    |||j        || j        | j        | j&        | j'        | j        	  	        | _        | j        #tQ          j(        | j                   | j        _         |	r+| j        j)        *                    |           d| j        _+        j| j        rt          | j        d           | j         rt          | j        d           |,                    |||j        ||| j        | j&        d|	  	        | _        tZ          j.        r$t_          | j        | j0                  | j        _0        d S )Nr   r  zOnly extern functions allowedr   z%Can't multiply declare template typesfunc_templatezFused types not allowed herezwarn.multiple_declaratorszNon-trivial type declarators in shared declaration (e.g. mix of pointers and values). Each pointer declaration should be on its own line.F)r  rm  rn  r  z Variable type '%s' is incompletez'Python object cannot be declared externr   zMissing name in declaration.z8C++ references cannot be declared; use a pointer insteadz(C++ rvalue-references cannot be declaredr1  T)r  rm  rn  apir=  r  z>Variables cannot be declared with 'cpdef'. Use 'cdef' instead.z,Decorators can only be followed by functions)r  rm  rn  r  is_cdefpytyping_modifiers)1r  
dest_scoper  rT  rm  r   r:   rL   r   outer_scoper   declare_typern   rk  ro  r   r  rg  rn  r  is_module_scoper   r  rM   rW  r   r  r  r  rc  is_memoryviewslicer|  r  is_referencer  r  is_static_methoddeclare_cfunctionr  r=  r   rj  create_to_py_utility_codecreate_wrapperr  r!   
docstringsrE   rD   )r   r   r  r  template_paramrk  r=  rm  r  create_extern_wrapperr  rj  rn   r  s                 r5   r   z CVarDefNode.analyse_declarations  s    ($&D! 	J$ 	(+==??III (**dh ?@@@4#$$q((d&q)-/VWWW55C _7CN"+ P P  !4ndhOOOON**3//	 	>0 	GAA#FFI 	dk 	s7K 	7:7J	$(:;;;
_
* 9	H 9	HJD$%%))&z3FGG *'BC * NJKLN N N
 &*%5 &=)-H)D&=),)< " % /).
&*&9:: O(2(:(:sT5JWajnju ); )w )w% )3(:(:sz$+ ); )O )O%##%% U8333I`3*.*Lt*STTT(**t/?*jn&OPPP"'D#)Erzzjn&DEEE  bT_%@%@jn&`aaa' RDOx,G,Gjn&PQQQ  H!S^33,0D)'99$
DODKDNHX : Z Z
 :)26)D<Q2R2RDJ/( 5JO==cBBB04DJ-# f$($deee( T$($RSSS'33$
Jt{$9 4 N N
 % H%3DHdh%G%GDJNs9	H 9	Hr4   r   )r-   r.   r/   r   
decoratorsr  r   r3   r4   r5   r<  r<    sK         .KJ]H ]H ]H ]H ]H ]Hr4   r<  c                   .    e Zd ZdgZddZd Zd Zd ZdS )CStructOrUnionDefNode
attributesNc                     |                     | j        | j        || j        | j        | j        | j        | j        | j        	  	        | _	        d S )N)rm  r  packed)
r  rn   r  r  r:   r  rm  r  r  r  r   r   r  s      r5   declarezCStructOrUnionDefNode.declareB  sH    00Ity%):DHJ4?; 1    


r4   c                    d }| j         t          | j                  }|                     ||           | j         | j        r|j        sd| j        _        | j         D ]}|                    ||           | j	        dk    rM|j
        D ]G}|j        }|j        r|j        }|j        || j        j        k    rt          |j        d           Dd S d S d S )Nr   r  z)Struct cannot contain itself as a member.)r  r   rn   r  rn  r>  r  r  r   rm  var_entriesrj  rc  rk  r   r:   )r   r   r  r   rj  s        r5   r   z*CStructOrUnionDefNode.analyse_declarationsH  s   ?&&ty11ES%   ?&{ .3? .,-
) 6 6))#u5555(**!- U UD9D- .#~ - .tz..dh(STTT '&
 +*U Ur4   c                     | S r   r3   r   s     r5   rx   z)CStructOrUnionDefNode.analyse_expressionsZ      r4   c                     d S r   r3   r   s     r5   r  z-CStructOrUnionDefNode.generate_execution_code]  r   r4   r   )r-   r.   r/   r   r  r   rx   r  r3   r4   r5   r  r  4  sa          .K       U U U$      r4   r  c                   6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )CppClassNodeNc           	      ^   | j         d }nmd | j         D             }t          d | j         D                       }|r<t          d | j         d |          D                       st          | j        d           |                    | j        d | j        | j        g | j        |          | _	        d S )Nc                 @    g | ]\  }}t          j        ||           S r3   r
   r  r   template_namerequireds      r5   r   z(CppClassNode.declare.<locals>.<listcomp>s  C     M M M"9- )@T\P\]] M M Mr4   c              3   "   K   | ]
\  }}| V  d S r   r3   r   r  r  s      r5   r=  z'CppClassNode.declare.<locals>.<genexpr>u  s(      (X(X+!XX(X(X(X(X(X(Xr4   c              3       K   | ]	\  }}|V  
d S r   r3   r  s      r5   r=  z'CppClassNode.declare.<locals>.<genexpr>v  s&      1w1w{q((1w1w1w1w1w1wr4   zGRequired template parameters must precede optional template parameters.)base_classesrm  r  )
r  sumrA  r   r:   declare_cpp_classrn   r  rm  r  )r   r   r  num_optional_templatess       r5   r  zCppClassNode.declareo  s    >!!NNM M=A^M M MN%((X(X(X(X(X%X%X"% kc1w1wdn]u_u^u]uNv1w1w1w.w.w kdh ijjj**ItTXtz> + S S


r4   c           	         
                                  st           j        dd            j        d x}}n"d  j        D             }d  j        D             }d  j        t           j        |           fd}t          |fd j        D                       }	                     j         j         j
        | j        |	           _         j        d S d j        _         j        j        _        g }
fd

 j         j        rj        sd j        _         j        D ]?}t%          |dd           }|r|                               |                               @ 
 j                  D ];}	|                    |	            j        dd                    |          z  |	_        <t1           j        |           _         _        d S )Nz0Using 'cppclass' while Cython is not in c++ moder   r  c                     g | ]\  }}|S r3   r3   )r   r  r  s      r5   r   z5CppClassNode.analyse_declarations.<locals>.<listcomp>  s    SSS0@qmSSSr4   c                 @    g | ]\  }}t          j        ||           S r3   r  r  s      r5   r   z5CppClassNode.analyse_declarations.<locals>.<listcomp>  r  r4   )r  c                 X    | j         s| j        rdS t          j        d| z             d S )NTz&Base class '%s' not a struct or class.)r  	is_structr   r:   )
base_classr   s    r5   base_okz2CppClassNode.analyse_declarations.<locals>.base_ok  s=    & W**> Wtdh H: UVVVVVr4   c                 >    g | ]}|                     p          S r3   r\  )r   br   r  s     r5   r   z5CppClassNode.analyse_declarations.<locals>.<listcomp>  s)    +_+_+_AIIels,C,C+_+_+_r4   )rm  r  c              3     K   | D ]}t          |t                    r|V  t          |t                    r |j        j                  E d {V  Mt          |t
                    r|j         |j                  E d {V  d S r   )rM   CFuncDefNoder   r   r  r  r  )r  r   func_attributess     r5   r	  z:CppClassNode.analyse_declarations.<locals>.func_attributes  s      " @ @dL11 @JJJJ&<== @.ty??????????l33 @8S.t?????????@ @r4   r  ztemplate <typename %s>z, typename r'  )r   r   r:   r  r  r   rn   filterr  r  r  rm  r  r  rj  rn  r>  r  r   r  r   r  r   template_declarationr  r   r  )r   r   r  template_namesr  base_class_typesdefined_funcsr   r  r^   r	  r  s   ``        @@r5   r   z!CppClassNode.analyse_declarations|  sk   zz|| 	DHF    >!.22N^^SSDNSSSNM M=A^M M MN?&!$)SNKKKE	W 	W 	W 	W 	W
 "'+_+_+_+_+_TM^+_+_+_``**IudhJ(T_P^ + ` `
 :F"#
EJ	@ 	@ 	@ 	@ 	@ ?&{ .3? .,-
) 1 1!$	488 (LL'''))%0000'88 n n$$T***>-0H=K]K]^lKmKm0mD- ???	


r4   c                 b    | j                             | j        j        j                  | _         | S r   )r   rx   r  rj  r  r   s     r5   rx   z CppClassNode.analyse_expressions  s%    I11$*/2GHH	r4   c                 Z    | j                             | j        j        j        |           d S r   )r   r  r  rj  r  r5  s      r5   r  z*CppClassNode.generate_function_definitions  s'    	//
0EtLLLLLr4   c                 :    | j                             |           d S r   r   r  r   s     r5   r  z$CppClassNode.generate_execution_code      	))$/////r4   c                 :    | j                             |           d S r   rL  r   s     r5   r   zCppClassNode.annotate  rM  r4   )
r-   r.   r/   r  r  r   rx   r  r  r   r3   r4   r5   r  r  a  s|         JS S S2 2 2h  M M M0 0 0! ! ! ! !r4   r  c                   2    e Zd ZddgZdZd Zd Zd Zd ZdS )CEnumDefNoderj   underlying_typeNc                     d }t           j        rt          | j        | j                  }|                    | j        | j        | j        | j        | j	        | j
        | j        | j        |	  	        | _        d S )N)r  scopedr  rm  r  r  rD   )r!   r  rE   r:   rD   declare_enumrn   r  r  r  rm  r  r  r  )r   r   rD   s      r5   r  zCEnumDefNode.declare  so     	5 4844C%%Itx*;*DH.C & 9 9


r4   c                    d }| j                             |          }|j        st          | j         j        d           || j        j        _         | j        r:| j        3t          | j
        |          }| j        j        |_        |j        |_        n|}| j        p| j        r|j        sd| j        _        | j        dk    }|rdnd }| j        D ]?}|                    || j        |           |rd|j        j        |j        j        n|z   }>d S d S )Nz'underlying type is not an integral typer   r  r   )r  ro  r  r   r:   r  rj  r  rj   r   rn   r   rn  r>  r  rm  analyse_enum_declarationsenum_int_value)r   r   r  r  is_declared_enumnext_int_enum_valuer   s          r5   r   z!CEnumDefNode.analyse_declarations  s>   .66s;;% 	W$&*,UVVV*9
'; 	4:1&ty#66EEJ"~EE:!{ .3? .,-
)  $(:'7"A!!T
 u u..udjBUVVV# u*+59Z5N5Z
11`s+u' "!u ur4   c                     | S r   r3   r   s     r5   rx   z CEnumDefNode.analyse_expressions  r  r4   c                    | j         rd S | j        s| j        s| j        dk    sd S |                    | j                   |j                            t          j	        d          }| j
        j        D ]}|                    |d|j        d|                    ||j                             |                    |t          j	                   |                    d|                    t"          j                  d|j                                        d|d|                    |j                             |                    |t          j	                   |j                            |           d S )	NpublicT
manage_refz = PyLong_FromLong(); zif (PyDict_SetItemString(r   ) < 0) )r  r  rn   rm  r,  r:   	funcstateallocate_tempr
   r   r  enum_valuesrT   r  error_goto_if_null
put_gotrefname_in_module_stater	   moddict_cnamer!  
error_gotoput_decref_clearrelease_temp)r   rY   tempr   s       r5   r  z$CEnumDefNode.generate_execution_code  s   ; 	Fx 	 	do.I.I F 	dh~++J,ERV+WWJ* 	C 	CDJJ


''dh7779 : : : OOD*";<<<JJJ))&*>????	--////)))	+ , , ,
 !!$
(ABBBB##D)))))r4   )	r-   r.   r/   r   rD   r  r   rx   r  r3   r4   r5   r  r    se         -.K
C9 9 9u u u>  * * * * *r4   r  c                       e Zd ZdgZd ZdS )CEnumDefItemNoder   c                 ^   | j         ry| j                             |          | _         | j         j        j        sI| j                             t
          j        |          | _         | j                             |          | _         |j        j        r|j        d| j	        }n| j        }|
                    | j	        |j        | j         | j        ||j        |j        |j        o|j	        d u           x| _        }|}| j         r^| j         j        rt#          | j         j                   }n8| j         j        s| j         j        r| j         j        r| j         j        j        }nd }|||_        |j                            |           |j	        r&|j        j                            |j	                   d S d S )N::)r  rm  r  r  )r   r  rj  r  r  r
   r	  is_cpp_enumr  rn   declare_constr:   rm  r  r  r  r   r(   r   is_attributer  r)  r  r  )r   r   
enum_entryincremental_int_valuer  r  
enum_values          r5   r  z*CEnumDefItemNode.analyse_enum_declarations   s   : 	F<<SAADJ:?) F!Z11*2GMM
!Z@@EE
?& 	 * 0 0 0$))<EEJE ..IzJ!,*.%4PD9P	 / R R 	R
U +
: 	"z$ "*4:+;<<

*$ "
(? "TZEU "!Z-<

 "
!#-E %%e,,,? 	6O"))%*55555	6 	6r4   N)r-   r.   r/   r   r  r3   r4   r5   r3  r3    s,        
 )K!6 !6 !6 !6 !6r4   r3  c                   (    e Zd ZddgZd Zd Zd ZdS )CTypeDefNoderk  r  c                 N   | j                             |          }| j                            ||| j        | j                  \  }}|j        }|j        }|                    ||| j        || j        | j	                  }|j
        rd|_        | j        r|j        sd|_        d S d S d S )Nr  )r  rm  r  Tr   )rk  ro  r  rm  rn  rn   r  r  r:   r  rg  r>  r  )r   r   rs  r  rj  rn   r  r  s           r5   r   z!CTypeDefNode.analyse_declarationsM  s    ~%%c** $ 7 7#$/$+ !8 !G !G#%##$DO $ C C = 	% $E; 	%s 	%#$E   	% 	% 	% 	%r4   c                     | S r   r3   r   s     r5   rx   z CTypeDefNode.analyse_expressions^  r  r4   c                     d S r   r3   r   s     r5   r  z$CTypeDefNode.generate_execution_codea  r   r4   Nr-   r.   r/   r   r   rx   r  r3   r4   r5   r=  r=  D  sM         -K% % %"      r4   r=  c                       e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZg ZdZdZdZdZdZdZdZd Zd Zd Zd Zd Zd Zd	 Zd
 Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&dS )FuncDefNodeNFc                    d}| j         D ]}|j        rd}|j        rE|j                            |          |_        |j                            |j        |          |_        W|j        r)|j        j        st          |j	        d           d |_        t          |j	        d           d |_        |j
        rd}|rt          |j	        d           d S )Nr   r   z2This argument cannot have a non-None default valuez)This argument cannot have a default valuez/Non-default argument following default argument)rV   rX  rR  rw   r  rj  rS  r   r   r:   rT  )r   r   default_seenr  s       r5   analyse_default_valuesz"FuncDefNode.analyse_default_values  s    9 	R 	RC{ R > 	'"%+";";C"@"@CK"%+"7"7#"F"FCKK3 ';. +cg'[\\\&*#'#NOOO"&CKK R  RcgPQQQ!	R 	Rr4   c                     | j         D ](}|j        r|j                            |          |_        )| j        r!| j                            |          | _        d S d S r   )rV   r  rw   return_type_annotationr   r   r  s      r5   analyse_annotationszFuncDefNode.analyse_annotations  sp    9 	C 	CC~ C!$!=!=c!B!B& 	Y*.*E*S*STW*X*XD'''	Y 	Yr4   c                 8   | j         }|j        }|j        |v r#||j                 }|                    |          }nLt	          |t
                    r5|j        r.|j        d         r!|j        }|                    |          }||S n|S |t          |j
        d           n{|t          urE|                    |          s0t          |j        j
        d           t          |j
        d           n-||_        |j        j        r|j                            |           |S )Nr+  r  r  r  )r  rj  rn   r  rM   r  r  r   r2  r   r:   r   r  rk  rr  rt  )r   r   r  r  	orig_typer  r  s          r5   align_argument_typezFuncDefNode.align_argument_type  s0   0H	8'''(2I"22377JJ\** 	s~ 	#.QdBe 	I99#>>J!
 " J)-....n,,Y5F5Fz5R5R,#-#%YZZZ)-!<====!CHx" >88===
r4   c                     dS Nr   r3   r   lenvs     r5   need_gil_acquisitionz FuncDefNode.need_gil_acquisition  s    qr4   c                    |}|j         s|j        r|j        }|j         |j        | j        r9| j        rt
          nt          } || j        j        ||| j        j	                  }nt          | j        j        ||          }| j        |_        | j        j        }|j        r|j        o|j         |_        || _        |j        |_        |S )N)rn   r  parent_scope
scope_name)rn   r  rT  )is_py_class_scoper  r  needs_closureis_generator_expressionr   r   r  rn   r  r   r  rj  r  r  r  local_scoper   )r   r   genvrm   rQ  rj  s         r5   create_local_scopezFuncDefNode.create_local_scope  s    $ 	$(= 	$#D $ 	$(= 	$ 		0.2.J\**P\C3DJO,0-0+/:+;= = =DD
 4:?*.+.0 0 0D  +z 	:9DM(9DJ.r4   c                 :    | j                             |           d S r   r  r5  s      r5   generate_function_bodyz"FuncDefNode.generate_function_body  r  r4   c                 +   '() ddl m}  j        }|j        r#|j        st
          j        dt
          j        }nt
          j        }|                    |            j	        
                    ||                                ||            j        j        dk    o j        j        j        } j        j        dk    o j        j        j        }|p|}|rd j        vr j        dgz    _                                         }	 j        rd}
ni|                                }
|
rS|j                            t-          j        dd	                     |j        j        d
         r|                                 |                    |           |                                |_        |j         |j        _        |                      j!                    "                    ||           |#                    d           |	r|#                    |	            $                    ||          p j%        } j&        r j&        '                    ||d            '                    ||           |}|j(        s|j        r|j)        }|j(        |j         j*        rR|+                    |j,        j-        .                    t
          j                             |#                    d           n j/        r|j        rQ|+                    |j,        j-        .                    t
          j                             |#                    d           |+                    |j,        j-        .                    t
          j                             |#                    d            0                    ||           |j1        D ]%}|j2        s|j3        s|4                    |           &d} j5        }|j6        r|j7        r|j8        }|j9        se|j:        rd}n$|j;        rd|<                    |j=                  z   }|#                    |.                    t
          j>                  |d           |?                                } @                    |            jA        }d |jB        D             }|j        o j*        p j/        }d )d}|s|r#|C                                 d|j        _        d}n|?                                )|
re|D                                 d } jE        r3 jE        F                    |            jE        G                                }|H                    |           |r I                    |           |?                                }|?                                }|j        j         }|r J                    |            j*        rt          jL        dd          }t          jM        |j,        j-        j        |          }|s'd|N                    |j,        j-        jO                  z  }|#                    t
          j        d|j,        j-        P                                d|d|N                    |j,        j-        jO                  d|N                    t
          jQ                  d
           |#                    dt
          j        z             |#                    t
          j        d|j,        j-        R                    d          d           |S                    dt                     |#                    |U                     j!                             |#                    d           |V                    t
          j        |j,        j-                   |#                    d            j/        r jW        rE|#                    |d|j,        j-        P                                dt
          jX        d            nD|#                    |d|j,        j-        P                                d!t
          jX        d           |j        r&|#                    t
          j        d|d           nG j*        r@|S                    ||j,        j-                   |Y                    ||j,        j-                   |
rl jZ        rt           j        j        d"z             }n j        j        }|\                    | j!        |j        j          j&        d u#           d|j        _]         ^                    ||           |j_        D ]c}|j-        j;        s&|s|j`        r|j2        s|a                    |           4|j`        r(|j2        s!|b                    ||j        j        $           d|j1        D ]}|j3        rm|j`        rf|j2        s_|j-        j;        r!|b                    ||j        j        $           |jc        r|d                    |           n|a                    |           |j-        e                    |          r|j-        f                    ||           |j1        |j_        z   D ]5}|j-        jg        r'|jh        ji        jj        r|k                    ||           6 l                    |           |j_        D ]*}|j-        jg        r|m                    || j!                   +|j        jn        rd}|rK|j        rD)")C                                 d )d|j        _        |o                                 d|j        _         p                    ||           |                      j!        d%           |#                    d           |#                    d&           |j        j        |j        j        )d u d'(|f()fd(	' j5        } j	        jq        s|j:        r.t
          j>        } 'd)           |r                    ||           n_|j;        sX|j=        }|r&|#                    t
          j>        d|d           n)|j9        s"|#                    d*t
          j>        z             |
r/|s                    t
          j>         j!        |(d)          +           |t                    |ju                  r+ j	        jq        s|v                    |jw                   |x                    |ju                   |j        y                                D ].\  }} 'd,           |z                    ||(d,         $           /t          |          d-k    } | r|j                            t                     |#                    d.           |#                    d/            'd,           |#                    d0           |#                    d1           |D ]}|}                    ||           |#                    d2           |j;        r3dd3l m~}! |!                    t
          j>        |           t
          j>        }"n                                 }"|
r 'd,           |                                 |#                    d4           |                     j!                   |#                    d5           |s                    d6 j!        (d)          7           |#                    d8                                            }#|"|#r 'd,           |j        j        rD|#                    d9t
          j        z             |#                    d:t
          j        z             |                     j        j                   |j        j        r|#                    d           nSt           j        j!        d; j        j        z  d-            'd,           |                     j        j                   |j=        }$|"|$r|$}"|"6|"t
          j>        k    r%|#                    t
          j>        d|"d           n)|j9        s"|#                    d*t
          j>        z             |r  'd,                                |           |?                                f'( fd<	}%| s	|s|j;        r,(d,         s	|j;        sJ |v                    |j                   n |%             nd= }%|t                    |jw                  s|t                    |ju                  s|x                    |jw                   |D ]#} 'd)           |}                    ||           $|r  'd)                                |           |j;        r|                    |                    t
          j>                            }&|#                    d>|&z             (d)         s|C                                 |#                    d?           (d)         s|o                                 |#                    d           |t                    |j                  r$ |%             |x                    |j                   |j1        D ]}|jj        r|j2        r|j-        j        r'|j3        r|j`        s,|j-        j        r 'd)           n5|j-                            |          r|j-                            ||           |                    |(d)         $           |j_        D ]]}|j2        r
|j-        j;        r	|j`        sn!|s|j`        s)|j-        j        r 'd)           |                    |(d)         $           ^ j*        r5 'd)           |                    t
          j        |j,        j-                   |j        sA|j=        }$                                 }"|"|$r|$}"|                    t
          j>        |            j        j        rK j        j        d@k    r; 'd)           |#                    dAt
          j>        dBt
          j>        dC           |
r-d|j        _]        |                    |j        j         7           |j        jn        rR|                                 |                     j        j        |D           |                    (d)          7           |s|j        r((d)         r |o                                 d|j        _        |j9        s"|#                    dEt
          j>        z             |#                    d           |	r|#                    dF|	z             |                    |j                   |                                  j&        r j&        
                    ||                                |           d S )GNr   r  rK   __getbuffer____releasebuffer__cython_unusedFProfilez	Profile.c	linetracer   Twith_pymethdef
proto_only)re  rG  z = NULLrF  c                      g | ]}|j         	|S r3   r  )r   r  s     r5   r   z=FuncDefNode.generate_function_definitions.<locals>.<listcomp>D  s    TTTTuTTTr4   tp_newrl   z
%s->tp_newz = ()(r   , NULL);if (unlikely(!%s)) {Py_None} else {}z) __Pyx_CyFunction_GetClosure();z) z
 (wrapper))r  is_cpdef_funchave_giltrace/* function exit code */)successr   gil_state_declaredc                     |          s>d         s                                  dd<   |                    d           d| <   d S d S )Nry  TFdeclare_gilstate)r|  put_ensure_gil)	code_pathrY   	gil_ownedgilstate_decls     r5   
assure_gilz=FuncDefNode.generate_function_definitions.<locals>.assure_gil  sl    Y' , !56 ;!224446:I23##U#;;;'+	)$$$, ,r4   rx  z!__Pyx_pretend_to_initialize(&%s);r  r  r   r   z0{ PyObject *__pyx_type, *__pyx_value, *__pyx_tb;__Pyx_PyThreadState_declare__Pyx_PyThreadState_assignz5__Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);z5__Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}r  z#if CYTHON_USE_SYS_MONITORING#elseNULL)r  #endifzint %s = 0; /* StopIteration */
if (!%s) {z&Unraisable exception in function '%s'.c                     d         r d|            n!d         r|                                   dd<   d         d         k    s#J j        dd         dd                     d S )Nrx  r   )rY   Fz: error path z != success path )put_release_ensured_gilr:   )rY   r  r  r   s    r5   $align_error_path_gil_to_success_pathzWFuncDefNode.generate_function_definitions.<locals>.align_error_path_gil_to_success_pathD	  s    Y' /JwT22222w' /00222).Ig& )Yy-AAAAHHHi000)I2F2FDHAAAAAr4   c                      d S r   r3   r3   r4   r5   r  zWFuncDefNode.generate_function_definitions.<locals>.align_error_path_gil_to_success_pathZ	  s      r4   	if (%s) {zOPyErr_SetString(PyExc_TypeError, "Memoryview return value is not initialized");__hash__if (unlikely(z == -1) && !PyErr_Occurred()) z = -2;)acquire_gil
return %s;#endif /*!(%s)*/)r   r  rY  is_closure_scopeis_passthroughr	   cur_scope_cnameouter_scope_cnamemangle_closure_cnamesr   r  r  r  rn   r  r  r=  get_preprocessor_guardis_generator
is_tracingr  r  r   load_cachedr   use_fast_gil_utility_codeenter_cfunc_scope	new_labelreturn_from_error_cleanup_labelr  r'  r  r,  r:   r  rT   needs_assignment_synthesispymethdef_requiredpy_funcgenerate_function_headerrV  r  rW  putscope_classrj  rf  needs_outer_scopegenerate_argument_declarationsr  
in_closurer/  put_var_declarationr  is_cv_qualifiedr  cv_base_typere  r|  r  literal_coder  retval_cnamerP   generate_keyword_listr  buffer_entriesr}  put_trace_declarationscode_objectgenerate_result_code	py_resultput_trace_frame_initgetbuffer_checkgetbuffer_initr   ConstructorSlotget_slot_functionr,  typeptr_cnamer.  empty_tupler@  
put_increfr   r.  r+  is_cyfunction
self_cnamerJ  r   r   put_trace_start	can_tracegenerate_argument_parsing_codearg_entriescf_is_reassignedput_var_increfput_var_incref_memoryviewslicexdecref_cleanupput_var_xincrefneeds_explicit_constructiongenerate_explicit_constructionrd  
buffer_auxbuflocal_nd_varr  put_init_varsgenerate_argument_type_testsput_acquire_arg_bufferneeds_refnannyr  r]  r   put_init_to_py_noneput_trace_return
label_usederror_labelput_gotoreturn_label	put_labelall_managed_tempsput_xdecrefrL   restore_exception_utility_codeput_release_buffer_coder  put_init_entryerror_valueput_trace_exception_propagatingput_trace_unwindcaller_will_check_exceptionserror_without_exceptionerror_without_exception_cnameput_add_tracebackqualified_namer   put_unraisablegetbuffer_error_cleanupgetbuffer_normal_cleanupunlikelyerror_conditionneeds_refcountingrefcounting_needs_gilneeds_explicit_destructiongenerate_explicit_destructionput_var_xdecref
put_decrefput_xgiveref
is_specialput_trace_exitput_declare_refcount_contextput_setup_refcount_contextput_finish_refcount_contextput_temp_declarationsexit_cfunc_scopegenerate_wrapper_functions)*r   r   rY   r  rQ  r  is_getbuffer_slotis_releasebuffer_slotis_buffer_slotpreprocessor_guardtracingre  cenvr  initr  tempvardecl_coder  used_buffer_entriesvar_decls_definitely_need_gilvar_decls_need_gilr  refnanny_decl_coderefnanny_setup_coderefnanny_needs_giltp_slotslot_func_cname
trace_namelhsvalr  rj  buffers_presentr  err_valr  default_retvalr  condr  r  r  s*   `                                      @@@r5   r  z)FuncDefNode.generate_function_definitions  s     	9)< 	9,2,B,B,B,2,D,D!F !' 8""#4555	//d;;;((t444!Z_? ?!Z-> 	!%4G!G "C!%!1!B 	*C.C 	Ddn44!%?2C!C!88:: 		5GGoo''G 5 11+I{CCE E E#.{; 522444 	t$$$/3~~/?/?,'+z>  	dh++D$777

2 	+JJ)***99#tDD 21 	< 	FL11^ 2 F F F%%d>%JJJ $ 	$(= 	$#D $ 	$(= 	$ 	HHT%*;;F<RSSTTTJJsOOOO# 	"  ).??@VWWXXX

3HHT%*;;F<TUUVVVJJsOOO++D$777% 	0 	0E$ 0 0((/// && 	3;+? 	3 &2K" 	& S / S{778QRRRJJ,,V-@AAA     //11""4((( &TT$2ETTT )-
(e8J8ddNd%" 	37 	3!!!'+DN$!% 0022M 	333555K ; 55d;;;".88::%%k222  	'  &&& .==??"2244!%!99  	&%%% 	/)DDG'9$:J:O:UW^__O" T".--d.>.C.QRR#TJJ&&& %<<>>>>))$*:*?*MNNNN))&*<====? @ @ @ JJ-0FFGGGJJ&&& %//	::::< = = = OOI~666JJttx00111JJz"""OOF2D4D4IJJJJJsOOO! 	K! 	(

%%%$)@@BBBB%%%' ( ( ( (
 

%%%$)@@BBBB%%%' ( ( ( " K

)?)?)?ARARARSTTTT# K 143C3HIII  !2D4D4IJJJ 		,  -*4:?\+IJJ

!Z_
  DH0H,HX\XdlpXp ! r r r'+DN$++C666 % 
	G 
	GE:0 	G /5#9 /5CS /''...
 ' G0@ G33E-1^-E 4 G G G% 
	G 
	GE| / 6 /u?O /:0 K77151I 8 K K K( /((////''...z55d;; G
99$FFF %(88 	2 	2Ez# 2(8(H(M 2$$UD111 	))$///% 	E 	EEz# E--eT48DDD>( 	& "& 	-$* 	-(,,... $+/(((***',DN$
 	##C...dhe,,,

2

-... ~/^-"/4"7
 
	
 (, 	, 	, 	, 	, 	, 	, 	, &y& 	l& Z )
9%%%((k:::: 3 Z!/ ZJJV-@-@-@###FGGGG$, ZJJBVEXXYYY l%%'{V_`iVjRj & l l l ??4+,, \	=9* 1d/000NN4+,,,#~??AA K Kt
7###  y7I JJJJ ""566:O 
T 112PQQQ

MNNN

8999
7###

7888

RSSS0 @ @E224????

RSSS- -(((((())&*=tDDD -**,, %
7###44666

:;;;%%dh///

7###%%fdh)IBV>V%WWW

8$$$99;;I"i"
7###>9 T$**9F<``   JJ|f.RRSSS&&tz'@AAA>9 $JJsOOO
@
12346 6 6 
7#####DJ$=>>>(6N>("f111JJV-@-@-@'''JKKK ( V

>ATTUUU  3
7###,,T222:>:N:N:P:P H H H H H H H H  7"3 7{7U 7 )K[-KKKKdBCCCC 546666 =<< ??4,-- 	T__TEU5V5V 	NN4,---, < <
9%%%..tU;;;;  4
9%%%--d333-  }}[%@%@AT%U%UVV

$&( ( ( + *'')))

eg g g + 300222

   ??4?@@ 	A00222NN4?@@@% 	G 	GE: !1 z+ F< (> :3 *Jy)))66t<< F
88uEEE  91E FFFF % 	G 	GE z, 	* -  # 5+A :/ *Jy)))   91E FFFF 	KJy!!!OOF2D4D4IJJJ z 	@(6N&&((G>(f1;???:  	;TZ_
%B%B Jy!!!JJJ###V%8%8%8: ; ; ;  	D',DN$$.*B&BCCC>( 	M;;===::4:?Xj:kkk,,y7K3K,LLL 	-4: 	-)I*> 	-((***',DN$" 	;JJ|f&99:::

3 	@JJ),>>??? 	..t~>>> 	< 	BL66sDAAA''-----r4   c                 X   |j         j        rt          |j        d           nN|j                                         s5|j         j        s)|j         j        st          |j        d|j         z             |                    |j        |j         |j                  }|j	        r|j	        |_	        |S )NzInvalid use of 'void'z Argument type '%s' is incomplete)
rj  re  r   r:   r  rc  r  declare_argrn   r  )r   r   r  r  s       r5   declare_argumentzFuncDefNode.declare_argument	  s    8 	J#'23333%%'' 	J1B 	JchFa 	J#'=HIII#(CG<<> 	."~Er4   c                    |j                                         r|j                            t	          j        dd                     |                    |j                   }d|j        j        z  }d}|j         j	        r|j         j
        r|j        rdnd}|                    d|||j        |j        ||                    |j                  fz             d S t#          |j        d           d S )	NArgTypeTestFunctionArguments.c((PyObject *)%s)r   r&   r   z8if (unlikely(!__Pyx_ArgTypeTest(%s, %s, %d, %s, %s))) %szICannot test type of extern C class without type object name specification)rj  typeobj_is_availabler  r  r   r  typeptr_cname_in_module_stater  r  is_builtin_typerequire_exactr<  rT   accept_noner"  r.  r:   r   )r   r  rY   r  arg_codeexacts         r5   generate_arg_type_testz"FuncDefNode.generate_arg_type_test	  s
   8((** 	h--'7LMMO O O >>sxHHM)CIO;HEx' =CH,B = !5<1JJJ!O$OOCG,,N. ./ / / / / #'fgggggr4   c           	      `   |j         j        rd|j        j        z  }n|j        j        }|                    d|z             |                    dt          dt          |j                            |j        |                    |j	                  fz             |                    d           d S )Nz
%s.memviewz,if (unlikely(((PyObject *)%s) == Py_None)) {zKPyErr_Format(PyExc_TypeError, "Argument '%%.%ds' must not be None", %s); %s   rp  )
rj  r  r  r  rT   r   rL   r"  r.  r:   )r   r  rY   r  s       r5   generate_arg_none_checkz#FuncDefNode.generate_arg_none_check	  s    8& 	$ 39?2EEIOE

AEIJJJ

dS)**++S-=OOCG$$h& & 	' 	' 	' 	

3r4   c                     d S r   r3   r   s     r5   r  z&FuncDefNode.generate_wrapper_functions	  r   r4   c                     |                     | j                   | j        s&| j        D ] }|j        s|                    |           d S d S r   )r,  r:   r   rV   rV  rO  r   rY   r  s      r5   r  z#FuncDefNode.generate_execution_code	  sf    dh  	7y 7 7~ 700666	7 	77 7r4   c                     | j         j        d         }	 |j        j        j        j        d         j        }n# t          t          f$ r d }Y nw xY w||fS )Nr   obj)rY  r  rj  rk  r  r  r   KeyError)r   	py_bufferobj_types      r5   _get_py_buffer_infozFuncDefNode._get_py_buffer_info
  sg    $03		 ~/5=eDIHH) 	 	 	HHH	 (""s   !6 AAc                     |                                  \  }}|j        }|                    d|z             |                    d           |                    d           |                    d           d S )Nzif (unlikely(%s == NULL)) {zZPyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete");z
return -1;rp  )r(  r  rT   )r   rY   r&  r  views        r5   r  zFuncDefNode.getbuffer_check
  sz    //11	1

047888

 O 	P 	P 	P

<   

3r4   c                     |                                  \  }}|j        }|r;|j        r4|                    d|z  |           |                    d|z  |           d S |                    d|z             d S )N%s->objz%s->obj = NULL;)r(  r  r|  r  rJ  rT   r   rY   r&  r'  r*  s        r5   r  zFuncDefNode.getbuffer_init$
  s    "6688	8 	1, 	1$$Y%5x@@@Y-x88888JJ(4/00000r4   c                 F   |                                  \  }}|j        }|rh|j        ra|                    d|z             |                    d|z  |           |                    d|z  |           |                    d           d S |                    d|z             d S )Nzif (%s->obj != NULL) {r,  rp  zPy_CLEAR(%s->obj);r(  r  r|  rT   r+  r/  r-  s        r5   r  z#FuncDefNode.getbuffer_error_cleanup-
  s    "6688	8 	4, 	4JJ/$6777OOI,h777!!)d"2H===JJsOOOOOJJ+d233333r4   c                    |                                  \  }}|j        }|rh|j        rc|                    d|z             |                    d|z  |           |                    d|z  |           |                    d           d S d S d S )Nzif (%s->obj == Py_None) {r,  rp  r/  r-  s        r5   r  z$FuncDefNode.getbuffer_normal_cleanup8
  s    "6688	8 	, 	JJ2T9:::OOI,h777!!)d"2H===JJsOOOOO		 	 	 	r4   c                 D   | j         j        sd S | j         j        }t          j        | j        j                                      |          }|sd S |dk    r!| j         j        	                    d          sd S |dv r| j         j        j
        rd S |                                S )N__long____int__r_  r`  )r  r  rn   r   get_slot_tablerY  r   get_slot_by_method_namer  r  r  preprocessor_guard_code)r   rn   slots      r5   r  z"FuncDefNode.get_preprocessor_guardA
  s    z$ 	4z'(8(CDD\\]abb 	4:dj&6&B&B9&M&M4999dj>N>_94++---r4   )'r-   r.   r/   r  rW  r  r  r  rX  is_coroutineis_asyncgenis_generator_bodyis_async_defr=  has_fused_argumentsstar_argstarstar_argr  r  rH  r   rF  rJ  rM  rR  r[  r]  r  r  r  r  r  r  r(  r  r  r  r  r  r3   r4   r5   rC  rC  e  s       * GML#LKLIHLMK!KR R R(Y Y Y  4    ,0 0 0m. m. m.^  h h h.    7 7 7# # #   1 1 1	4 	4 	4  . . . . .r4   rC  c                       e Zd Zg dZddgZdZdZdZdZdZ	dZ
dZdZdZd Zd Zed             Zej        d	             Zd
 Zd Zd Zd dZd Zd Zd Zd Zd!dZd"dZd Zd Zd Zd Z d Z! fdZ"d Z#d Z$d Z% fdZ& xZ'S )#r  )rk  r  r   r  py_func_statr  rA  FNc                     | j         j        S r   )r  rn   r   s    r5   unqualified_namezCFuncDefNode.unqualified_namet
  s    zr4   c                 4    | j                                         S r   r  r   s    r5   rR  zCFuncDefNode.declared_namew
  r  r4   c                 6    | j         r| j         j        n| j        S r   )r  r  _code_objectr   s    r5   r  zCFuncDefNode.code_objectz
  s     ,0<Nt|''T=NNr4   c                     || _         d S r   )rF  )r   r  s     r5   r  zCFuncDefNode.code_object
  s    'r4   c                 	   |j         d         | _        |j        | _        | j        i | _        | j                            |j                             di                      | j        C| j                            |          }|&t          | j        j
        d           t          j        }n| j                            |          }d|j         v o|                    d           | _        t#          | j        t&                    r7| j                            ||d| j        d uz  | j        | j                  \  }}n0| j                            ||d| j        d uz  | j                  \  }}|j        st          | j
        d           || _        | j        |_        | j        }t5          |d	          s|j        }t5          |d	          || _        |j        | _        | j        j        }| j        d
k    s| j        r|rt          | j        j
        d           |j         dk    rJ| j        dk    r?|j!        "|j!        j"        rt          | j
        d           ntG          | j
        dd           tI          | j        |j                  D ]\  }}| %                    ||           |j        |_        |j&        |_&        |j'        |_'        | (                    |j        |j
        |           |j        j)        rd| _*        |j        j+        rd| j,        v rtG          |j
        dd           |j        j+        s|j        j-        rA| j        j.        rt          |j
        d           d| j,        v rtG          |j
        dd           | (                    |j/        | j
        |           |j&        }	|j'        }
| j0        |_0        | j        |_        |1                    |	|| j
        |
| j        | j        | j        d u| j,        | j        | j2        
  
        | _3        |j/        | _/        | j/        j4        r | j        dk    rt          | j
        d           | j/        j5        r | j/        6                    | j
        d           | j        rD|j7        s=| j        s6tq          | j                  dk     s| j        d         j        j9        sd| _        | :                    |           | ;                    |           d S )Nc_compile_guardlocalsr  r1  r&   )rl  r  rm  )rl  rm  z*Suite attached to non-function declarationrV   r"  zBFunction with optional arguments may not be declared public or apir  r  z/Only extern functions can throw C++ exceptions.Tinlinez$Buffer unpacking not optimized away.r   zUBuffer may not be acquired without the GIL. Consider using memoryview slices instead.)r  rm  r  definingr=  r  rn  zFunction cannot return an arrayzused as a return valuer   F)<r   rI  r  is_c_class_methodr  r   getdirective_returnsr  r   r:   r
   r   rk  ro  r  r  rM   r  r  r   rm  r  rj  r  r  hasattrrs  cfunc_declaratorrV   r  r  r  r  r   r   ziprM  rn   r  _validate_type_visibilityrg  r=  rd  r=  is_pythran_exprr  r  r  r  inline_in_pxdr  rc  r  check_nullary_constructorr  rL   r|  declare_cpdef_wrapperr[  )r   r   rk  r  typr  opt_arg_count
formal_argtype_argrn   r  s              r5   r   z!CFuncDefNode.analyse_declarations
  s-   "~.?@!$!5 ($&D!$$S^%7%7"%E%EFFF!-.>>sCCI d,0,???&1	..s33I .#. @ hYgIhIhEhdo':;; 	b#'?#:#:3dit.C)D!%!64? $; $T $T OSS $(?#:#:3dit.C)DQUQ` $; $b $b OS 	J$(HIII
 	!-_
*f-- 	)#J *f-- 	) !+O	-@Ox''48''$'+VX X X #%%$/X*E*E".33F3N. dhEG G G G EqJ J J %(	38$<$< 	W 	W J$$S(333&mJO&mJO'~J**8=(,LLL}% 0+/(}& S8t~+E+E
(NPQRRR}& W(-*G W9? W*.qs s s s//JN,RTUVVV&&s#FFF#%"2#4**#txDOYd*dn(1C	 + E E

 ?$ 	?H)D)D$(=>>>( 	[66txAYZZZ 	)C$7 	)@U 	)49~~!!1):)F!#( ""3'''$$$$$r4   c                    | j         sd S | j        rt          | j        d           |                     |j                  }t                              ||dd          }| j        r[ddlm	} t          | j         || j        t          d                    	          g}|d
         j                            |           ng }| j        j        }t!          | j        | j        j        | j        d d | j        t'          | j        |g          |d	  	        | _        |j        | j        _        | j                            |           d| j        j        _        t'          | j        | j        g          | _        t0          j        | j        _        | j        j        | j        _        dx| j        _        | j        j        _        | j        |j        |<   | j        j        s|j        rt>          j         rs| j!        r!| j        j"        sJ | j        | j!        _        d S tG          | j        | j                  | _!        t'          | j        | j!        | j$        g          | _$        d S d S d S )Nz&static cpdef methods not yet supported)r  F)profilerc  r   r  r1  rZ  	decoratorr   r'  )	r:   rn   rV   r>  r?  rD   r   r  r   T)r  )%r  r  r   r:   call_self_noder  r   r   r  r  DecoratorNoder   r`  rw   r  rn   DefNoderV   rD   r  r  r   r  rA  r
   r   rj  as_variabler  r  is_final_cmethodr!   lookup_module_cpdefoverrideis_fused_specializedOverrideCheckNoder   )r   r   py_func_bodyr  r  rn   s         r5   rW  z"CFuncDefNode.declare_cpdef_wrapper
  si    	F  	F$(DEEE**3;N*OO-<<#u = ? ?   	++++++'HHTXTabpTqTq<r<r<rssstJqM#11#6666Jz48$(JO$(I(,,0#'8$0,$P$P$P*4*+- - - (+':$))#...,0)($,HHH&5!%!3
8<<
$*05 JD
+ 	U(	U,3,G	U} Uz6666(,%%% 1$(DL Q Q Q($-9STTT				U 	U 	U 	Ur4   c                     | j         dk    p| j        }t          |dd          }|r2|r2|j        r-|j         dv s&|j        s!|j        st          |d           dS dS dS dS dS dS dS )zo
        Ensure that types used in cdef functions are public or api, or
        defined in a C header.
        r"  r  N)r"  r  z:Function declared public or api may not have private types)rm  r  r   r  r>  r   )r   rj  r:   r   public_or_apir  s         r5   rS  z&CFuncDefNode._validate_type_visibility  s    
 H4@gt,, 	YU 	Ys': 	Y$(<<<I =!&!2 =cWXXXXX	Y 	Y 	Y 	Y 	Y 	Y<<<<<<r4   r   c                 T    ddl m  j        j        }|r$|d t	          |           j        j        z
           }d |D             }|r)                     j         j        j	                  }|}n݉ j        j
        rf j        j        j        j        }                     j        |j	                  }||_                             j        | j        j	                  }nk j        j        d         j        j        }	                     j        |	j	                  }
|	|
_                             j        |
 j        j	                  }|ot          j         }                     j        | fd|D             |          }t#           j        t$          j        |	          S )
Nr   r  c                     g | ]	}|j         
S r3   rZ  r   r  s     r5   r   z/CFuncDefNode.call_self_node.<locals>.<listcomp>)  s    ...#SX...r4   rZ  )r$  	attributer   c                 H    g | ]}                     j        |           S rZ  )r  r:   )r   nr  r   s     r5   r   z/CFuncDefNode.call_self_node.<locals>.<listcomp><  s.    JJJ1)$$TXA$66JJJr4   )functionrV   wrapper_call)r:   r  r   )r   r  rj  rV   rL   r  r  r:   r  rn   r  r  r  AttributeNoder!   rf  SimpleCallNodeReturnStatNoder
   r   )r   omit_optional_argsr  rV   	arg_namescfunccall_arg_namesclass_entry
class_noder  r[  skip_dispatchc_callr  s   `            @r5   ra  zCFuncDefNode.call_self_node$  s   y~ 	CATTY%AAABD.....	 	_&&txdjo&FFE&NNY' 		_**6<K"++DH;;K+LLJ*J++DH*PTPZP_+``EE*/5J ))$()IIH'HN++DH(djo+^^E,L1LM))HJJJJJ	JJJ&	 * ( (
 $(
8QY_````r4   c                     | j         j        D ]4}|j        st          |j        d           |                     ||           5d S )Nr]  )rj  rV   rn   r   r:   r  rI  s      r5   declare_argumentszCFuncDefNode.declare_arguments@  sU    9> 	, 	,C8 8cg6777!!#s++++	, 	,r4   c                     | j         j        S r   )rj  r  rP  s     r5   rR  z!CFuncDefNode.need_gil_acquisitionF  s    y!!r4   c                     | j         }|j        }|j        rZ|sZ|j        j        rt          | j        d           | j        j        D ].}|j         j        r|j	        st          | j        d           +d S d S d S )Nz9Function with Python return type cannot be declared nogilz8Function declared nogil has Python locals or temporaries)
rj  r  r  r  r|  r   r:   rY  r  in_with_gil_block)r   r   rj  r  r  s        r5   r   zCFuncDefNode.nogil_checkI  s    y=: 	`h 	`+ SdhQS S S)5 ` `:) `%2I `$($^___	` 	` 	` 	`` `r4   c                 V   |j         | j        _         | j         | j                            |          | _        nQ| j         | j                            |          | _        n*|                     |           |                     |           |                     | j                  | _        | S r   )	r   rY  rA  rx   r  rF  rJ  rR  r  r   s     r5   rx   z CFuncDefNode.analyse_expressionsT  s    &)n#( $ 1 E Ec J JD\%<;;C@@DLL'',,,$$S)))44T5EFFr4   c                     dS rP  r3   r5  s      r5   r  z'CFuncDefNode.needs_assignment_synthesisb  s    ur4   r   c                    | j         }g }| j        }|j        d t          |j                  |j        z
           D ]Q}	|	                                }
|                    |	j                  }|j        sd|
z  }
|	                    |
           R|re| j
        r^t          j                            t          j                  }| j        r|	                    |           n|	                    d|z             |j        r9|r7|	                    |j                            t          j                             |j        r|	                    d           |sdg}|| j        j        }|                    |d                    |                    }| j        j        dk    rd|vrd}nd}d }|                    | j        j                  }| j                            ||	          }| j        p| j        j        }| j        rF|r*|j        j        d
                              | j                   |                     | j                   |r| !                                }|r%|j        j        d
                              |           |j        j        d
                              |||d           |r%|j        j        d
                              d           |                     |||d           d S )NzCYTHON_UNUSED %sz...voidr   privater5  static r   )dll_linkagemodule_declarationsz; /* proto*/r  z {)"rY  rj  rV   rL   r  rf  rj  rn   cf_usedr  r  r
   r	  r	   skip_dispatch_cnamerg  r  optional_args_cnamer  r  
func_cnamefunction_header_coder   rm  build_function_modifiersfunc_modifiersr  rM  r   r  r  partsrT   r  )r   rY   re  with_opt_argswith_dispatchr  r  	arg_declsrj  r  arg_declr  dispatch_argentitystorage_classr  r=  headerneeds_protor  s                       r5   r  z%CFuncDefNode.generate_function_headere  s#    	y9Dc$)nnT-DDDE 	' 	'C++--HLL**E= 9-8X&&&& 	DT- 	D%0AA*, ,L} D  ....  !3l!BCCC" 	^} 	^T/@@A[\\]]] 	$U### 	!I=J)E**5$))I2F2FGG: I--$e2C2C%MMM11$*2KLL	!226{2SS,G
0G$ 	2 _ &'<=CCDD]^^^JJt0111 	N!%!<!<!>!>! X &'<=CCDVWWW"#89??(5yy&&&IK K K! N &'<=CCHMMM

		666BCCCCCr4   c                     | j         }| j        D ]~}|j        ru|                    |j                  }| j        s|j        rM|                    |          }|                    |j	        
                    |j                  d|d           d S rE  )rY  rV   rX  rj  rn   rg  r  rB  rT   rj  rf  r  )r   r   rY   r  r  r  r   s          r5   r  z+CFuncDefNode.generate_argument_declarations  s     9 	G 	GC{ GSX..= GEM G ==dCCFJJ11#)<<<<fff F G G G	G 	Gr4   c                     d S r   r3   r   s     r5   r  z"CFuncDefNode.generate_keyword_list  r   r4   c           
      8  
 d}d}| j         }| j        j        rL                    dt          j        z             | j        D ]

j        r|                    
j	                  }| j
        s|j        r                    dt          j        dt          j        d|d           
j        }t          |d          s|j        }t          |d                              
j        dt          j        d| j                            |j	                  d	           |d
z  }|d
z  }t%          |          D ]}                    d                               d           
fd}	| j        D ]%
 |	|                    
j	                             &d S )Nr   r  if (rK   zn > ) {rn   rF  rG  r   rp  c                 (   | j         rj        s                    | j        d| j        d           | j        j        r#| j                            | j        d           d S                     |            	                    |            d S d S d S )NrF  rG  T)
r  rX  rT   r  original_cnamerj  r  generate_incref_memoryviewslicer  put_var_giveref)r  r  rY   s    r5   put_into_closurezECFuncDefNode.generate_argument_parsing_code.<locals>.put_into_closure  s     0 0

e6J6J6JKLLL:0 0J>>tU[RVWWWWW''...((/////0 0 0 0r4   )rY  rj  r  rT   r	   r  rV   rX  rj  rn   rg  r  r  r  rP  rs  r  opt_arg_cnameranger  )r   r   rY   r  r  r  r  r  r  r  r  s     `       @r5   r  z+CFuncDefNode.generate_argument_parsing_code  s    9' 	JJ{V%??@@@y  ; !LL22E} 
" 
"


$*$>$>$>$*$7$7$7$< = = = &)^
")*f"="= 9)3J #**f"="= 9

$'IIIv/I/I/I$(I$;$;JO$L$L$L$L$N O O O 	FA4[[    

3JJsOOO	0 	0 	0 	0 	0 	0 9 	: 	:CU..sx889999	: 	:r4   c                     d S r   r3   r   s     r5   !generate_argument_conversion_codez.CFuncDefNode.generate_argument_conversion_code  r   r4   c                     | j         j        D ]I}|j        r|                     ||            |j         j        r|j        s|                     ||           Jd S r   )rj  rV   needs_type_testr  r|  r  r  r"  s      r5   r  z)CFuncDefNode.generate_argument_type_tests  sr     9> 	8 	8C" 8++C6666% 8co 8,,S$777		8 	8r4   c                    |j         j        d         r/|                    | j                   |                    d           t                                          |           | j        r| j                            |           d S d S )Nrc  r   )r  r   r,  r:   rT   rk   r  rA  )r   rY   rO   s     r5   r  z$CFuncDefNode.generate_execution_code  s    &{3 	MM$(###JJrNNN''--- 	<55d;;;;;	< 	<r4   c                 @    | j         j        rdS | j        j        j        S )N0)r  r|  r  rj  r  r   s    r5   r  zCFuncDefNode.error_value  s"    ' 	33:?22r4   c                 $    | j         j        j        S r   )r  rj  r  r   s    r5   r  z)CFuncDefNode.caller_will_check_exceptions  s    z..r4   c                    d}| j         }|j        }|j        |dz  }|j        }| j         j        t          j        d||_        |                                 |                     |d|j        j        |j        j	        |j                   | j
        j        s|                    d           | j        j        }d |d t          |          | j        j	        z
           D             }|j        j        r |                    t          j                   n|j        r|                    d           |j        j	        r |                    t          j                   n|j	        r|                    d           |                    | j         j        d	d
                    |          d           |                    d           |j        d S d S )Nr   r   wrap_)r  r  r  return c                     g | ]	}|j         
S r3   )r  rp  s     r5   r   z;CFuncDefNode.generate_wrapper_functions.<locals>.<listcomp>  s    ZZZSsyZZZr4   r  r  rk  r   rq  rp  )r  rj  
prev_entryr  r	   r  rT   r  r  r  r  re  r  rV   rL   r  r  r  r   )r   rY   kr  r  rV   arglists          r5   r  z'CFuncDefNode.generate_wrapper_functions  s    
J	*FA$E04
0E0EvGZGZGZ\]\]^EJJLLL))a#j7#j;&	 * ( ( (
 #+ $###9>DZZD1X#d))DI<X2X1X,YZZZGz( $v9::::) $s###z, 'v9::::- 'v&&&JJDJ$9$9$9499W;M;M;M;MNOOOJJsOOO/ *****r4   c                 r    t                                                      }| j        r|rJ d| j         S |S )Nz#if )rk   r  rI  )r   super_guardrO   s     r5   r  z#CFuncDefNode.get_preprocessor_guard  sF    gg4466 	1""""0$.000r4   )r   r   r   )r   r   N)(r-   r.   r/   r   r   rU  r  r  rO  rg  r  r  rA  rF  rC  rR  rX  r  setterr   rW  rS  ra  r  rR  r   rx   r  r  r  r  r  r  r  r  r  r  r  r  rs   rt   s   @r5   r  r  O
  s,       0 TSSK0KMJHOLL  / / / O O XO ( ( (d% d% d%L-U -U -U^
Y 
Y 
Ya a a a8, , ," " "	` 	` 	`     0D 0D 0D 0DdG G G  #: #: #:L  8 8 8< < < < <3 3 3/ / /  >        r4   r  c                        e Zd Zg ZdZdZd ZdS )PyArgDeclNodeFc                 <    | j                             ||           d S r   )r  r  r5  s      r5   r  z+PyArgDeclNode.generate_function_definitions  s     
00d;;;;;r4   N)r-   r.   r/   r   r  rQ  r  r3   r4   r5   r  r    s4         KKK< < < < <r4   r  c                       e Zd ZdgZdS )rb  r`  N)r-   r.   r/   r   r3   r4   r5   rb  rb    s         -KKKr4   rb  c                       e Zd Zg dZddgZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd	 Z	 	 dd
Zd Zd Zd Zd 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 Z+d Z,d Z-d Z.dS )!rc  )rV   r>  r?  r   r  rH  r  rH  FNr  r   Tc                     t          j        | |fi | dx}x}x}}| j        D ]2}|j        r|dz  }|j        r|dz  }|j        s|dz  }|j        s|dz  }3|| _        || _        || _        || _	        d S r7   )
rC  r   rV   rU  rT  rX  num_posonly_argsnum_kwonly_argsnum_required_kw_argsnum_required_args)r   r:   rW   pr  rkrr  s           r5   r   zDefNode.__init__V  s    T3//$///AQ9 	 	C| Q{ Q{ !GB; Q ! $&!!"r4   c
                    | j         rt          | j         j        d           | j        rt          | j        j        d           |pd\  }
}|p|	}|g }| j        D ]\}|                    |d          \  }}|                    t          j        |j	        d |j
        t          |j                             ]t          j        t          |dd |||	|          }t          | j        |	          }n||j        }|j        }|j        rd
}t#          | j                  t#          |j                  k    s|j        r*t          | j        d           t          |j        d           t'          t)          | j        |j                            D ]Q\  }\  }}|                    |d|dk    o|j                  \  }}||t          j        u r|j        |_        ||_        R|
G|j        @ddlm} |                    | j        t7          |j                  |j        |j                  }
t;          | j        t=          | j        | j	        d           | j        d|j        |
||j        |j         	  	        }tC          | j        |pg tE          | j        |j        	          || j#        | j$        |j%        ||j        |j         ddtM          |di           |          S )Nz'cdef function cannot have star argumentz+cdef function cannot have starstar argumentrP  r   r,  )rn   r  r  rj  r:   F)r  rV   r  r  r  r  r  r  r_  Tzwrong number of argumentszprevious declaration herer   r  r  r  r  )rs  rV   r  r  r  r  r  r  r  r  )r=  rk  r  r   rD   r  rj  r  r  rm  r  r  rO  )'r>  r   r:   r?  rV   ro  r  r
   r  rn   r  r   r  r<  r  rj  r  rL   r  r  rR  r  r  r  r  r  r  r  r  r  rW  r  r  r  r8  r   rD   r  r   )r   r|  r  r  returns
except_valr  r=  r  r  r  r  
cfunc_argsrZ  r  rj  
cfunc_typer  r[  r  r  s                        r5   as_cfunctionzDefNode.as_cfunctionh  sO   = 	P$-#%NOOO 	X$#')VWWW+5+F(!=J"i O O
(2(:(:51(:(M(M%!!*"9?S@DEOEZ?M>Hn	#N #N #N O O O O
 $-.3=:?>B>M497?=HJ J JJ  z:::EE}J) / +/'49~~Z_!5!5559O5dh ;<<<ei!<===-6s49jo7V7V-W-W A A))J(2(:(:51HIQHiSXSi ); )l )l%<4:+D#D#D&.mJO1@J."z'A'M,,,,,,'00J$> ? ?jF\ * : 1 < <O ).A$(QUQZbf.g.g.g.2i5:9C9S9HCZ2<2E/9/?A A A
 DH&/o2&;DH:Ka&b&b&b'1!% $(2(A!+%/%8","2'0 %-4U<NPR-S-S.57 7 7 	7r4   c                 8    | j         rdS | j        s| j        rdS dS )zDetermines if the function's signature is compatible with a
        cdef function.  This can be used before calling
        .as_cfunction() to see if that will be successful.
        FT)rW  r>  r?  r   s    r5   is_cdef_func_compatiblezDefNode.is_cdef_func_compatible  s2    
  	5= 	D- 	5tr4   c                 b   | j         rJ| j         D ]B}|j        }|j        r2| xj        |j        dk    z  c_        | xj        |j        dk    z  c_        C| j        r|                    d          rd| _        | j        r|                    d          rd| _        |j        s|j        r| j        dk    r|j        rd| _        n| j        dk    r|j        rt          | j
        d           n|| j        t          v rn| j        sgd| _        dd	lm} | j         pg | _         | j                             d
t          | j
         || j
        t!          d                                         |                     |           | j        dk    r|                     |           n|                     |           |                     |           | j        j                                        | _        | j        t0          u rM| j        rF|j        d         r9| j        j        s-| j                            |          \  }}|r|j        r|| _        |                     |           t?          | j
        | | j        j        | j         | j!        | j"        | j                  | _#        | j#        $                    |           d S )Nr  r1  Frl   Tr)   z7'__init_subclass__' is not supported by extension classr   r^  r   rZ  r_  z<lambda>r+  )rM  rn   rV   r>  r?  r  )%r  r`  r   is_classmethodrn   is_staticmethodr  rV  r  r   r:   IMPLICIT_CLASSMETHODSr  r  insertrb  r   analyse_argument_typesdeclare_lambda_functiondeclare_pyfunctionanalyse_signaturer  	signaturer  r   rH  r   r  r7  r|  r[  DefNodeWrapperrV   r>  r?  
py_wrapperr   )r   r   r`  r^   r  r  r  s          r5   r   zDefNode.analyse_declarations  s   ? 	H!_ H H	 *< H''49+EE''((DI,GG(( 	(3??=#A#A 	("'D 	)COON$C$C 	)#(D   	`C$8 	`yI%%#*?%'+$$111c6J1dh YZZZZ333D<O3&*#//////"&/"7R&&q-Hm@\@\(](](]+_ +_ +_ ` ` ` 	##C(((9
""((----##C(((s###:/;;==~--$2M-~12 34:;P 3!%!<!T!TUX!Y!Y; 3;#: 3'2D$$$$(H]*(* * * 	,,S11111r4   c                    |j                             di           | _        |j         d         }|j        }d |_        | j        D ]}t          |d          rd }n||j                            |          }t          |          r"|j	        rt          j        ||j        g          }|j                            ||          \  }}|j        |_        ||_        |                     ||           |r|j        rt%          | j        d           |j                                        |_        d |_        d|_        d|_        d|_        |j        j        s|j        j        s|j        j        ry|j        rd|_        n|j        rd|_        n|j        j        s$|j        j         s|j        j        s|j        j        r#|j!        r|j!        j"        d|_        n[||_        nSd|_        nK|j        j#        s?d|_        |j        rt%          |j        d	           |j        rt%          |j        d
           |j        j$        rd| _%        ||_        t          |          r%d tM          | j                  D             | _'        d S g | _'        d S )NrJ  allow_none_for_extension_argsrn   z9Python function argument cannot have C name specificationr   r   TFz.Only Python type arguments can have 'not None'z-Only Python type arguments can have 'or None'c                 0    g | ]\  }}|j         j        |S r3   )rj  is_numpy_buffer)r   r  as      r5   r   z2DefNode.analyse_argument_types.<locals>.<listcomp>1  s&    \\\caQVE[\\\\r4   )(r   rN  r  rh  rV   rP  rk  ro  r#   rT  r
   r  
org_bufferr  rn   rj  rM  r  r   r:   as_argument_typehdr_typer$  r  rR  r|  rd  r  r  r  r  is_extension_typer  rX  r  r  rg  r=  r  np_args_idx)r   r   r  f2sr  r  rk  rj  s           r5   r  zDefNode.analyse_argument_types  s    # 2 28R @ @(+7V(W%# $9 1	0 1	0CsF##  "&M11#66	 "#&& /9+D / * 4!!,6. !/ !/I
 N**9c:: &*/$$S#... ]?#8 ]dh [\\\x0022CHCL#$C "#CCNx# Tsx'9 TSX=X T; +&*COO\ +&+COOh0 
+CH4L 
+8-
+141L
+{ Hs{'B'J*. +H '+COOX& T"&< U#'#STTT; T#'#RSSSx  0+/( ## 	"\\Yty-A-A\\\D!Dr4   c                 
   | j         j        rO| j        rt          | j        d           t          | j                  dk    o| j        p| j         | j         _	        no| j        sg| j        s_|j
        d         rt          d | j        D                       r3| j         j        t          j        u rt          | j                  dk    rt          j        | j         _        nt          | j                  dk    r:| j        d         j        (| j        d         j        st          j        | j         _        n| j         j        t          j        u rt          | j                  dk    rt          j        | j         _        nRt          | j                  dk    r:| j        d         j        (| j        d         j        st          j        | j         _        | j         j        }|                                }|                                }|t          j        u rH|dk    rBt          | j                  dk    r*| j        r#t          j        x}| j         _        d| _        dx}}| j        rG|j        r@dx}}d| _        t7          j        |          x| j         _        }d|_        d|_        d|_        | j        s| j        r| j        r|j        r| j         j!        d d = tE          tG          |t          | j                                      D ]}| j        |         }d|_$        ||k    rd|_%        |&                    |          rP| j        sI| j        r d|_'        tP          j)        x|_*        |_+        nd|_&        |j,        x|_*        |_+        d|_-        |.                    |          |_*        |j+        /                    |j*                  s'|j*        j0        r|j+        j0        rd|_1        d|_-        |t          | j                  k    r| 2                                 d S |t          | j                  k     rK|j        s| 2                                 | j        D ](}|j$        r|j+        j3        s|j+        j4        rd|_1        )|5                                }|rrt          j6        |v rf| j         j        s\| j        r+d}| j        D ] }|j$        r|j        s|j&        s	|j'        sd	}!nd	}|s(|7                                x}| j         _        d S d S d S d S d S )
Nz8special functions of cdef classes cannot have decoratorsr   always_allow_keywordsc                     g | ]	}|j         
S r3   rU  rp  s     r5   r   z-DefNode.analyse_signature.<locals>.<listcomp><  s    ::::::r4   r   r&   Tr  F)8r  r  r  r   r:   rL   rV   r>  r?  trivial_signaturer   rA  r  r   pyfunction_signaturepyfunction_noargsrX  rT  pyfunction_oneargpymethod_signature	unaryfuncibinaryfuncmax_num_fixed_argsmin_num_fixed_argsself_in_starargr  r  r   fixed_arg_formathas_generic_argsr  r=  decorator_indirectionr  r  minrR  rS  r  rQ  r   	type_typer  rj  r  r$  fixed_arg_typer  r|  r  bad_signaturer  r  method_flagsmethod_varargswith_fastcall)	r   r   signfixed
min_nfixedr  r  mfuses_args_tuples	            r5   r  zDefNode.analyse_signature5  s#   :  	E \dh Z[[[+.ty>>Q+>+kHjY]YjCkDJ((- 	E4#4 	EN#:;	E::	:::;;	E z#y'EEEty>>Q&&+4+FDJ((^^q((y|+3DIaL<P3/8/J
,%)EEEty>>Q&&+4+>DJ((^^q((y|+3DIaL<P3/8/D
,j"''))++--
9///FaKKty>>Q&&4=& *3)GGC$*&#$D "##FZ 	(C$8 	("##FZ#'D )-37DJ 3#&C "&C#'C   	4D$8 	4(	4-0-A	4*03s63ty>>2233 	1 	1A)A,CCNJ15.q!! 1$*> 1& >&'CO.5.??CL388&'CO.1o=CL38'($$"11!44x''55 1|/ 1CH4H 1./++/0,DI&&   Fc$)nn$$' %""$$$y , ,> ,sx'A ,SXE] ,*+C'  	A)*b009N0 } ("&9 0 0C 0s{ 0 #08;0 +0	0 #(" A-0->->-@-@@dj***#	A 	A0000 A Ar4   c           	      >   | j         j        }d|                                z  }|j        r|dz  }n!|j        r|d|                                z  z  }| j        }| j         j        rd}nd}t          | j	        d|| j        t          | j                  |fz             d S )Nz%dz or morez to %dzSpecial methodMethodz>%s %s has wrong number of arguments (%d declared, %s expected))r  r  r  r  optional_object_arg_countr  rn   r  r   r:   rL   rV   )r   r  expected_strrn   descs        r5   r  zDefNode.bad_signature  s    j"c44666 	@J&LL* 	@Hs'='='?'???Ly:  	#DDDdhX$)S^^\\; ; 	< 	< 	< 	< 	<r4   c                 H   | j         }|                    |          }|rX|j        r!|j        j        st          | j        d           |j        j        r$|j	        s| j
        st          | j        dd           |                    || j        | j
                   }|| _        |                    |j                  }t!          t"          j        |z   |z             | j        _        t(          j        rt-          | j        | j                  |_        t!          t"          j        |z   |z             |_        |j        r_|j         t6          j        v s|j        r|j         dv r|j        d         r	d |_        d S t!          t"          j        |z   |z             |_        d S d S d |_        d S )Nz:Only final types can have final Python (def/cpdef) methodszOverriding a c(p)def method with a def method. This can lead to different methods being called depending on the call context. Consider using a cpdef method for both.   )allow_redefine__getattr__fast_getattr) rn   r  re  r  is_final_typer   r:   rj  r  is_builtin_cmethodr   r   r  r  next_idscope_prefixr   r	   pyfunc_prefixpyfunc_cnamer!   r  rE   rD   funcdoc_prefix	doc_cnamer  r   	invisibler   wrapperbase_cnamewrapperbase_prefix)r   r   rn   r  prefixs        r5   r  zDefNode.declare_pyfunction  s   y%% 	T% ^co.K ^dh \]]]z& Tu/G TPTP_ T #PQRT T T &&tTX$/FY&ZZ
S-.."1&2F2ORV2V"W"W
 
	&tx::EI-f.Cf.Lt.STTEO i:!444EI4
m33~8V3.2E+++.=f>WZ`>`cg>g.h.hE+++i i EIIIr4   c                     |                     | j        | j                  }d |_        || _        |j        | j        _        d S r   )r  lambda_namer:   rD   r  r  r  )r   r   r  s      r5   r  zDefNode.declare_lambda_function  s<    ++D,<dhGG	
"'+
r4   c                    | j         D ]}|j        st          |j        d           |j        rD|                    |j        |j        |j                  |_        |j        j        rd|j        _	        n| 
                    ||          |_        d|j        _        d|j        _        |j        |j        _        |                     || j                   |                     || j                   d S )Nr]  r  r   )rV   rn   r   r:   r$  r  rj  r  r|  r  r  r/  r  r  declare_python_argr>  r?  rI  s      r5   r  zDefNode.declare_arguments  s    9 	4 	4C8 8cg6777# <OOCHchHH	8' )%(CIN 11#s;;	 CICIN$'OCI!!T]333T%677777r4   c                     |rk|j         d         dk    rt          j        }nt          }|                    |j        ||j                  }d|_        d|_        d|_	        d|_
        ||_        d S d S )Ninfer_typesFr   r  )r   r
   unspecified_typer   r  rn   r:   r/  r  r  r  r  )r   r   r  rj  r  s        r5   r   zDefNode.declare_python_arg  sv     
	~m,55!2%OOCHdCG<<EELEJEJ$%E!CIII
	 
	r4   c                 L   |j         | j        _         |                     |           |                     |           |                     |          s9| j        r2| j        d d d         D ]!}|j                            |          |_        "| j        	                    |           | S )Nr   )
r   rY  rF  rJ  r  r  r`  rx   r  prepare_argument_coercion)r   r   r`  s      r5   rx   zDefNode.analyse_expressions  s    &)n###C(((  %%%..s33 	S 	S!_TTrT2 S S	&/&9&M&Mc&R&R	##11#666r4   c                    | j         rdS | j        s| j        j        rdS | j        rdS | j        j        rdS | j        j        rdS |j        s|j        r&|| j	        j
        d         S |j        j
        d         S |j        p|j        S )NTFbinding)r  specialized_cpdefsr  rh  no_assignment_synthesisr  is_anonymousr  r  rY  r   r  rV  r  r5  s      r5   r  z"DefNode.needs_assignment_synthesis  s     	4" 	dj&E 	5' 	5:  	5:" 	4 	>#"6 	>|'29=='29==$<(<<r4   c                 $    | j         j        j        S r   )r  r  r  r   s    r5   r  zDefNode.error_value  s    z#//r4   c                 $    | j         j        j        S r   )r  r  r  r   s    r5   r  z$DefNode.caller_will_check_exceptions
  s    z#33r4   c                 P   | j         rJ|                                }t                              | j         |          }|                    ||           | j        r1| j        j        | j        _        | j                            ||           t                              | ||           d S r   )
defaults_getterr  r   r   r  py_wrapper_requiredr  r  r  rC  )r   r   rY   module_scopedirectives_nodes        r5   r  z%DefNode.generate_function_definitions  s     	N++--L4AA$BVXdeeO99,MMM # 	E)-)>DO&O99#tDDD11$TBBBBBr4   c                 b   |r%| j         r| j                            ||d           d S g }| j        j        j        r0dt          j        z  }| j        sd|z   }|	                    |           d }| j
        D ] }|	                     ||                     !| j        r#|	                     || j                             | j        r#|	                     || j                             |rd                    |          }nd}| j                            | j        j                  }	|j        d         }
|                                 }|r|
                    |           |
                    d|	d	|d
           |r|
                    d           |                    d|	d	|d           d S )NTPyObject *%sCYTHON_UNUSED c                     | j         }|j        r|j        }n|j        }|j                            |          }|j        sd|z   }|S )Nr4  )r  r  r  r  rj  rf  r  )r  r  r  decls       r5   arg_decl_codez7DefNode.generate_function_header.<locals>.arg_decl_code(  sS    IE $,:..u55D= /'$.Kr4   r   r  declsr  rk  z); /* proto */r  r  )r/  r  r  r  r  has_dummy_argr	   r  r  r  rV   r>  r?  r   r  rf  r  r  r  rT   )r   rY   re  rf  arg_code_listself_argr7  r  r  dc
decls_coder  s               r5   r  z DefNode.generate_function_header  s    	' 088.$0 0 0F:- 	+%(99H) 7+h6  ***		 		 		 9 	5 	5C  s!3!34444= 	?  t}!=!=>>> 	C  t/@!A!ABBB 	yy//HHH..tz/FGG%g.
!88:: 	1/000,.BB9	; 	; 	; 	'X&&&


HHH566666r4   c                     d S r   r3   r5  s      r5   r  z&DefNode.generate_argument_declarationsI  r   r4   c                     d S r   r3   r   s     r5   r  zDefNode.generate_keyword_listL  r   r4   c                     fd}| j         D ]} ||j                   | j        | j        fD ]}|r ||j                   d S )Nc                 t   | j         r.| j        j        ro| j        j        J j                            t          j        dd                                         d	                    | j
        | j                             n%                    | j
        d| j        d           | j        j        r#| j                            | j
        d           d S | j        r,                    |                                |            d S                     |                                |            d S d S )NIncludeStringHzStringTools.czmemcpy({0}, {1}, sizeof({0}));rF  rG  T)r  rj  rc  r  r  r  r   r  rT   formatr  r  r  r  r  r  put_var_xgiverefr  r  )r  rY   s    r5   r  z@DefNode.generate_argument_parsing_code.<locals>.put_into_closureQ  sK    0:& Q !:?666$55k6MN^`o6p6pqqqJJ?FFu{TYThiijjjjJJU[[[%:N:N:NOPPP:0 0 J>>tU[RVWWWWW* 0 ((///))%00000''...((/////+0 0r4   )rV   r  r>  r?  )r   r   rY   r  r  s     `  r5   r  z&DefNode.generate_argument_parsing_codeO  s    	0 	0 	0 	0 	0. 9 	( 	(CSY''''=$"33 	, 	,C ,  +++	, 	,r4   c                     d S r   r3   r   s     r5   r  z$DefNode.generate_argument_type_testsn  r   r4   )	NNTNNFNFFr   r   )/r-   r.   r/   r   r   r  r  r  reqd_kw_flags_cnamer   r)  r  rH  r  r  r  py_cfunc_noderequires_classobjdefaults_structrD   fused_py_funcr(  r  r/  r  r.  r   r  r  r   r  r  r  r  r  r  r   rx   r  r  r  r  r  r  r  r  r  r3   r4   r5   rc  rc  $  s       , gffK!9:KONKJJ!EKOMO
CMJJO# # #$ }B;@I7 I7 I7 I7V	 	 	52 52 52n>" >" >"@eA eA eAN< < <  6. . .8 8 8   
 
 
= = = =$0 0 04 4 4C C C,7 ,7 ,7 ,7\    , , ,>    r4   rc  c                       e Zd ZdZdZdZd Zd Zd Zd Z	d Z
d Zd	 ZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z dS ) r  NFc                     t          j        | g|R i | | j        j        | _        | j        j        | _        | j        j        | _        | j        j        | _        | j        j        | _        d | _        d S r   )	rC  r   rM  r  r  r  r  r  r  )r   rV   r~   s      r5   r   zDefNodeWrapper.__init__y  so    T3D333F333 $ <#{:$(K$D!!%!>#{:r4   c                 *   | j         j        }| j        }|                    |j                  }t          t          j        |z   |z             |_        t          t          j	        |z   |z             |_
        |j        | _        | j         j        | _        d S r   )rM  r  rn   r  r  r   r	   pywrap_prefixr  pymethdef_prefixpymethdef_cnamer  r  )r   r   target_entryrn   r  s        r5   r   z#DefNodeWrapper.analyse_declarations  s    {(yS-.."1&2F2ORV2V"W"W'6v7NQW7WZ^7^'_'_$%/;2r4   c                 v   | j         D ]X}|j        j        s|j                            |          s	 *|j        r'|j        j        s|j                            |          s	 Y| j        rM| j        j        j        s>| j        j        }d|_	        |j
        D ]%}|j        s|j        j        rd|j        _        "d S d S d S )Nr   T)rV   rj  r|  create_from_py_utility_coder  r  r?  r  r  r  cf_assignmentsr/  r  r   cf_maybe_null)r   r   r  r  asss        r5   r%  z(DefNodeWrapper.prepare_argument_coercion  s    
 9 	 	C8' x;;C@@  cl&> |==cBB  	1T%6%<%D 	1 %+E$%E!+ 1 1z 1cgo 1,0CG)	1 	1 	1 	1
1 1r4   c                     t          | j                  }|dk    s*|dk    r&| j        d         j        s| j        d         j        rdS dS r7   )rL   rV   r  rQ  )r   argcounts     r5   signature_has_nongeneric_argsz,DefNodeWrapper.signature_has_nongeneric_args  sI    ty>>q==A49Q<#;#'9Q<#; 1qr4   c                     | j         j        S r   )r  r  r   s    r5   signature_has_generic_argsz)DefNodeWrapper.signature_has_generic_args  s    ~..r4   c                    g }| j         j        r|                    t          j                   | j        D ]}|j        j        rP|j        	                    t          j        dd                     |                    d|j        j        z             ^|j        r\|j        j        sP|j        j        sD|j        j        s8|                    |j                            |j        j                             |                    |j        j                   | j        r$|                    | j        j        j                   | j        r$|                    | j        j        j                   d                    |          }| j        j        s"|                    dt          j        z             |                    | j        j        j        d|d           d S )NMoveIfSupportedCppSupport.cpp__PYX_STD_MOVE_IF_SUPPORTED(%s)r   z%s = rk  rq  )r  r9  r  r	   r  rV   rj  r  r  r  r   r  r  r  r  r  r  rr  r@  r>  r?  r   r  re  r  r  rT   rM  r  )r   rY   rV   r  s       r5   r]  z%DefNodeWrapper.generate_function_body  s   >' 	+KK)***9 	- 	-Cx$ -  11+,=?OPPR R R=	OPPPP -sx'B -%(X%7-%(X%8- CH..sy??@@@@CIO,,,,= 	3KK+1222 	7KK)/5666yy' 	4HHWv22333

K***DDD2 	3 	3 	3 	3 	3r4   c                 	   | j         j        }|                    | j                   |                    d           |                    d           | j                                         }|r|                    |           |                    |           |                                |_        | j         	                    ||          p| j         j
        }|                     ||           |                     ||           |                                }| j        j        rd}nd}| j        j        s<|                    | j                            t$          j                  |d           |                                 |                    t-          d| j        z                       |                     |||           |                     |           |                     |           |                    |j                   |                    | j                   |                    d           |                    d           |                    d          }|                    |j                  r|                    |j                    |!                    |j                   |j        "                                D ]\  }	}
|#                    |	|
           | $                                }|%|                    t$          j        d|d           | %                    |           |                    |           |!                    |j                    | %                    |           |!                    |           |j&        D ];}|j'        r2|j(        r|)                    |           &|*                    |           <tW          |j&                  }| j,        D ]X}|j-        j        sJ|j.        |vrA|j.        j(        r|)                    |j.                   >|*                    |j.                   Y|/                                 | j        j        s"|                    d	t$          j        z             |                    d
           |0                                 |r|                    d|z             d S d S )Nr   z/* Python wrapper */z = 0rG  z%s (wrapper)rw  
cleaned_uprF  r  rp  r  )1rM  rY  r,  r:   rT   r  r  r  r  r  r  r  r  rP   r  r|  re  rf  r	   r  r  r  r   rn   r  r  r]  r  r'  r  r  r  r  r  r  r  r  %generate_argument_values_cleanup_coder  r/  r  r  put_var_decrefr   rV   rj  r  r  r  )r   r   rY   rQ  r  re  r  retval_initvalues_cleaned_up_labelr  rj  r  r  var_entries_setr  s                  r5   r  z,DefNodeWrapper.generate_function_definitions  s   {&dh

2

)***![??AA 	+JJ)***t$$$/3~~/?/?,+@@dKK 9+8 	%%dN;;;++D$777//11' 	 KKK' 	JJ 11&2EFFF    	))+++''nty6P(Q(QRRR++D$8HIII))$///##D))) 	..t~>>>dh

2

-... #'..">">??4+,, 	3MM$+,,,NN4+,,,#~??AA . .t  ----&&((G"

)<)<)<gggFGGG 66t<<<MM1222 	t()))224888.///% 	/ 	/E| /( /((////''...d.//9 	3 	3C8' 3CI_,L,L 9, 3((3333''	222((***' 	;JJ|f&99:::

3 	@JJ),>>?????	@ 	@r4   r   c                    g }| j         }|j        s| j        r0dt          j        z  }|j        sd|z   }|                    |           | j        D ]g}|j        s^|j        s|j	        r|                    d|j
        z             5|                    |j                            |j
                             h| j        j        }|j        s8|                                t"          j        gk    r|                    d           |j        r~dt          j        dt          j        }	|j        rFdt          j        dt          j        dt          j        }
|                    d|
d	|	d
           n|                    |	           |j        rOt1          t3          | j                  |                                          D ]}|                    d|z             d                    |          }d}|j        dv r|j        j        rd}d}| j                            |j                   }|d|d|d}|!                    d|z             |r0| j        j"        r"| j        j"        #                    ||d           d S tH          j%        r|j&        r| j        j"        s|j        j'        s|j        r|j(        r|j&        }|j)        r|*                                }|j        r	|j        dv s3|!                    d|j+        d|,                                d           |j        rG|!                    d           |!                    d|j(        z             |!                    d           |s| j        j"        r?|-                    d|j.        z             |/                    | j        j        dd           |!                    d|z             d S )Nr3  r4  zCYTHON_UNUSED PyObject *unusedz
PyObject *, PyObject *zPyObject *const *z, Py_ssize_t z
#if CYTHON_METH_FASTCALL
z
#else
z
#endif
z%CYTHON_UNUSED PyObject *unused_arg_%sr   r   r4  Fr  rk  rj  z%s; /*proto*/T)rf  zPyDoc_STRVAR(rq   #if CYTHON_UPDATE_DESCRIPTOR_DOCzstruct wrapperbase %s;r  zstatic PyMethodDef %s = rG  )
allow_skipz%s {)0r  r9  r  r	   r  r  rV   rR  r  rQ  r'  r  rf  rM  r  r  r  r   method_noargsr  
args_cname
kwds_cnameuse_fastcallnargs_cnamer  rL   r  r   rn   r  r  r  r  rT   rK  r  r!   r  rD   is_property_scoper  
is_unicodeas_utf8_stringr  r!  r  rQ  put_pymethoddef)r   rY   re  rf  r:  r  r  r  r  varargs_argsfastcall_argsrt  r  r<  r  docstrs                   r5   r  z'DefNodeWrapper.generate_function_header   s|   n 	+ 4 	+%(99H$ 7+h6  ***9 	F 	FC> F? Fco F!((#-)GHHHH!((55cmDDF F F! 	CC$4$4$6$69;R:S$S$S  !ABBB 
	3 
	3%%%v'8'8:L 3 3)))6+=+=+=v?P?P!R$$$%|||56 6 6 6 $$\222 	R3ty>>3+A+A+C+CDD R R$$%Lq%PQQQQ99]++ J@@@K0 A!B"N..u/?@@&(bb"""hhh7

?V+,,, 	{( ; )BB.T C ; ; ;F 	%59 	%K-	%K1	% %	% */)@	%
 YF  1..00$ 37])])]


OOO..00002 3 3 3  %

=>>>

,u/FFH H H

8$$$ 	KT[6 	KHH*U-BBD D D  !2CE JJJ

6F?#####r4   c                 >   | j         D ]H}|j        r?|j        r|                    d|j        z             .|                    |j                   I|j        D ]}|j        r|                    |           | 	                                rpdt          j        z  }| j        j        r@|                    d           |                    |           |                    d           n|                    |           |                    dt          j        z             d S )NzPyObject *%s = 0;zCYTHON_UNUSED Py_ssize_t %s;#if !CYTHON_METH_FASTCALLr  z"CYTHON_UNUSED PyObject *const *%s;)rV   rR  r$  rT   r'  r  r  r  r/  r\  r	   rp  r  ro  kwvalues_cname)r   r   rY   r  r  
nargs_codes         r5   r  z-DefNodeWrapper.generate_argument_declarationss  s+   9 	8 	8C~ 8' 8JJ2S]BCCCC,,SY777_ 	0 	0E| 0((/// **,, 	'7&:LLJ~* '

6777

:&&&

8$$$$

:&&& 	

7&:OOPPPPPr4   c           
      l   |                                 }|j        }|                    d          }| j        dk    }| j        d up
| j        d up|}| j        D ])}	|	j        j        s|	j        	                    |          s	 *| 
                                r| j        j        r|                    d           |                    d           |                    t          j        dt          j        d           |                    d           |                    t          j        dt          j        d	|                    d
t          j        z            d|                                 d           |                    d           | j        j        r|                    d           |j                            t+          j        dd                     |                    t          j        d| j        j        dt          j        dt          j        d           | 
                                s-|rt3          | j        d           |                     |           nM|                                 s|                     |           n#|                     | j        ||           d| _        ||_        |                     |          rQ|!                    |           |"                    |           | #                    |           |rr| $                    | j        |           | j        rP| j        j%        j&        r |'                    | j        j%                   n|(                    | j        j%                   | j        D ]4}	|	j        j        s&|	j        j)        r|*                    |	j%                   5|+                    | j,        j%        j-                   |.                                 |                    d|                                 z             |"                    |           d S )Nargument_unpacking_doner   ry  z#if CYTHON_ASSUME_SAFE_SIZEz = PyTuple_GET_SIZE(rq  r  z = PyTuple_Size(z); if (z%s < 0z	) return rG  r  fastcallr  z = __Pyx_KwValues_rk  r   z.This method cannot have * or keyword argumentsTr  )/new_error_labelr  r  r  r>  r?  rV   rj  r|  rT  r\  r  ro  rT   r	   rp  rm  r  r  r  r  r   r  rz  fastvarr   r:   r  rZ  generate_stararg_copy_code'generate_tuple_and_keyword_parsing_codeneeds_values_cleanupr  r  r  rc  generate_arg_decrefr  r  put_var_xdecref_clearput_var_decref_clearr  r  r  rM  r  r  )
r   r   rY   	decl_codeold_error_labelour_error_label	end_labelhas_kwonly_argshas_star_or_kw_argsr  s
             r5   r  z-DefNodeWrapper.generate_argument_parsing_code  sU    ..00*NN#<==	.2"m47 @ ,@0? 	 9 	 	C8' x;;C@@  **,, 	%~* 8

6777JJ4555JJ"""F$5$5$57 8 8 8JJw JJ"""!!!h);;<<<<  """"	    JJx   ~* %

8$$$))#J0EFF	H 	H 	H

!!!4>#9#9#96;L;L;LfN`N`N`b 	c 	c 	c ..00 	-" Rdh PQQQ22488883355 	- ++D1111 88D)TTT(,D%*???++ 	:MM)$$$NN?+++66t<<<" K((===$ K(.> K2243D3JKKKK11$2C2IJJJy 4 4x+ 40J 4 ((333""4;#4#CDDD,,...JJ|d&6&6&8&88999y!!!!!r4   c                 B    |r|                     |j                   d S d S r   )r  r  r   r  rY   s      r5   generate_arg_xdecrefz#DefNodeWrapper.generate_arg_xdecref  s0     	2&&sy11111	2 	2r4   c                 B    |r|                     |j                   d S d S r   )r  r  r  s      r5   r  z"DefNodeWrapper.generate_arg_decref  s0     	1%%ci00000	1 	1r4   c                    d|                                   d}| j                                        }| j        sc|j                            t          j        dd                     |                    dt          j
         d| dt          j
         d| d		           |                    d
t          j         d| j        rdnd dt          j         d| j        j         dt          j         d           |                    dt          j         d|            | j        r|                    dt          j         d           |j                            t          j        dd                     |                    d| dt          j         d|            | j        j        j        rd| j        j        _        | j        j        j        }|                    | d| j        j         dt          j         dt          j         d           |                    d| d|            |                    | j        j                   |                    d           |                    | d           |                    d| d|            |                    | j        j                   |                    d           nc|j                            t          j        d d                     |                    dt          j         d!| dt          j         d| d	           | j        r| j        j        s| j        j        rJ | j        j        j        }|                    | d"t          j
         d#|                    || j                              |                    | j        j                   |                    t          j        t<                     |                    t          j        t<                     |                    |                     d$| d%t          j         d&| j                             |j!        "                    tF          j$        d'          }|                    d(| d)| d*t          j
         d+| d,	           |                    d-t          j%         d| d           |                    d.           |                    |                    d/| j                             |                    d0           |                    d/t<                     |                    d/t<                     |                    |                     d$| d| d1| j                             |                    d           |j!        &                    |           d2| j        j        _        d S | j        r|| j        j        rJ | j        j        j        }|                    t          j%        t<                     |                    | dt          j%         d           d2| j        j        _        d S d S )3Nr  rG  RaiseArgTupleInvalidr  r  z$ > 0)) { __Pyx_RaiseArgtupleInvalid(z, 1, 0, 0, r%   }const Py_ssize_t rF  r   r  rk  ) ? __Pyx_NumKwargs_) : 0;z < 0)) r  z > 0) {KeywordStringCheckz'if (unlikely(__Pyx_CheckKeywordStrings(r   z
) == -1)) Fz = __Pyx_KwargsAsDict_rq  if (unlikely(!z)) ro  z = PyDict_New();rp  RejectKeywordsz > 0)) {__Pyx_RejectKeywords(z = PyTuple_New(z + 1); z__Pyx_PyTuple_SET_ITEM(z, 0, rj  r#  for (=0; z < ; z++) {z(PyObject* item = __Pyx_PyTuple_GET_ITEM(z#if !CYTHON_ASSUME_SAFE_MACROSr   r  z	+1, item)r   )'r  rn   r!  r>  r  r  r   r  rT   r	   rp  kwds_len_cnamer?  rn  r  r  r  r  r  r  rz  put_var_gotrefr  rM  r  ro  r*  r:   r  r  r   rJ  error_goto_if_negr'  r(  r
   c_py_ssize_t_typerm  r0  )r   rY   
goto_errorfunction_namestarstar_arg_cnamestar_arg_cnamer1  s          r5   r  z)DefNodeWrapper.generate_stararg_copy_code  s   4t//11444
	5577} 		--'(>@UVVX X XJJ 2  /< IOI[       	

R 5 R R&6rrJR R9?9JR R#~5R R8>8IR R R	
 	
 	

 	

M6#8MMMMNNN &	JJ=f3===>>>--'(<>STTV V VJJt-tt6K\tthrtt  
  &. =:?!'7%)%6%<%B"

)  AW  ( ,2,A    
 

O,>OO:OOPPP##D$5$;<<<

:&&&

0BBBCCC

O,>OO:OOPPP##D$5$;<<<JJsOOOO --'(8:OPPR R RJJ 5  (5 9?9J        "	4(C "	4~2222!]06NJJ! G G&2D G G**>48DDG G    3444OOF-~>>>V.???JJ&&'j'j'jV\Vg'j'j'jlpltuuw w w>//
0LY^/__DJJMMM$MM6+=MMMMMO O OJJX6;LXXPTXXXZ Z ZJJ7888JJt..vtx@@AAAJJx   OOFN333V^444JJ&&'b'b'bSW'b'b'bdhdlmmo o oJJsOOON''---23DM///] 	4~2222!]06NOOF-~>>>JJ!::f&7:::< < <23DM///	4 	4r4   c                    j                             t          j        dd                     | j                                        }                    d          }                    | j                  }g }g }g }	dx}
}|D ]l}|j	        s
|j
        s|j        r|j        r|j        r|	n|                    |           ?|                    |           |j        r|
dz  }
|j        s|dz  }m||	z   }| j        | j        z
  }t%          |          dk    r|d         j
        s|d         j        r|dz  }t%          |          }| j         o||k    }t)          |          }| j        s| j        r|                     |           t/          |          t/          |          z   }d |D             }|p| j        }                    d           |rKd                    fd	|D             d
gz             }                    dt4          j        d|d           |                     ||                               dt4          j         d|rdnd dt4          j         d| j        j          dt4          j         d                               dt4          j         d|            t4          j         d}| j        dk    rd|z  }                    d|z             |sWj                             t          j        dd                                         d| dt4          j         d|            nw| !                    ||||||           | "                    ||           | #                    |           ||k    rj                             t          j        dd                                         dt4          j$         d | d!                               d"| d|d#d|d#d|d#d$| d%                               d&           | j        rj                             t          j        d'd                                         d| d || j        z    d!                               d(| d)t4          j         d*|
 d+| d%	                               d&           | j        r|dk    s||k    rL||k    r
| j        sd,}nd-}                    d.t4          j$        ||fz             %                    |           | j        r||k    r@| j        s9                    d/t4          j$        |fz             %                    |                               d0           |D ]u}|j        slj                             t          j        d'd                     &                    |j'        j                  }                    d1| d| d|             nvnw                    d0           ||k    rhtQ          |          D ]V\  }}                    d2| d3| j        j          dt4          j)         d| d4	                               d5| d6|            Wnމ                    d7t4          j$         d8           | j        r                    d9           tU          tQ          |                    d d d:         }|D ]\  }}||dz
  k    rD||d         d         k    r                    d;                               d<|dz   d=d>                               d2| d3| j        j          dt4          j)         d| d4	                               d5| d6|            |dk    r*                    d;           +                    d?                               d@           | j        rI|rFtY          |dz
  d:d:          D ]}                    d<|d=d>           %                    |           n*+                    dA           %                    |                               d&           | #                    |                               d&           tQ          |          D ] \  }}| -                    |d2| dB           !                    d&           .                    |          r                    dC          }%                    |           /                    |           j                             t          j        dd                                         dD||||t4          j$        |fz             /                    |           d S d S )ENr~  r  argtuple_errorr   r   c                      g | ]}|j         	|S r3   r  rp  s     r5   r   zJDefNodeWrapper.generate_tuple_and_keyword_parsing_code.<locals>.<listcomp>t  s    HHHC3<HCHHHr4   {,c                 T    g | ]$}d                      |j        j                   %S )&)intern_identifierr  rn   )r   r  rY   s     r5   r   zJDefNodeWrapper.generate_tuple_and_keyword_parsing_code.<locals>.<listcomp>y  sC     ( ( ( =D**39>::<<( ( (r4   r  zPyObject ** const z[] = {z};r  rF  r   r  rk  r  r  r  r&  z > 0z
likely(%s)r  r  z__Pyx_RejectKeywords(r   r%  r  zfor (Py_ssize_t i = z; i < z; i++) {z7if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid(dz, i); r  rp  RaiseKeywordRequiredz7if (unlikely(!values[i])) { __Pyx_RaiseKeywordRequired(z, *(z[i - z])); z!=<z } else if (unlikely(%s %s %d)) {z} else if (unlikely(%s > %d)) {ro  z__Pyx_RaiseKeywordRequired(values[] = __Pyx_ArgRef_rq  3if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[])) zswitch (r  default:r   CYTHON_FALLTHROUGH;case 2d:	case  0: break;	default: ]skipz2__Pyx_RaiseArgtupleInvalid(%s, %d, %d, %d, %s); %s)0r  r  r   r  rn   r!  r  r.  r:   rR  r  rQ  rT  rX  r  rU  r  r  rL   r>  boolr?  generate_stararg_init_codetuplerT   r   r	   pykwdlist_cname#generate_argument_values_setup_coder  rn  r  r  generate_posargs_unpacking_codegenerate_keyword_unpacking_code*generate_argument_defaults_assignment_coderp  r  r  r  r  rm  r   r  r  generate_arg_assignmentr  r  )r   rV   rY   r  self_name_csafeargtuple_error_labelr  r  required_kw_only_argsoptional_kw_only_argsnum_pos_only_argsnum_required_pos_only_argsr  kw_only_argsmin_positional_argsmax_positional_argshas_fixed_positional_counthas_kw_only_argsall_argsnon_posonly_argsaccept_kwd_argsnon_pos_args_idkw_unpacking_conditioncomparepystring_cnamer  reversed_argsskip_error_handlings     `                         r5   r  z6DefNodeWrapper.generate_tuple_and_keyword_parsing_codeH  s"   ))#J0EFF	H 	H 	H )7799#~~.>??__TX..
 " "9::6 	8 	8C>  #/ { 8*-+P&&;PXXY\]]]]&&s+++< 8%*%; 82a72 -/DD"4t7PPt99q==d1g1=T!W5H=1$!/22)-%6 &7#66 	#-- 	G 	G++,?FFF))E,,?,??HH8HHH*?d.?

3 	"!hh ( ( ( (+( ( ( (  O JJJ&&&! " " " 	004KKK 	

R 5 R R$4rr*R R7=7HR R#~5R R8>8IR R R	
 	
 	

 	

M6#8MMMMNNN$*$9!?!?!?$q((%14J%J" 	

;!77888 3	 --'(8:OPPR R RJJddd&BSddXbddeeee 00#%8*,<hH\^bd d d 00#Xt5 5 5 ;;HdKKK #%??? 11+,BDYZZ\ \ \

j&2DjjL_jjjkkk

&  27  +0	 
 +0  "  
 
 
 

3(   11+,BDYZZ\ \ \

  H2E  H  HM`cgc|M|  H  H  H  I  I  I

&   /  7H 
 "     

3 % 		0*=*A*AFY]pFpFp #&999$-9JJ9"G-@=B B C C CMM.///$ 8	L"%8888

<&(;@= = > > >2333JJz"""#  { $55#/0FH]^^` ` `%)%;%;CIN%K%KNJJo_ooP^oocmoopppE JJz""""&999 (88 j jFAsJJi!iidn6LiivO`iideiiik k kJJhUVhh\fhhiiiij 

>f&8>>>???= +JJz*** $Y%?%? @ @2 F+ j jFAs/111a 0 333 JJ'<===

#41Q3#4#4#4#4555JJi!iidn6LiivO`iideiiik k kJJhUVhh\fhhiiii&!++JJ4555HH[)))

8$$$= 8* <!&':1'<b"!E!E 8 8A JJq7777&:;;;HH[)))MM"6777

3 ;;HdKKK

3
  )) 	D 	DFAs((nnnndCCCC

3??/00 	0"&.."8"8MM-...NN/000--'(>@UVVX X XJJK!;#%8"	O     NN./////	0 	0r4   c                     |j         j        rU|j        r%t          j        |j         t          j        |          }|j        }|                    |j        d|d           d S |j         j	        r|j
        r|                    d|z             |                    |j                             ||j        j        |j        |                     |j
        r|                    d           |                    |j        j        d|                    |          d           |j         j        r|                    |j        d           |                    d           d S d S t!          |j        d|j         z             d S )	NrF  rG  r  ro  Trs  rp  2Cannot convert Python object argument to type '%s')rj  r|  rR  r
   typecastr   r  rT   r  from_py_functionrX  from_py_call_coder:   rB  r  r  r   )r   r  r   rY   r  s        r5   r  z&DefNodeWrapper.generate_arg_assignment2  s   8 	`~ V!*38Z5NPTUUIEJJU[[[$$$788888x( `; 3JJ{T1222

3855#)/37D: : ; ; ;; $JJz***JJ	88>>>> @ A A A x2 V;;CIPT;UUUJJsOOOOO$ $ cgSVYV^^_____r4   c                    | j         r| j         j        j        r~d| j         j        _        |                    | j         j        j        d| j         j        j        d|                                 d           |                    | j         j                   | j        rd| j        j        _        |dk    ri| j	        j
        rJ |                    t          j        t                     |                    | j        j        j        dt          j        d           d S |                    | j        j        j         d| j	        j         dt          j         d| dt          j         d	
           |                    d
| j        j        j                            | j        j        j                   d           | j         r|                    | j         j                   |                                 |                    d|                                  d           |                    d           |                    | j        j                   d S d S )Nr   z = PyDict_New(); if (unlikely(!z
)) return rG  rF  z = __Pyx_ArgsSlice_rk  r   rq  r  )) {r  rp  )r?  r  r  r  rT   r  r  r  r>  r  ro  r  r	   rm  r   r  rp  rj  nullcheck_stringr  r  )r   r  rY   s      r5   r  z)DefNodeWrapper.generate_stararg_init_codeK  sl    	9!2!8!@ 	967D#3JJ!'---!'---  """"$ % % %  1 7888= 	923DM/"a''  >6666 1>BBB

)<)B)B)BFDUDUDUVWWWWW
 

}*0  T^E[  ( ,? CICU    
 

pT]%8%=%N%Nt}ObOh%i%ipppr r r$ G--d.?.EFFF00222

:T%5%5%7%7:::;;;

3##DM$7888881	9 	9r4   c                 4   t          |          }|                    d|d                    d|z            fz             | j        j        rL|                    d| j        j        dt
          j        d| j        j        dt
          j        d	           d S d S )	NzPyObject* values[%d] = {%s};r  r  struct z *z$ = __Pyx_CyFunction_Defaults(struct r   rq  )rL   rT   r   rM  rJ  r	   dynamic_args_cnamer  )r   rV   rY   r  max_argss        r5   r  z2DefNodeWrapper.generate_argument_values_setup_coden  s    t99 	6chhs8|,,:. . 	/ 	/ 	/ ;& 	AJJJ+++V-F-F-F+++V->->->@ A A A A A	A 	Ar4   c                     t          |          D ]d\  }}|j        rX|j        j        rL|                    |          }|                    d| d| d|j                            |           d           ed S )Nzif (!values[z
]) values[z] = __Pyx_NewRef(rq  )r  rX  rj  r|  rB  rT   as_pyobject)r   rV   rY   r  r  r  s         r5   r  z9DefNodeWrapper.generate_argument_defaults_assignment_code{  s    oo 	t 	tFAs{ tsx3 t # @ @ F F

r!rrqrr38K_K_`mKnKnrrrsss	t 	tr4   c           	          | j         sd S t          j        }|                    d| d| d| d           |                    d| d           |                    d           d S )Nzfor (Py_ssize_t r  z5 < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++r  zPy_XDECREF(values[z]);rp  )r  r	   quick_temp_cnamerT   )r   rY   loop_vars      r5   rc  z4DefNodeWrapper.generate_argument_values_cleanup_code  s    ( 	F*

  Bh  B  BH  B  Bs{  B  B  B  	C  	C  	C

5555666

3r4   c                 4   d}|D ]}	|	j         r|	j        s|dz  }|                    dt          j        z             | j        r|                    d           t          |dz
  |dz
  d          D ]}
|                    d|
dz   dd           |                    d	|
 d
| j        j         dt          j	         d|
 d	           |                    d|
 d|
                    | j                              |                    d           |dk    r|                    d|dd           t          |dz
  dd          D ]k}
|                    d	|
 d
| j        j         dt          j	         d|
 d	           |                    d|
 d|
                    | j                              l|                    d           t          |dz
  dd          D ]4}
|                    d|
dz   dd           |                    d           5|                    d           |dk    r|                    d           n|                    |           | j        s*|                    d           |                    |           |                    d           d S )Nr   r   switch (%s) {r  r   r  r  r  r  r  rk  r   rq  r  r  r  r   r  r&   r  r  rp  )rU  rX  rT   r	   rp  r>  r  r  r  rm  r.  r:   r  r  )r   r  r  r  r  r  r  rY   num_required_posonly_argsr  r  s              r5   r  z.DefNodeWrapper.generate_posargs_unpacking_code  s    %&! 	/ 	/C| /CK /)Q.) 	

?V%77888= 	#JJz"""*1,.G.I2NN 	. 	.AJJ(qs(((()))JJhhhT^5KhhfN_hhcdhhhiiiJJoQooTXTcTcdhdlTmTmoopppJJ,----$q((HH=6====>>>4Q6B?? u u

lQll9OllRXRcllghlllmmm

sQRssX\XgXghlhpXqXqssttttJJx   02B;; 	. 	.AJJ(qs(((()))JJ,----$))JJx     MM.///} 	0HH[!!!MM.///

3r4   c                 *   d}|D ]}|j         r|dz  }|dk    r1|                    dt          j        |t          j        |fz             n(|dk    r"|                    dt          j        z             |dk    rd}n-| j        r$||z
  }|                    d| d| d           d	}nd
}d|cxk     rt          |          k     r	n nd| }nd}| j                                        }	|j        	                    t          j        dd                     |                    | j        dt          j         dt          j         dt          j         d| j        r| j        j        j        nd d| d| dt          j         d|	 d| j        d udd           d S )Nr   r   zBconst Py_ssize_t kwd_pos_args = (unlikely(%s < %d)) ? 0 : %s - %d;z#const Py_ssize_t kwd_pos_args = %s;r  z1const Py_ssize_t used_pos_args = (kwd_pos_args < z) ? kwd_pos_args : rG  used_pos_argskwd_pos_argsz	values + r  ParseKeywordsr  z__Pyx_ParseKeywords(r   r  rj  )rU  rT   r	   rp  r>  rL   rn   r!  r  r  r   r  put_error_if_negr:   rn  rz  r  r?  r  r  r  )
r   r  r  rY   r  r  pos_arg_count
max_kwargsvalues_arrayr  s
             r5   r  z.DefNodeWrapper.generate_keyword_unpacking_code  sX     	' 	'C| '!Q&!q   JJ["$5"$5_      !1$$JJ<v?QQRRR!##MM] 
	+ -/@@JJJw:wwjtwwwxxx+MM*M 00003x==00000:'8::LL#L)7799))#O5JKK	M 	M 	MH  $*$9 =C=S 040AJt &,,s    	 
 $     ,1  	
 	
 	
 	
 	
r4   c                 T    | j         D ]}|j        r|                     ||            d S r   )rV   r$  generate_arg_conversionr"  s      r5   r  z0DefNodeWrapper.generate_argument_conversion_code  sA     9 	8 	8C# 8,,S$777	8 	8r4   c                    |j         }|j        }|j        ro|j        r|                    d|j        z             n|                    d|j        z             |                     ||           |                    d           d S |j        r|                     ||           d S |                    |          r,|                    |j	        j
        d|j        d           d S t          |j        d|d|d           d S )	Nr  zassert(%s); {rp  rF  rG  z Cannot convert 1 argument from 'z' to 'r  )r  rj  r|  rX  rT   r'  %generate_arg_conversion_from_pyobject#generate_arg_conversion_to_pyobjectr  r  r  r   r:   )r   r  rY   old_typenew_types        r5   r  z&DefNodeWrapper.generate_arg_conversion  s   <8 	e{ <

;67777

?S]:;;;66sDAAAJJsOOOOO! 	e44S$?????''11 e

#---HIIIIIcggPXPXPXZbZbZbcdddddr4   c                     |j         }|j        rA|                    |                    |j        |j        j        |j        |                     d S t          |j        d|z             d S )Nr  )	rj  r  rT   r  r'  r  r  r:   r   )r   r  rY   r  s       r5   r  z4DefNodeWrapper.generate_arg_conversion_from_pyobject  s|    8$ 	\JJx11		       #'ORZZ[[[[[r4   c                 2   |j         }|j        }|rn|                    |j        j        d|d|j        d|                    |j        j        |j                             |                    |j                   d S t          |j        d|z             d S )NrF  rk  r%  z5Cannot convert argument of type '%s' to Python object)
r  to_py_functionrT   r  r  r'  r*  r:   r  r   )r   r  rY   r  r^   s        r5   r  z2DefNodeWrapper.generate_arg_conversion_to_pyobject  s    <& 	_JJ	''	AAA	C D D D
 	*****#'RU]]^^^^^r4   c           
         | j         D ]a}|j        r|                     ||            |j        s:|j        j        s|j        j        s|j        j        r|                     ||           b| j	        j
        j        rt          t          t          | j                   | j                                                            D ]}| j	        j
        j        dk    r|                    d           |                    d|z             |                    d| j	        j
        j        d| j                                        d|d           |                    d|                    | j                  z             |                    d	           | j	        j
        j        dk    r|                    d
           | j	        j
        j        dk    rt          | j                   dk    r|                    d           |                    d| j	        j
        j        z             |                    d|                    | j                  z             |                    d	           d S d S d S d S )N__ipow__z #if PY_VERSION_HEX >= 0x03080000z)if (unlikely(unused_arg_%s != Py_None)) {z"PyErr_SetString(PyExc_TypeError, "z	() takes z arguments but z were given");%s;rp  z'#endif /*PY_VERSION_HEX >= 0x03080000*/r&   z$if ((PY_VERSION_HEX < 0x03080000)) {zYPyErr_SetString(PyExc_NotImplementedError, "3-argument %s cannot be used in Python<3.8");)rV   r  r  r  rj  r|  rd  r  r  rM  r  r  reversedr  rL   r  r  rn   rT   r  r.  r:   )r   rY   r  rt  s       r5   r  z+DefNodeWrapper.generate_argument_type_tests%  su    9 	8 	8C" 8++C6666_ 8#(*> 8*-(*<8*-(*E8 ,,S$777;' 	 eC	NNDN4U4U4W4WXXYY J J ;$)Z77 JJABBB

FJKKK


 )888$.:[:[:]:]:]:]_`_`_`bc c c 

54??48#<#<<===

3;$)Z77JJHIII{ %33DI!8K8K
 

ABBB

E)8:; ; ; 

54??48#<#<<===

3;	  	 $ 438K8Kr4   c                     | j         j        S r   )r  r  r   s    r5   r  zDefNodeWrapper.error_valueP  s    ~))r4   rF  )!r-   r.   r/   defnoderM  r  r   r   r%  rZ  r\  r]  r  r  r  r  r  r  r  r  r  r  r  r  rc  r  r  r  r  r  r  r  r  r3   r4   r5   r  r  r  s        GF   	3 	3 	31 1 1,  / / /3 3 36U@ U@ U@nQ$ Q$ Q$ Q$fQ Q Q2M" M" M"^2 2 21 1 1c4 c4 c4Jh0 h0 h0T` ` `2!9 !9 !9FA A At t t  & & &P;
 ;
 ;
z8 8 8e e e&\ \ \_ _ _)  )  ) V* * * * *r4   r  c                   ^     e Zd ZdZdZdZdZej        dgz   Z fdZ	 fdZ
d Z fdZ xZS )	GeneratorDefNodeTF	Generatorgbodyc                 f    t          |g d          |d<    t                      j        |fi | d S )NT)r  r   r   )r  rk   r   r   r:   r~   rO   s      r5   r   zGeneratorDefNode.__init__a  s@    %c4HHHv'''''''r4   c                     t                                          |           | j        | j        _        | j                            |           d S r   )rk   r   rY  r
  r   r   rO   s     r5   r   z%GeneratorDefNode.analyse_declarationsf  sD    $$S)))!%!1

'',,,,,r4   c                    | j         j        j        }|                    | j                  }|                    | j                  }|                    | j                  }| j                            |           |	                    d           |	                    d| j
         d| d| j                                         dt          j         d| d| d| d|                    d| j                              |                    t          j        t"                     | j        r]d}|	                    |d	t          j        d
           |                    |t"                     |                    |t"                     |                                 |	                    d           |	                    d           d S )Nr  z#__pyx_CoroutineObject *gen = __Pyx_z_New((__pyx_coroutine_body_t) r   , (PyObject *) r%  genzgen->classobjz  = __Pyx_CyFunction_GetClassObj(rq  zreturn (PyObject *) gen;rp  )r
  r  r  r  rn   qualnamemodule_namer  r  rT   gen_type_namer  r	   r  r*  r:   r  r   rI  r  r  rJ  r  )r   r   rY   
body_cnamern   r  r  classobj_cnames           r5   r]  z'GeneratorDefNode.generate_function_bodyk  s   Z%0
%%di00))$-88,,T-=>>--d333

3

=$2D = =(2= = **,,= = $3= = 	= = !	= = %0	= =
 ))%::= =	
 	
 	
 	.???! 	=,NJJ 1 1 13 4 4 4OONN;;;^^<<<((***

-...

3r4   c                    |                     t          j        | j        d                     | j                            |d           t                                          ||           | j                            ||           d S )NCoroutine.cT)proto)r  r   r  r  r
  r  rk   r  )r   r   rY   rO   s      r5   r  z.GeneratorDefNode.generate_function_definitions  sz    [4T5GWWXXX
++D+===--c4888
00d;;;;;r4   )r-   r.   r/   r  is_iterable_coroutiner  rW  rc  r   r   r   r]  r  rs   rt   s   @r5   r  r  T  s         L!MM%	1K( ( ( ( (
- - - - -
  :< < < < < < < < <r4   r  c                       e Zd ZdZdZdS )AsyncDefNode	CoroutineTN)r-   r.   r/   r  r9  r3   r4   r5   r  r    s        MLLLr4   r  c                       e Zd ZdZdZdS )IterableAsyncDefNodeIterableCoroutineTN)r-   r.   r/   r  r  r3   r4   r5   r  r    s        'M r4   r  c                       e Zd ZdZdZdS )AsyncGenNodeAsyncGenTN)r-   r.   r/   r  r:  r3   r4   r5   r"  r"    s        MKKKr4   r"  c                   N     e Zd ZdZdZdZdZdZd	 fd	Zd Z	d Z
d
dZd Z xZS )GeneratorBodyDefNodeTFNc                 \    t                                          |||||d g d d 	  	         d S )N)	r:   r   rn   is_coroutine_bodyis_async_gen_bodyrD   rV   r>  r?  )rk   r   )r   r:   rn   r   r'  r(  rO   s         r5   r   zGeneratorBodyDefNode.__init__  sI    $T//24	 	 	A 	A 	A 	A 	Ar4   c                 ,   |                     |j                  }|                     d          }t          j        |z   |z   }|                    d t
          | j        |d          }||_        t          | j	                  |_
        d|_        || _        d S )N	generatorr  )r  rm  T)r  r  r	   genbody_prefixr  r   r:   r  r   rn   r  r  r  )r   r   r  rn   r  r  s         r5   declare_generator_bodyz+GeneratorBodyDefNode.declare_generator_body  s    S-..{{;''%.5ndh&+	   C C ,TY77 



r4   c                 Z    |                      |           |                     |           d S r   )r  r,  r   s     r5   r   z)GeneratorBodyDefNode.analyse_declarations  s0    ##C(((##C(((((r4   c           	          d| j         j        dt          j        dt          j        dt          j        d	}|r|                    d|z             d S |                    d|z             d S )Nzstatic PyObject *z(__pyx_CoroutineObject *z, CYTHON_UNUSED PyThreadState *ri  rj  z%s; /* proto */z%s /* generator body */
{)r  r  r	   generator_cnamelocal_tstate_cnamesent_value_cnamerT   )r   rY   r  r  s       r5   r  z-GeneratorBodyDefNode.generate_function_header  s     J!!!"""%%%###	%
  	>JJ(6122222JJ3f<=====r4   c           
         | j         }| j                            ||           |                    |           |                                |_        |                    | j                   |                     ||           |	                    d           | 
                    |           |                                }|	                    dt          j        z             |                                }|                                 |                    | j        j        p| j        j                   |                                }|r"|                    d           d|j        _        | j                            |           |j                            |j        j        j                   |                                }|                    d          }|                    |           |                    |           |r5|j        j        sJ |                     | j        j        | j        d           | j!        r9|	                    |"                    t          j#        | j                             n|	                    dt          j#         d           | j$        rd}	n| j%        rd	}	nd
}	|	                    dt          j#         d|	 d           |	                    |&                    | j                             |	                    d           | j!        r| j'        | j'        }
|
tP          j)        u rd}n4|
tP          j*        u rd}n#|
tP          j+        u rd}ntY          d|
z            |	                    t          j        d|d|"                    t          j        | j                             |-                    t          j        t\                     | /                    ||           |j        j        j        j0        r|	                    |j        j        1                    t          j2                  d|j        j        3                    dt          j4        z            d           |	                    dt          j2        z             |r4| j        j5        s(d|j        _        |6                    d| j                   |                    | j                   |	                    d           |	                    d           | j!        s1| j        j5        s%|7                    t          j        t\                     |8                    |j9                  r| j        j5        s|:                    |j;                   |                    |j9                   | j!        r,| j'        %|<                    t          j        t\                     |j        =                                D ]\  }}|>                    ||           |	                    d           |r|?                                 t          jA        |jB        jC        v rW|jD        E                    t          jG        dd                     |	                    dt          | j$                  z             |I                    | j        j                   |r|J                    | j                   |	                    d           |                    |j;                   |K                    t          j        t\                     |r|L                                 |	                    d           |	                    d t          j4        z             |	                    d!           |	                    d"t          j4        z             |	                    d#t          j4        z             |M                                 |	                    d$t          j        z             |	                    d           |N                    |j                   |	                    d%t          j4        z             |	                    d&|z             |jO        D ]\  }}|	                    d'||fz              |	                    d(           |rC|                     | j        j        | j        d           |6                    d| j                   |M                                 |	                    d)           |	                    d           |P                                 d S )*Nr   zPyObject *%s = NULL;T)r  	first_runr  z != Py_None)) {zasync generator	coroutiner*  zQ)) PyErr_SetString(PyExc_TypeError, "can't send non-None value to a just-started z");rp  zPyList_New(0)zPySet_New(NULL)zPyDict_New()z)invalid type of inlined comprehension: %srF  r  z%s->closurerG  zCYTHON_MAYBE_UNUSED_VAR(%s);Frn  r9   rw  zif (__Pyx_PyErr_Occurred()) {pep479r  z*__Pyx_Generator_Replace_StopIteration(%d);z#if !CYTHON_USE_EXC_INFO_STACKz+__Pyx_Coroutine_ResetAndClearException(%s);r  z%s->resume_label = -1;z%__Pyx_Coroutine_clear((PyObject*)%s);r  zswitch (%s->resume_label) {zcase 0: goto %s;zcase %d: goto %s;z2default: /* CPython raises the right error here */zreturn NULL;)QrY  r   r  r  r  r  r,  r:   r  rT   r  rP   r	   r  r  r  r  rn   r  r  r  r'  r  r  r  init_closure_tempsr  rj  r  	use_labelr  r  r  
is_inlinedr*  r1  r(  r'  r.  inlined_comprehension_typer   	list_typeset_type	dict_typer   r+  r   r]  r  rf  r  r@  r/  r   r  r  r  r  r  r  put_xdecref_clearr  r  r  r    generator_stopr  future_directivesr  r  r   r  r  r  r  r  r  r  r  yield_labelsr  )r   r   rY   rQ  closure_init_coder  r  resume_codefirst_run_label	coro_typetarget_type	comp_initr  rj  r  labels                   r5   r  z2GeneratorBodyDefNode.generate_function_definitions  s    		//d;;; 	t$$$/3~~/?/?, 	dh++D$777

2%%d+++ 0022

)F,??@@@//11))+++''
(T4:;TUUU//## 	,333FFF'+DN$--d333 	))$*:*?*EFFF**,,..55'''''' 	Y>++++  !:DHSW XXX? 	JJt..v/FQQRRRRJJPv'>PPPQQQ% (-		' ('		'	JJt 7 t tclt t t   JJttx00111JJsOOO ? 	At>J9Kg///+		 000-		 111*		#?+MO O OJJ###YYY''(;TXFFFH I I I OOF/@@@ 	##C... &2 	P## %66v7MNNNN %//060F1G H H H H%I J J J
 JJ58NNOOO 	;492 	;',DN$!!)!::: 	dh

2

-...  	Jty'> 	J $$V%8.III ??4+,, 	9* 1d/000NN4+,,, L4#B#N&&v':NKKK#~??AA . .t  ----JJ6777 744666$(EEE 11+2I(Ta2b2bccc

G$tOeJfJffggg""4:#<=== 0%%dh///JJsOOO 	t()))&-~>>> 	"!!! 	

3444

@6CYYZZZ

8

+f.DDEEE

:V=SSTTT((***

<&"55666

3 	..t~>>>7-/ 	0 	0 	0 	,>???) 	@ 	@HAu1QJ>????NOOO 	B''
(A48Z^'___(((AAA//111.)))#r4   )NNNFFr`  )r-   r.   r/   r;  r8  r'  r(  r9  r   r,  r   r  r  rs   rt   s   @r5   r%  r%    s         J!%A A A A A A  ) ) )	> 	> 	> 	>_  _  _  _  _  _  _ r4   r%  c                   $    e Zd ZdgZdZd Zd ZdS )ri  r   Nc                 B    |j          _         j        j        rd}nd}ddlm                      j        t                     _	        
                     j         j	         fd j        |d          D                       }|j        j        s|j        j        rFt           j        t           j        |          t!           j        d           g           _        nt!           j        |           _         j                            |           _         S )	Nr   r   rn  c                 R    g | ]#}                     j        |j                   $S rs  )r  r:   rn   )r   r  r  r   s     r5   r   z9OverrideCheckNode.analyse_expressions.<locals>.<listcomp>  s@     4 4 4 $$TXCH$== 4 4 4r4   ru  rV   )exprr   r'  )r  rV   r  r  r   r  RawCNameExprNoder:   r   	func_noderx  r  re  is_returncoder  ExprStatNodery  r   rx   )r   r   	first_arg	call_noder  s   `   @r5   rx   z%OverrideCheckNode.analyse_expressions|  s@   O	<' 	III"33DHnMM,,Ht~4 4 4 4 4!Yyzz24 4 4 - 5 5	 ?" 	Bco&C 	B$TXTXI666txt44466 7 7 7DII 'txyAAADII11#66	r4   c                 
   | j         j        r| j         j        j        n| j         j        }|                    |j                  }| j         j        rdt          j        z  }nd| j        d         j	        z  }|
                    d           |
                    dt          j        z             |
                    d           | j         j        s$| j         j        j                            d          r|
                    d           n|
                    d           |
                    d	           |                    | j         j        j        j        j                  }|
                    d
| d| d           |
                    d| d           |
                    d           |
                    d
| d| d           |
                    d           |
                    d           |
                    d           |j                            t'          j        dd                     |
                    dt          j        dt          j        d           |
                    d|dt          j        dt          j        d           |
                    dt          j        d|d           |
                    d           |j                            t4          d !          }| j                            |           |j                            t'          j        d"d                     |
                    |d#|d|d$|                    || j                             |                    |t4                     |
                    d%|d&|j         d'           | j!        "                    |           |
                    d(           |
                    d           |
                    t          j        d|d           |
                    t          j        d)|d           |
                    d*t          j        d+t          j        d'           |
                    t          j        d,t          j        d           |
                    d(           |
                    d           |#                    |tH          j                   |j        %                    |           |
                    d           |
                    d(           |
                    d           |
                    d(           d S )-Nr  r   z /* Check if called by wrapper */zif (unlikely(%s)) ;z#/* Check if overridden in Python */r   zelse {z	else if (z#if !CYTHON_USE_TYPE_SLOTSzunlikely(Py_TYPE(z) != z &&z __Pyx_PyType_HasFeature(Py_TYPE(z), Py_TPFLAGS_HAVE_GC))r  z9)->tp_dictoffset != 0 || __Pyx_PyType_HasFeature(Py_TYPE(z3), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))r  r  zQ#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTSPyDictVersioningObjectHandling.czstatic PY_UINT64_T z = __PYX_DICT_VERSION_INIT, z = __PYX_DICT_VERSION_INIT;z0if (unlikely(!__Pyx_object_dict_version_matches(r   z))) {zPY_UINT64_T z = __Pyx_get_tp_dict_version(rq  Tr#  PyObjectGetAttrStrz = __Pyx_PyObject_GetAttrStr(r%  zif (!__Pyx_IsSameCFunction(z, (void(*)(void)) r  rp  z! = __Pyx_get_object_dict_version(r   != rF  )&r  rK  r  r  rn   r  r	   module_cnamerV   r  rT   r  r  r  r,  r  r  r  r  r   r  tp_dict_version_tempobj_dict_version_temptype_dict_guard_tempr'  r(  r   rO  	set_cnamer*  r:   r+  r  r   r  r/  r
   r0  )r   rY   method_entryinterned_attr_cnamer;  r  func_node_temps          r5   r  z)OverrideCheckNode.generate_execution_code  s   ;?<;Umt|177[_[g[m"44\5FGG <' 	?)F,??HH)DIaL,>>H

5666

(6+EEFFF

8999<' 	4<+=+C+O+OPZ+[+[ 	JJx    JJ{###JJ3444
 !55dl6H6N6Z6hiiMJJ .8 . .(. . . / / /JJ[([[[\\\JJwJJ x8 x x:Bx x x y y yJJx   JJu

fggg))#$68JKK	M 	M 	M 	


''')E)E)EG 	H 	H 	H


HHf11163O3O3OQ 	R 	R 	R


'''3 	4 	4 	4

855nQU5VV  000))#$8:LMM	O 	O 	O

NNHHH&9&9&9##NDH===? 	@ 	@ 	@ 	777


nnn^j^u^u^uvwww	))$///

3
 	

fggg

'''3 	4 	4 	4

((((((4 	5 	5 	5 	


''')D)D)DF 	G 	G 	G

''')E)E)EG 	H 	H 	H

3

8nj.GHHH##N333

fggg

3

8

3r4   )r-   r.   r/   r   r   rx   r  r3   r4   r5   ri  ri  n  sE         (KD  *X X X X Xr4   ri  c                       e Zd ZdS )ClassDefNodeNr-   r.   r/   r3   r4   r5   rb  rb            Dr4   rb  c                       e Zd Zg dZdZdZdZdZdZdZ	dZ
	 	 ddZd Zd Zd Z ej        ej         ej        dej        d          g          Zd	 Zd
 Zd ZdS )PyClassDefNode)doc_noder   ri   	metaclassmkwro   class_resultrM  
class_cellr  
orig_basesNFc	           	      .   t                               | |           || _        || _        || _        || _        || _        ddlm}	 | j        rmt          j
        rat          | j        | j                  }|	                    ||          }
|	                    t          d          t           |          | _        nd }
| }|rd}d| _        |j        r|j        rxt+          t-          |j                            d d d         D ]E\  }}|j        j        d	k    r0| j        t5          |j        d
           |j        | _        |j        |= F|| _        n$| j        J n|	                    |          | _        |s| j        s| j        s| j        r| j        M|r|j        s| j        }nd }|s| j        j        r| j        j        sn|	                    ||           | _        d}nd}|	                     |||
|           | _!        |	"                    ||| |
|||          | _#        n:|	$                    |g           | _!        |	%                    ||| |
          | _#        |	                    ||          | _&        |	'                    | j                  | _(        d S )Nr   rn  rM  r   )rn   rj  r:   FTr   rh  z2keyword argument 'metaclass' passed multiple times)class_def_node)rn   rD   rn  )rn   rn  rD   calculate_metaclassallow_py2_metaclass
force_typer  )rn   rn  rD   rZ  ))r3  r   rn   rD   r   r  ro   r   r  r!   r  rE   r:   UnicodeNoder  r   r   rg  is_py3_style_classis_dict_literalr  r   r  r   r   rh  r   ri  	ProxyNodeis_sequence_constructorrV   PyClassMetaclassNodePyClassNamespaceNoderi   Py3ClassNodeclassobjDictNode	ClassNoderM  ClassCellInjectorNoderk  )r   r:   rn   ro   rD   r   r  r  force_py3_semanticsr  rg  rp  r  r   mkdictneeds_metaclass_calculations                   r5   r   zPyClassDefNode.__init__  s   $$$$		$
8 	* 	 4844C ,,S,<<H%..M)4L4LSagj.kkDMMH"55 	="'&*D#+ =/ 6#'	,2N(O(O#P#PQUQUSUQU#V @ @48>[88#~9 %dh0d e e e .2ZDN , <Q ?+DHH>5555 %..|<< 	C$* 	C 	CDN 	C~% "(D "!XFF!F 2
:2 JO2 %.%C%CD &D &2 &2DN.3++.2+!66$HT 7 C CDI%22$t$?$7.	 3  DMM "**3*CCDI%//$t 0 C CDM  ((4(88#99$(CCr4   c                     | j         rt          | j        j        d           dS ddlm} t          | j        dd| j        | j        p|	                    | j        g           | j
        | j        d| j        	  	        S )	zO
        Return this node as if it were declared as an extension class
        z7Python3 style class could not be represented as C classNr   rn  r  rV   F)rm  r  
class_namero   r  r   rn  rD   )rt  r   r{  r:   r   r  CClassDefNodern   ro   r  r  r   rD   r   r  s     r5   	as_cclasszPyClassDefNode.as_cclassW  s     " 	$-#%^___FTX(1)-(,	#':#W1D1DTXTV1D1W1W(,"&)$)!%+ + + 	+r4   c                     |}|j         s|j        r|j        }|j         |j        t          | j        |          x}| _        |S )N)rn   r  )rV  r  r  r   rn   r  )r   r   rZ  r  s       r5   create_scopezPyClassDefNode.create_scopej  s[    $ 	$(= 	$#D $ 	$(= 	$(diTJJJJtzr4   c                    | j         x}}| j        r9ddlm} | j        d d d         D ]} ||j        |j        |g          }d | _        || _        | j        r| j                            |           | j	        r| j	                            |           | j                            |           | j
                            |           |                     |          }|j        |_        | j
        j        j        |_        | j        r| j                            |           | j                            |           |                    |           d S )Nr   )rx  r   rK  )r{  r  r  rx  r:   r`  rj  ro   r   ri  rM  analyse_target_declarationr  r   r  r  class_obj_cnamerg  r   rJ  )r   r   unwrapped_class_resultrj  rx  r`  r  s          r5   r   z#PyClassDefNode.analyse_declarationsq  si   04=? 	#111111!_TTrT2 ) )	-~M&0& )  )  ) #DO(: 	1J++C0008 	/H))#.....s333..s333  %%.#{06= 	;M44T:::	&&t,,,22488888r4   ro   c           	      d   | j         r| j         j        rt          | j         j                  dk    seddlm}m} | j                             |          } ||j        d| j	        t          j        dd           ||          g          | _         || _        | j         r| j                             |          | _         | j        r| j                            |          | _        | j        r| j                            |          | _        | j                            |          | _        | j                            |          | _        | j        }| j                            |          | _        | j                            || j                  | _        | j                            |          | _        | S )Nr   r   )PythonCapiCallNode	CloneNode__Pyx_PEP560_update_basesPy3UpdateBasesrV  )r  r  utility_coderV   )ro   rw  rL   rV   r  r  r  rx   r:   update_bases_functyper   r  rl  ri  rh  ri   rj  r  r   rM  analyse_target_expressionr{  rk  )r   r   r  r  rl  r  s         r5   rx   z"PyClassDefNode.analyse_expressions  s   : 		)tzA 		)c$*/FZFZ^_F_F_@@@@@@@@77<<J++JN94(45EGYZZi
++,	. . .DJ
 )DO: 	=77<<DJ8 	9x33C88DH> 	E!^??DDDNI11#66	 -AA#FFzI11$77	k;;COO/==dCCr4   c                 |    |                      | j        |           | j                            | j        |           d S r   )r  r  r   r  r5  s      r5   r  z,PyClassDefNode.generate_function_definitions  s:    ((T:::	//
DAAAAAr4   c           	         |                     | j                   |j                            |            | j        }| j        r| j                            |           | j        r| j                            |           | j        r| j                            |           | j	        r| j	                            |           | j
                            |           | j        r|                    d| j                                        d| j                                        d           |                    |                    d| j
                                        d| j                                        d| j                             |                    d           | j                            |           | j                            |           | j
                                        x|_        |_        | j        }|	|j        sd }||                    |           | j                            |           | j                            |           |-|                    || j                                                   |*|                    |           |                    |           | j                                        x|_        |_        | j                            | j        |           | j
                            |           | j
                            |           | j	        r4| j	                            |           | j	                            |           | j        r4| j                            |           | j                            |           | j        r4| j                            |           | j                            |           |j                                         d S )Nr  rX  r  zPyDict_SetItemString(z, "__orig_bases__", rj  rp  )r,  r:   pyclass_stackr  r  rl  r?  ro   ri  rh  ri   rT   r   r  generate_disposal_coderL  namespace_cnamer  rk  	is_activer   r  rj  generate_injection_coder{  rM  rO  pop)r   rY   r  rk  s       r5   r  z&PyClassDefNode.generate_execution_code  s   dh!!$'''z? 	;O44T:::: 	6J//5558 	4H--d333> 	:N33D999	**4000? 
	-JJJDJ,=,=,?,?,?,?AWAWAYAYAYAYZ[[[JJ&&&I$$&&&&(>(>(@(@(@(@(BH   
 JJsOOOO224888O&&t,,,6:i6F6F6H6HHt3_
!**>!J!//555	))$///224888!..d'..002 2 2!--d333!!$'''6:m6J6J6L6LLt3,,T->EEE	((...	T"""> 	,N11$777N%%d+++8 	&H++D111H%%%: 	(J--d333J!!$'''     r4   )NNF)r-   r.   r/   r   r  rj  rt  rh  ri  rg  rl  r   r  r  r   r
   r  r   r  r  rx   r  r  r3   r4   r5   rf  rf    s       (G G GKJLI
CHJ?C8=GD GD GD GDR+ + +&  9 9 92 1J0!#J#Gj.GNN$
 
  2B B B6! 6! 6! 6! 6!r4   rf  c                       e Zd ZdgZdZdZdZdZdZdZ	dZ
dZdZed             Zd Zd Zd Zd Zd	 Zd
 Zd Zedd            Zd ZdS )r  r   NFc                 *    t          | j                  S r   )r   r  r   s    r5   punycode_class_namez!CClassDefNode.punycode_class_name  s    t///r4   c                     t          | d          s>ddlm} | j        r*|                    | j        |g | j        d          | _        nd | _        | j        S )N_buffer_defaultsr   r  F)need_complete)rP  r   r  buffer_defaults_noder  buffer_defaults_posr  )r   r   r  s      r5   r  zCClassDefNode.buffer_defaults
  sy    t/00 	-      ( -(.(E(E,T6"' )F )) ))%%
 )-%$$r4   c                    | j         rE| j        dk    r:| j                             d          }|                    || j                  }|sd S n|}|                    | j        | j        dd| j         d | j        | j        | j        | j	        | j
        | j        |                     |          | j                  | _        | j        r0t!          | j        j                  dk    rd| j        j        _        d S d S d S )Nr  rI   r   )rn   r:   rL  implementingr  rk  objstruct_cnametypeobj_cnamerm  r  
check_sizer  r  shadowr   T)r  rm  splitrn  r:   declare_c_classr  objstruct_nametypeobj_namer  r  r  r  r  r  ro   rL   rV   rj  multiple_bases)r   r   ri  
home_scopes       r5   r  zCClassDefNode.declare  s    	8 ; ;*0055K11+txHHJ t J//( /+* 0055; 0    
 : 	2#djo..22-1DJO***	2 	222r4   c                 $   i }| j         s|S ddlm} g }| j         D ]}|j        }d }t	          ||j                  r	|}|j        }t          j        ||          }|dk    r|rt          |j
        d           d|d<   a|dk    rTd }	i }
|rFt	          ||j                  r|j        }	n)|j        j        }	|j        }|r|                                }
|	|
f||<   |                    |           |rt          |d         j
        d	           || _         |S )
Nr   rn  zfunctools.total_orderingz total_ordering cannot be called.Ttotal_orderingdataclasses.dataclassr   z8Cdef functions/classes cannot take arbitrary decorators.)r  r   r  r`  rM   CallNoderu  r   'exprnode_to_known_standard_library_namer   r:   rx  rV   r  r  as_python_dictr  )r   r   extra_directivesr  remaining_decoratorsoriginal_decoratorr`  decorator_call
known_namerV   rW   kwds_s               r5   _handle_cclass_decoratorsz'CClassDefNode._handle_cclass_decorators1  s    	$##!"&/ 	< 	<*4I "N)Y%788 /!*%.	 HTWXXJ777! R.,.PQQQ59 !12666! :!.)2JKK :-2-=B . ;  :#(#7#7#9#9D04d| , ''(:;;;; 	k&q)-/ijjj.r4   c                     j         r j        st           j        d                                          }d  _         j        rud  _        j        D ]}|j	         j        k    r| _         j        Ft           j        d j                   _        d j        _                             j                    j        j        r j        j        d         }|                              }|t"          j        u r                    d          j        }nQ|t"          j        u r                    d          j        }n(|t"          j        u r                    d          j        }|t          |j        d j        z             n|t0          u rd }n|j        s'|j        r|j        st          |j        d|z             n|                                s't          |j        d	|j	        d
 j        d           nq|j        r5|j        j        r)|j        r"t          |j        d	|d
 j        d           n5|j        r'|j	        dv rt          |j        d|j	        z             n| _        j                             dd          dk    r&|t"          j        k    rtC           j        dd            j"        d u}|r8 j        r1 j        j        s% j        j#        $                     fd           d S  j        rE j%        dk    r: j        &                    d          }'                    | j                  }	|	sd S n}	 j%        dk    rO j        dk    rD j        tP          j)        v r1j*        d d         dk    rtC           j        d j        z  d           |	+                     j         j        |o j,        |o j,          j         j         j         j-         j.         j%         j/         j0         1                               j2                   _3         j        r.ti           j        j                  dk    rd j3        j        _5         j2        r$ j3        |	                     j                  _6        |	ur1 j%        dk    r&7                     j         j3         j                    j3        j        j        x _        }
|
|r9j        8                                |
_        |
j        9                    |           nj        |
_        d|
j        v rId}|
j        d         }|r-|d         }|                     d          }|o|j:        o|j;        }|rdnd|
_<         j=        r+t|          j?        rt           j         j=                  |
_=        |r j"        A                    |
            j        B                    d          }|rZ|jC        rS|
jD        sL|
jE        sE j        F                    d          |_G         j        H                    d|j=        |j                    j,        rd|
_D        nd|
_E        ti           j        j                  dk    r|r j,        r%t           j        j        d         j        d            j        j        dd          D ],}|                              rt          |j        d            -d j3        j        _I        dd!lJmK} |L                     j        |M                     j         j        "           j        |N                     j        g #          g$           _O        nN j        r/ j        jP        p j        jI         j3        j        _I        d  _O        nd j3        j        _I        d  _O        Q                     j3                    j3        j        j#        D ]} |             d S )%NzTObject struct name specification required for C class defined in 'extern from' blockr   r   r  r  rp  z+First base of '%s' is not an extension typez'%s' is not an extension typezBase class 'z' of type 'z' is incompletez
' is final)r  byteszGinheritance from PyVarObject types like '%s' is not currently supportedfreelistzIfreelists cannot be used on subtypes, only the base class can manage themc                  .                                    S r   )r   )r   r   s   r5   <lambda>z4CClassDefNode.analyse_declarations.<locals>.<lambda>  s    @Y@YZ]@^@^ r4   r  rI   __builtin__   zcpython.z %s already a builtin Cython type)rn   r:   rL  r  r  rk  r  r  r  rm  r  r  r  r  Tr  Ffrozenr   __dict__getterz'Only declare first base in declaration.z+Only one extension type base class allowed.rn  rM  rr  r  )Rr>  r  r   r:   r  rk  r  modulecimported_modulesrn   r   r  has_extern_classadd_imported_modulero   rV   r  r
   r	  rj  rj  c_float_typerv  r  r   r  r  r  r  r  r   r  rN  r   r   defered_declarationsr  rm  r  rn  r   builtin_typesr  r  rn  r  r  r  r  r  r  r  rL   r  rd  add_imported_entryr   r   r   r   is_c_dataclass_scoperD   r!   r  rE   r   r  is_variabledefinedimplementedmangle_internalgetter_cnamedeclare_property
early_initr   r  r  IdentifierStringNoder|  type_init_argsis_externalallocate_vtable_names)r   r   r  r  rs  rk  base_class_scopehas_bodyri  r  r  	is_frozendataclass_configdecorator_kwargsfrozen_flag
dict_entry
other_baser  thunks   ``                 r5   r   z"CClassDefNode.analyse_declarations\  sR   
 ? 	t4#6 	t$(rsss99#>>  	5DK/ ) );$"222"(DK{")$*:D#+NN/0,''444:? #	r:?1%D,,S11I J111JJu--2		j555JJw//4		j>>>JJy116	 dh MPTP_ _````n,,#'  0 +#3+8A8Q+dh ?) KLLLL**,, +dhhNNNDOOO!5 6 6 6 6 	+Y_%? 	+,	+dhhIIt!0 1 1 1 1* +^'999dh i!!' ( ( ( ( "+~!!*a00144jF_9_9_"mopqqq9D( 	 	t~/C 	 N/667^7^7^7^7^___F 	8 ; ;*0055K11+txHHJ  J?h&& M11Ow'<<<&rr*j88"Dt"VXYZZZ//-$+!5$+o(n /+* 0055; 0    
 : 	2#djo..22-1DJO*; 	H=AZJdo..:S  T_%@%@""4?DJIII!Z_22
U 2#&>#6#6#8#8  ''(89999#&> &%*:::!	#(#34K#L # ]'7':$"2"6"6x"@"@K + \0F \;K\I9B-LXX*8 	;* 	;&tx::EI 		&I**5111//
;;J Xj4 Xem XTYTe X*.**D*DEU*V*V
'
++J

WWW{ & !$%!tz!## Yt{ Ydjoa(,.WXXX #joabb1 Y Y
--c22 Y*.*WXXX)*DJO&######"+"5"544TXT_4UUj((2(FFH #6 #I #ID
 ^ 	')-)C)`t~G`DJO&"&D)*DJO&"&D!!$*---Z_9 	 	EEGGGG	 	r4   c                     | j         r0| j        j        j        }| j                             |          | _         | j        r| j                            |           | S r   )r   r  rj  r  rx   r  r  s      r5   rx   z!CClassDefNode.analyse_expressions  sV    9 	=JO)E	55e<<DI 	933C888r4   c                     | j         r=|                     | j        |           | j                             | j        |           d S d S r   )r   r  r  r  r5  s      r5   r  z+CClassDefNode.generate_function_definitions  sQ    9 	F,,TZ>>>I33DJEEEEE	F 	Fr4   c                    |                     | j                   | j        j        j        s'd }| j        r|j                            t          j	        d          }| j        
                    |           |                    |d| j                                        d           |                    |                    d| | j                             |                    |t          j	                   |j                            t          j        d          }|                    | d| d           |                    |                    d| | j                             |j                            t          j	        d          }|                    d	           |                    d
           |j                            t          j	        d          }|                    | d           |                    |                    || j                             |                    |t                     |j                            t          j	        d          }|                    | d           |                    |                    || j                             |                    |t                     |j                            t          j	        d          }|                    | d| d| j                                         d           |                    |                    || j                             |                    |t                     |                    | d| d| d           |||fD ]<}|                    |t          j	                   |j                            |           =|                    d           |                    d           |                    |d| j                                        d           |                    |                    || j                             |                    |t                     |                    d|d|d           d|z  }	|                    d|	z             |                    d|z             |                    d           |                    d           |                    d           |                    d           |                    |                    | j                             |                    d           |                    | d            |j                            |           |                    |t          j	                   |j                            |           | j                            |           | j                            |           |                     | j        ||d!           |:|                    |t          j	                   |j                            |           | j        r| j                            |           d S d S )"NTr#  z = __Pyx_PyTuple_GET_ITEM(z, 1);z!CYTHON_ASSUME_SAFE_MACROS && !Fz* = ((PyTypeObject*)__Pyx_PyTuple_GET_ITEM(z, 0));zM#if CYTHON_COMPILING_IN_LIMITED_API && __PYX_LIMITED_VERSION_HEX < 0x030A0000z/if (__Pyx_get_runtime_version() < 0x030A0000) {z> = PyObject_GetAttrString((PyObject*)&PyType_Type, "__new__");z, = PyTuple_Pack(1, (PyObject*)&PyType_Type);z = PyNumber_Add(r   rq  z = PyObject_Call(rl  z} elser  zE = __Pyx_PyType_GetSlot(&PyType_Type, tp_new, newfunc)(&PyType_Type, z)if (__Pyx_PyType_GetSlot((PyTypeObject*) z, tp_base, PyTypeObject*) != r  z@__Pyx_PyType_GetSlot((PyTypeObject*) %s, tp_base, PyTypeObject*)zB__Pyx_TypeName base_name = __Pyx_PyType_GetFullyQualifiedName(%s);zB__Pyx_TypeName type_name = __Pyx_PyType_GetFullyQualifiedName(%s);zxPyErr_Format(PyExc_TypeError, "best base '" __Pyx_FMT_TYPENAME "' must be equal to first base '" __Pyx_FMT_TYPENAME "'",z#             base_name, type_name);z!__Pyx_DECREF_TypeName(base_name);z!__Pyx_DECREF_TypeName(type_name);rp  z = NULL;)bases_tuple_cnamecheck_heap_type_bases)r,  r:   r  rj  r  r  r'  r(  r
   r   r?  rT   r   error_goto_ifr  r   r  r*  r+  r/  r0  r.  r  rL  generate_type_ready_coder   r  )
r   rY   ro   
first_base
trial_typetype_new
type_tuple
args_tupler1  trial_type_bases
             r5   r  z%CClassDefNode.generate_execution_code  s    	dhz) D	3E" =544Z5N[_4``#<<TBBB

EEE4K^KeKeKgKgKgKghiii

4--.WPU.W.WY]Yabbcccz'@AAA!^99':KX]9^^


jaaTYaaabbb

4--.\PZ.\.\^b^fgghhh "^99*:S`d9ee


jkkk

LMMM>77
8Q^b7cc

hfffggg

4228TXFFGGG.999!^99*:S`d9ee


jVVVWWW

422:txHHIII
N;;;!^99*:S`d9ee


jhh*hhH[HbHbHdHdhhhiii

422:txHHIII
N;;;

j[[8[[z[[[\\\%z:> 6 6D))$
0IJJJN//5555

8$$$

8$$$

JJ 3 : : < < < <> ? ? ?

422:txHHIII
N;;;


JJ


, - - - #egq"q

_bqqrrr

_bllmmm

 w x x x

@AAA

>???

>???

4??4844555

3

j222333++J777%%j*2KLLL++J777#::4@@@#..t444))$*deko)ppp %%eZ-FGGG++E2229 	4I--d33333	4 	4r4   c                    | j         }t          j         d|j         }|j        }|sd S | j        dk    r7|j        r.|j        rJ |                    |j        d|j        d           d S |sJ |j        sJ d|j        z  }|                    d           d }|s|j        j	        r|j
                            t          d          }|                    |d	|                    |j        j	                  d
|                    || j                             |                    |t                     |s|r|r|j                            t'          j        dd                     |                    | j        d|dt-          j        d|j                                      |          d|p|d           |                    |dt          j        d|d|p|d           |r6|                    |t                     |j
                            |           |                    |                    || j                             nC|                    |dt          j        d|d|                    || j                             t-          j        d|j        j                  }	|	                    |          s|                    d           |                    |d|	j        d|	                    |          d           dD ]}
t-          j        |j        j                                       |
          }	|	                    |          dk    rt-          j!        ||	          so|                    d|d|	j        d|d|d |	j        d!           |                    |d|	j        d|d |	j        d           |                    d"           |                    d#           |                    d$           |                    d%           |                    d&           |                    d'           |                    d(           |                    d)           |j                            t'          j        d*d                     |                    | j        d+|d|d           |                    d'           |rV|"                    |t                     |#                    |t                     |                    |j        d,|d           |                    |d|j        d           |                    d)           |j	        }|r|j$        r|j%        d-k    r|                    d.|j&        rd/nd0|j%        d1|j&        rd/nd0|j%        d2           |j                            t'          j        d3d                     |                    |j	                  }|                    | j        d4|z             |                    d"           n	|j	        }||                    d           t-          j        |j        j                  D ]}|'                    ||           |                    d)           |                    d5           |j                            t'          j        d6d                     |                    | j        d7|z             |                    d)           t-          j(        |d8          }t-          j(        |d          }|dk    ry|dk    rs|                    d           |                    d9|d:|d;           |                    d<|z             |                    d"           |                    d)           | j         j        j)        D ]}|j*        dv }|j+        rtX          j-        r|j.        r|st-          j        | j         j        j                                       |j*                  }|r|/                                nd }|r|                    |           |                    d=           |                    d>           |                    d?|d@|j*        dA|                    dB| j                             |                    dC           |                    dD|j.        z             |                    |j.        dE|j0        d           |                    dF|j.        z             |                    d"           |                    d"           |                    d)           |r|                    d)           |j1        r|j                            t'          j        dGdH                     |                    | j        dI|d|j2        d           |j                            t'          j        dJdH                     |                    | j        dK|z             |j        j3        sf|j        j        4                    dL          sG|                    | j        dMt          j        d|5                    |j6                  dN|d           |j7        s|8                    dO          nd }|r|j         t          u rpdP|z  }|j&        r|j%        }n
dQ|j%        z  }|                    dR           |                    dS|dT|dU|d|j9        d	           |                    d)           ntu          |j        dV           |j7        s|8                    dW          rPnd S |j                            t'          j        dXd                     |                    | j        dY|z             d S d S )ZNrK   r   = &rG  z%s_specz#if CYTHON_USE_TYPE_SPECSTr#  z = PyTuple_Pack(1, (PyObject *)r%  ValidateBasesTuplezExtensionTypes.cz__Pyx_validate_bases_tuple(z.name, tp_dictoffsetr   rj  z3 = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(, &rq  r_  z	, NULL); tp_as_bufferz$#if !CYTHON_COMPILING_IN_LIMITED_APIrF  r4  r  zif (!z->tp_as_buffer-> && z->tp_base->tp_as_buffer && z->tp_base->tp_as_buffer->r  rp  z>#elif defined(Py_bf_getbuffer) && defined(Py_bf_releasebuffer)zB/* PY_VERSION_HEX >= 0x03090000 || Py_LIMITED_API >= 0x030B0000 */z#elif defined(_MSC_VER)zU#pragma message ("The buffer protocol is not supported in the Limited C-API < 3.11.")r  zL#warning "The buffer protocol is not supported in the Limited C-API < 3.11."r  FixUpExtensionTypez'__Pyx_fix_up_extension_type_from_spec(&z.tp_bases = PyTypeObjectzif (sizeof(r   r  z) != sizeof(r  ValidateExternBasez__Pyx_validate_extern_base(%s)z#if !CYTHON_USE_TYPE_SPECSPyType_Readyz__Pyx_PyType_Ready(%s)tp_getattrozCif ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!z->tp_dictoffset && z,->tp_getattro == PyObject_GenericGetAttr)) {z*%s->tp_getattro = PyObject_GenericGetAttr;rj  r  z7PyObject *wrapper = PyObject_GetAttrString((PyObject *)z, "z"); wrapperz3if (__Pyx_IS_TYPE(wrapper, &PyWrapperDescr_Type)) {z0%s = *((PyWrapperDescrObject *)wrapper)->d_base;z.doc = z0((PyWrapperDescrObject *)wrapper)->d_base = &%s;	SetVTableImportExport.cz__Pyx_SetVtable(MergeVTablesz__Pyx_MergeVtables(%s)internalzPyObject_SetAttr(r  __weakref__z%s->tp_weaklistoffsetz	struct %sz#if CYTHON_USE_TYPE_SLOTSr  z == 0) z = offsetof(z)__weakref__ slot must be of type 'object'__reduce_cython__SetupReducez#__Pyx_setup_reduce((PyObject *) %s));rj  r	   modulestatevalue_cnamer  r  rm  r  rT   r  rk  r'  r(  r   r  r*  r:   r+  r  r  r   r  r  r   get_slot_by_namer   	slot_coderY  r=  r0  is_empty	slot_namer5  r6  get_base_slot_functionr  rJ  r  r  r  generate_dynamic_init_codeget_slot_code_by_namepyfunc_entriesrn   r  r!   r  r  r7  r  vtable_cnamevtabptr_cnameis_internalrN  r  r  is_closure_class_scoper  r  r   )r  rY   r  r  rj  r  r  typespec_cname
tuple_tempbuffer_slotbuffer_method_namerk  base_typeptr_cnamer8  getattr_slot_funcdictoffset_slot_funcr^   rd  r  weakref_entrytp_weaklistoffset	objstructs                         r5   r  z&CClassDefNode.generate_type_ready_codeV  s    z!8PPD<NPP
 	Fx'' ! ----

&&&&&&    F !   %%%%&);;NJJ2333J$ <):)D <!^99.UY9ZZ


JJ66u7H7RSSSS++J	BBB   
 
N;;;  J ( $55#/0DFXYY[ [ [))%))&!2?EDTUU__`effff)7Z776    

!MM'''"NN%333	     <**:N*KKKN//
;;;

422=%)LLMMMM

%+++&//uyIII	   $4^TEUE`aaK''.. %

ABBB

!MM)))))%0000    +Q ( (&"+":(3#5 #55L5LM_5`5`  ",,U33s::9CcdikvCwCw:


 *MM;+@+@+@)MM)MM;+@+@+@$    

)MM;+@+@+@)MM;+@+@+@$    

3

[\\\

_```

4555

tuuu

7###

klll

8$$$--'(<>PQQS S S!!%))./ 0 0 0 JJw  Z 1>BBB  !2NCCC

$2D2D2DFWFWFWXYYYJJ"""    JJx   I 0( Y-F.-X-X JJJ"/>Y>@T@T@T'4C)CYE^E^E^ ` a a a $55#/0DFXYY[ [ [)-)K)KDN)[)[&))%)5U*6, - - -JJsOOO%/	  0  JJ=>>>!01A1LMM = =//t<<<<JJx   JJ3444--'8JKKM M M!!%)-E-UVVVJJx    !* ?} U U#,#B5/#Z#Z  C'',@C,G,G

ABBB


!MM===2 3 3 3 

G!" # # #

3

8$$$
 
(7 - - I)OO	O -(: -.-7@-$3
(35 55L5LTY5W5W KO)Y)E)E)G)G)GUY&) 7

#5666JJABBBJJsOOOJJJ)MM III 33IuyIIIKL L L
 JJMO O OJJJ 245 5 5 JJ*.*@*@*@$...QS S SJJJ 245 5 5 JJsOOOJJsOOOJJx((() -

8,,,  	[ 11+K9IJJL L L%%eii!MM&&&2     11+N<LMMO O O%%ei1IM1YZZZ:) $*2G2K2KJ2W2W  %%eii'''**5+;<<<<!MM2    EJD`jE--m<<<fjM Z %77(?-(O%( G$($8		$/$2F$F	JJ:;;;JJJ))))))!		%+++	 - . . .
 JJx((((-+-XYYY=B=Y hu  !455 h h h h  11+M;MNNP P P%%ei1VYf1fgggggh hr4   c                     | j         r| j                             |           | j        r| j                            |           d S d S r   )r  r   r   r   s     r5   r   zCClassDefNode.annotateE  sT     	/((...9 	%It$$$$$	% 	%r4   rP  )r-   r.   r/   r   r  r  r  r  r  r  r  r  r  rX  r  r  r  r  r   rx   r  r  r1  r  r   r3   r4   r5   r  r    s       , (KL
CNLJJF0 0 X0
% 
% 
%2 2 26)  )  ) V] ] ]~  F F F
K4 K4 K4\ lh lh lh \lh\% % % % %r4   r  c                   2    e Zd ZdgZd Zd Zd Zd Zd ZdS )PropertyNoder   c                     |                     | j        | j        | j                  | _        | j                            | j        j                   d S r   )r  rn   rD   r:   r  r   r   r  r   s     r5   r   z!PropertyNode.analyse_declarationsV  sB    ))$)TXtxHH
	&&tz'788888r4   c                 D    | j                             |          | _         | S r   rF  r   s     r5   rx   z PropertyNode.analyse_expressionsZ      I11#66	r4   c                 <    | j                             ||           d S r   rH  r5  s      r5   r  z*PropertyNode.generate_function_definitions^  rI  r4   c                     d S r   r3   r   s     r5   r  z$PropertyNode.generate_execution_codea  r   r4   c                 :    | j                             |           d S r   rL  r   s     r5   r   zPropertyNode.annotated  rM  r4   NrN  r3   r4   r5   r  r  L  sh         (K9 9 9  ; ; ;  ! ! ! ! !r4   r  c                   P    e Zd ZdZdgZdZed             Zd Zd Z	d Z
d Zd	 Zd
S )CPropertyNodezADefinition of a C property, backed by a CFuncDefNode getter.
    r   Tc                 x    | j         j        }|rt          |d         t                    s
J |            |d         S rO  )r   r  rM   r  )r   r  s     r5   r|  zCPropertyNode.cfuncs  s;    	BE!Hl;;BBUBBBQxr4   c                    t          | j        |          }| j                            |           |                    | j        | j        | j        | j        j        |          x}| _	        | j        j	        j
        |_        d S )N)class_scope)ctypeproperty_scope)r   rn   r   r   r  rD   r:   r|  r  r  r  r  )r   r   r  r  s       r5   r   z"CPropertyNode.analyse_declarationsy  s    diS999	&&u--- 11Itx1GX] 2 _ _ 	_
!Z-3r4   c                 D    | j                             |          | _         | S r   rF  r   s     r5   rx   z!CPropertyNode.analyse_expressions  r"  r4   c                 <    | j                             ||           d S r   rH  r5  s      r5   r  z+CPropertyNode.generate_function_definitions  rI  r4   c                     d S r   r3   r   s     r5   r  z%CPropertyNode.generate_execution_code  r   r4   c                 :    | j                             |           d S r   rL  r   s     r5   r   zCPropertyNode.annotate  rM  r4   N)r-   r.   r/   r   r   r   rX  r|  r   rx   r  r  r   r3   r4   r5   r'  r'  h  s          (KL  X
4 4 4  ; ; ;  ! ! ! ! !r4   r'  c                   $    e Zd Zg Zd Zd Zd ZdS )
GlobalNodec                 P    | j         D ]}|                    || j                   d S r   )namesdeclare_globalr:   r   r   rn   s      r5   r   zGlobalNode.analyse_declarations  s8    J 	/ 	/DtTX....	/ 	/r4   c                     | S r   r3   r   s     r5   rx   zGlobalNode.analyse_expressions  r  r4   c                     d S r   r3   r   s     r5   r  z"GlobalNode.generate_execution_code  r   r4   NrA  r3   r4   r5   r2  r2    sH        
 K/ / /      r4   r2  c                   $    e Zd Zg Zd Zd Zd ZdS )NonlocalNodec                 P    | j         D ]}|                    || j                   d S r   )r4  declare_nonlocalr:   r6  s      r5   r   z!NonlocalNode.analyse_declarations  s8    J 	1 	1D  tx0000	1 	1r4   c                     | S r   r3   r   s     r5   rx   z NonlocalNode.analyse_expressions  r  r4   c                     d S r   r3   r   s     r5   r  z$NonlocalNode.generate_execution_code  r   r4   NrA  r3   r4   r5   r:  r:    sH        
 K1 1 1      r4   r:  c                   <    e Zd ZdgZd Zd Zd ZdZd Zd Z	d Z
d	S )
rQ  rL  c                    ddl m} | j        }t          ||j                  r|j                                        }|dk    r|                                \  }}t          |          rt          |j
        d           |j        D ]U\  }}|                    |          }	|	t          |j
        d           2|                    |j        |	|j
        d           Vt          | _        d S d S t#          |dd           F|j        r#|                    |           t          | _        d S |j        s|j        rt          | _        d S d S d S )	Nr   rn  r  z!Variable names must be specified.Unknown typeT)r  r  )r   r  rL  rM   GeneralCallNoderu  r  explicit_args_kwdsrL   r   r:   r  r  r  r   PassStatNoderO   r   r   declare_from_annotationr8  is_subscript)
r   r   r  rL  r^   rV   rW   varr  rj  s
             r5   r   z!ExprStatNode.analyse_declarations  sm   ydI566 	.=4466Dy  !4466
dt99 I$($GHHH&*&: P PNC$44S99D|im^<<<<	4$OOOO!- !  T<..:| .,,S111!-" .d&7 .!- ;:
. .r4   c                 t    d| j         _        | j                             |          | _         d| j         _        | S rP  )rL  result_is_usedrx   r   s     r5   rx   z ExprStatNode.analyse_expressions  s2    #(	 I11#66	#(	 r4   c                     | j         j        j        r/| j                                         r|                                  d S d S d S r   )rL  rj  r|  result_in_tempr   r   s     r5   r   zExprStatNode.nogil_check  sP    9>% 	$)*B*B*D*D 	NN	 	 	 	r4   zDiscarding owned Python objectc                    |                     | j                   d| j        _        | j                            |           | j                                        s`| j                                        rG| j                                        }| j        j        j        sd|z  }|	                    d|z             | j        
                    |           | j                            |           d S )NFz
(void)(%s)r  )r,  r:   rL  rI  r?  rK  r   rj  re  rT   r  rL  )r   rY   r   s      r5   r  z$ExprStatNode.generate_execution_code  s    dh#(	 	**4000y'')) 	'di.>.>.@.@ 	'Y%%''F9>) /%.JJuv~&&&	((...	T"""""r4   c                 <    | j                             ||           d S r   )rL  r  r5  s      r5   r  z*ExprStatNode.generate_function_definitions  rI  r4   c                 :    | j                             |           d S r   )rL  r   r   s     r5   r   zExprStatNode.annotate  rM  r4   N)r-   r.   r/   r   r   rx   r   r   r  r  r   r3   r4   r5   rQ  rQ    s~        
 (K. . .2     3K
# 
# 
#; ; ;! ! ! ! !r4   rQ  c                   &    e Zd Zd Zd Zd Zd ZdS )AssignmentNodec                     |j         }|j         }|j        rL|j        j        rB|j        r=|j        j        s3t	          | j        d                    ||          d           d S d S d S d S d S )Nz4Assigning to '{}' from '{}' discards const qualifierr   r  )rj  rb  rk  r  r   r:   rC  )r   r  rhsrhs_tlhs_ts        r5   _warn_on_const_assignmentz(AssignmentNode._warn_on_const_assignment  s    < 	tEO4 	t 	teoNf 	tDHT[[\achiiqrssssss	t 	t 	t 	t 	t 	t 	t 	tr4   c                 t    t          |t                    r"|                     |j        |j                   d S d S r   )rM   rP  rU  r  rR  )r   rX   s     r5   _check_const_assignmentz&AssignmentNode._check_const_assignment  s>    dN++ 	?**48TX>>>>>	? 	?r4   c                 ,   |                      |          }|                     |           t          |t                    rTt          |t                    s?|j        j        j        r.|j                                        rt          | j
        d           |S )Nz9Storing unsafe C derivative of temporary Python reference)rw   rW  rM   rP  ParallelAssignmentNoderR  rj  rb  is_ephemeralr   r:   )r   r   rX   s      r5   rx   z"AssignmentNode.analyse_expressions  s    !!#&&$$T***dN++ 	]JtE[4\4\ 	]x}# ](=(=(?(? ]dh [\\\r4   c                     |                     | j                   |                     |           |                     |           d S r   )r,  r:   generate_rhs_evaluation_coderO  r   s     r5   r  z&AssignmentNode.generate_execution_code  sD    dh))$///%%d+++++r4   N)r-   r.   r/   rU  rW  rx   r  r3   r4   r5   rP  rP    sS        t t t? ? ?  , , , , ,r4   rP  c                   f    e Zd ZddgZdZdZdZdZd ZddZ	d Z
d Zd	 Zd
 Zd ZddZd Zd ZdS )SingleAssignmentNoder  rR  Fc                 &	   ddl m} t          | j        |j                  r| j        j                                        }|r| j                                        \  }}|dv rt          |          dk    rt          |d         j
        d           d S |?|                    d           }|dk    sd|vrt          |j
        d           d S |d         }nd	}|d
                             |          }|t          |d
         j
        d           d S | j        }	|dk    rt          |	|j                  r|	j        |	j
        fg}
n>t          |	|j                  rd |	j        D             }
nt          |	j
        d           d S |
D ]\  }}|                    |||d|            t          |          dk    r|d         | _        nd| _        nd| _        t          |	|j                  st          |	j
        d           |                    |	j        || j
        d	           n|dv rPd| _        t          |          d
k    s|t          | j        j
        d           d S g }|j        D ]T\  }}|                    |          }|t          |j
        d           2|                    |j        ||j
        f           Ut          |          t          |j                  k     rd S t          | j        |j                  st          | j        j
        d           | j        j        }t1          |          }|                    |||d| j        j
                   |D ]\  }}}|                    |||           ni|dk    rcd| _        |rt          | j        j        j
        d           t5          | j        j
        | j        j        |          }|                    |           | j        rd S | j        r| j                            |           d S | j                            |           | j        j        s| j        j         rM| j        j!        r?| j        j!        j"        s2| j        #                                }|r|| j        j!        _"        d S d S d S d S d S )Nr   rn  )r  typedefr&   zInvalid positional argument.r`  rm  zInvalid keyword argument.r  r   rA  r  c                 *    g | ]}|j         |j        fS r3   )rn   r:   r   rG  s     r5   r   z=SingleAssignmentNode.analyse_declarations.<locals>.<listcomp>G  s!    #L#L#LCSXsw$7#L#L#Lr4   zInvalid declarationT)r  rm  zInvalid declaration.)rm  )r  unionz.Struct or union members must be given by name.F
fused_typez*fused_type does not take keyword arguments)rn   rg   )$r   r  rM   rR  r  ru  r  rC  rL   r   r:   compile_time_valuer  r  r  rn   r  rV   r  declaration_onlyr  r  r  r   r   r  r  r   is_assignment_expression0analyse_assignment_expression_target_declarationr  r8  r   r  rm  !get_known_standard_library_import)r   r   r  	func_namerV   rW   kwdictrm  rj  r  varsrG  r:   membersmemberr  rn   r  	fusednodestdlib_import_names                       r5   r   z)SingleAssignmentNode.analyse_declarations*  s(    dh	 233 I	8)==??I G8!X88::
d 6664yy1}}d1gk+IJJJ'!%!8!8!>!>$	11\5O5O!$(,GHHH"F%+L%9

%.
722377D|d1gk>:::(C I--%c9+=>> #%(Xsw$7#8DD'Y-@AA ##L#L38#L#L#LDD!#'+@AAA"F(, a aHCOOCsDU_O````t99>>'+AwDHH48D1104-)#y/ABB C!#'+ABBB++CHdDHQZ+[[[["555,0D)4yy1}}dhl,\]]] G-1-A M M)	(88==<!)-@@@@#NNFL$
+KLLLL7||c$*>&?&???%dh	0BCC Ddhl,BCCC8=D.t44E//itx|\\\-4 = =)c))&$<<<<= ,..,0D) Ldh/3JL L L !.dhl378=!N !N !NI223777  	ZF, 
ZII#NNNNN33C888 H) ZTX-= Z48> ZZ^ZbZh  [G Z)-)S)S)U)U&) ZGYDDDZ Z Z Z Z ZZ Zr4   r   c                    ddl m} | j                            |          | _        | j        j        r| j        j        j        j        rp|j	        rF| j        j        j
        5| j                                        r| j        j        | j        j        _
        n#t          | j        d| j        j         d           |                     |          }|r|S | j                            |          | _        | j                            |           |                     |          }|r|S t)          | j        |j                  rD| j                            | j                   | j                            | j                  | _        nm| j        j        j        r\t)          | j        |j                  sB|                    | j        j        | j        d d           }|                    |          | _        | j        j        j        r|                    | j        d| j        j        | j        j        g          }|rk| j        }d| _        |j        j        | _        |j        j        | _        | j        dk    r/| j        (|                    tA          j!        d	d
                     nK| j        "                    | j        j        |          }n%| j        "                    | j        j        |          }|s!|j#        s|j        s)|j$        s"|j        j%        r|&                    |          }n!|j        j%        r|'                    |          }|| _        | S )Nr   rn  zAssignment to const 'r  )rs  r[   stop=Tr  CppExceptionConversionr_  )(r   r  rR  rw   r  r   r  rj  r  r  r  r  r  r   r:   rn   
unroll_rhsry   gil_assignment_check
unroll_lhsrM   MemoryViewIndexNodeanalyse_broadcast_operation$analyse_as_memview_scalar_assignmentrc  SliceIndexNoder  lookup_operator_for_typesis_overloaded_assignmentr  r  r  r   r  r  r8  r   r|  coerce_to_tempcoerce_to_simple)r   r   use_tempr  unrolled_assignmentr  oprR  s           r5   rw   z"SingleAssignmentNode.analyse_types  s   8))#..8 	J 3 < 	J" Jtx~':'BtxGcGcGeGe'B&*h&>##dh H H H HIII"ooc22 	'&&80055%%c***"ooc22 	'&&dh	 =>> 	9H00:::xDDTXNNDHHX]# 	9dh	(@AA 9..tx|$(RV]a.bb33C888=% 	9..txtx}dhm>\]]B =h04-')w'>$')w'>$'3..43G3O(()@AY[k)l)lmmmh((<<($$TX]C88C 	,s' 	,K	,(+	,$	, $$S))CCX! 	,&&s++Cr4   c           
      2	   ddl m}m} |}d x}x}x}	}
|j        j        r|j        j        }n|j        j        s|j        j        rt          ||j	                  r:|j
        s3|j        s,|j        x}}t          ||j	                  r|j
        s|j        ,t          ||j	                  rc|j        }|j
        }|r |                    t          j        |          }|j        }|r!|                    t          j        |          }n|j        j        rq|j        j        re|                    | j        t%          |j        j                  t          |j        j        t&                    r|j        j        n|j                  }nt+          | j        d           d S d }	|	r |	                    t          j        |          }	d }	  ||d            ||d          z
   ||	d          z  }nZ# t,          $ r t+          | j        d           Y d S w xY w|j        j        r$|j        j        }t          |t&                    sd S nd S d S ||k    rt+          | j        d|d	|           d S g }|                    |          }|g}|r1|j        s*|                    |          }|                    |           |r1|j        s*|                    |          }|                    |           |	r1|	j        s*|                    |	          }	|                    |	           t5          |          D ]k}|                    | j        t%          |          |t          j        
          }|	l|	                                r:|j        |	j        z  }|                    | j        t%          |          |          }n|                    | j        d|	|          }||                                rN|                                r:|j        |j        z   }|                    | j        t%          |          |          }n|                    | j        d||          }|                    |                    | j        ||                     |                               m|
||fS )Nr   )r  	UtilNodes)r   r  z*C array iteration requires known end indexc                 ^    | |S |                                  r| j        S t          d          )NzNot a constant.)r  r  r  )rX   
none_values     r5   	get_constz.SingleAssignmentNode.unroll.<locals>.get_const  s9    |))1133 <#33():;;;r4   r   z5C array assignment currently requires known endpointsz3Assignment to/from slice of wrong length, expected z, got )r   r  rj  r  )operatoroperand1operand2r  )rs  r  )!r   r  r  rj  	is_ctupler  rb  rc  rM   r{  r[   rr  rs  r  r
   r  IntNoder:   r  r  constant_value_not_setr   r  
LetRefNoder   r  r  r  r  MulNodeAddNode	IndexNoderw   )r   rX   target_sizer   r  r  rs  
start_node	stop_node	step_node
check_node
slice_sizer  rj   refsr  ix_node
step_valueindex_values                      r5   unrollzSingleAssignmentNode.unroll  s+   ********:>>
>Y>Z9 2	JJY /	!3 /	T9#;<< (dj (TXT] ("i't T9#;<< (dj (TXT] ($	 899 )y!Z
 Y!+!5!5j6RTW!X!XJ I	 
 ) 3 3J4PRU V VIIy) din $-$5$5 HC	,?,??I$).Z]?^?^ .STY^^2;2R %6 %U %U		
 dh(TUUU 	 W ) 3 3J4PRU V VI< < <"+)It"<"<yyUV?W?W"W[d[denpq[r[r!rJJ!   $($[\\\FF # !Y^
!*c22 F  F$$$((

KK) * * *F##D))v 	$j3 	$"--j99JKK
### 	#Y1 	#!,,Y77IKK	""" 	#Y1 	#!,,Y77IKK	"""$$ 	e 	eB''BQSZdZv'wwG$0022 n!(!89;T!TJ'//Jak/llGG'//3QZel/mmG%1133 W8S8S8U8U W")"9J<V"VK'//K@P@Pbm/nnGG'//3g 0 W WGLL,,TXDH]H]^aHbHb,ccdddd4&&s   &G( (H
Hc           	      p   ddl m} g }t          ||          D ]5\  }}	|                    t	          | j        ||	| j                             6t          | j        |                              |          }
|rt          | j        ||
g          }
|d d d         D ]}|
                    ||
          }
|
S )Nr   )r  )r  rR  first)r:   r  r   )r   r  rR  r  r^  r:   r  rY  rx   r  LetNode)r   r  r  lhs_listrhs_listr   r  assignmentsr  rR  rX   refs               r5   unroll_assignmentsz'SingleAssignmentNode.unroll_assignments  s    Hh// 	c 	cHC3DH#3VZV`aaabbbb%$(+FFFZZ[^__ 	HDHZ4FGGGD": 	0 	0C$$S$//DDr4   c                 P   ddl m} t          | j        |j                  sd S t          d | j        j        D                       rd S |                     | j        t          | j        j                  |          }|sd S |\  }}}| 
                    ||| j        j        ||          S )Nr   rn  c              3   $   K   | ]}|j         V  d S r   )
is_starredrp  s     r5   r=  z2SingleAssignmentNode.unroll_rhs.<locals>.<genexpr>,  s$      77#s~777777r4   )r   r  rM   r  r  r  rV   r  rR  rL   r  )r   r   r  unrolledr  r  rR  s          r5   ru  zSingleAssignmentNode.unroll_rhs(  s    $(I$788 	F7777777 	F;;txTX]););SAA 	F (
D#&&tZSQQQr4   c                 ,   | j         j        j        rd S ddlm} t          | j        |j                  sd S |                     | j         t          | j        j
                  |          }|sd S |\  }}}|                     |||| j        j
        |          S Nr   rn  )r  rj  r  r   r  rM   rR  r  r  rL   rV   r  )r   r   r  r  r  r  r  s          r5   rw  zSingleAssignmentNode.unroll_lhs5  s    8=" 	F$(I$788 	F;;txTX]););SAA 	F (
D#&&tZdhmSQQQr4   c                 :    | j                             |           d S r   rR  r?  r   s     r5   r\  z1SingleAssignmentNode.generate_rhs_evaluation_codeC      ))$/////r4   c                     | j         r5| j                            | j        || j         | j        | j                   d S | j                            | j        |           d S )N)rN  r  r  )r}  r  rO  rR  r  r  )r   rY   rN  s      r5   rO  z-SingleAssignmentNode.generate_assignment_codeF  sr    ( 	>H--&*&C $ 4 $ 4 . 6 6 6 6 6 H--dh=====r4   c                 <    | j                             ||           d S r   rR  r  r5  s      r5   r  z2SingleAssignmentNode.generate_function_definitionsQ       ..sD99999r4   c                 n    | j                             |           | j                            |           d S r   r  r   rR  r   s     r5   r   zSingleAssignmentNode.annotateT  4    $$r4   NrF  r`  )r-   r.   r/   r   r  r}  rg  rf  r   rw   r  r  ru  rw  r\  rO  r  r   r3   r4   r5   r^  r^    s         %.KE$$\Z \Z \Z|4 4 4 4l\' \' \'|
 
 
R R RR R R0 0 0	> 	> 	> 	>: : :         r4   r^  c                   P    e Zd Zg dZdZdZdZd Zd ZddZ	d Z
dd	Zd
 Zd ZdS )CascadedAssignmentNode)r  rR  coerced_valuescloned_valuesNc                 ~    t          |t                    r%|j        D ]}|                     ||j                   d S d S r   )rM   r  r  rU  rR  )r   rX   r  s      r5   rW  z.CascadedAssignmentNode._check_const_assignmentl  sU    d233 	>} > >..sDH====	> 	>> >r4   c                 D    | j         D ]}|                    |           d S r   )r  r  )r   r   r  s      r5   r   z+CascadedAssignmentNode.analyse_declarationsq  s4    = 	0 	0C**3////	0 	0r4   r   c                    ddl m}m} t                      }t	          | j                  D ]S\  }}|                    |          x}| j        |<   |                    |           |                    |j	                   T| j
                            |          }t          |          dk    rt          t          |                    j        rH|                    d|| j
        g          }	|	s(|                    |                                |          }n(|                    |                                |          }|j        s2|j        s+|s|j        s|j	        j        r|                    |          }n|                    |          }|                                r ||          n|| _
        g | _        i }
g | _        | j        D ]}|j	        j        o|                    d|| j
        g          }| j                            |           |j	        |
vra|j	        |j	        k    rQ || j
                  }|s|                    |j	        |          }| j                            |           ||
|j	        <   g | _        | j        D ]E}|
                    |j	        | j
                  }| j                             ||                     F| S )Nr   )r  rv  rs  )r  r  rv  r   r  r  ry   rv  r   rj  rR  rw   rL   nextiterr  lookup_operatorr  r  r   r   r8  r|  r~  r  rK  r  assignment_overloadsr  r  rN  )r   r   r  r  rv  	lhs_typesr  r  rR  r  r  
overloadeds               r5   rw   z$CascadedAssignmentNode.analyse_typesu  s   33333333 EE	.. 	$ 	$FAs%(%=%=c%B%BBC$-"$$S)))MM#(####h$$S))y>>QDOO$$1 :((sDHo>> >--	==CmmIMMOOS99{ 	,3> 	,	,,	,030D	,$$S))CC&&s++C%(%7%7%9%9B99S>>>s !$&!= 	/ 	/C.\33F3FsSRVRZO3\3\J%,,Z888x~--#(ch2F2Fi))! 7--#66C#**3///+.sx(  = 	6 	6C $$SXtx88C%%iinn5555r4   c                 :    | j                             |           d S r   r  r   s     r5   r\  z3CascadedAssignmentNode.generate_rhs_evaluation_code  r  r4   Fc                    | j         D ]}|                    |           t          | j        | j        | j                  D ]3\  }}}|                    |           |                    |||           4| j         D ],}|                    |           |                    |           -| j	                            |           | j	                            |           d S )N)rN  )
r  r?  rR  r  r  r  rO  r  rL  rR  )r   rY   rN  rR  r  overload	rhs_values          r5   rO  z/CascadedAssignmentNode.generate_assignment_code  s    & 	/ 	/C((...."%dmT5GIb"c"c 	T 	TCh((...((d((SSSS, 	' 	'I,,T222  &&&&''---D!!!!!r4   c                 <    | j                             ||           d S r   r  r5  s      r5   r  z4CascadedAssignmentNode.generate_function_definitions  r  r4   c                    | j         D ]}|                    |           t          | j        | j                  D ]/\  }}|                    |           |                    |           0| j                            |           d S r   )r  r   rR  r  r  rR  )r   rY   rR  r  s       r5   r   zCascadedAssignmentNode.annotate  s    & 	 	CLLDM4+=>> 	 	HCLLLL$r4   rF  r`  )r-   r.   r/   r   r  r  r  rW  r   rw   r\  rO  r  r   r3   r4   r5   r  r  Y  s         IHHKMN> > >
0 0 0/ / / /b0 0 0" " " ": : :         r4   r  c                   2    e Zd ZdgZd Zd Zd Zd Zd ZdS )rY  r  c                 D    | j         D ]}|                    |           d S r   r   r!  s      r5   r   z+ParallelAssignmentNode.analyse_declarations  s4    J 	+ 	+D%%c****	+ 	+r4   c                 v    fd| j         D             | _         | j         D ]}|                    |           | S )Nc                 >    g | ]}|                     d           S )r   )r  )rw   r&  s     r5   r   z>ParallelAssignmentNode.analyse_expressions.<locals>.<listcomp>  s<     . . . ((q(99 . . .r4   )r  rW  r!  s    ` r5   rx   z*ParallelAssignmentNode.analyse_expressions  s^    . . . ."&*. . .
 J 	/ 	/D((....r4   c                     |                     | j                   | j        D ]}|                    |           | j        D ]}|                    |           d S r   )r,  r:   r  r\  rO  r-  s      r5   r  z.ParallelAssignmentNode.generate_execution_code  sp    dhJ 	4 	4D--d3333J 	0 	0D))$////	0 	0r4   c                 F    | j         D ]}|                    ||           d S r   r)  r*  s       r5   r  z4ParallelAssignmentNode.generate_function_definitions  s6    J 	: 	:D..sD9999	: 	:r4   c                 D    | j         D ]}|                    |           d S r   r/  r-  s      r5   r   zParallelAssignmentNode.annotate  r0  r4   N	r-   r.   r/   r   r   rx   r  r  r   r3   r4   r5   rY  rY    sh         )K+ + +  0 0 0: : :         r4   rY  c                   4    e Zd ZddgZd Zd Zd Zd Zd ZdS )	InPlaceAssignmentNoder  rR  c                 :    | j                             |           d S r   r  r  r   s     r5   r   z*InPlaceAssignmentNode.analyse_declarations
      ++C00000r4   c                    | j                             |          | _         | j                            |          | _        | j        j        s| j        j        r+| j                             | j        j        |          | _         nD| j        j        j        r3| j	        dv r*| j                             t          j        |          | _         | S )Nz+-)rR  rw   r  ry   is_memview_indexis_buffer_accessr  rj  	is_stringr  r
   r  r   s     r5   rw   z#InPlaceAssignmentNode.analyse_types  s    8))#..80055 8$ 	M(A 	Mx))$(-==DHHX]$ 	M$)>)>x))**FLLDHr4   c                 b   |                     | j                   | j        | j        }}|                    |           |                    |           | j        }|dk    rd}n|dk    rt          | j        d           |j        s|j	        rp|j
        j        rt          | j        d           |dv r3|j
        j        r'|j        j        d         st          | j        d           |                    |||           n_|j        rt          | j        d	           nB|                    |                                d
|d|                                d           |                    |           |                    |           |                    |           |                    |           d S )Nz///z**zNo C inplace power operatorzAIn-place operators not allowed on object buffers in this release.)r  %	cdivisionz;In-place non-c divide operators not allowed on int buffers.z4Inplace operators not supported on memoryview slicesrH   z= rG  )r,  r:   r  rR  r?   generate_subexpr_evaluation_coder  r   r  r  rj  r|  r  r  r   generate_buffer_setitem_codeis_memview_slicerT   r   generate_subexpr_disposal_codefree_subexpr_tempsr  rL  )r   rY   r  rR  c_ops        r5   r  z-InPlaceAssignmentNode.generate_execution_code  s   dh8TXS$$T***,,T222}4<<DDT\\$(9::: 	J3#7 	Jx# edh cdddz!!cho!d>N>YZe>f!dh ]^^^,,S$====! 	J$(RSSSS JJszz||||TTT3::<<<<HIII**4000t$$$""4(((tr4   c                 n    | j                             |           | j                            |           d S r   r  r   s     r5   r   zInPlaceAssignmentNode.annotate4  r  r4   c                 f    ddl m} |                    | j        | j        | j        | j                  S r  )r   r  
binop_noder:   r  r  rR  r  s     r5   create_binop_nodez'InPlaceAssignmentNode.create_binop_node8  s6    ##DHdmTXtxPPPr4   N)	r-   r.   r/   r   r   rw   r  r   r  r3   r4   r5   r  r    so        $ %.K1 1 1
 
 
  6     Q Q Q Q Qr4   r  c                   @    e Zd ZddgZd Zej        ZdZd Z	d Z
d ZdS )	PrintStatNode	arg_tuplerR   c                    | j         r4| j                             |          }|                    |          | _         | j                            |          }|                    |          | _        |                    t
                     t          | j        j                  dk    r!| j        r|                    t                     | S )Nr   )
rR   rx   coerce_to_pyobjectr  r  printing_utility_coderL   rV   append_newlineprinting_one_utility_code)r   r   rR   r  s       r5   rx   z!PrintStatNode.analyse_expressionsF  s    ; 	9[44S99F 33C88DKN66s;;	"55c::2333t~"##q((T-@(  !:;;;r4   zPython print statementc           
         |                     | j                   | j        r4| j                            |           | j                                        }nd}t          | j        j                  dk    r| j        r| j        j        d         }|                    |           |	                    d|d|                                d|
                    | j                             |                    |           |                    |           n| j                            |           |	                    d|| j                                        | j        |
                    | j                  fz             | j                            |           | j                            |           | j        r6| j                            |           | j                            |           d S d S )Nr  r   r   zif (__Pyx_PrintOne(r   r&  z#if (__Pyx_Print(%s, %s, %d) < 0) %s)r,  r:   rR   r?  r  rL   r  rV   r  rT   r.  r  rL  )r   rY   stream_resultr  s       r5   r  z%PrintStatNode.generate_execution_codeT  s   dh; 	 K00666 K1133MMMt~"##q((T-@(.%a(C((...JJJ!MMMMOOOOOODH---/0 0 0
 &&t,,,NN4    N33D999JJ5!N,,..'OODH--	9/ /0 0 0 N11$777N%%d+++; 	)K..t444K""4(((((	) 	)r4   c                     | j         r| j                             ||           | j                            ||           d S r   )rR   r  r  r5  s      r5   r  z+PrintStatNode.generate_function_definitionsu  sC    ; 	AK55c4@@@44S$?????r4   c                 |    | j         r| j                             |           | j                            |           d S r   )rR   r   r  r   s     r5   r   zPrintStatNode.annotatez  s>    ; 	'K  &&&%%%%%r4   N)r-   r.   r/   r   rx   r   r   r   r   r  r  r   r3   r4   r5   r  r  =  sn         )K	 	 	 .K*K) ) )B@ @ @
& & & & &r4   r  c                   8    e Zd ZdgZd Zej        ZdZd Z	d Z
dS )ExecStatNoderV   c                     t          | j                  D ]9\  }}|                    |          }|                    |          }|| j        |<   :|                    t
          j                   | S r   )r  rV   rx   r  r  r   pyexec_utility_coder   r   r  r  s       r5   rx   z ExecStatNode.analyse_expressions  sn    	** 	 	FAs))#..C((--CDIaLLW8999r4   zPython exec statementc           	      
   |                     | j                   g }| j        D ]>}|                    |           |                    |                                           ?t          |ddgd dt          |          z
           z             }|j        	                    t          j        d          }|                    d|f|z   z             | j        D ],}|                    |           |                    |           -|                    |                    || j                             |                    |t                     |                    |t                     |j                            |           d S )Nr  r   Tr#  z%s = __Pyx_PyExec3(%s, %s, %s);)r,  r:   rV   r?  r  r  r  rL   r'  r(  r
   r   rT   r  rL  r*  r+  r/  r0  )r   rY   rV   r  temp_results        r5   r  z$ExecStatNode.generate_execution_code  sn   dh9 	) 	)C((...KK((((TS#J|#d))|4455n22:3LY]2^^

48MNOOO9 	! 	!C&&t,,,NN4    

##K::	< 	< 	<^444k>:::##K00000r4   c                 D    | j         D ]}|                    |           d S r   rV   r   r"  s      r5   r   zExecStatNode.annotate  2    9 	 	CLL	 	r4   N)r-   r.   r/   r   rx   r   r   r   r   r  r   r3   r4   r5   r  r    sX        
 (K   .K)K1 1 1$    r4   r  c                   :    e Zd ZdgZdZd Zd Zd ZdZd Z	d Z
d	S )
DelStatNoderV   Fc                 D    | j         D ]}|                    |           d S r   )rV   r  rI  s      r5   r   z DelStatNode.analyse_declarations  s4    9 	0 	0C**3////	0 	0r4   c                    t          | j                  D ]\  }}|                    |d           x}| j        |<   |j        j        s|j        r5|j        j        r)|j        r!|j        j        rt          |j
        d           m|j        j        r'|j        j        j        r|                     |           |j        j        rt          |j
        d           |j        r|j        j        t"          j        u rt          |j
        d           | S )NzDeletion of global C variablezDeletion of non-heap C++ objectz&Deletion of non-Python, non-C++ object)r  rV   r  rj  r|  r   r  r  
is_cglobalr   r:   rb  rk  r  r   rF  rs  r   bytearray_typer  s       r5   rx   zDelStatNode.analyse_expressions  s#   	** 	I 	IFAs!$!>!>sD!I!IIC$)A,x# 
I 
I8S 
I; D39#7 D#'#BCCC ISX%7%D Is####& Icg@AAAA! Ichmw7M&M&McgGHHHHr4   c                 Z    | j         D ]"}|j        j        r|                                  #d S r   )rV   rj  r|  r   rI  s      r5   r   zDelStatNode.nogil_check  s;    9 	! 	!Cx# !   	! 	!r4   zDeleting Python objectc                    |                     | j                   | j        D ]}|j        j        s+|j        j        s|j        r5|j        j        t          j	        u r|
                    || j                   V|j        j        rz|j        j        j        ri|                    |           |                    d|                                z             |                    |           |                    |           d S )N)ignore_nonexistingz
delete %s;)r,  r:   rV   rj  r|  r  rF  rs  r   r  generate_deletion_coder  rb  rk  r  r?  rT   r   r  rL  r"  s      r5   r  z#DelStatNode.generate_execution_code  s   dh9 
	% 
	%C$ 	%H/	%$	%),':P)P)P**T-D + F F F F %SX%7%D %,,T222

<#**,,6777**4000t$$$
	% 
	%r4   c                 D    | j         D ]}|                    |           d S r   r  r"  s      r5   r   zDelStatNode.annotate  r  r4   N)r-   r.   r/   r   r  r   rx   r   r   r  r   r3   r4   r5   r  r    su        
 (K0 0 0  "! ! !
 +K% % %    r4   r  c                       e Zd Zg Zd Zd ZdS )rD  c                     | S r   r3   r   s     r5   rx   z PassStatNode.analyse_expressions  r  r4   c                 b    |j         j        d         r|                    | j                   d S d S )Nrc  )r  r   r,  r:   r   s     r5   r  z$PassStatNode.generate_execution_code  s9    &{3 	$MM$(#####	$ 	$r4   N)r-   r.   r/   r   rx   r  r3   r4   r5   rD  rD    s9         K  $ $ $ $ $r4   rD  c                   "     e Zd ZdZ fdZ xZS )IndirectionNodez
    This adds an indirection so that the node can be shared and a subtree can
    be removed at any time by clearing self.stats.
    c                 d    t                                          |d         j        |           d S )Nr   r'  )rk   r   r:   )r   r  rO   s     r5   r   zIndirectionNode.__init__  s,    qU33333r4   )r-   r.   r/   r   r   rs   rt   s   @r5   r  r    sB         
4 4 4 4 4 4 4 4 4r4   r  c                   "    e Zd Zg ZdZd Zd ZdS )BreakStatNodeTc                     | S r   r3   r   s     r5   rx   z!BreakStatNode.analyse_expressions  r  r4   c                     |                     | j                   |j        st          | j        d           d S |                    |j                   d S )Nzbreak statement not inside loop)r,  r:   break_labelr   r  r   s     r5   r  z%BreakStatNode.generate_execution_code   sU    dh 	,$(=>>>>>MM$*+++++r4   Nr-   r.   r/   r   r   rx   r  r3   r4   r5   r  r    s<        KM  , , , , ,r4   r  c                   "    e Zd Zg ZdZd Zd ZdS )ContinueStatNodeTc                     | S r   r3   r   s     r5   rx   z$ContinueStatNode.analyse_expressions  r  r4   c                     |j         st          | j        d           d S |                    | j                   |                    |j                    d S )Nz"continue statement not inside loop)continue_labelr   r:   r,  r  r   s     r5   r  z(ContinueStatNode.generate_execution_code  sT    " 	$(@AAAFdhd)*****r4   Nr  r3   r4   r5   r  r    s<        KM  + + + + +r4   r  c                   L    e Zd ZdgZdZdZdZdZd Zd Z	dZ
d Zd Zd	 Zd
 ZdS )ry  r   TFc                 `   |j         }|| _         |st          | j        d           | S | j        r| j        rt          | j        d           | j                            |          | _        |j        s|j        rt          | j        j        d           n| j                            |j         |          | _        |j	        d         s|j	        d         r1|j
        s*|                    |          r|                    |           n*|j        s#|j
        s|j        st          | j        d           | S )Nz!Return not inside a function bodyz$Return with value in async generatorz"Return with value in void functionr]  rc  zReturn value required)r  r   r:   r   in_async_genrw   re  rP  r  r   r|  can_coerce_to_pyobjectr  )r   r   r  s      r5   rx   z"ReturnStatNode.analyse_expressions(  sM   o& 	$(?@@@K: 	9  Hdh FGGG11#66DJ" Ck&? Cdjn&JKKKK!Z11#/3GG
>), C{0K C&2 C{7Y7YZ]7^7^ C#==cBBB' 9'39'59 dh 7888r4   c                 J    | j         j        r|                                  d S d S r   )r  r|  r   r   s     r5   r   zReturnStatNode.nogil_check@  s0    ' 	NN	 	r4   zReturning Python objectc                    |                     | j                   | j        sd S | j        }| j        j        r0|                    t          j        | j                   |r	|j        rd }|rJ|	                    |           | j        j
        rPddlm} |                    t          j        | j        |j        ||| j                   |                    |           n|                    |           |                    t          j        d|                    | j                  d           |                    |           |j        j        d         s|j        j        d         r8|                    t          j        | j        | j        |j        j                    |                    |           n^| j        j        r&|                    t          j        | j                   n,| j        j        r |                     || j        j                   |j                                        D ]\  }}|                    ||           |                    |j                    d S )	Nr   r  )	lhs_cnamelhs_typelhs_posrR  rY   rt  rF  rG  r]  rc  r  )!r,  r:   r  r   r|  r  r	   r  r   r?  r  r   r  put_acquire_memoryviewslicer   rK  rH  rT   rI  r  r   r  r'  r  rL  r  rP  
put_returnr  temps_holding_referencer/  r  r  )r   rY   r   r  r  rj  s         r5   r  z&ReturnStatNode.generate_execution_codeF  s   dh 	F
' 	V0$2BCCC   	F**40002 ((((((66$1!-!I!2 7 4 4 4 33D9999**4000

'''OOD$455557 8 8 8 33D999#.y9 T=M=XYd=e ))+$($4"&."::	 *    T""""+ F(()<d>NOOOO!/ Fd&6&DEEE>AACC 	/ 	/KE4!!%....d'(((((r4   c                     | j         r|                    d           |                    t          j        d|d           d S )Nz%#pragma omp critical(__pyx_returning)rF  rG  )in_parallelputln_openmprT   r	   r  )r   rY   r   s      r5   r#  zReturnStatNode.put_returnx  sM     	GEFFF

!4!4!4eee<=====r4   c                 N    | j         | j                             ||           d S d S r   )r   r  r5  s      r5   r  z,ReturnStatNode.generate_function_definitions}  s0    :!J44S$????? "!r4   c                 L    | j         r| j                             |           d S d S r   )r   r   r   s     r5   r   zReturnStatNode.annotate  s2    : 	&J%%%%%	& 	&r4   N)r-   r.   r/   r   r   in_generatorr  r&  rx   r   r   r  r#  r  r   r3   r4   r5   ry  ry    s         )KMLL K  0   ,K0) 0) 0)d> > >
@ @ @& & & & &r4   ry  c                   P    e Zd Zg dZdZdZdZdZd Ze	j
        ZdZd Zd Zd	 ZdS )
RaiseStatNode)exc_type	exc_valueexc_tbcauseTNFc                 N   | j         r4| j                             |          }|                    |          | _         | j        r| j                            |          }| j        rc|j        t          j        u s|j        j        sDddl	m
}  ||j        |                    |          gd          }|                    |d          }|                    |          | _        | j        r4| j                            |          }|                    |          | _        | j        r4| j                            |          }|                    |          | _        | j         r| j        s| j        s| j         }ddlm	} t          ||j                  r!|j        s|j        |j        j        s|j        }|j        ro|j        j        rcddlm}	 |j        | _        | j        dk    rd | _         n>| j        d	k    r3|j        r,|j        d
k    r!|j        r|j        j        r| j        sd | _         | S )Nr   r  T)rV   slow)skip_childrenrn  )SymtabMemoryErrorStopIteration__next__)r-  rw   r  r.  wrap_tuple_valuerj  r   
tuple_typer  r  r  r:   r/  r0  r   rM   rx  rV   r  ru  r   r  
is_builtinr4  rn   builtin_exc_nameis_local_scoperT  r  in_try_block)
r   r   r-  r.  r  r/  r0  excr  r4  s
             r5   rx   z!RaiseStatNode.analyse_expressions  s^   = 	=}22377H$77<<DM> 	?44S99I$ Q>W%777y~?]7444444 )	)-y?[?[\_?`?`>ahl m m mI ) 7 74 7 P PI&99#>>DN; 	9[..s33F 33C88DK: 	7J,,S11E11#66DJ= 	) 	) 	)-C######3	 899 ##&)m&?CMDV&?l{ )sy3 )$$$$$$(+%(M99$(DMM+>>* ?/2x:/E/E( 0F-0-=-N 0F - 0F %)DMr4   Raising exceptionc                 D   |                     | j                   | j        dk    r2|                    d|                    | j                  z             d S | j        dk    rb| j        s[|                    dt          j        z             |                    d|                    d           z             d|j        _	        d S | j        rd| j        
                    |           | j                                        }| j        j        r$|j                            | j        j                   nd}| j        r4| j        
                    |           | j                                        }nd}| j        r4| j        
                    |           | j                                        }nd}| j        r4| j        
                    |           | j                                        }nd}|j                            t(                     |                    d|d	|d	|d	|d
	           | j        | j        | j        | j        fD ].}|r*|                    |           |                    |           /|                    |                    | j                             d S )Nr5  zPyErr_NoMemory(); %sr6  z%s = 1;r  Tr  z__Pyx_Raise(r   rq  )r,  r:   r;  rT   r.  r-  r	   r  r'  r  r?  r  r   r  use_entry_utility_coder  r.  r/  r0  r  raise_utility_coder  rL  )r   rY   	type_code
value_codetb_code
cause_coder$  s          r5   r  z%RaiseStatNode.generate_execution_code  s   dh M11JJ-0I0IIJJJF"o55dm5JJy6#GGHHHJJutt44455559DN2F= 	M224888//11I}$ M 778KLLLI> 	N33D9991133JJJ; 	K00666k++--GGG: 	J//555--//JJJ))*<===


		



		 	 	 M4>4;
K 	% 	%C %**4000t$$$

OODH%%	' 	' 	' 	' 	'r4   c                    | j         | j                             ||           | j        | j                            ||           | j        | j                            ||           | j        | j                            ||           d S d S r   )r-  r  r.  r/  r0  r5  s      r5   r  z+RaiseStatNode.generate_function_definitions  s    =$M77TBBB>%N88dCCC;"K55c4@@@:!J44S$????? "!r4   c                    | j         r| j                             |           | j        r| j                            |           | j        r| j                            |           | j        r| j                            |           d S d S r   )r-  r   r.  r/  r0  r   s     r5   r   zRaiseStatNode.annotate  s    = 	)M""4(((> 	*N##D))); 	'K  &&&: 	&J%%%%%	& 	&r4   )r-   r.   r/   r   r   r;  r8  r=  rx   r   r   r   r   r  r  r   r3   r4   r5   r,  r,    s         ?>>KML( ( (T .K%K.' .' .'`@ @ @& & & & &r4   r,  c                   4    e Zd Zg ZdZd Zej        ZdZ	d Z
dS )ReraiseStatNodeTc                     | S r   r3   r   s     r5   rx   z#ReraiseStatNode.analyse_expressions  r  r4   r?  c                 H   |                     | j                   |j        j        }|r|j                            t                     |                    |d         t                     |                    |d         t                     |	                    |d         t                     |
                    dt          |          z             |
                    d                    d |D                                  nB|j                            t          j        dd                     |
                    d	           |                                r|                    | j        d
           |
                    |                    | j                             d S )Nr   r   r&   &__Pyx_ErrRestoreWithState(%s, %s, %s);rH   c                     g | ]}| d S )z = 0; r3   )r   varnames     r5   r   z;ReraiseStatNode.generate_execution_code.<locals>.<listcomp>  s!     H H HG!3!3!3 H H Hr4   ReRaiseExceptionExceptions.cz__Pyx_ReraiseException();Treraise)r,  r:   r'  exc_varsr  r  r  rJ  r   r  rT   r  r   r   r  r  put_trace_exceptionr.  )r   rY   rl  s      r5   r  z'ReraiseStatNode.generate_execution_code  sq   dh~& 	4--.LMMMT!Wn555T!Wn555d1g~666JJ?%++MNNNJJsxx H H4 H H HIIJJJJ--'(:NKKM M MJJ2333?? 	=$$TXt$<<<

4??48,,-----r4   N)r-   r.   r/   r   r   rx   r   r   r   r   r  r3   r4   r5   rJ  rJ  	  sJ        KM   .K%K. . . . .r4   rJ  c                   8    e Zd Zg dZdZd Zd Zd Zd Zd Z	dS )AssertStatNode)	conditionr   	exceptionNc                 ~    | j         
J d            | j        
J d            | j                            |           d S )Nz0Message should have been replaced in PostParse())r   rY  r   r   s     r5   r   z#AssertStatNode.analyse_declarations2  sL    z!!#U!!!~))+])))++C00000r4   c                     | j                             |          | _         | j                            |          | _        | S r   )rX  analyse_temp_boolean_expressionrY  rx   r   s     r5   rx   z"AssertStatNode.analyse_expressions7  s5    GGLL;;C@@r4   c                 "   |j                             t          j        dd                     |                    d           |                    d           |                    | j                   | j                            |           |                    d| j        	                                z             | j
                            |           |                    d           | j                            |           | j                            |           |                    d           |                    d           |                    d|                    | j        d	
          z             |                    d           d S )NAssertionsEnabledrQ  z!#ifndef CYTHON_WITHOUT_ASSERTIONSz+if (unlikely(__pyx_assertions_enabled())) {rm  rp  r  zif ((1)); else %sFrh  r  )r  r  r   r  rT   r,  r:   rX  r?  r   rY  r  r  rL  r.  r   s     r5   r  z&AssertStatNode.generate_execution_code<  su   ))#$7HH	J 	J 	J

6777

@AAAdh//555

"T^%:%:%<%<<	> 	> 	>..t444

	 	 	--d333!!$'''

	 	 	

7

&)N)NNOOO

8r4   c                 r    | j                             ||           | j                            ||           d S r   )rX  r  rY  r5  s      r5   r  z,AssertStatNode.generate_function_definitionsQ  s8    44S$???44S$?????r4   c                 n    | j                             |           | j                            |           d S r   )rX  r   rY  r   s     r5   r   zAssertStatNode.annotateU  s4    %%%%%%%%r4   )
r-   r.   r/   r   rY  r   rx   r  r  r   r3   r4   r5   rW  rW  (  st         655KI1 1 1
  
  *@ @ @& & & & &r4   rW  c                   4    e Zd ZddgZd Zd Zd Zd Zd ZdS )	
IfStatNode
if_clauseselse_clausec                     | j         D ]}|                    |           | j        r| j                            |           d S d S r   )rc  r   rd  )r   r   	if_clauses      r5   r   zIfStatNode.analyse_declarationsb  s\     	0 	0I**3//// 	711#66666	7 	7r4   c                     fd| j         D             | _         | j        r| j                                      | _        | S )Nc                 :    g | ]}|                               S r3   r%  )r   rf  r   s     r5   r   z2IfStatNode.analyse_expressions.<locals>.<listcomp>i  s'    ___)988==___r4   )rc  rd  rx   r   s    `r5   rx   zIfStatNode.analyse_expressionsh  sJ    ____t___ 	I#/CCCHHDr4   c                    |                     | j                   |                                }t          | j                  }| j        s|dz  }t          | j                  D ]!\  }}|                    ||||k               "| j        rc|                     | j        j                   |                    d           | j                            |           |                    d           |	                    |           d S )Nr   )is_last
/*else*/ {rp  )
r,  r:   r  rL   rc  rd  r  r  rT   r  )r   rY   r  lastr  rf  s         r5   r  z"IfStatNode.generate_execution_coden  s    dhNN$$	4?## 	AID%do66 	R 	RLAy--dIqDy-QQQQ 	MM$*.///JJ|$$$44T:::JJsOOOy!!!!!r4   c                     | j         D ]}|                    ||           | j        | j                            ||           d S d S r   )rc  r  rd  )r   r   rY   clauses       r5   r  z(IfStatNode.generate_function_definitions}  s\    o 	< 	<F00d;;;;'::3EEEEE ('r4   c                     | j         D ]}|                    |           | j        r| j                            |           d S d S r   )rc  r   rd  )r   rY   rf  s      r5   r   zIfStatNode.annotate  s\     	% 	%It$$$$ 	,%%d+++++	, 	,r4   Nr  r3   r4   r5   rb  rb  Z  sn          /K7 7 7  " " "F F F, , , , ,r4   rb  c                   8    e Zd ZddgZdZd Zd Zd Zd Zd Z	dS )	IfClauseNoderX  r   Nc                 :    | j                             |           d S r   )r   r   r   s     r5   r   z!IfClauseNode.analyse_declarations  s    	&&s+++++r4   c                     | j                             |          | _         | j                            |          | _        | S r   )rX  r\  r   rx   r   s     r5   rx   z IfClauseNode.analyse_expressions  s5    GGLLI11#66	r4   c                 <   | j                             |           |                    | j                   | j                                         }| j        r| j        d|d}|                    d|z             | j                             |           | j                             |           | j	        
                    |           |                    | j        d           |s!| j	        j        s|                    |           |                    d           d S )Nrk  rj  r  Fru  rp  )rX  r?  r,  r:   r   branch_hintrT   r  rL  r   r  r   r  )r   rY   r  rj  rX  s        r5   r  z$IfClauseNode.generate_execution_code  s   //555dhN))++	 	A$($4$4$4iii@I

;*+++--d333!!$'''	))$///dhe,,, 	%492 	%MM)$$$

3r4   c                 r    | j                             ||           | j                            ||           d S r   )rX  r  r   r5  s      r5   r  z*IfClauseNode.generate_function_definitions  s8    44S$???	//T:::::r4   c                 n    | j                             |           | j                            |           d S r   )rX  r   r   r   s     r5   r   zIfClauseNode.annotate  s4    %%%	4     r4   )
r-   r.   r/   r   ru  r   rx   r  r  r   r3   r4   r5   rq  rq    sp         'KK, , ,  
  ; ; ;! ! ! ! !r4   rq  c                   .    e Zd ZddgZd Zd Zd Zd ZdS )SwitchCaseNode
conditionsr   c                 D    | j         D ]}|                    |           d S r   )rz  r?  r   rY   r  s      r5   "generate_condition_evaluation_codez1SwitchCaseNode.generate_condition_evaluation_code  s4    O 	0 	0D))$////	0 	0r4   c                    t          | j                  }|j        j        d         }t	          | j        d          D ]f\  }}|                    d|                                z             |                    |j                   |r||k     r|                    d           g| j	        
                    |           |                    | j        d           |                    d           d S )Nrc  r   zcase %s:r  Fru  r  )rL   rz  r  r   r  rT   r   r,  r:   r   r  )r   rY   num_conditionsline_tracing_enabledr  r  s         r5   r  z&SwitchCaseNode.generate_execution_code  s    T_--#/:;G !44 	2 	2GAtJJzDKKMM1222MM$(#### 2N(:(:

0111	))$///dhe,,,

8r4   c                 |    | j         D ]}|                    ||           | j                            ||           d S r   )rz  r  r   )r   r   rY   r  s       r5   r  z,SwitchCaseNode.generate_function_definitions  sJ    O 	: 	:D..sD9999	//T:::::r4   c                 x    | j         D ]}|                    |           | j                            |           d S r   )rz  r   r   r|  s      r5   r   zSwitchCaseNode.annotate  sD    O 	  	 DMM$	4     r4   N)r-   r.   r/   r   r}  r  r  r   r3   r4   r5   ry  ry    s\          (K0 0 0  ; ; ;
! ! ! ! !r4   ry  c                   (    e Zd Zg dZd Zd Zd ZdS )SwitchStatNode)testcasesrd  c                    | j                             |           | j        D ]}|                    |           |                    | j                   |                    d| j                                         z             | j        D ]}|                    |           | j	        E|                    d           | j	                            |           |                    d           n|                    d           |                    d           | j         
                    |           | j                             |           d S )Nr  r  r  zdefault: break;rp  )r  r?  r  r}  r,  r:   rT   r   r  rd  r  rL  r   rY   cases      r5   r  z&SwitchStatNode.generate_execution_code  s@   	**4000 J 	: 	:D33D9999dh

?TY%5%5%7%77888J 	/ 	/D((....'JJz"""44T:::JJx    
 JJ()))

3	((...	T"""""r4   c                     | j                             ||           | j        D ]}|                    ||           | j        | j                            ||           d S d S r   )r  r  r  rd  )r   r   rY   r  s       r5   r  z,SwitchStatNode.generate_function_definitions  st    	//T:::J 	: 	:D..sD9999'::3EEEEE ('r4   c                     | j                             |           | j        D ]}|                    |           | j        | j                            |           d S d S r   )r  r   r  rd  r  s      r5   r   zSwitchStatNode.annotate  sl    	4   J 	  	 DMM$'%%d+++++ ('r4   N)r-   r.   r/   r   r  r  r   r3   r4   r5   r  r    sQ         322K# # #.F F F, , , , ,r4   r  c                       e Zd ZdS )LoopNodeNrc  r3   r4   r5   r  r    rd  r4   r  c                   4    e Zd Zg dZd Zd Zd Zd Zd ZdS )WhileStatNode)rX  r   rd  c                     | j                             |           | j        r| j                            |           d S d S r   )r   r   rd  r   s     r5   r   z"WhileStatNode.analyse_declarations  sJ    	&&s+++ 	711#66666	7 	7r4   c                     | j         r| j                             |          | _         | j                            |          | _        | j        r| j                            |          | _        | S r   )rX  r\  r   rx   rd  r   s     r5   rx   z!WhileStatNode.analyse_expressions  se    > 	Q!^KKCPPDNI11#66	 	I#/CCCHHDr4   c                 \   |                     | j                   |                                }|                    d           | j        r}| j                            |           | j                            |           |                    d| j                                        z             | j                            |           | j	        
                    |           |                    |j                   |                    d           |j        }|                    |           | j        rc|                     | j        j                   |                    d           | j        
                    |           |                    d           |                    |           d S )Nzwhile (1) {zif (!%s) break;rp  rk  )r,  r:   new_loop_labelsrT   rX  r?  r  r   rL  r   r  r  r  r  set_loop_labelsrd  )r   rY   old_loop_labelsr  s       r5   r  z%WhileStatNode.generate_execution_code   s   dh..00

	 	 	> 	,N33D999N11$777JJ!DN$9$9$;$;;= = =N%%d+++	))$///t*+++

3&_--- 	MM$*.///JJ|$$$44T:::JJsOOO{#####r4   c                     | j         r| j                             ||           | j                            ||           | j        | j                            ||           d S d S r   )rX  r  r   rd  r5  s      r5   r  z+WhileStatNode.generate_function_definitions7  sm    > 	DN88dCCC	//T:::'::3EEEEE ('r4   c                     | j         r| j                             |           | j                            |           | j        r| j                            |           d S d S r   )rX  r   r   rd  r   s     r5   r   zWhileStatNode.annotate>  sj    > 	*N##D)))	4    	,%%d+++++	, 	,r4   Nr  r3   r4   r5   r  r  
  so         766K7 7 7
  $ $ $.F F F, , , , ,r4   r  c                   F    e Zd Zg dZdxZZdxZZdxZZ	d Z
d Zd Zd ZdS )DictIterationNextNode)
dict_objexpected_sizepos_index_varcoerced_key_varcoerced_value_varcoerced_tuple_var
key_targetvalue_targettuple_targetis_dict_flagNc                 n    t                               | |j        |||||||dt          j                   d S )NT)	r  r  r  r  r  r  r  is_temprj  r   r   r:   r
   c_bint_type)r   r  r  r  r  r  r  r  s           r5   r   zDictIterationNextNode.__init__R  sL    (,''!%%%' 	 
	) 
	) 
	) 
	) 
	)r4   c                    ddl m} | j                            |          | _        | j                            |          | _        | j        r| j                            |          | _        | j        rx| j                            |          | _        |                    | j        j	        t          j                  | _        | j                            | j        j        |          | _        | j        ry| j                            |          | _        |                    | j        j	        t          j                  | _        | j                            | j        j        |          | _        | j        rx| j                            |          | _        |                    | j        j	        t          j                  | _        | j                            | j        j        |          | _        | j                            |          | _        | S Nr   rn  r_  )r   r  r  rw   r  r  r  ry   TempNoder:   r
   r   key_refr  rj  r  r  	value_refr  r  	tuple_refr  r  r   r   r  s      r5   rx   z)DictIterationNextNode.analyse_expressions`  s   33C88!/==cBB 	G!%!3!A!A#!F!FD? 	U"oBB3GGDO$--do.A:C\]]DL#'<#9#9$/:NPS#T#TD  	[ $ 1 F Fs K KD&//0A0EJLe/ffDN%)^%=%=d>O>TVY%Z%ZD" 	[ $ 1 F Fs K KD&//0A0EzG`aaDN%)^%=%=d>O>TVY%Z%ZD" -;;C@@r4   c                 <    | j                             ||           d S r   )r  r  r5  s      r5   r  z3DictIterationNextNode.generate_function_definitionsu  s     33C>>>>>r4   c                    |j                             t          j        dd                     | j                            |           g }g }| j        | j        | j        f| j	        | j
        | j        f| j        | j        | j        ffD ]d\  }}}|d}nD|                    |||f           |                    |           d|                                z  }|                    |           e|j                            t(          j        d          }|                    |d| j                                        d| j                                        d| j                                        d|d	         d|d
         d|d         d| j                                        d           |                    d|z             |                    |                    d|z  | j                             |j                            |           |D ]\  }}}|                    |           |D ]\  }}}|                    |           |D ]1\  }}}|                    ||           |                     |           2d S )N	dict_iter
Optimize.cr  &%sFz = __Pyx_dict_iter_next(r   r  r   r   r&   rq  if (unlikely(%s == 0)) break;%s == -1)!r  r  r   r  r  r?  r  r  r  r  r  r  r  r  r  r  allocater   r'  r(  r
   r	  rT   r  r  r  r  r  r:   r0  generate_gotrefrO  release)	r   rY   r  temp_addressesrG  r   rM  addrresult_temps	            r5   r  z-DictIterationNextNode.generate_execution_codex  s   ))+*A+|*\*\]]]..t444%)\43G$Y%)^T5KTM^$_%)^T5KTM^$_$a 		( 		(C ~""C#8999T"""szz||+!!$''''n22:3H%PP

KKM##%%%%%%''''%%''''111$$&&&&	
 		 		 		 	

2[@AAA

4%%j;&>IIJJJ##K000 $/ 	& 	&C%%%%#. 	2 	2C++D1111#. 	 	C++FD999KK	 	r4   )r-   r.   r/   r   r  r  r  r  r  r  r   rx   r  r  r3   r4   r5   r  r  F  s        Q Q QK !%$Og$((	$((	) ) )  *? ? ?' ' ' ' 'r4   r  c                   6    e Zd Zg dZdxZZd Zd Zd Zd Z	dS )SetIterationNextNode)set_objr  r  r  r  is_set_flagNc                 j    t                               | |j        |||||dt          j        	  	         d S )NT)r  r  r  r  r  r  rj  r  )r   r  r  r  r  r  s         r5   r   zSetIterationNextNode.__init__  sF    '+''%#' 	 	) 	) 	) 	) 	)r4   c                    ddl m} | j                            |          | _        | j                            |          | _        | j                            |          | _        | j                            |          | _        |                    | j        j	        t          j                  | _        | j                            | j        j        |          | _        | j                            |          | _        | S r  )r   r  r  rw   r  r  r  ry   r  r:   r
   r   r  r  rj  r  r  r  s      r5   rx   z(SetIterationNextNode.analyse_expressions  s    |11#66!/==cBB!/==cBB -BB3GG"++D,=,A
Ha+bb!%!9!9$:K:PRU!V!V+99#>>r4   c                 <    | j                             ||           d S r   )r  r  r5  s      r5   r  z2SetIterationNextNode.generate_function_definitions  s     223=====r4   c                    |j                             t          j        dd                     | j                            |           | j        }|                    |           |j        	                    t          j        d          }|                    |d| j                                        d| j                                        d| j                                        d|                                d| j                                        d           |                    d|z             |                    |                    d	|z  | j                             |j                            |           |                    |           | j                            |           | j                            | j        |           |                    |           d S )
Nset_iterr  Fz = __Pyx_set_iter_next(r   r  rq  r  r  )r  r  r   r  r  r?  r  r  r'  r(  r
   r	  rT   r  r  r   r  r  r  r:   r0  r  r  r  rO  r  )r   rY   r  r  s       r5   r  z,SetIterationNextNode.generate_execution_code  s   ))+*A*l*[*[\\\--d333N	4   n22:3H%PP

KKL""$$$$%%''''%%''''##%%%%
 	 	 	 	

2[@AAA

4%%j;&>IIJJJ##K000 	!!$'''77===2243I4PPP$r4   )
r-   r.   r/   r   r  r  r   rx   r  r  r3   r4   r5   r  r    sq        G G GK %)(		) 	) 	)	 	 	> > >         r4   r  c                 r    d|v r'|d         j         rt          | fi |S t          | fi |S t          | fi |S )Niterator)is_asyncAsyncForStatNodeForInStatNodeForFromStatNode)r:   r   s     r5   ForStatNoder    s^    Rj>" 	,#C..2... +++++s))b)))r4   c                   B    e Zd Zg dZdZdZd Zd Zd Zd Z	d Z
d	 ZdS )
_ForInStatNode)rM  r   r  r   rd  NFc                      t          d          )Nz!must be implemented by subclasses)NotImplementedErrorr   s    r5   _create_item_nodez _ForInStatNode._create_item_node  s    !"EFFFr4   c                     | j                             |           | j                            |           | j        r| j                            |           |                                  d S r   )rM  r  r   r   rd  r  r   s     r5   r   z#_ForInStatNode.analyse_declarations  sh    ..s333	&&s+++ 	711#666     r4   c                 l   | j                             |          | _         | j                            |          | _        |                                  | j                            |          | _        | j        sL| j        j        j        s| j        j        j	        r*| j         j        
                    | j        j                  rn*| j                            | j         j        |          | _        | j                            |          | _        | j        r| j                            |          | _        | S r   )rM  ry   r  rx   r  r   r  rj  rb  rc  r  r  r   rd  r   s     r5   rx   z"_ForInStatNode.analyse_expressions   s   k66s;;99#>>   I11#66	 	C#*	C.2m.@.I	C 001CDD	C 	++DK,<cBBDII11#66	 	I#/CCCHHDr4   c                 .   |                     | j                   |                                }| j                            |           |                    d           | j                            |           |                    d           | j                            |           | j	        
                    | j        |           |                    | j                   | j                            |           |                     | j                   |                    |j                   |                    d           | j                            |           | j        r|                    d          nd }|                    d          }|                    |j        g|g|p|| j                  }|                     | j                   |D ]}| j                            |           |                    |           | j                            |           | j        rY|                    d           |                    |           | j                            |           |                    d           |                    |           d S )Nr  r  rp  for_elsefor_end)skip_to_labelr:   rk  )r,  r:   r  r  r?  r  generate_for_loop_headerrT   r   rM  rO  write_trace_liner   r  r  r  r  rd  r  label_interceptorr  r  rL  )r   rY   r  
else_labelr  label_interceptsr  s          r5   r  z&_ForInStatNode.generate_execution_code  s]   dh..00..t444..t444

5	**4000,,TY===dh'''	))$///dht*+++

3 	,,T222373CMT^^J///
NN9--	11K$1		 2 
 
 	dh! 	7 	7AM006666_---  &&& 	JJ|$$$NN:&&&44T:::JJsOOOy!!!!!r4   c                     | j                             ||           | j                            ||           | j                            ||           | j        | j                            ||           d S d S r   )rM  r  r  r   rd  r5  s      r5   r  z,_ForInStatNode.generate_function_definitions;  sz    11#t<<<33C>>>	//T:::'::3EEEEE ('r4   c                    | j                             |           | j                            |           | j                            |           | j        r| j                            |           | j                            |           d S r   )rM  r   r  r   rd  r   r   s     r5   r   z_ForInStatNode.annotateB  s    T"""t$$$	4    	,%%d+++	4     r4   )r-   r.   r/   r   r   r  r  r   rx   r  r  r   r3   r4   r5   r  r    s         HGGKDHG G G! ! !  "(" (" ("TF F F! ! ! ! !r4   r  c                       e Zd ZdZd ZdS )r  Fc                 <    ddl m}  || j                  | _        d S )Nr   )NextNode)r  r  r  r   )r   r  s     r5   r  zForInStatNode._create_item_nodeP  s+    ''''''HT]++			r4   N)r-   r.   r/   r  r  r3   r4   r5   r  r  K  s*         H, , , , ,r4   r  c                       e Zd ZdZd Zd ZdS )r  Tc                     d|vsJ ddl m} |                    |d         j        d           |d<   t	          j        | |fi | d S )Nr   r   rn  r  )r  )r   r  AwaitIterNextExprNoder:   r  r   )r   r:   r   r  s       r5   r   zAsyncForStatNode.__init__]  si    R44R
^5GT4RR6
c00R00000r4   c                 Z    ddl m} |                    | j                  | j        _        d S r  )r   r  AsyncNextNoder  r   r  r  s     r5   r  z"AsyncForStatNode._create_item_noded  s1    !//>>	r4   N)r-   r.   r/   r  r   r  r3   r4   r5   r  r  U  s9         H1 1 1? ? ? ? ?r4   r  c                   b    e Zd Zg dZdZdZdZdZdZd Z	d Z
d Zd Zd	 Zd
ddddZd Zd ZdS )r  )rM  bound1bound2stepr   rd  FNz&For-loop using object bounds or targetc                 t    | j         | j        | j        fD ]"}|j        j        r|                                  #d S r   )rM  r  r  rj  r|  r   )r   r   r   s      r5   r   zForFromStatNode.nogil_check  sF    +t{DK8 	! 	!Av! !   	! 	!r4   c                     | j                             |           | j                            |           | j        r| j                            |           d S d S r   )rM  r  r   r   rd  r   s     r5   r   z$ForFromStatNode.analyse_declarations  s`    ..s333	&&s+++ 	711#66666	7 	7r4   c                    ddl m} | j                            |          | _        | j                            |          | _        | j                            |          | _        | j        Tt          | j        |j	                  rt          | j        j        dd           | j                            |          | _        |                     |           | j        j        }|j        s!|j        st!          | j        j        d           | j                            |          | _        | j        r| j                            |          | _        | S )Nr   rn  zdProbable infinite loop in for-from-by statement. Consider switching the directions of the relations.r&   z>for-from loop variable must be c numeric type or Python object)r   r  rM  ry   r  rw   r  r  rM   UnaryMinusNoder   r:   set_up_looprj  r|  rq  r   r   rx   rd  )r   r   r  rE  s       r5   rx   z#ForFromStatNode.analyse_expressions  s?   k66s;;k//44k//449 $)Y%=>> R	 (NOPR R R	//44DIk&' 	e;+A 	e$+/#cdddI11#66	 	I#/CCCHHDr4   c                    ddl m} | j        j        }|j        r|}n|j        rt          | j        j        d           |j        rt          j
        nt          j        }| j        j        j        st          j        || j        j                  }| j        j        j        st          j        || j        j                  }| j        0| j        j        j        st          j        || j        j                  }| j                            ||          | _        | j                            ||          | _        | j        j        s| j                            |          | _        | j        K| j                            ||          | _        | j        j        s| j                            |          | _        |j        s|j        rKd| _        t)          | j        |j                  rt-          | j        d          | j        | _        d | _        d S d| _        |                    | j        ||          }|| _        |                    |                              |          | _        d S )Nr   rn  zWInteger loops over enum values are fragile. Please cast to a safe integer type instead.FzEBuffer or memoryview slicing/indexing not allowed as for-loop target.T)r   r  rM  rj  rq  is_enumr   r:   r|  r
   c_long_typer	  r  widest_numeric_typer  r  r  r   r~  is_py_targetrM   BufferIndexNoder   loopvar_nodepy_loopvar_noder  r  r  )r   r   r  rE  	loop_typec_loopvar_nodes         r5   r  zForFromStatNode.set_up_loop  s>   k&! 	V#II" sqs s s2=2Id
..zOdI;#/ X&:9dkFVWW	;#/ X&:9dkFVWW	y$TY^-G$&:9dinUU	k++Is;;k++Is;;{% 	:+44S99DK9 	++Is;;DI9' : I44S99	! 
	_[%8 
	_ %D$+y'@AA oDH&mnnn $D#'D    $D&//)SIIN .D#,#6#6~#F#F#Y#YZ]#^#^D   r4   c                    |                     | j                   |                                }| j        }| j                            |           | j                            |           | j        | j                 \  }}| j	        A| j	                            |           | j	        
                                }|d         d|}nd}ddlm} t          | j        |j                  r| j                            |           t          | j        |j                  r| j                            |           | j        j        j        rt*          j        n| j        j        }|r#| j        s|j                            |d          }	n| j        
                                }	|j        r~|j        sw| j        d         dk    rf|                    d|	d	| j        
                                |d
|d|	d| j        d| j        
                                d
|d|	|d           n_|                    d|	d	| j        
                                |d|	d| j        d| j        
                                d|	|d           | j        }
|
#|r!|                    | j        j        ||	          }
|
0|
                    |           | j                            |
|           |                     | j                   | j!        "                    |           |#                    |j$                   |s(| j        r | j        j%        j&        rh|'                    | j        j        d           }|                    |           |(                    | j        j%        j)                  }| j        j%        j*        j+        r0|j,        -                    t]          j/        dd                     d}nV|j,        -                    t]          j/        dd                     d0                    | j        j%        j*        j1                  }|                    ||
                                ||2                    |
                                | j        j                  fz             |3                    |           n| j        }|4                    | j        j        || j        j%        j*                  }|	|_5        |6                    |           | j        j%        j&        rB|7                    |
                                |j                   |8                    |           |                    d           |sA| j        r:| j                            |           | j                            | j        |           |r!| j        s|j        9                    |	           |j:        }|;                    |           | j<        rD|                    d           | j<        "                    |           |                    d           |#                    |           | j        =                    |           | j        >                    |           | j        =                    |           | j        >                    |           t          | j        |j                  r| j        8                    |           t          | j        |j                  r| j        8                    |           | j	        6| j	        =                    |           | j	        >                    |           d S d S )Nr   rs  1r   rn  F>r  rF  z + r  rH   z; ) { rG  r  GetModuleGlobalNamerV  z%__Pyx_GetModuleGlobalName(%s, %s); %sGetNameInClassz$__Pyx_GetNameInClass(%s, {}, %s); %srp  rk  )?r,  r:   r  
from_ranger  r?  r  relation_table	relation1r  r   r   r  rM   r  r  r  r  rM  rj  r  r
   r  r  r'  r(  r  rg  	relation2rT   rN  rO  r  r   r  r  r  r  is_pyglobal
PyTempNoder  rn   r  r  r  r  r   r  rC  r  r*  r  CoerceFromPyTypeNode	temp_coder  r  r  r0  r  r  rd  r  rL  )r   rY   r  r  offsetincopr  r  loopvar_typeloopvar_namecoerced_loopvar_nodetarget_nodeinterned_cnamelookup_funcfrom_py_noder  s                   r5   r  z'ForFromStatNode.generate_execution_code  sE   dh..00_
,,T222,,T222+DN;9 I..t4449##%%D$Qxxx.EEDd');<< 	-&&t,,,d*I,>?? 	0 ))$///151A1I_z--t{O_ 	6d/ 	6>77eLLLL,3355L 	&|': 	&t~a?PTW?W?W JJJ""$$$fffddddnnndk.@.@.B.B.B.BDDDeee	% & & & & JJJ""$$$fffdnnndk.@.@.B.B.B.Beee	% & & &  $3'J'#,#=#=dko|]i#j#j + 99$???K001EtLLLdh'''	))$///t*+++ 	*d2 	* { , *'224;?DII$$T***!%!7!78I8N!O!O;$*: A$55#/0EGYZZ\ \ \"IKK$55#/0@BTUUW W W"H"O"O)/?#A #AK

;&&(("++K,>,>,@,@$+/RR*T T U U U ++D1111"k$99!&T[5F5LN NL%1L"--d333{ , * 2 2 4 4k6FGGG##D)))

3 	Md2 	M  99$???K001EtLLL 	6d/ 	6N''555&_--- 	JJ|$$$44T:::JJsOOO{###**4000t$$$**4000t$$$d');<< 	,%%d+++d*I,>?? 	/ ((...9 I,,T222I  &&&&& ! r4   )r   ++)z+1r	  )r   --)z-1r	  )z<=r  z>=r  c                 j   | j                             ||           | j                            ||           | j                            ||           | j        | j                            ||           | j                            ||           | j        | j                            ||           d S d S r   )rM  r  r  r  r  r   rd  r5  s      r5   r  z-ForFromStatNode.generate_function_definitionsD  s    11#t<<<11#t<<<11#t<<<9 I33C>>>	//T:::'::3EEEEE ('r4   c                 ^   | j                             |           | j                            |           | j                            |           | j        r| j                            |           | j                            |           | j        r| j                            |           d S d S r   )rM  r   r  r  r  r   rd  r   s     r5   r   zForFromStatNode.annotateN  s    T"""T"""T"""9 	%It$$$	4    	,%%d+++++	, 	,r4   )r-   r.   r/   r   r  r  r  r  r   r   r   rx   r  r  r  r  r   r3   r4   r5   r  r  i  s        $ POOKLLOJ:K! ! !
7 7 7  *$_ $_ $_Lp' p' p'h  NF F F, , , , ,r4   r  c                   :    e Zd ZdZg dZdZdZd Zd Zd Z	d Z
dS )WithStatNodea  
    Represents a Python with statement.

    Implemented by the WithTransform as follows:

        MGR = EXPR
        EXIT = MGR.__exit__
        VALUE = MGR.__enter__()
        EXC = True
        try:
            try:
                TARGET = VALUE  # optional
                BODY
            except:
                EXC = False
                if not EXIT(*EXCINFO):
                    raise
        finally:
            if EXC:
                EXIT(None, None, None)
            MGR = EXIT = VALUE = None
    )manager
enter_callrM  r   Nc                     | j                             |           | j                            |           | j                            |           d S r   )r	  r   r	  r   r   s     r5   r   z!WithStatNode.analyse_declarations{  sJ    ))#...,,S111	&&s+++++r4   c                    | j                             |          | _         | j         j        j        r-t                              |                               |          S | j                            |          | _        | j        r+ddl	m
}  || j        j        | j        j                  | _        | j                            |          | _        | S )Nr   )r  )r	  rw   rj  is_cython_lock_typeCythonLockStatNodefrom_withstatrx   r	  rM  r  r  r:   target_tempr   )r   r   r  s      r5   rx   z WithStatNode.analyse_expressions  s    |11#66<0 	S%33D99MMcRRR/77<<; 	S++++++'x(;T_=QRRDI11#66	r4   c                     | j                             ||           | j                            ||           | j                            ||           d S r   )r	  r  r	  r   r5  s      r5   r  z*WithStatNode.generate_function_definitions  sP    223===55c4@@@	//T:::::r4   c                    |                     | j                   |                    d           | j                            |           |j                            t          d          | _        |j	        
                    t          j        dd                     |                    | j        d| j                                        d|                    t          | j        rdnd	                    d
|                    | j        | j                             |                    | j        t                     |                                }|j        }| j                            |           | j        r| j                            |           | j                            |           |                    | j                                        d| j                                        d           | j                            |           n| j                            |           | j                            |           | j                            |           | j                            |           ||_        | j                            |           |                     |          r|!                                }|"                    |           |#                    |           |$                    | j        t                     |"                    |           |#                    |           |j        %                    | j                   |                    d           d S )Nz/*with:*/ {Fr#  PyObjectLookupSpecialrV  z  = __Pyx_PyObject_LookupSpecial(r   	__aexit____exit__r%  rF  rG  rp  )&r,  r:   rT   r	  r?  r'  r(  r   exit_varr  r  r   r  r  r  r   r  r*  r+  r  r  r	  rM  r	  r  rH  r   rK  r  rL  r   r  r  r  r  r  r/  r0  )r   rY   r  intermediate_error_labelstep_over_labels        r5   r  z$WithStatNode.generate_execution_code  s   dh

=!!!--d33344^PU4VV))#$;=OPP	R 	R 	R

MMML""$$$$""=1]S]#^#^____##DM48<<<	 	 	 	 	~666 ..00#'#3 00666; 	9 %%d+++O00666JJT%5%<%<%>%>%>%>@V@V@X@X@X@XYZZZO99$????O224888""4(((++D111%%%*	))$///??344 	,"nn..OMM/***NN3444!!$-@@@MM/***NN?+++##DM222

3r4   )r-   r.   r/   r   r   r	  r	  r   rx   r  r  r3   r4   r5   r	  r	  Y  sq         8 >==KJK, , ,

 
 
; ; ;
. . . . .r4   r	  c                   6    e Zd ZddgZdZdZd Zd Zd Zd Z	dS )WithTargetAssignmentStatNoderR  r  Nc                 :    | j                             |           d S r   r  r   s     r5   r   z1WithTargetAssignmentStatNode.analyse_declarations  r  r4   c                     | j                             |          | _         | j                             |           | j        j                            | j         j        |          | _        | S r   )r  ry   rv  	with_noder	  r  rj  rR  r   s     r5   rx   z0WithTargetAssignmentStatNode.analyse_expressions  sT    80055%%c***>-77sKKr4   c                     | j                             |           | j                            | j         |           | j        j                            |           d S r   )rR  r?  r  rO  r)	  r	  r  r   s     r5   r  z4WithTargetAssignmentStatNode.generate_execution_code  sQ    ))$///))$(D999"**400000r4   c                 n    | j                             |           | j                            |           d S r   r  r   s     r5   r   z%WithTargetAssignmentStatNode.annotate  r  r4   )
r-   r.   r/   r   r)	  rR  r   rx   r  r   r3   r4   r5   r&	  r&	    se         %.KI
C1 1 1  1 1 1
         r4   r&	  c                   J    e Zd Zg dZdZd Zd Zej        Z	dZ
d Zd Zd Zd	S )
TryExceptStatNode)r   except_clausesrd  Fc                     | j                             |           | j        D ]}|                    |           | j        r| j                            |           d S d S r   )r   r   r.	  rd  )r   r   except_clauses      r5   r   z&TryExceptStatNode.analyse_declarations  ss    	&&s+++!0 	4 	4M..s3333 	711#66666	7 	7r4   c                 T   | j                             |          | _         d}t          | j                  D ]D\  }}|                    |          x}| j        |<   |rt	          |j        d           |j        sd}E|| _        | j        r| j                            |          | _        | S )Nr   zdefault 'except:' must be lastr   )	r   rx   r  r.	  r   r:   patternhas_default_clauserd  )r   r   default_clause_seenr  r0	  s        r5   rx   z%TryExceptStatNode.analyse_expressions  s    I11#66	 )$*= > > 	( 	(A}5B5V5VWZ5[5[[MD/2" Km')IJJJ ( (&'#"5 	I#/CCCHHDr4   zTry-except statementc                 
                        | j                                       d           j        }j        }j        }                                }j        }                    d          }                    d          }                    d          }	                    d          }
|r                    d          nd }|r                    d          nd }                    d          }fd	t          d
          D             
                                }                    d           |
_        |_        |_        | j                                                            | j        d                               d           j                                        }                    |          }|rj                            t$                     | j        s*|                    d           |                    d           |                    dd                    d D                       z             D ]}|                    |t,                     fd}n:d D             }|                    dd                    |          z             d }|_        |	_        | j        j        }| j        rq                     | j        j                                       d           | j                                                           d           |s| j        j        }|r|s5D ]}                    |t,                                         |                               |           |D ]\  }}                    ||                                           r                                 j        j        }| j        _        | j        D ]}|                     |           |j        _        | j!        s                    |           "                    ||||
|	g|||||g|s                    |          s|nd | j        d          }|D ]}|r
 |                                 |          rM|s*                    |          s                    |                               |           |r
 |                                 |          r                    |                               d           D ]}j        #                    |           |_        |_        |_        |_        d S )Nr  exception_handledexcept_errorexcept_return
try_return	try_breaktry_continuetry_endc                 P    g | ]"}j                             t          d           #S r`  r'  r(  r   r   r  rY   s     r5   r   z=TryExceptStatNode.generate_execution_code.<locals>.<listcomp>   s;     , , , 55neLL , , ,r4   r   
/*try:*/ {Fru  rp  r  r  z__Pyx_ExceptionSave(%s);r   c                     g | ]}d |z  S )r  r3   rb  s     r5   r   z=TryExceptStatNode.generate_execution_code.<locals>.<listcomp>,   s    @@@353;@@@r4   c                      D ]}                      | t                                         dd                              z             d S )Nz__Pyx_ExceptionReset(%s);r   )r  r   rT   r   )rn   rY   exc_save_varss    r5   restore_saved_exceptionzJTryExceptStatNode.generate_execution_code.<locals>.restore_saved_exception0   sb    ) < <D%%dN;;;;

699]334 5 5 5 5 5r4   c                     g | ]}d |z  S )z	(void)%s;r3   rb  s     r5   r   z=TryExceptStatNode.generate_execution_code.<locals>.<listcomp>8   s    IIICkC/IIIr4   z%s /* mark used */rH   c                      d S r   r3   r3   r4   r5   rD	  zJTryExceptStatNode.generate_execution_code.<locals>.restore_saved_exception;   s    r4   z/*else:*/ {)r  r:   rv  )$r,  r:   rT   r  r  r  r  r  r  r  rP   r   r  r'  all_free_managed_tempsr  r  r  reset_exception_utility_coder*  r   put_xgotrefr   r   rd  r=  r  r  r  r  current_exceptr.	  generate_handling_coder3	  r  r0  )r   rY   old_return_labelold_break_labelold_continue_labelr  r  except_end_labelexcept_error_labelexcept_return_labeltry_return_labeltry_break_labeltry_continue_labeltry_end_labelsave_exctemps_to_clean_up	can_raiserG  rD	  mark_vars_usednormal_case_terminates	temp_name	temp_typeouter_exceptr0	  r  r  r  rC	  s    `                          @r5   r  z)TryExceptStatNode.generate_execution_code   s!   dh

3,*!0..00*>>*=>>!^^N;;"nn_==>>,779HR$..555d?Q[T^^N;;;W[y11, , , ,"'((, , ,''))

	 	 	,*0	))$///dhe,,,

	 	 	 NAACCOOO44	 	--.JKKK$ =<===;<<<NN5		@@-@@@AAC D D D$ : :$$S.99995 5 5 5 5 5 5 JI=IIINNN/#((>2J2JJKKK   ./!%!8 	HMM$*.///JJ  44T:::JJ  ) H)-)9)G& 	2) -( @ @C**3????m,,,NN?+++(9 = =$	9&&y)<<<<   744666>8L,0DN)!%!4 M M44T;KLLLL,8DN)* 20111112DFVXklo/ACSUef/Evdoo^kNlNlv--rv 2 
 
 " 	* 	*A *'')))??+,, 	*) -$//-2P2P -m,,,NN+,,, *'')))??=)) 	*NN=)))

3" 	/ 	/EN''....,*0*r4   c                     | j                             ||           | j        D ]}|                    ||           | j        | j                            ||           d S d S r   )r   r  r.	  rd  )r   r   rY   r0	  s       r5   r  z/TryExceptStatNode.generate_function_definitions   sw    	//T:::!0 	C 	CM77TBBBB'::3EEEEE ('r4   c                     | j                             |           | j        D ]}|                    |           | j        r| j                            |           d S d S r   )r   r   r.	  rd  )r   rY   except_nodes      r5   r   zTryExceptStatNode.annotate   ss    	4   . 	' 	'K  &&&& 	,%%d+++++	, 	,r4   N)r-   r.   r/   r   r*  r   rx   r   r   r   r   r  r  r   r3   r4   r5   r-	  r-	    s         <;;KL7 7 7   .K(Kx+ x+ x+tF F F, , , , ,r4   r-	  c                   F    e Zd Zg dZdZdZdZd Zd Zd Z	d Z
d Zd	 ZdS )
ExceptClauseNode)r2	  rM  r   r.  NFc                 |    | j         r| j                             |           | j                            |           d S r   )rM  r  r   r   r   s     r5   r   z%ExceptClauseNode.analyse_declarations   s>    ; 	8K223777	&&s+++++r4   c                    |j         | _        | j        rLt          | j                  D ]7\  }}|                    |          }|                    |          | j        |<   8| j        rJddlm} |	                    | j
                  | _        | j                            || j                  | _        | j                            |          | _        | S r  )r  r  r2	  r  rx   r  rM  r   r  ExcValueNoder:   r.  r  r   )r   r   r  r2	  r  s        r5   rx   z$ExceptClauseNode.analyse_expressions   s     /< 	B'55 B B
7!55c::")"<"<S"A"AQ; 	U######&33DH==DN+??T^TTDKI11#66	r4   c                    | j         }t          |t                    r=|j        D ]3}t          |t                    rt          |t
                    r|} n dS dS t          |t
                    r|j        }||j        rdS dS )NTF)r   rM   r  r  rD  ry  r   r   )r   r   rX   r   s       r5   body_may_need_exceptionz(ExceptClauseNode.body_may_need_exception   s    ydL)) 	
 
 
dL11  n55  DE44 udN++ 	JE} 0}u tr4   c           	                               | j                   | j        rEt          d | j        D                        }|rvfdt	          d          D             }j                            t          j        dd                     	                    dt          |          z             |d         nd x}| j        D ]}|                               d | j        D             }g }rj                            t          j        d	d
                     t          |          dk    r,|                    dd|d         d|d         d           n|                    fd|D                        nt          |          dk    rVj                            t          j        d	d
                     |                    d|d         d|d         d           nLj                            t          j        dd                     |                    d |D                        j                            t"          j        d          }	                    |dd                    |          d           | j        D ],}|                               |                               -|rv	                    dt          |          z             	                    d                    d |D                                  |D ]}	j                            |	           	                    d|z             j                            |           n	                    d                                           }
| j        d up| j        d up|                                 }|s|
r                    | j                   |
r                    | j                   |rj                            t<                     fdt	          d          D             }dt          |          z  }	                    d |d!                    | j                             |D ]}                     |tB                     nBj                            t          j        dd                     	                    d"           |
r	                    d#           | j        rZ| j"        #                    |d                    | j"                                       | j        $                    | j"                   | j        5tK          || j        j&                  D ]\  }}|#                    |           '                    d$          }|rj        j(        }|j        _(        | j)        *                               |r|j        _(        | j)        j+        s7|r |D ]},                    |tB                     -                    |           |r.                    /                                |          D ]e}0                    |d         tB                     0                    |d         tB                     ,                    |d         tB                     f|D ]}	j                            |	           1                    |           	                    d%           d S )&Nc              3   v   K   | ]4}|j         p(|                                o|                                 V  5d S r   )r   	is_simplerK  r   r2	  s     r5   r=  z:ExceptClauseNode.generate_handling_code.<locals>.<genexpr>   s^       '- '- "Zg&7&7&9&9&Z'BXBXBZBZ>Z'- '- '- '- '- '-r4   c                 R    g | ]#}j                             t          d           $S Tr#  r>	  r?	  s     r5   r   z;ExceptClauseNode.generate_handling_code.<locals>.<listcomp>   s?     / / / ! !N88TX8YY / / /r4   r   PyErrFetchRestorerQ  z__Pyx_ErrFetch(&%s, &%s, &%s);r   c                 6    g | ]}|                                 S r3   )r  rk	  s     r5   r   z;ExceptClauseNode.generate_handling_code.<locals>.<listcomp>   s$    HHH))++HHHr4   FastTypeChecksModuleSetupCode.cr&   z#__Pyx_PyErr_GivenExceptionMatches2(r   r   rj  c              3   *   K   | ]}d d|dV  dS )z"__Pyx_PyErr_GivenExceptionMatches(r   rj  Nr3   )r   r2	  r-  s     r5   r=  z:ExceptClauseNode.generate_handling_code.<locals>.<genexpr>   sK       % %#G HPxxQXQXQXY% % % % % %r4   z__Pyx_PyErr_ExceptionMatches2(PyErrExceptionMatchesc              3       K   | ]	}d |z  V  
dS )z __Pyx_PyErr_ExceptionMatches(%s)Nr3   rk	  s     r5   r=  z:ExceptClauseNode.generate_handling_code.<locals>.<genexpr>   s;       ! ! 7@! ! ! ! ! !r4   Fr#  rF  z || rG  __Pyx_ErrRestore(%s, %s, %s);rH   c                     g | ]}d |z  S %s = 0;r3   rb  s     r5   r   z;ExceptClauseNode.generate_handling_code.<locals>.<listcomp>!  s    $I$I$IY_$I$I$Ir4   r  z/*except:*/ {c                 R    g | ]#}j                             t          d           $S rm	  r>	  r?	  s     r5   r   z;ExceptClauseNode.generate_handling_code.<locals>.<listcomp>(!  s?     + + + 44^PT4UU + + +r4   z&%s, &%s, &%szif (__Pyx_GetException(r&  z__Pyx_ErrRestore(0,0,0);z__Pyx_TraceExceptionDone();except_rp  )2r,  r:   r2	  rA  r  r  r  r   r  rT   r  r?  rL   r  extendr'  r(  r
   r	  r   r  rL  r0  r  rM  excinfo_targetrg	  r  r  put_trace_exception_handledget_exception_utility_coder.  rI	  r   r.  set_varrO  rR  rV   r  rT  r   r  r   r=  r  r  get_loop_labelsr/  r  )r   rY   r  has_non_literalsrT  r2	  patterns	exc_tests
match_flagr1  r  needs_exceptionexc_argsrG  tempvarrX   r  old_exc_varsr  r-  s    `                 @r5   rK	  z'ExceptClauseNode.generate_handling_code   s   dh< ?	(#& '- '-#|'- '- '- $- $-  -   +/ / / /%*1XX/ / / 11+2IJ]_m2n2nooo

;eHooMNNN#A;&**8< 7 7006666HH4<HHHHI  11+,<>QRRT T Tx==A%%$$$ (1+++x{{{&     $$ % % % %'/% % %     X!## 11+,<>QRRT T T   QKKK!"      11+,C^TTV V V   ! !#+! ! !   
 55j6KX]5^^JJJZZZY1G1G1G1GHIII< ) )..t444""4(((( 6

:U8__LMMM

388$I$I$I$I$IJJKKK$ 6 6DN//5555JJ      N''
3333JJ'''//##Kt# +t++((** 	  	7g 	7""4#5666 	7,,TX666 	3 --.HIII+ + + +!&q+ + +H&x8HJJJ$//$(3335 6 6 6 6 6  n55556 --k.EFY[i.j.jkkkJJ1222 	6JJ4555; 	GN""8A;///N33D999K00FFF*!$Xt/B/G!H!H & &W%%%%..y99 	/>2L&.DN#	))$/// 	3&2DN#y& 	% @# @ @C **3????MM)$$$ 	2++D,@,@,B,BOTT D D%%hqk>BBB%%hqk>BBB&&x{NCCCC  2 2++D1111_---

	 	 	 	 	r4   c                     | j         | j                             ||           | j                            ||           d S r   )rM  r  r   r5  s      r5   r  z.ExceptClauseNode.generate_function_definitionsa!  s@    ;"K55c4@@@	//T:::::r4   c                     | j         r| j         D ]}|                    |           | j        r| j                            |           | j                            |           d S r   )r2	  r   rM  r   )r   rY   r2	  s      r5   r   zExceptClauseNode.annotatef!  sp    < 	'< ' '  &&&&; 	'K  &&&	4     r4   )r-   r.   r/   r   r.  r|	  is_except_asr   rx   rg	  rK	  r  r   r3   r4   r5   rb	  rb	     s        " =<<KINL, , ,
     0M M M^; ; ;
! ! ! ! !r4   rb	  c                       e Zd Zg dZdZdZdZdZdZdZ	e
d             Zd Zd Zej        Zd	Zd
 Zd Z	 ddZddZd Zd ZdS )TryFinallyStatNode)r   finally_clausefinally_except_clauser   TNFc                 *    t          | ||          }|S )Nr   r	  )r	  )r:   r   r   r	  rX   s        r5   r  z"TryFinallyStatNode.create_analysed!  s    !#DPPPr4   c                     | j                             |           t          j        | j                  | _        | j                            |           | j                            |           d S r   )r   r   r   deepcopyr	  r	  r   s     r5   r   z'TryFinallyStatNode.analyse_declarations!  sa    	&&s+++%)]43F%G%G""77<<<0055555r4   c                     | j                             |          | _         | j                            |          | _        | j                            |          | _        |j        r|j        j        s|j        | _        | S r   )r   rx   r	  r	  r  re  func_return_typer   s     r5   rx   z&TryFinallyStatNode.analyse_expressions!  sq    I11#66	"1EEcJJ%)%?%S%STW%X%X"? 	43?#: 	4$'OD!r4   zTry-finally statementc                                           j                                       d           j        }                                }                                }j        } j        s|_                                        } j        	                                                   d           j
                                        }                      j        j                                       d                               |            j        gf fd	} j        o                    |          }	 j        j         }
 j        j        sh                    d            |            	                                j        j        s                    |                               d           |	r                    |                               d            j        s                    d            j        r                                 |
rst-          fdt/          d	          D                       }j
                            t3          j        t3          j        t2          j                            d
          }nd x}}t-          fdt/          d          D                       }                                r.                                                      j                                         ||||                                           }                    d           j
        j!        }|d d         j
        _!         j"        	                               |j
        _!                            d           |
r #                    |||           |r|D ]}j
        $                    |           |rj
        $                    |                                           r%                     j        d                               |           &                                                    |          D ]} '                    |           |D ]}j
        $                    |                               d                               |           j(        }d}tS          tU          ||                    D ]\  }\  }}                    |          s||k    r|	r(                    d|z             d }||k    r j        j        s j+        r j        stY           j        tZ                    stj
                             j+        d
          }                    |dt\          j/        d            j+        j0        r"                    dt\          j/        z              |            	                               ||k    re|rc                    t\          j/        d|d            j+        j0        r                    d|z             j
        $                    |            j        j        s                    |                               d                               |                               d           d S )Nr@	  rp  z/*finally:*/ {c                 b    | d         }t          j        |          }|j        u r|| d<   n|}|S rO  )r   r	  r	  )_nextrX   	node_copyr   s      r5   fresh_finally_clausezHTryFinallyStatNode.generate_execution_code.<locals>.fresh_finally_clause!  s>    8Dd++It***$a Kr4   z/*normal exit:*/{z/*exception exit:*/{r  c                 \    g | ](}j                             t          j        d           )S Fr#  )r'  r(  r
   r	  r?	  s     r5   r   z>TryFinallyStatNode.generate_execution_code.<locals>.<listcomp>!  sB     +' +' +' N001FSX0YY+' +' +'r4   r&   Fr#  c                 R    g | ]#}j                             t          d           $S r	  r>	  r?	  s     r5   r   z>TryFinallyStatNode.generate_execution_code.<locals>.<listcomp>!  s>     # # # ,,^,NN# # #r4      r  r   TrR  r3   z%s: {rF  rG  rx	  )1r,  r:   rT   r  all_new_labelsget_all_labelshandle_error_caser  r   r  r'  rG	  r	  set_all_labelspreserve_exceptionr  r   r  r  r*  is_try_finally_in_nogilr|  r  r  r(  r
   CPtrTyper  r  r  r  r}	  put_error_catcherrT  r	  put_error_uncatcherr0  rU  r  put_error_cleanerr  r  rR  r	  rM   GILExitNoder	   r  r|  )r   rY   r  
old_labels
new_labelsr  catch_labelrW	  r	  preserve_errorneeds_success_cleanupexc_lineno_cnamesexc_filename_cnamerT  finally_old_labelsr	  r  r  r  r  r  	old_labelret_temps   ``                     r5   r  z*TryFinallyStatNode.generate_execution_code!  s7   dh

<   *((**
((**
*% 	/.Dnn&&	))$///

3 NAACCd)-...

#$$$ 	J'''(,(;'< 	 	 	 	 	 	 0UT___5U5U$($7$E Ey& 	JJ*+++  ""::4@@@&4 +k***JJsOOO 2	NN?+++JJ-...$ :

8999+ (%%'''$ >$) +' +' +' +'"1XX+' +' +' %( %(! &*^%A%A'
(?
@V(W(WXX$ &B && &&"" :>=!$6 # # # #q# # # $ $H    ;4466600:::""'3DFXZ Z Z!%!4!4!6!6JJsOOO>2L&.rrlDN#&>>tDDD&2DN#JJsOOO$ 	/((x9JL^___$ ;!2 ; ;33E::::% DN//0BCCC??$$ E,,TXt,DDDo...++D,?,?,A,ACUVV 7 7&&tX6666! 3 3++E2222JJsOOOJ'''( *33z:3N3N)O)O 	 	%A%	9??9-- O+++JJw*+++HL((*8 	H- H $ <H *4+> L LH $(>#?#? 1e $@ $E $E

6;N;N;N#OPPP0< H JJy63F'FGGG  ""::4@@@L(( :JJV-@-@-@(((KLLL,8 9

9x#7888N//999&4 )i(((JJsOOOO 	{###

	 	 	 	 	r4   c                     | j                             ||           | j                            ||           | j        r| j                            ||           d S d S r   )r   r  r	  r	  r5  s      r5   r  z0TryFinallyStatNode.generate_function_definitions)"  sj    	//T:::99#tDDD% 	P&DDS$OOOOO	P 	Pr4   c                 j   |j                             t                     |j                             t                     |j                             t                     | j        r|                    d           |                    d           |                    d                    d |D                                  |D ]\  }}|	                    ||           |                    d|dd          z             |                    d|d d         d	z  z             |D ]}|
                    |t                     |rQ|                    |d
         dt          j        d|d         dt          j        d|dt          j        d           | j        r|                                 d S d S )NFr{  r  rH   c                     g | ]}d |z  S rw	  r3   rb  s     r5   r   z8TryFinallyStatNode.put_error_catcher.<locals>.<listcomp>9"      AAAY_AAAr4   z$ __Pyx_ExceptionSwap(&%s, &%s, &%s);r   zTif ( unlikely(__Pyx_GetException(&%s, &%s, &%s) < 0)) __Pyx_ErrFetch(&%s, &%s, &%s);r&   r   rF  r  r   rG  )r  r  r  r~	  swap_exception_utility_coder	  r}  rT   r   r=  rI	  r   r	   lineno_cnameclineno_cnamefilename_cnamer  )	r   rY   rW	  rT  r	  r	  r[	  rj  rG  s	            r5   r	  z$TryFinallyStatNode.put_error_catcher/"  s   ))*HIII))*DEEE))*EFFF' 	8777

/000

388AAAAABBCCC0 	4 	4OIt""9d3333 	

9HQRRLHIII

 4 8@|a7G	I 	J 	J 	J
  	2 	2CS.1111 	<JJ!!$$$f&9&9&9!!$$$f&:&:&:"""F$9$9$9; < < <
 ' 	+((*****	+ 	+r4   c                 J   |j                             t                     |j                             t                     | j        r+|                    d           |                    d           |dd          D ]}|                    |t                     |                    d|dd          z             |d d         D ]}|                    |t                     |                    d|d d         z             | j        r|	                                 |                    d
                    d |D                                  |rS|                    t          j        d	|d
         dt          j        d	|d         dt          j        d	|d           d S d S )NFr{  r  r   !__Pyx_ExceptionReset(%s, %s, %s);ru	  rH   c                     g | ]}d |z  S rw	  r3   rb  s     r5   r   z:TryFinallyStatNode.put_error_uncatcher.<locals>.<listcomp>e"  r	  r4   rF  r   r  r   rG  )r  r  r  rH	  r	  r}  rT   r  r   r  r   r	   r	  r	  r	  )r   rY   rT  r	  r	  rG  s         r5   r	  z&TryFinallyStatNode.put_error_uncatcherP"  s   ))*HIII))*FGGG' 	5777JJ3444 ABB< 	3 	3Cc>2222

6!""EFFFBQB< 	3 	3Cc>2222

2Xbqb\ABBB' 	+((***

388AAAAABBCCC 	<JJ###%6q%9%9%9$$$&7&:&:&:%%%'9'9'9; < < < < <	< 	<r4   c                 ,   |j                             t                     | j        r+|                    d           |                    d           |dd          D ]}|                    |t                     |                    d|dd          z             |d d         D ]}|                    |t                     | j        r|	                                 |                    d
                    dgdz            |dd          z             d S )NFr{  r  r   r	  rH   rx	  )r  r  rH	  r	  r}  rT   r  r   r=  r  r   )r   rY   rT  rG  s       r5   r	  z$TryFinallyStatNode.put_error_cleanerl"  s%   ))*FGGG' 	5777JJ3444 ABB< 	3 	3Cc>2222

6!""EFFFBQB< 	8 	8C""37777' 	+((***

388YKM**Xabb\9:::::r4   c                 n    | j                             |           | j                            |           d S r   )r   r   r	  r   s     r5   r   zTryFinallyStatNode.annotate~"  s5    	4   $$T*****r4   )NN)r-   r.   r/   r   r	  r	  r	  r	  r	  r*  r1  r  r   rx   r   r   r   r   r  r  r	  r	  r	  r   r3   r4   r5   r	  r	  o!  s         FEEK  #L  \6 6 6   .K)KH H HTP P P FJ+ + + +B< < < <8; ; ;$+ + + + +r4   r	  c                       e Zd ZdZdZdZdS )NogilTryFinallyStatNodezJ
    A try/finally statement that may be used in nogil code sections.
    FN)r-   r.   r/   r   r	  r   r3   r4   r5   r	  r	  "  s%          KKKr4   r	  c                   V     e Zd Zdgej        z   ZdZdZd	dZd Z fdZ	d Z
d Z xZS )
GILStatNoderX  NTc           
          || _         || _        |                     |||           t                              | ||t          ||| j                             d S )N)state
state_tempr	  )r	  rX  create_state_temp_if_neededr	  r   r	  r	  )r   r:   r	  r   rX  s        r5   r   zGILStatNode.__init__"  sr    
"((eT:::###&5T_> > > 	$ 	? 	? 	? 	? 	?r4   c                     ddl m}  |            }|                    |           |j        sd S |dk    rt          j        }nt          j        }ddlm} |	                    ||          | _
        d S )Nr   YieldNodeCollectorgilrn  )ParseTreeTransformsr	  visitchildrenyieldsr
   c_gilstate_typec_threadstate_ptr_typer   r  r  r	  )r   r:   r	  r   r	  	collectorr\	  r  s           r5   r	  z'GILStatNode.create_state_temp_if_needed"  s    ;;;;;;&&((	%%% 	FE>>"2II"9I#,,S)<<r4   c                     | j         dk    |_        | j         dk    rd|_        | j        | j                            |           t                                          |          S )Nr	  T)r	  _in_with_gil_blockhas_with_gil_blockrX  r   rk   r  s     r5   r   z GILStatNode.analyse_declarations"  s]    "&*"5:%)C">%N//444ww++C000r4   c                    |                     t          j        dd                     | j        | j                            |          | _        |j        }| j        dk    |_        t                              | |          }||_        |S )NForceInitThreadsrq	  r  )r  r   r  rX  rx   r  r	  r	  )r   r   	was_nogilrX   s       r5   rx   zGILStatNode.analyse_expressions"  s    #$68KLL	N 	N 	N >%!^??DDDNI	J')	!55dC@@	r4   c                 Z   |                     | j                   |                                 | j        r4| j                            |           | j                                        }nd }|j        j        }| j        dk    r#|	                    |           d|j        _        n)|
                    || j                    d|j        _        t                              | |           | j        r| j                            |           ||j        _        |                                 d S )Nr	  )variableT)r	  unknown_gil_stateF)r,  r:   begin_blockr	  r  r   r'  r  r	  r}  put_release_gilscope_gil_state_knownr	  r  r  	end_block)r   rY   r	  old_gil_configs       r5   r  z#GILStatNode.generate_execution_code"  s   dh? 	O$$T***--//HHH1:222'+DN$$  ($JdFd eee',DN$224>>>? 	*O##D)))#1 r4   r   )r-   r.   r/   r	  r   r	  r	  r   r	  r   rx   r  rs   rt   s   @r5   r	  r	  "  s         -"9"EEKJ ? ? ? ?= = =1 1 1 1 1        r4   r	  c                   *    e Zd ZdZg ZdZdZd Zd ZdS )r	  a  
    Used as the 'finally' block in a GILStatNode

    state   string   'gil' or 'nogil'
    #   scope_gil_state_known  bool  For nogil functions this can be False, since they can also be run with gil
    #                           set to False by GilCheck transform
    NTc                     | S r   r3   r   s     r5   rx   zGILExitNode.analyse_expressions"  r  r4   c                     | j         r| j                                         }nd }| j        dk    r|                    |           d S |                    || j                    d S )Nr	  )r	  )r	  r   r	  r  put_acquire_gilr	  )r   rY   r	  s      r5   r  z#GILExitNode.generate_execution_code"  sr    ? 	--//HHH:((22222  A[=[ \\\\\r4   )	r-   r.   r/   r   r   r	  r	  rx   r  r3   r4   r5   r	  r	  "  sS          KJ   	] 	] 	] 	] 	]r4   r	  c                       e Zd ZdZd ZdS )EnsureGILNodezI
    Ensure the GIL in nogil functions for cleanup before returning.
    c                 2    |                     d           d S )NFr{  )r}  r   s     r5   r  z%EnsureGILNode.generate_execution_code#  s    U33333r4   N)r-   r.   r/   r   r  r3   r4   r5   r	  r	  "  s-         4 4 4 4 4r4   r	  c                   j     e Zd ZdZdgej        z   ZdZdZdZ fdZ	d Z
 fdZ fdZd	 Zd
 Z xZS )CriticalSectionStatNodez
    Represents a freethreading Python critical section.
    In non-freethreading Python, this is a no-op.

    args    list of ExprNode    1 or 2 elements, must be object
    rV   NFc                   t          |          dk    rt          j        | _        nt          j        | _        |                     ||            t                      j        |f||t          |t          |          |           d| d S )Nr   )rL   critical_section)rV   r   r	  )	rL   r
   c_py_critical_section2_typevar_typec_py_critical_section_typer	  rk   r   CriticalSectionExitNode)r   r:   rV   r   rW   rO   s        r5   r   z CriticalSectionStatNode.__init__#  s    t99q==&BDMM&ADM((d333	
2TT; ; ;		
 	
 	
 	
 	
 	
 	
r4   c                     ddl m}  |            }|                    |           |j        sd S ddlm} |                    || j                  | _        d S )Nr   r	  rn  )	r	  r	  r	  r	  r   r  r  r	  r	  )r   r:   r   r	  r	  r  s         r5   r	  z3CriticalSectionStatNode.create_state_temp_if_needed$#  su    ;;;;;;&&((	%%% 	F#,,S$-@@r4   c                     | j         D ]}|                    |           t                                          |          S r   )rV   r   rk   )r   r   r  rO   s      r5   r   z,CriticalSectionStatNode.analyse_declarations.#  sC    9 	* 	*C$$S))))ww++C000r4   c                     t          | j                  D ]X\  }}|                    |                              |          }|j        j        st          |j        d           || j        |<   Yt                                          |          S )Nz<Arguments to cython.critical_section must be Python objects.)	r  rV   rx   r~  rj  r|  r   r:   rk   )r   r   r  r  rO   s       r5   rx   z+CriticalSectionStatNode.analyse_expressions3#  s    	** 	 	FAs ))#..==cBBC 8' GR   DIaLLww**3///r4   c           
         |j                             t          j        dd                     |                    | j                   |                                 | j        r4| j                            |           | j        	                                }n<t          j        }|                    | j                            |           d           | j        D ]}|                    |           d | j        D             }|                    dt#          |           d| dd                    |           d           t&                              | |           | j        D ],}|                    |           |                    |           -| j        r| j                            |           |                                 d S )	NCriticalSectionsrq	  rG  c                 <    g | ]}d |                                  S )z(PyObject*))r   rp  s     r5   r   zCCriticalSectionStatNode.generate_execution_code.<locals>.<listcomp>U#  s)    DDD#-szz||--DDDr4   __Pyx_PyCriticalSection_Begin(&r   rq  )r  r  r   r  r,  r:   r	  r	  r  r   r	   critical_section_variablerT   r	  rf  rV   r?  rL   r   r	  r  r  rL  r  r	  )r   rY   r	  r  rV   s        r5   r  z/CriticalSectionStatNode.generate_execution_codeF#  s   ))#$68KLL	N 	N 	N 	dh? 	GO$$T***--//HH7HJJ$-88BBEEEFFF9 	/ 	/C((....DDDDD

XCIIXXXXTYYt__XXX	
 	
 	
 	224>>>9 	! 	!C&&t,,,NN4    ? 	*O##D)))r4   c                 0    t          | j        d           d S )Nz!Critical sections require the GIL)r   r:   r   s     r5   r   z#CriticalSectionStatNode.nogil_checke#  s    dh;<<<<<r4   )r-   r.   r/   r   r	  r   r	  r	  r	  r   r	  r   rx   r  r   rs   rt   s   @r5   r	  r	  #  s          (/;;KHJ
 
 
 
 
"A A A1 1 1 1 1
0 0 0 0 0&  >= = = = = = =r4   r	  c                   (    e Zd ZdZg Zd Zd Zd ZdS )r	  zG
    critical_section - the CriticalSectionStatNode that owns this
    c                     | S r   r3   )r   memos     r5   __deepcopy__z$CriticalSectionExitNode.__deepcopy__o#  s	    
 r4   c                     | S r   r3   r   s     r5   rx   z+CriticalSectionExitNode.analyse_expressionsv#  r  r4   c                     | j         j        r| j         j                                        }nt          j        }|                    d| j         d| d           d S )N__Pyx_PyCriticalSection_Endr	  rq  )r	  r	  r   r	   r	  rT   rL   )r   rY   variable_names      r5   r  z/CriticalSectionExitNode.generate_execution_codey#  si     + 	> 1<CCEEMM#=M

G$(GGmGGG	
 	
 	
 	
 	
r4   N)r-   r.   r/   r   r   r	  rx   r  r3   r4   r5   r	  r	  i#  sR          K    
 
 
 
 
r4   r	  c                   p     e Zd ZdZdgej        z   ZdZdZdZe	d             Z
d Z fdZ fdZd	 Z xZS )
r	  z
    Represents
        with l:
            ...
    where l in a cython.pymutex or cython.pythread_type_lock.

    arg    ExprNode
    r  NFc                    ddl m} t          |j        t                    sJ t          |j        j        t
                    sJ  | |j        |j        |j        j        j        t          |j                  |	                    |j        t          j        |j        j                                      }||j        _        |j        |_        |S )Nr   rn  )r  r   r	  	lock_temp)r   r  rM   r   r	  r-	  r:   r	  CythonLockExitNoder  r
   r	  rj  r	  lock_stat_noder	  )rm   rX   r  r   s       r5   r	  z CythonLockStatNode.from_withstat#  s    $)%788888$).*;<<<<<H$/  "**48Z5HIZ5[5[\\
 
 
 06,'-'<$r4   c                    ddl m}  |            }|                    | j                   |j        rM| j        j                            d                                          }t          | j
        d| d           d S d S )Nr   r	  Tr`  z&Cannot use a 'with' statement with a 'zy' in a generator. If you really want to do this (and you are confident that there are no deadlocks) then use try-finally.)r	  r	  r	  r   r	  r  rj  r.  stripr   r:   )r   r	  r	  typenames       r5   check_for_yieldsz#CythonLockStatNode.check_for_yields#  s    ;;;;;;&&((		*** 
	 x};;$;GGMMOOH( ( ( (    
	 
	r4   c                 z    | j                             |           t                                          |          S r   )r  r   rk   r  s     r5   r   z'CythonLockStatNode.analyse_declarations#  s1    %%c***ww++C000r4   c                    | j                             |          | _         |                                  | j        }t	          |t
                    r%t          |j                  dk    r|j        d         }t	          |t                    rW|j	        dk    rL| j         j
                            d                                          }t          |j        d| dd           t                                          |          S )	Nr   r   r	  Tr
  zAcquiring the GIL inside a z: lock. To avoid potential deadlocks acquire the GIL first.r&   )r  rx   r
  r   rM   r  rL   r  r	  r	  rj  r.  r	
  r   r:   rk   )r   r   r   	type_namerO   s       r5   rx   z&CythonLockStatNode.analyse_expressions#  s    8//44ydL)) 	!c$*oo.B.B:a=DdK(( 	TZ5-@-@<<4<HHNNPPIFi F F F	  
 ww**3///r4   c           	         |j                             | j        j                                                   |                    | j                   |                                 | j        	                    |           | j        
                                }| j                            |           |                    | d| j        
                                 d           | j        t          j        k    rd}n| j        t          j        k    rd}nd}|                    d| j        j        j         d| d| d	           t$                              | |           | j                            |           | j                            |           | j                            |           |                                 d S )
Nr  rG  Nogilr   Gil__Pyx_Locks__Lockz(*rq  )r  r  r  rj  get_utility_coder,  r:   r	  r
  r  r   r?  rT   r   r,   r1   r2   
cname_partr	  r  r  rL  r  r	  )r   rY   r[	  gil_strs       r5   r  z*CythonLockStatNode.generate_execution_code#  s   ))$(-*H*H*J*JKKKdh%%%N))++	))$///

i99TX__%6%6999::: J$444GG"j&;;;GGG

Y$(-":YYYYIYYYZZZ224>>>''---D!!!t$$$r4   )r-   r.   r/   r   r	  r   r
  r	  r   r  r	  r
  r   rx   r  rs   rt   s   @r5   r	  r	  #  s          '.::KIK  [$   1 1 1 1 10 0 0 0 0       r4   r	  c                   "    e Zd ZdZg Zd Zd ZdS )r
  zI
    lock_stat_node   CythonLockStatNode   the associated with block
    c                     | S r   r3   r   s     r5   rx   z&CythonLockExitNode.analyse_expressions#  r  r4   c                     | j         j        j        j        }|                    d| d| j         j                                         d           d S )Nr
  z	_Unlock(*rq  )r
  r  rj  r
  rT   r
  r   )r   rY   r
  s      r5   r  z*CythonLockExitNode.generate_execution_code#  sQ    (,1<


a*aat7J7T7[7[7]7]aaabbbbbr4   N)r-   r.   r/   r   r   rx   r  r3   r4   r5   r
  r
  #  sH          K  c c c c cr4   r
  c                 B    ddl m} |                    | j                  S r~  )r   r  r  r  )r  r  s     r5   cython_view_utility_coder
  #  s+    ++G,QRRRr4   c                 ,    t          j        dd          S NArrayAPIzarrayarray.hr   r  r  s    r5   r  r  #      k.EjR`.a.a r4   c                 ,    t          j        dd          S r
  r
  r 
  s    r5   r  r  #  r!
  r4   )zcpython.arrayzcpython.array.arrayzcython.viewc                    |j         j        j        j        D ]}|j        | j        k    r|                    d          }|                    d          }|r|j        p|o|j        }|s|rV|sT|rR|j        j	        rFt          | j        dd           |j                             t          j        dd                      d S d S )Nimport_array_import_arrayzx'numpy.import_array()' has been added automatically since 'numpy' was cimported but 'numpy.import_array' was not called.r   NumpyImportArrayzNumpyImportArray.c)r  module_noder  r  rn   r  r  r  rj  r  r   r:   r  r   r  )rX   rY   modr$
  r%
  r  s         r5   cimport_numpy_checkr)
  $  s    +1C  8t''' ~66882!2]8\-J\ 
	] 
	
	  !3!@  #_`ac c c 11$01CEYZZ   ' r4   c                   (    e Zd Zg ZdZd Zd Zd ZdS )CImportStatNodeFc                 j   |j         st          | j        d           d S |                    | j        | j        | j        rdnd          }d| j        v rd | j                            d          D             }|d         }|j                            |          }|}|dd          D ]5}|                    |          }|	                    ||| j                   |}6| j
        r"|	                    | j
        || j                   nh|                    |           |	                    ||| j                   n6| j
        p| j        }|	                    ||| j                  }| j        |_        | j        t          v r9|                    t          | j                 |j        j                             d S d S )N$cimport only allowed at module levelr   r   relative_levelrI   c                 ,    g | ]}t          |          S r3   r   )r   rn   s     r5   r   z8CImportStatNode.analyse_declarations.<locals>.<listcomp>-$  s     QQQT]4((QQQr4   r   )r  r   r:   find_moduler  is_absoluter  r  find_submoduledeclare_moduleas_namer  rm  utility_code_for_cimportsr  r  )	r   r   r0  r4  top_nametop_module_scopern   submodule_scoper  s	            r5   r   z$CImportStatNode.analyse_declarations&$  s   " 	$(BCCCFdhD<L7TqqRT ' V V$"""QQT5E5K5KC5P5PQQQEQxH"{99(CC+Labb	 / /"."="=d"C"C++D/48LLL.| I""4<txHHHH''555""8-=txHHHH<34#3D&&t\48DDE262BE/888  !:4;K!LS[M`!a!abbbbb 98r4   c                     | S r   r3   r   s     r5   rx   z#CImportStatNode.analyse_expressionsA$  r  r4   c                 @    | j         dk    rt          | |           d S d S Nnumpyr  r)
  r   s     r5   r  z'CImportStatNode.generate_execution_codeD$  .    w&&d+++++ '&r4   N)r-   r.   r/   r   r2
  r   rx   r  r3   r4   r5   r+
  r+
  $  sP         KKc c c6  , , , , ,r4   r+
  c                   6    e Zd Zg ZdZdZdZd Zd Zd Z	d Z
dS )FromCImportStatNodeNc           	      <   |j         st          | j        d           d S |j                            d          dz   }| j        rK| j        |k    rt          | j        d           d S | j        |k    r|j        st          | j        d           d S |                    | j        | j        | j                  }|sd S |j        }|	                    |           | j
        D ]\  }}}|dk    rDt          |j                                                  D ]\  }}	|                    ||	|           Q|                    |          }	|	rd|	_        nz| j        d uo
| j        dk    }
|j                            ||| j        d	|

          }|s|j        |u r|                    |p||| j                   nt          |d|d|d           |	r|p|}|                    ||	|           	|                    d          s|                    d          r|t*          v r2|                    t+          |         |j        j                             | j
        D ]J\  }}}|d|}|t*          v r2|                    t+          |         |j        j                             Id S d S )Nr-
  rI   r   z3relative cimport beyond main package is not allowedz:relative cimport from non-package directory is not allowedr.
  r  r   F)from_moduler:   absolute_fallbackrelative_importzName 'z' not declared in module 'r  cpythoncython)r  r   r:   r  countr/
  
is_packager1
  r  r  imported_namesr   r  rj   r  rj  r  r  parent_moduler4
  
startswithr6
  r  r  )r   r   qualified_name_componentsr0  r  r:   rn   r5
  
local_namer  is_relative_importr9
  r  fqnames                 r5   r   z(FromCImportStatNode.analyse_declarationsU$  s-   " 	$(BCCCF$'$6$<$<S$A$AA$E! 	"%>>>dh UVVV$(AAA#.Adh \]]]t'7RVReff 	F"1---"&"5 	C 	CCws{{)-l.B.H.H.J.J)K)K C C%J**:ucBBBBC %++D11 b!"EJJ)-)<D)H)dTM`cdMd&&)k&=&=,DHX]  pB '> 'C 'CO* ! &4DD**7?dOTXVVVVccdddT_T_T_#`aaa C!(DJ**:ucBBB!!),, 	a0F0Fx0P0P 	a777$$%>{%KCKL_%`%`aaa"1 a a
4$/KK6666(()B6)J3;K^)_)_```	a 	aa ar4   c                 r    |j         sdS |j        }|dk    r
|j        sdS n|j        sdS ||j        k    rdS dS )Nr   classr   )rk  rj  r  is_struct_or_unionr  )r   r  r  rj  s       r5   declaration_matchesz'FromCImportStatNode.declaration_matches$  s_    } 	1z7??) q * qty  qqr4   c                     | S r   r3   r   s     r5   rx   z'FromCImportStatNode.analyse_expressions$  r  r4   c                 @    | j         dk    rt          | |           d S d S r<
  r>
  r   s     r5   r  z+FromCImportStatNode.generate_execution_code$  r?
  r4   )r-   r.   r/   r   r  r/
  rJ
  r   rT
  rx   r  r3   r4   r5   rA
  rA
  I$  sj         KKNN0a 0a 0ad    , , , , ,r4   rA
  c                   *    e Zd ZdgZdZd Zd Zd ZdS )FromImportStatNoder  r   c                 \   | j         D ]\  }}|dk    r.|j        st          | j        d            d S d|_        d| _        9|                    |           |j        rB|                                -t          | j
        j        j        d|          |j        _        d|j        _        d S )Nr  z%import * only allowed at module levelr   rI   r   )rj   r  r   r:   has_import_starimport_starr  r  ri  r   r  r  r   rm  )r   r   rn   rM  s       r5   r   z'FromImportStatNode.analyse_declarations$  s     J 	D 	DLD&s{{* $($KLLLFF&'##$  11#666< D??AAIER'+{'>'D'D'DddKFM FMB BDFL>>	D 	Dr4   c                    ddl m} | j                            |          | _        |                    | j        t                    | _        g | _        | j	        D ]\  }}|dk    r]|j
        	                                D ]B\  }}|j        s6|j        j        r*|                    t          j        dd                      nCi|                    |j                  }|j        r|j        j        |k    rt'          |j        d          r|j        j        | j        j        j        k    r	 |                    | j        j        j        | j        | j        j                  }|j        j        |j        k    rn# t2          $ r Y nw xY w|                    |d           }|j        t          u rd }n | j                            |j        |          }| j                            |||f           | S )Nr   rn  r  ExtTypeTestrV  r  )r:   r/
  )r   r  r  rx   rN  r:   r   r   interned_itemsrj   r  rk  rj  r  r  r   r  rj  rn   rP  r  r   r1
  r   r  r   r  r  r  )	r   r   r  rn   rM  r  r  r  coerced_items	            r5   rx   z&FromImportStatNode.analyse_expressions$  s   k55c::..txHH	  J 	I 	ILD&s{{ # 1 1 3 3  HAu = UZ-I ,,[-D]Tf-g-ghhh

6;//M ejo&=&=#EJ>> '>z-1H1NNN !$1H1NTXT\@D@Q "1 "S "S :1V5JJJ$ K)   99#tDD;.00#'LL#'9#6#6v{C#H#HL#**D&,+GHHHHs   )AE77
FFc                    |                     | j                   | j                            |           | j        rX|                    dt          j        d| j                                        d|                    | j                  d           |j	        
                    t          d          }| j                            |           | j        r-|j                            t#          j        dd                     | j        D ]\  }}}|                    |d	| j                                        d
|                    |          d|                    || j                             |                    |t                     ||                    | j        |           n@|                    |           |                    |           |                    ||           |                    |t                     |j	                            |           | j                            |           | j                            |           d S )Nr  rk  r&  rG  Tr#  
ImportFromr   z = __Pyx_ImportFrom(r   r%  )r,  r:   r  r?  r[
  rT   r	   r  r.  r'  r(  r   r   r]  r^
  r  r  r   r  r  r*  r+  rO  allocate_temp_resultr  r/  r0  r  rL  )r   rY   	item_temprn   rM  r_
  s         r5   r  z*FromImportStatNode.generate_execution_code$  sV   dh,,T222 	0JJJ&&&K))++++OODH----/0 0 0
 N00D0QQ		I&&& 	I--'6FGGI I I*.*= 	= 	=&D&,JJIIK))++++**40000++Itx@@@	BC C C OOI~666#//	4@@@@11$77711$777//dCCC!!)^<<<<##I...**4000t$$$$$r4   N)r-   r.   r/   r   r[
  r   rx   r  r3   r4   r5   rX
  rX
  $  sS         *KKD D D&! ! !F% % % % %r4   rX
  c                       e Zd ZdZdZdS )ParallelNodez4
    Base class for cython.parallel constructs.
    N)r-   r.   r/   r   r   r3   r4   r5   re
  re
  %  s          KKKr4   re
  c                   v    e Zd ZdZg dZdZdZdZdZdZ	dZ
dZej        ej        ej        fZej        ej        ej        fZej        ej        ej        fZdZ fdZd Zd Zd	 Zd
 Zd Zd%dZ d Z!d Z"d Z#d Z$d&dZ%d Z&d Z'd Z(d Z)d'dZ*d Z+d Z,d Z-d Z.	 d(dZ/dZ0dZ1de0d e1d!Z2d" Z3d# Z4d$ Z5 xZ6S ))ParallelStatNodea  
    Base class for 'with cython.parallel.parallel():' and 'for i in prange():'.

    assignments     { Entry(var) : (var.pos, inplace_operator_or_None) }
                    assignments to variables in this parallel section

    parent          parent ParallelStatNode or None
    is_parallel     indicates whether this node is OpenMP parallel
                    (true for #pragma omp parallel for and
                              #pragma omp parallel)

    is_parallel is true for:

        #pragma omp parallel
        #pragma omp parallel for

    sections, but NOT for

        #pragma omp for

    We need this to determine the sharing attributes.

    privatization_insertion_point   a code insertion point used to make temps
                                    private (esp. the "nsteps" temp)

    args         tuple          the arguments passed to the parallel construct
    kwargs       DictNode       the keyword arguments passed to the parallel
                                construct (replaced by its compile time value)
    )r   num_threadsthreading_conditionNFr   c                      t                      j        |fi | |                    d          pi | _        t	                      | _        i | _        g | _        d S )Nr  )rk   r   rN  r  r   seen_closure_varsprivatesassigned_nodesr  s      r5   r   zParallelStatNode.__init__K%  sd    ''''' "::m44: "%
  !r4   c                    | j                             |           d | _        d | _        | j        rcg }t                      }| j        j        D ]}|j        j        |v r"t          | j
        d|j        j        z             |                    |j        j                   |j        j        dk    r|j        j        s|j        | _        z|j        j        dk    r|j        j        s|j        | _        | j        r)|j        j        dk    r|j        j        s|j        | _        |                    |           || j        _        	 | j                            |          | _        n8# t"          $ r$}t          | j        j
        d           Y d }~nd }~ww xY wi | _        | j                                        D ]8\  }}|| j        vrt          | j
        d|z             't)          | ||           9d S )Nz$Duplicate keyword argument found: %srh
  use_threads_if	chunksizez=Only compile-time values may be supplied as keyword argumentszInvalid keyword argument: %s)r   r   rh
  ri
  r~   r   r  r   r   r   r:   r   r   	is_prangerp
  r  re  	Exceptionrj   valid_keyword_argumentsr   )r   r   pairsseendictitemr  r   r	  s           r5   r   z%ParallelStatNode.analyse_declarations\%  s,   	&&s+++#' ; 	E55D K7 + +<%--$($JX\M_$_```+,,,<%66#>1 :+3>(\'+;;;#>1 B3;>0^ +(:k(I(I#>1 8)1LL*****/DK'H"k<<SAA H H Hdko (G H H H H H H H HH DK{((** 	' 	'GB555dh > CDDDDb#&&&&		' 	's   E# #
F-FFc                    | j         r| j                             |          | _         | j        r<| j        r | j                            |          | _        nt	          | j        d           | j        r| j                            |          | _        | j                            |          | _        |                     |           | j         | j	        r.| j	        j         "| j	        j
        st	          | j        d           ny| j	        r"| j	        j
        st	          | j        d           nP| j         j        j        r?| j         j        r3| j                             |          dk    rt	          | j        d           | j                                         r| j         j        j        r=| j                             t$          j        |                              |          | _         | S )Nz@'use_threads_if' must de declared in the parent parallel sectionz-num_threads already declared in outer sectionz;num_threads must be declared in the parent parallel sectionr   z.argument to num_threads must be greater than 0)rh
  rx   ri
  is_parallelr   r:   rp
  r   analyse_sharing_attributesparentrq
  rj  r  r   re  rj	  r|  r  r
   r	  r~  r   s     r5   rx   z$ParallelStatNode.analyse_expressions%  s    	I#/CCCHHD# 	d d+/+C+W+WX[+\+\((dh bccc> 	E!^??DDDNI11#66	'',,,'{ Rt{6B4;K`Bdh OPPPP RT[%: Rdh ]^^^^"'. R$/R$77<<AAdh PQQQ#--// D43C3H3T D#'#3#=#=)3$0 $00>s0C0C  r4   c                    | j                                         D ]i\  }\  }}| j        r&| j        s|| j        j         v rt          |d           5| j        s|rt          |d           Od}|                     ||||           jdS )z
        Analyse the privates for this block and set them in self.privates.
        This should be called in a post-order fashion during the
        analyse_expressions phase
        z0Cannot assign to private of outer parallel blockz*Reductions not allowed for parallel blocksTN)r  rj   rq
  rx
  rz
  r   propagate_var_privatization)r   r   r  r:   r  lastprivates         r5   ry
  z+ParallelStatNode.analyse_sharing_attributes%  s     !% 0 6 6 8 8 	J 	JE9C~ d&6  DK333#QRRR> b cGHHH K,,UC[IIII%	J 	Jr4   c                    ||f| j         |<   |j        j        rt          |d           dS | j        rI| j        s|| j        j        vr| j        j        }n| j        }|r |s|r|                    ||||           dS dS dS dS )a
  
        Propagate the sharing attributes of a variable. If the privatization is
        determined by a parent scope, done propagate further.

        If we are a prange, we propagate our sharing attributes outwards to
        other pranges. If we are a prange in parallel block and the parallel
        block does not determine the variable private, we propagate to the
        parent of the parent. Recursion stops at parallel blocks, as they have
        no concept of lastprivate or reduction.

        So the following cases propagate:

            sum is a reduction for all loops:

                for i in prange(n):
                    for j in prange(n):
                        for k in prange(n):
                            sum += i * j * k

            sum is a reduction for both loops, local_var is private to the
            parallel with block:

                for i in prange(n):
                    with parallel:
                        local_var = ... # private to the parallel
                        for j in prange(n):
                            sum += i * j

        Nested with parallel blocks are disallowed, because they wouldn't
        allow you to propagate lastprivates or reductions:

            #pragma omp parallel for lastprivate(i)
            for i in prange(n):

                sum = 0

                #pragma omp parallel private(j, sum)
                with parallel:

                    #pragma omp parallel
                    with parallel:

                        #pragma omp for lastprivate(j) reduction(+:sum)
                        for j in prange(n):
                            sum += i

                    # sum and j are well-defined here

                # sum and j are undefined here

            # sum and j are undefined here
        z9Memoryview slices can only be shared in parallel sectionsN)	rl
  rj  r  r   rq
  rx
  rz
  r  r|
  )r   r  r:   r  r}
  rz
  s         r5   r|
  z,ParallelStatNode.propagate_var_privatization%  s    j !#K0e:( 	#RSSSF> 
	P# %T[5L(L(L+  P2 P P225#r;OOOOO
	P 
	PP P P Pr4   c                    | j         r| j                             ||          S |j        | j        v r|j        S |j                            |j        d          }| j                            |j                   | j                            |           | j        	                    ||j        f           |
                    |d|j        d           ||_        dS )zo
        Helper function that allocate a temporary for a closure variable that
        is assigned to.
        TrF  rG  N)rz
  _allocate_closure_tempr  rk
  r'  r(  rj  r   modified_entriesr  rT   )r   rY   r  r  s       r5   r
  z'ParallelStatNode._allocate_closure_temp&  s    
 ; 	C;55dEBBB;$000;,,UZ>> 	""5;///""5)))$$eU[%9:::

4555r4   c                 T   d}t          | j                                                  D ]~\  }\  }}|st|r||k    rl|j                                        }|rQ|r|                    d           d}|                    |j        d|j                            |          d           d S )NTz4/* Initialize private variables to invalid values */FrF  rG  )sortedrl
  rj   rj  invalid_valuerT   r  r@  )r   rY   excluder  r  r  r}
  r
  s           r5   initialize_privates_to_nanz+ParallelStatNode.initialize_privates_to_nan&  s    (.t}/B/B/D/D(E(E 
	S 
	S$E$B 	Sw 	S%7*:*: %
 8 8 : :  S &

 $7 8 8 8 %JJU[[[-2Z-A-A--P-P-P-P R S S S
	S 
	Sr4   c                     | j         }|j        j        }||j        _        |                    |           ||j        _        |                                S r   )1begin_of_parallel_control_block_point_after_declsr'  ownerr?  r   )r   rY   rL  r   r
  s        r5   evaluate_before_blockz&ParallelStatNode.evaluate_before_block+&  sL    B !%%a(((!{{}}r4   c                 z    | j         3|                    d|                     || j                   z             dS dS )zS
        Write self.num_threads if set as the num_threads OpenMP directive
        Nz num_threads(%s))rh
  r  r
  r   s     r5   put_num_threadsz ParallelStatNode.put_num_threads7&  sF     'HH'$*D*DT4K[*\*\\]]]]] ('r4   c                     g | _         t          | j                  D ]&}|j        s|j        r|                     ||           'dS )a  
        If a variable is in a scope object, we need to allocate a temp and
        assign the value from the temp to the variable in the scope object
        after the parallel section. This kind of copying should be done only
        in the outermost parallel section.
        N)r
  r
  r  from_closurer  r
  )r   rY   r  s      r5   declare_closure_privatesz)ParallelStatNode.declare_closure_privates?&  s\     !#D,-- 	9 	9E! 9U%5 9++D%888	9 	9r4   c                     | j         D ]K\  }}|                    |d|j        d           |j                            |j                   ||_        LdS )z
        Release any temps used for variables in scope objects. As this is the
        outermost parallel block, we don't need to delete the cnames from
        self.seen_closure_vars.
        rF  rG  N)r
  rT   r  r'  r0  )r   rY   r  r  s       r5   release_closure_privatesz)ParallelStatNode.release_closure_privatesL&  sg     &*%: 	) 	)!E>JJ^^^U[[[ABBBN''444(EKK	) 	)r4   r3   c                 l   | j         }d| _         | j        r|j                                        x| _        }g g }}t          |          D ]>\  }}|j        s|j        r|                    |           )|                    |           ?|r+|	                    dd
                    |          z             |r+|	                    dd
                    |          z             | j        rt          j        g}	| j        r|	                    | j                   |j                            t'          j        dd                     |	                    dt          j         d           |	                    d	| j        z             |	                    d
d
                    |	          z             dS dS dS )z
        Make any used temporaries private. Before the relevant code block
        code.start_collecting_temps() should have been called.
        Nz private(%s)r    firstprivate(%s)SharedInFreeThreadingrq	  z' __Pyx_shared_in_cpython_freethreading(rj  z private(%s, %s, %s)z shared(%s))privatization_insertion_pointrx
  r'  stop_collecting_tempsr   r
  r|  r  r  r  r   breaking_label_usedr	   parallel_whyerror_label_usedr{	  parallel_excr  r  r   r  parallel_freethreading_mutexpos_info)
r   rY   exclude_tempsr   r   rl
  firstprivatesr1  rj  shared_varss
             r5   privatize_tempsz ParallelStatNode.privatize_tempsW&  s   
 .-1* 	>!%!E!E!G!GGDJ&("mH$Umm * *
d# *t'> *!((....OOD)))) <ntyy':'::;;; F)DIIm,D,DDEEE' >%23( B&&t'8999M22#/3/1 12 2 2 EEjFDgjjjkkkEE04=@AAAmdii&<&<<=====3	> 	>> >r4   c                     | j         rN| j        sI|                    d           t          | j                  D ]!\  }}|                    ||d           d S d S d S )Nz/* Clean up any temporaries */Frs  )rx
  is_nested_prangerT   r
  r   r=  )r   rY   r1  rj  s       r5   cleanup_tempszParallelStatNode.cleanup_tempsz&  s     	CD$9 	CJJ7888$TZ00 C C
d&&tTE&BBBB	C 	C 	C 	CC Cr4   c                 n   |                                 | _        |                                | _        |j        | _        |                    d          |_        |                                 |                                | _	        |                                | _
        |                     |           dS )a  
        Sets up a block that surrounds the parallel block to determine
        how the parallel section was exited. Any kind of return is
        trapped (break, continue, return, exceptions). This is the idea:

        {
            int why = 0;

            #pragma omp parallel
            {
                return # -> goto new_return_label;
                goto end_parallel;

            new_return_label:
                why = 3;
                goto end_parallel;

            end_parallel:;
                #pragma omp flush(why) # we need to flush for every iteration
            }

            if (why == 3)
                goto old_return_label;
        }
        returnrZ  N)r  r  r  r  r  rL	  r  r	  rP   %begin_of_parallel_control_block_pointr
  "undef_builtin_expect_apple_gcc_bugr   s     r5   !setup_parallel_control_flow_blockz2ParallelStatNode.setup_parallel_control_flow_block&  s    4  $3355#3355 $ 1 NNN99595I5I5K5K2AEAUAUAWAW>//55555r4   c                 8    |                                 | _        dS )a  
        Each OpenMP thread in a parallel section that contains a with gil block
        must have the thread-state initialized. The call to
        PyGILState_Release() then deallocates our threadstate. If we wouldn't
        do this, each with gil block would allocate and deallocate one, thereby
        losing exception information before it can be saved before leaving the
        parallel section.
        N)rP   begin_of_parallel_blockr   s     r5   begin_parallel_blockz%ParallelStatNode.begin_parallel_block&  s     (,';';'='=$$$r4   c                    | j         }d| _         | j        r>|}|                    d           |                    d           |                    d           |                    d           |                    d           |                    d           |                    d           |                    d	           |                                 |                    d           |                     |           |                                 |                    d
           |                    d           |                    d           dS dS )a  
        To ensure all OpenMP threads have thread states, we ensure the GIL
        in each thread (which creates a thread state if it doesn't exist),
        after which we release the GIL.
        On exit, reacquire the GIL and release the thread state.

        If compiled without OpenMP support (at the C level), then we still have
        to acquire the GIL to decref any object temporaries.
        N#ifdef _OPENMPTr{  Py_BEGIN_ALLOW_THREADS#endif /* _OPENMP */Py_END_ALLOW_THREADSr  z{
z#ifndef _OPENMPz}
)r
  r
  rT   r}  put_safer
  r  )r   rY   
begin_codeend_codes       r5   end_parallel_blockz#ParallelStatNode.end_parallel_block&  s[    1
'+$  	3H-...%%t%<<<56663444NN+,,,NN1222NN7###e$$$##%%%NN1222x(((,,...NN,---e$$$NN122222%	3 	3r4   c                    |                                 }|                                 }d| _        d| _        d| _        g | _        |                                }|D ]5}|                    |          r| j        p
||j        k    | _        d| _        6| j        r|                    |           t          |          D ]\  }}|                    |          s||j        k    }|
                    |           |r|sN||j        k    rd| _        |                     |           |                    dt          j        |dz   fz             | j        r| j        r|s|                    |           |                    |           | j        rz| j        r1| j        r*|
                    |           |                     |           |
                    |           |r-| j        r(|                    dt          j        z             dS dS dS dS )a  
        Trap any kind of return inside a parallel construct. 'should_flush'
        indicates whether the variable should be flushed, which is needed by
        prange to skip the loop. It also indicates whether we need to register
        a continue (we need this for parallel blocks, but not for prange
        loops, as it is a direct jump there).

        It uses the same mechanism as try/finally:
            1 continue
            2 break
            3 return
            4 error
        FTz%s = %d;r   #pragma omp flush(%s)N)r  any_label_usedr
  r
  parallel_private_tempsr	  r  r  r  r  r  r  fetch_parallel_exceptionrT   r	   r
  rq
  save_parallel_varsr'  )	r   rY   should_flushsave_lastprivates_labeldont_return_label
all_labelsrG  r  is_continue_labels	            r5   trap_parallel_exitz#ParallelStatNode.trap_parallel_exit&  sn    #'.."2"2 NN,,##(  %&(#((**
   	+ 	+Eu%% +,0,D -I,1T5H,H (&*# 	-MM+,,,!*-- 	1 	1HAu??5))  %)< <NN5!!!  F%6 FD,,,,0D)11$777

:)<a!e(DDEEE( 1T^ 1%156666/0000 		Q~ .$": .6777''---NN,--- Q 8 Q!!"9F<O"OPPPPP		Q 		QQ Q Q Qr4   c                    d| j         z  }|                    d|z             t          xj         dz  c_         |                                 | j        }d}t          | j                                                  D ]Z\  }\  }}|r|j        j	        r|j        j
        r9|j        j        s-|j        j        d         r|j                            d          }n|j                                        }d|z  }	|j        }
|dz  }|j                                        }|rd|j                            |          z   }nd}|                    |d	|	|d
           | j                            |	|
|j        f           |j        j
        r2|j                            t/          j        dd                     d|
z  }
|                    |	d|
d
           \|                                 dS )a  
        The following shenanigans are instated when we break, return or
        propagate errors from a prange. In this case we cannot rely on
        lastprivate() to do its job, as no iterations may have executed yet
        in the last thread, leaving the values undefined. It is most likely
        that the breaking thread has well-defined values of the lastprivate
        variables, so we keep those values.
        z__pyx_parallel_lastprivates%dz#pragma omp critical(%s)r   r   
cpp_localsr   z__pyx_parallel_temp%drF  rH   rG  r^  r_  r`  N)critical_section_counterr'  rg
  r	  r
  r
  rl
  rj   rj  r|  r  is_fake_referencer  r   cpp_optional_declaration_coder.  r  r
  r@  rT   r
  r  r  r   r  r	  )r   rY   section_namer   
temp_countr  r  r}
  	type_decl
temp_cnameprivate_cnamer
  r  s                r5   r
  z#ParallelStatNode.save_parallel_vars'  s    79VV4|CDDD11Q6116
(.t}/B/B/D/D(E(E 	A 	A$E$B %*"8 z& @uz/K @PTP`PklxPy @!JDDRHH		!J==??	0:=J!KM!OJ!J4466M uz33MBBBGG)))ZZ>???'..
M5:/VWWWz& R 11+,=?OPPR R R AM QJJZZZ?@@@@ 	r4   c                    |                                  |                    d           |                                 |                    dt          j        z             |                    dt          j        z             |                    d| j        z             t          t          | j
        | j                   }d|j        _        |                    dt          |          z             |                    t          j        t                      |                    d           |                                 |                                 |                                 dS )	a^  
        As each OpenMP thread may raise an exception, we need to fetch that
        exception from the threadstate and save it for after the parallel
        section where it can be re-raised in the master thread.

        Although it would seem that __pyx_filename, __pyx_lineno and
        __pyx_clineno are only assigned to under exception conditions (i.e.,
        when we have the GIL), and thus should be allowed to be shared without
        any race condition, they are in fact subject to the same race
        conditions that they were previously when they were global variables
        and functions were allowed to release the GIL:

            thread A                thread B
                acquire
                set lineno
                release
                                        acquire
                                        set lineno
                                        release
                acquire
                fetch exception
                release
                                        skip the fetch

                deallocate threadstate  deallocate threadstate
        Tr{  r
  r  z'__Pyx_ErrFetchWithState(&%s, &%s, &%s);%s = %s; %s = %s; %s = %s;rp  N)r	  r}  put_acquire_freethreading_lockr'  r	   parallel_exc_typerT   r
  r   rR  parallel_pos_infor
  r'  uses_error_indicatorr  r+  r   put_release_freethreading_lockr  r	  r   rY   r
  s      r5   r
  z)ParallelStatNode.fetch_parallel_exceptionJ'  sG   6 	T222++---1F4LLMMM

633	5 	5 	5 	

<t?PPQQQ#d4dmDDE.2+

/%//ABBB0.AAA

	 	 	 	++---$$&&&r4   c                 
   |                                  |                    d           |                                 |                    t          j        t                     |                    d| j        z             t          t          | j        | j                   }|                    dt          |          z             |                                 |                                 |                                 dS )zRe-raise a parallel exceptionTr{  rM  r
  N)r	  r}  r
  rJ  r	   r
  r   rT   r
  r   rR  r
  r
  r  r
  r  r	  r
  s      r5   restore_parallel_exceptionz+ParallelStatNode.restore_parallel_exceptionz'  s    T222++---1>BBB

;d>OOPPP#dmT-CDDE

/%//ABBB++---$$&&&r4   c                 X    |                     | j        | j        | j        fz              dS )z
        Restore all old labels. Call this before the 'else' clause to for
        loops and always before ending the parallel control flow block.
        N)r	  r  rL	  r  r   s     r5   restore_labelszParallelStatNode.restore_labels'  sG    
 	D0D4I484H4J J 	K 	K 	K 	K 	Kr4   c                 2   | j         }d| _         d| _        | j        4| j                            |           | j                            |           |                                r|                    d           | j        r|                    d| j        z             |                    d| j	        z             |                    d           |                    dt          j         d           |                    d           |                    d	t          j        z             |                    d
           |                    dt          j        z             |                    d           |r| j        }n| j        }|r|                    dt          j        z             |                    dt          j        z             |                    d	t          j        z             | j        D ]-\  }}}	|	j        rd|z  }|                    |d|d           .|                    dt          j        z             |r/|                    d           |                    |j                   |r/|                    d           |                    |j                   |r/|                    d           |                    |j                   | j        rc|j                            t2                     |                    d           |                     |           |                    |j                   |                    d           |                    d           |                                 |                     |           dS )a  
        This ends the parallel control flow block and based on how the parallel
        section was exited, takes the corresponding action. The break_ and
        continue_ parameters indicate whether these should be propagated
        outwards:

            for i in prange(...):
                with cython.parallel.parallel():
                    continue

        Here break should be trapped in the parallel block, and propagated to
        the for loop.
        N$__Pyx_TurnOffSysMonitoringInParallelz*const char *%s = NULL; int %s = 0, %s = 0;z,PyObject *%s = NULL, *%s = NULL, *%s = NULL;z-#if CYTHON_COMPILING_IN_CPYTHON_FREETHREADINGzPyMutex z = {0};r  r  zg/* This may have been overridden by a continue, break or return in another thread. Prefer the error. */z%s = 4;rp  zint %s;rx	  r`  rF  rG  r  z    case 1: z    case 2: z    case 3: z    case 4:)r
  r
  rh
  r  rL  r  rT   r
  r
  r
  r	   r
  r
  r
  r
  r
  r
  r  r  r  r  r  r  r  r  r  r
  r  r	  "redef_builtin_expect_apple_gcc_bug)
r   rY   break_	continue_return_r   r
  r
  r
  r\	  s
             r5   end_parallel_control_flow_blockz0ParallelStatNode.end_parallel_control_flow_block'  s    6592AE>'33D999''---<<>> 	< GG:;;;   	GG@4CYYZZZGGBTEVVWWWGGCDDDGGMvBMMMNNNGGHJJf668 8 8JJ Q R R RJJy6#66777JJ    	6!0NN!5N #	GGI 33444GGI 33444JJf113 3 3 9=8S E E4
M9) P!BZ!OJ




CDDDDJJ)<<=== 3(((d1222 0(((d./// 1(((d/000$ 0 112PQQQ

=)))//555d.///JJsOOOJJ   	//55555r4   z((defined(__APPLE__) || defined(__OSX__))zQ(defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))))rk  r  rj  c                 L    | j         s|                    | j                   dS dS )z]
        A bug on OS X Lion disallows __builtin_expect macros. This code avoids them
        N)rz
  undef_builtin_expectredef_conditionr   s     r5   r
  z3ParallelStatNode.undef_builtin_expect_apple_gcc_bug'  s5     { 	<%%d&:;;;;;	< 	<r4   c                 L    | j         s|                    | j                   d S d S r   )rz
  redef_builtin_expectr
  r   s     r5   r
  z3ParallelStatNode.redef_builtin_expect_apple_gcc_bug'  s3    { 	<%%d&:;;;;;	< 	<r4   c                 ~    t          ||          D ]+\  }}|$|j        j        rt          |j        d|z             ,d S )Nz6%s may not be a Python object as we don't have the GIL)rR  rj  r|  r   r:   )r   r   r4  nodesrn   rX   s         r5   _parameters_nogil_checkz(ParallelStatNode._parameters_nogil_check'  se    eU++ 	C 	CJD$DI$9dh !;=A!B C C C	C 	Cr4   r   )r3   r`  )FFF)7r-   r.   r/   r   r   r   rq
  r
  r
  rh
  rp
  ri
  r	   r
  parallel_exc_valueparallel_exc_tbr
  parallel_filenameparallel_linenoparallel_clinenor
  r	  r	  r	  r
  r
  r   r   rx   ry
  r|
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  buggy_platform_macro_conditionhave_expect_conditionr
  r
  r
  r
  rs   rt   s   @r5   rg
  rg
  	%  s        < A@@KDIKI 	 !L 	  	H  !! ! ! ! !"(' (' ('T  >J J J4EP EP EPN  ,S S S S
 
 
^ ^ ^9 9 9	) 	) 	)!> !> !> !>FC C C#6 #6 #6J	> 	> 	>3 3 3BAQ AQ AQ AQF3 3 3j. . .`  K K K @EX6 X6 X6 X6v &P"[&D&D&DF[F[F[\O< < << < <C C C C C C Cr4   rg
  c                   >     e Zd ZdZddgZdZdZ fdZd Zd Z	 xZ
S )ParallelWithBlockNodezI
    This node represents a 'with cython.parallel.parallel():' block
    rh
  ro
  Nc                     t                                          |           | j        rt          | j        d           d S d S )Nz=cython.parallel.parallel() does not take positional arguments)rk   r   rV   r   r:   r  s     r5   r   z*ParallelWithBlockNode.analyse_declarations(  sT    $$S)))9 	4$( 3 4 4 4 4 4	4 	4r4   c                    | j         | j                             |           |                     |           |                     |           |                    d           |                    d           | j         /|                    d| j                                         z             | j        rKd | j        D             }|r8|                    dd                    t          |                    z             |
                                | _        |                     |           |                    d           |                    d           |                                 |                     |           |                     |           |j                                         | j                            |           |                     |           |                     |           |                     |           |                                 |                    |j                  }|                    |j                  }|                    |j                  }|                     |           |                     ||||	           | j         4| j                             |           | j                             |           |                      |           d S )
Nr
  z#pragma omp parallel zif(%s) c                 4    g | ]}|j         j        |j        S r3   )rj  r|  r  )r   r  s     r5   r   zAParallelWithBlockNode.generate_execution_code.<locals>.<listcomp>$(  s3     3 3 3A v13 3 3 3r4   zprivate(%s)r   r   r
  )r
  r
  r
  )!ri
  r?  r
  r
  rT   r  r   rl
  r   r
  rP   r
  r
  r	  r
  r
  r'  start_collecting_tempsr   r  r
  r
  r
  r	  r  r  r  r  r
  r
  r  rL  r
  )r   rY   rl
  r
  r
  r
  s         r5   r  z-ParallelWithBlockNode.generate_execution_code(  s   #/$==dCCC%%d+++..t444

#$$$()))#/HHY!9!@!@!B!BBCCC = 	F3 3 3 3 3H F6(3C3C)D)DDEEE-1-A-A-C-C*T"""

2

)***!!$'''''-----///	))$///%%%T"""%%%OOD$788	!122//$"344D!!! 	,,T&7@5< 	- 	> 	> 	> #/$;;DAAA$//555%%d+++++r4   c                 B    |                      |dg| j        g           d S )Nro
  )r
  ri
  r   s     r5   r   z!ParallelWithBlockNode.nogil_checkJ(  s*    $$S+;*<t?W>XYYYYYr4   )r-   r.   r/   r   rs
  rh
  ri
  r   r  r   rs   rt   s   @r5   r
  r
  (  s           -.>?K4 4 4 4 44, 4, 4,lZ Z Z Z Z Z Zr4   r
  c                        e Zd ZdZg dZdxZxZxZZdxZ	xZ
ZdZdZdZg dZ fdZ fdZ fdZd	 Zd
 Zd Z xZS )ParallelRangeNodez
    This node represents a 'for i in cython.parallel.prange():' construct.

    target       NameNode       the target iteration variable
    else_clause  Node or None   the else clause of this loop
    )r   rM  rd  rV   rh
  rp
  ri
  NT)scheduler  rh
  rp
  ro
  c                 d     t                      j        |fi | t          |          | _        d S r   )rk   r   rD  r  )r   r:   rW   rO   s      r5   r   zParallelRangeNode.__init__d(  s5    %%%%%$S))r4   c                 X   t                                          |           | j                            |           | j        | j                            |           | j        rt          | j                  dk    rt          | j        d           d S t          | j                  dk    r| j        \  | _	        nGt          | j                  dk    r| j        \  | _
        | _	        n| j        \  | _
        | _	        | _        | j        dvrt          | j        d| j                   d S d S )Nr   z0Invalid number of positional arguments to pranger   r&   )Nstaticdynamicguidedruntimez%Invalid schedule argument to prange: )rk   r   rM  r  rd  rV   rL   r   r:   rr  r[   r  r
  r  s     r5   r   z&ParallelRangeNode.analyse_declarationsi(  s   $$S)))..s333'11#666y 	C	NNQ..$(NOOOFty>>QJDII^^q  $(I!DJ		/3y,DJ	49= PPP$((XYYYYY QPr4   c                 <   |j         }| j         rd|_         | j        t          | j        d           | S | j                            |          | _        | j        j        j        sJ| j        j        j        s't          | j        j        d| j        j        z             t          j	        | _
        n| j        j        | _
        d| _        | j        | j        | j        f}t          || j                  D ]\  }}||                    |           |j        j        st          |j        d|z             A|j        s&|                    |          }t'          | ||           t          j        | j
        |j                  | _
        | j        | j                            |          | _        t/          | j        dd           }|r | j        j        d f| j        | j        j        <   t5                                          |          }|j        r|j        st          |j        j        d           n{|j        dk    rt          |j        j        d	           nU|j        j        j        rD|j        j        r8|j                            |          d
k    rt          |j        j        d           |j                            t          j         |                              |          |_        |j         r||_         |j!        o|j!        j"        |_#        |j#        r|}|j!        r&|j!        j"        r|j!        }|j!        r|j!        j"        |j        $                    |j                   |j%        $                    |j%                   |j&        '                    |j&                   |S )NTz/prange() can only be used as part of a for loopzMust be of numeric type, not %s)r[   rr  r  z%s argument must be numericr  z$Must provide schedule with chunksizer
  z,Chunksize not valid for the schedule runtimer   zChunksize must not be negative)(r  rM  r   r:   ry   rj  rq  r|  r
   r  
index_typer4  r[   rr  r  rR  rw   r   r~  r   r  rd  rx   r   r  r  rk   rp
  r
  r  re  r  r	  rz
  rq
  r
  r   rl
  rm
  r{	  )	r   r   r	  start_stop_steprX   rn   rR  rz
  rO   s	           r5   rx   z%ParallelRangeNode.analyse_expressions}(  s   I	: 	CI;$(MNNNKk66s;;{* 
	/ ;#/ Ldko7$+:JJL L L ):DOO"k.DO -
*di:otz:: 	0 	0JD$""3'''y+ $($AD$HIII ...s33DD$--- #-"@OTY#0 #0 '#/CCCHHD t{GT:: 	H26+/42GDT[./ww**3//> 	@= 	Ldn(<> > > >)++dn(DF F F F.%, L.+L.33C88A==dn(*JKKK!^55%s, ,,:N3,?,? N : 	"!CI $ E0E  	>F- 'FM$; ' - 'FM$; ' %%d&6777O""4=111!(()<===r4   c                 x    d}| j         | j        | j        | j        | j        f}|                     |||           d S )N)r[   rr  r  rM  ro
  )r[   rr  r  rM  ri
  r
  )r   r   r4  r
  s       r5   r   zParallelRangeNode.nogil_check(  s@    C
DIty$+t?WW$$S%77777r4   c                 t   |                      |           | j        j        j        }|| j        j                                        d}| j        | j        | j        f}d}t          || j
        |          D ]U\  }}}||}	nE|j        r|                                }	n)|                    |           |                                }	|	||<   V| j        | j                            |           |j                            | j        d          |d<   |j                            | j        d          |d<   | j        ?| j                                        r&| j        j        dk    rt+          |j        d           nK|d	                                         rt1          |d	                   dk    r|                    d
|z             |                     |           |j                            t;          j        dd                     |                    d|z             |                    d|z             |                                 |                      ||           |!                                 | "                    |           | j#        r| j$        r"|%                    dtL          j'        z             |                                 |                    d           | j#        (                    |           |!                                 | )                    |           || j*        | j        fz   D ].}
|
*|
+                    |           |
,                    |           /|j        -                    |d                    |j        -                    |d                    | .                    |           dS )a,  
        Generate code in the following steps

            1)  copy any closure variables determined thread-private
                into temporaries

            2)  allocate temps for start, stop and step

            3)  generate a loop that calculates the total number of steps,
                which then computes the target iteration variable for every step:

                    for i in prange(start, stop, step):
                        ...

                becomes

                    nsteps = (stop - start) / step;
                    i = start;

                    #pragma omp parallel for lastprivate(i)
                    for (temp = 0; temp < nsteps; temp++) {
                        i = start + step * temp;
                        ...
                    }

                Note that accumulation of 'i' would have a data dependency
                between iterations.

                Also, you can't do this

                    for (i = start; i < stop; i += step)
                        ...

                as the '<' operator should become '>' for descending loops.
                'for i from x < i < y:' does not suffer from this problem
                as the relational operator is known at compile time!

            4) release our temps and write back any private closure variables
        )rM  rE  )r  r  r  NFr  nstepsr   z!Iteration with step 0 is invalid.r  zif (((%(step)s) == 0)) abort();IncludeStdlibHrq	  zS%(nsteps)s = (%(stop)s - %(start)s + %(step)s - %(step)s/abs(%(step)s)) / %(step)s;zif (%(nsteps)s > 0)if (%s < 2)z
/* else */)/r
  rM  r  r  rj  r.  r[   rr  r  rR  r4  r   r  r?  r   ri
  r'  r(  r
  r  r  r   r:   isdigitr  rT   r
  r  r  r   r  r	  generate_loopr	  r
  rd  r
  r  r	   r
  r  r
  rp
  r  rL  r0  r
  )r   rY   target_index_cnamefmt_dictr
  defaultsrX   rn   rX  r   r1  s              r5   r  z)ParallelRangeNode.generate_execution_code(  s   P 	%%d+++ "[.4
 );+BBDD
 
 *di: #&
H#M#M 		$ 		$D$|  '88::--d333#HTNN#/$==dCCC44T_eLL!^99$/5QQ 9 TY%B%B%D%D IbfgIgIg$(?@@@@&!))++ 	Es8F3C/D/D/I/IJJ88CDDD..t444 	))+*ABRTg*h*hiii

hkssttt 	

(834444***D!!! 	' >)<<===JJ|$$$44T:::NN 	,,T222 $t~t7O&PP 	& 	&D++D111%%%##HSM222##HX$6777%%d+++++r4   c                 <	   | j         r|                    d           n|                    d           | j        s<|                    d           |                                | _        | j        j        }n|                    d           | j        /|                    d| j                                        z             |                                | _        | j        }|                    d           |                    d           |	                                 | 
                    |           | j         r|                    d           n|                    d           |                    d           t          | j                                                  D ]\  }\  }}|rX|dv rT|| j        j        k    rD|j        j        rt%          | j        d	           @|                    d
|d|j        d           b|| j        j        k    r;|                    d|j        z             |                    d|j        z             |j        j        s(|rd}nd}|                    d|d|j        d           | j        rH| j        rd|                     || j                  z  }nd}|                    d| j        |d           |                     |           |                    d           |                    d           |                    d|z             |	                                 |                                }	|	                                 |                    d|z             |                     || j        j                   | j        r | j         s|j                                         | j                            |           |                     |d           | j        r| j         s|                     |           | j         r"|	                    dtB          j"        z             |#                                 |#                                 | j        r+| $                    |           |#                                 d S d S )Nz#if 0r
  z#pragma omp forz#pragma omp parallelz if(%s)r   r
  z+*-&^|z#Python objects cannot be reductionsz reduction(r  rj  r
  z lastprivate(%s)r}
  r  rH   rk  z, %sz
 schedule(z,for (%(i)s = 0; %(i)s < %(nsteps)s; %(i)s++)z=%(target)s = (%(target_type)s)(%(start)s + %(step)s * %(i)s);)r
  T)r
  r  )%r
  rT   rx
  r  rP   r
  rz
  ri
  r   r	  r
  r
  rl
  rj   rM  r  rj  r|  r   r:   r  r
  rp
  r
  r
  r
  r'  r
  r   r  r
  r
  r
  r	   r
  r	  r
  )
r   rY   r  reduction_codepointr  r  r}
  r  rp
  guard_around_body_codepoints
             r5   r  zParallelRangeNode.generate_loopR)  s     	)JJwJJ'((( 	(HH&'''151E1E1G1GD."&+"KHH+,,,'3T%=%D%D%F%FFGGG151E1E1G1GD."&"DJJrNNNJJ-... %%d+++$ -

7####

+,,,HH&'''(.t}/B/B/D/D(E(E 	A 	A$E$B AbHnn$+2C)C)C:) I$($IJJJJ (+++79rr5;;; GI I I I DK---HH05;>???HH/%+=>>>z- A" ,"/"+HHH'''5;;;?@@@= 	E~ "T%?%?dn%U%UU			HHH$--CDDD0111

2

)***?(JKKK&*&:&:&<&<# 	

RU]]^^^''dk6G'HHH 	4D$9 	4N11333	))$///4888 	'D$9 	'  &&&# 	S (--mf>Q.QRRR 	##D)))NN	 	r4   )r-   r.   r/   r   r   r   rM  rd  rV   r[   rr  r  rq
  r  r
  rs
  r   r   rx   r   r  r  rs   rt   s   @r5   r
  r
  N(  s        7 7 7K *.-D-6-K$ED4IEHaaa* * * * *
Z Z Z Z Z(T T T T Tl8 8 8
x, x, x,tf f f f f f fr4   r
  c                   6    e Zd ZdZdgZd Zd Zd Zd Zd Z	dS )	CnameDecoratorNodea?  
    This node is for the cname decorator in CythonUtilityCode:

        @cname('the_cname')
        cdef func(...):
            ...

    In case of a cdef class the cname specifies the objstruct_cname.

    node        the node to which the cname decorator is applied
    cname       the cname the node should get
    rX   c                    | j                             |           | j         }t          |t                    r|j        j        d         }t          |t          t          f          | _        t          |t          t          f          }|j        }| j        rT| j        |_        | j        |_        d|_        |j        r*d|j        v r#|                     |j                  |_        d S d S d S |r| j        x|_        |j        _        d S |j        }| j        |_        | j        dz   |j        _        t(          j        | j        z   |j        _        | j        dz   |j        _        |j        j        |j        j        _        |j        j        |j        _        | j        dz   |_        |j                                        D ]Q\  }}|j        r|                     |j                  |_        |j        r|                     |j                  |_        Rd S )Nr   TrI   _obj_typer  )rX   r   rM   r   r   r  rC  r<  is_functionr  r  r  r  r  r  r  r
  rj  r  r  r	   typeobj_prefixr  r  r  rd  r  r  rj   )r   r   rX   is_struct_or_enumr  r  rn   r  s           r5   r   z'CnameDecoratorNode.analyse_declarations)  s   	&&s+++yd233 	&9?1%D%d[+,FGG&t.C\-RSSJ 	IjAG:ALAF~ =#"7"7!%Q^!<!<= ="7"7 	I%)Z/AGaflllJEjAG%)Z&%8AF"#)#84:#EAF #':#7AF +,6+?AFL("#&"6AM!%c!1E$}2244 I Ie# @'+{{5;'?'?E$% I)-U5G)H)HE&	I Ir4   c                 X    d|v r|                     d          d         }| j        d|S )NrI   r   r  )r  r  )r   r  s     r5   r
  zCnameDecoratorNode.mangle)  s4    %<<KK$$R(E***ee,,r4   c                 D    | j                             |          | _         | S r   )rX   rx   r   s     r5   rx   z&CnameDecoratorNode.analyse_expressions)  r"  r4   c                    | j         r|j        r|j        d         }t          | j        t
                    r| j                            |dd           nWddlm} | j        j	        }|j
        }|j        |_
        |                    ||                                |d           ||_
        | j                            ||           dS )	z=Ensure a prototype for every @cname method in the right placeutility_code_protoFTrd  r   )
ModuleNode)
definitionN)r  r  r  rM   rX   rc  r  r   r  r  r  r  generate_cfunction_declarationr  r  )r   r   rY   h_coder  r  r  s          r5   r  z0CnameDecoratorNode.generate_function_definitions)  s     	$ 4 	$%&:;F$)W-- $	225T 3 C C C C )(((((	#.99$$&&#	 : % % % $	//T:::::r4   c                 :    | j                             |           d S r   )rX   r  r   s     r5   r  z*CnameDecoratorNode.generate_execution_code*  r  r4   N)
r-   r.   r/   r   r   r   r
  rx   r  r  r3   r4   r5   r  r  )  sv          (K$I $I $IL- - -  ; ; ;20 0 0 0 0r4   r  c                       e Zd ZdZg ZdS )	ErrorNodez
    Node type for things that we want to get through the parser
    (especially for things that are being scanned in "tentative_scan"
    blocks), but should immediately raise and error afterwards.

    what    str
    N)r-   r.   r/   r   r   r3   r4   r5   r  r  *  s          KKKr4   r  aC  
/* Test for GCC > 2.95 */
#if defined(__GNUC__)     && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))
  #define likely(x)   __builtin_expect(!!(x), 1)
  #define unlikely(x) __builtin_expect(!!(x), 0)
#else /* !__GNUC__ or GCC < 2.95 */
  #define likely(x)   (x)
  #define unlikely(x) (x)
#endif /* __GNUC__ */
z1
#define likely(x)   (x)
#define unlikely(x) (x)
Printz
Printing.cPrintOnern	  rQ  RaiseExceptionGetExceptionSwapExceptionSaveResetExceptionAddTracebackr3   )rG
  r  rd  r   	itertoolsr   enumr   r   Errorsr   r   r   r   r   r	   r
   r   r   r   r4  r   r   r   r   r   r   r   r   r   r   r   rh   r   StringEncodingr   r    r!   r"   Pythranr#   r$   r%   Utilsr'   r(   r  IntEnumr,   r;   rE   r`   rj  rb   rv   r   r   r   r   r  r3  r8  rP  rW  rr  r  r  r  r  r  r  r  rZ  r8  rb  ry  r  r0  r  r  r  r  r<  r  r  r  r3  r=  rC  r  r  rb  rc  r  r  r  r  r"  r%  ri  rb  rf  r  r  r'  r2  r:  rQ  rP  r^  r  rY  r  r  r  r  rD  r  r  r  ry  r,  rJ  rW  rb  rq  ry  r  r  r  r  r  r  r  r  r  r  r	  r&	  r-	  rb	  r	  r	  r	  r	  r	  r	  r	  r	  r
  r
  r6
  r)
  r+
  rA
  rX
  re
  rg
  r
  r
  r  r  gcc_branch_hintsbranch_prediction_macrosr  r  r  r  rB  r~	  r	  rH	  traceback_utility_coder3   r4   r5   <module>r1     sX     " " "&& "vv "VV "v"%+V"5;V"DJF"W]W]"$f"28&"EKV"Z`Z`" #)&" 8>v" $V	" 28	" HNv	"
 !&" "               Q Q Q Q Q Q Q Q Q Q Q Q Q Q                   2 2 2 2 2 2 2 2: : : : : : : : : : : : : : : : : : : : : : : : : :       ) ) ) ) ) )                   D D D D D D D D D D 0 0 0 0 0 0 0 0 -.AB        6 6 6  4  4
8 
8 
8 
8 
8 
8 
8 
88 8 8 8 8T 8 8 84   kN kN kN kN kN kN kN kN\2* 2* 2* 2* 2*T 2* 2* 2*j: : : : : : : :"  "  "  "  " 4 "  "  " J% % % % %t % % %*%! %! %! %! %!X %! %! %!P    d   2         /      Fi i i i i i i i$- - - - -O - - -i i i i i< i i ii i i i i'D i i i.k .k .k .k .k? .k .k .kbpM pM pM pM pM/ pM pM pMf
f 
f 
f 
f 
f? 
f 
f 
fk! k! k! k! k!4 k! k! k!\	! 	! 	! 	! 	!D 	! 	! 	!    D   e e e e e- e e eN"
 "
 "
 "
 "
m "
 "
 "
J    -   ,B B B B B B B BJ	 	 	 	 	= 	 	 	       $$; $; $; $; $;M $; $; $;NZ Z Z Z Z} Z Z ZpH pH pH pH pH( pH pH pHf* * * * *H * * *ZZ! Z! Z! Z! Z!() Z! Z! Z!zX* X* X* X* X*8 X* X* X*v(6 (6 (6 (6 (6x (6 (6 (6V    8   Bg. g. g. g. g.(I g. g. g.T| | | | |; | | |~< < < < <D < < <         D      K	 K	 K	 K	 K	k K	 K	 K	\_* _* _* _* _*[ _* _* _*D8< 8< 8< 8< 8<w 8< 8< 8<v    #   
! ! ! ! !< ! ! !
    <   
M  M  M  M  M 7 M  M  M `{ { { { { { { {|	 	 	 	 	8Y 	 	 	r! r! r! r! r!\ r! r! r!jd	% d	% d	% d	% d	%L d	% d	% d	%N! ! ! ! !8 ! ! !8#! #! #! #! #!H #! #! #!L       $    8   $=! =! =! =! =!8 =! =! =!@", ", ", ", ",X ", ", ",J         >      D
h  h  h  h  h ^ h  h  h V/  /  /  /  / ^ /  /  / dDQ DQ DQ DQ DQN DQ DQ DQN@& @& @& @& @&H @& @& @&F& & & & &8 & & &R5 5 5 5 5( 5 5 5p
$ 
$ 
$ 
$ 
$8 
$ 
$ 
$4 4 4 4 4l 4 4 4, , , , ,H , , , + + + + +x + + + k& k& k& k& k&X k& k& k&\@& @& @& @& @&H @& @& @&F. . . . .h . . .>/& /& /& /& /&X /& /& /&d-, -, -, -, -, -, -, -,`&! &! &! &! &!4 &! &! &!R!! !! !! !! !!X !! !! !!H,, ,, ,, ,, ,,X ,, ,, ,,^	 	 	 	 	 	 	 	9, 9, 9, 9, 9,Hh 9, 9, 9,xY Y Y Y YD Y Y Yx9  9  9  9  9 4 9  9  9 x* * *`! `! `! `! `!Xx `! `! `!F, , , , ,N , , ,? ? ? ? ?~ ? ? ?(m, m, m, m, m,h m, m, m,`f f f f f8 f f fR         >      Bh, h, h, h, h, h, h, h,V^! ^! ^! ^! ^!t ^! ^! ^!BQ+ Q+ Q+ Q+ Q+ Q+ Q+ Q+h    0   Q Q Q Q Q) Q Q Qh] ] ] ] ]( ] ] ]84 4 4 4 4K 4 4 4a= a= a= a= a=0 a= a= a=H
 
 
 
 
h 
 
 
2b b b b b+ b b bJc c c c c c c cS S S baaa6    4*, *, *, *, *,h *, *, *,ZQ, Q, Q, Q, Q,( Q, Q, Q,ha% a% a% a% a% a% a% a%H    4   wC wC wC wC wCx wC wC wCvGZ GZ GZ GZ GZ, GZ GZ GZTj j j j j( j j jZZ0 Z0 Z0 Z0 Z0 Z0 Z0 Z0z       "  
   0/FF 3K3JMM  "9!89Ln!]!] ,[,-=~NN 4[4^^TT 5k5o~VV 6{67K^\\ 00PP   r4   