
    Ae\                       d dl mZ 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e d dlZd dlZd dlZd dlm	Z	 ddl
mZ ddlmZmZmZmZ 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 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* ejV                  d    d'k\  re,Z-ne,e.fZ-d( Z/d) Z0dd*Z1d+ Z2 G d, d-e3      Z4 G d. d/e3      Z5d0 Z6e6 G d1 d2e             Z7 G d3 d4e7      Z8 G d5 d6e      Z9 G d7 d8e7      Z: G d9 d:e7      Z; G d; d<e;      Z< G d= d>e7      Z= G d? d@e=      Z> G dA dBe=      Z? G dC dDe=      Z@ G dE dFe=      ZA G dG dHe=      ZB G dI dJe=      ZC G dK dLe7      ZD G dM dNe7      ZE G dO dPe7      ZF G dQ dReE      ZG G dS dTeE      ZH G dU dVeE      ZI G dW dXeE      ZJ G dY dZeE      ZK G d[ d\eE      ZL G d] d^eE      ZM G d_ d`eE      ZN G da dbe;      ZO G dc dde;      ZP G de dfePe9      ZQ G dg dhe;      ZR G di dje;      ZS G dk dle;      ZT G dm dne;e9      ZU G do dpeU      ZV G dq dre7      ZW G ds dte7      ZX G du dveU      ZY G dw dxeU      ZZ G dy dzeY      Z[ G d{ d|e[      Z\ G d} d~e\      Z] G d de\      Z^ G d deY      Z_ G d de;      Z` G d de;e9      Za G d dea      Zb G d dea      Zc G d de;      Zd G d de;      Ze G d de;      Zf G d de;      Zg G d de;      Zh G d deh      Zi G d deh      Zj G d deh      Zk G d deh      Zl G d de;      Zm G d de;      Zn G d de;      Zo G d de;      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 de7      Zy G d de;      Zz G d de;      Z{ G d de      Z| G d de|e;      Z} G d de7      Z~ G d de7      ZdÄ Z G dĄ de|e;      Z G dƄ de      Z G dȄ de      Z G dʄ de|e;      Z G d̄ de;      Z G d΄ deh      Z G dЄ de;      Z G d҄ de7      Z G dԄ de;      Z G dք de      Z G d؄ de      Z G dڄ de;      Z G d܄ de      Zdބ Zd߄ d edZdddZ G d de;      Z G d de;      Z G d de;      Z G d de7      Z G d de;e      Z G d de      Z G d de      Z G d de;      Ze#j2                  rdZndZ ej6                  dd      Z ej6                  dd      Z ej6                  dd      Z ej6                  dd      Z ej6                  dd      Z ej6                  dd      Z ej6                  dd      Z ej6                  d d      Z eddeg      Zy(      )absolute_importNsysoscopyBuiltinerrorwarningNaming
PyrexTypespy_object_typeModuleScope
LocalScopeClosureScopeStructOrUnionScopePyClassScopeCppClassScopeUtilityCodeEncodedString
error_type_py_int_types)chain   )r   )r   r	   InternalErrorCompileError)r
   )r   )	TypeSlots)r   r   )r   r   r   r   r   r   TemplateScope)r   )r   )Future)Options)
DebugFlags)has_np_pythranpythran_typeis_pythran_buffer   )add_metaclass   c                 2    | d   j                         | d   fS Nr   r   )get_filenametable_entryposs    5lib/python3.12/site-packages/Cython/Compiler/Nodes.pyrelative_positionr,   )   s    F**,c!f55    c                    t         j                  s|S dt        |       z  }|t        |      S |j                  }|	 |j                  |       |st        |      }nt        |dz   |z         }||_        |S # t        $ r d }Y 5w xY w)NzFile: %s (starting at line %s)
)r   embed_pos_in_docstringr,   r   encodingencodeUnicodeEncodeError)r*   	docstringpos_liner1   docs        r+   embed_positionr7   -   s    ))03DS3IIHX&& !!H	OOH% H%Hu,y89CLJ " 	H	s   A6 6BBc                    d }d}dx}}| j                   rzt        | j                  d       | j                  D ];  \  }}|j                  s|j
                  dv rd}|r&|} )|j
                  dv s8d}|} = |r|rt        | j                  d       | j                  |      }	| j                  r| j                  s| j                  dv r|1|	/|	j                  s#|j                  |      }
|
r|
j                  rd}d }	|	t        j                  t        j                  t        j                  fv rJ| j                  dk(  rt        j                   nt"        }	n$|	"| j                  rt        | j                  d	       |	B|r$|s"|	j                  st        | j                  d
       t%        | j                  |	d      }||	fS |rt        | j                  d       ||	fS t        | j                  d       ||	fS )NFzSDicts should no longer be used as type annotations. Use 'cython.int' etc. directly.)types   typeT)ctypes   ctypez9Duplicate type declarations found in signature annotation)intlongfloatr=   zWStrings should no longer be used for type declarations. Use 'cython.int' etc. directly.zOPython type declaration in signature annotation does not refer to a Python type)r9   is_argz'Ambiguous types in annotation, ignoringz0Unknown type declaration in annotation, ignoring)is_dict_literalr	   r*   key_value_pairsis_string_literalvalueanalyse_as_typeis_namecython_attributenameis_pyobject
infer_typer   c_long_type
c_int_typec_float_typec_double_typer   CAnalysedBaseTypeNode)
annotationenvassigned_value	base_typeis_ambiguousexplicit_pytypeexplicit_ctyperF   rB   arg_typeassigned_types              r+   analyse_type_annotationrW   G   s   IL',,On!!
e	g%55 		#KD%))zz.."&%!&J22!%"
		# ~JNN$_`))#.H*"="=*//UmBm%(*>xG[G[*55c:M!:!:#
..
0E0EzG^G^__3=??g3Mz//SaH		*">">
i	k>(:N:NJNNeg)NN$8	 h	 

 IJ h 	
 RShr-   c                       fd}|S )Nc            
         t        |       dkD  r^t        | d         rN| d d \  }}dd|j                  z  d|j                  j                  d	j                  d|j
                  dd  d	}|j                  j                  j                         }|j                  |       |j                  j                  j                         }|xj                  dz  c_         	| i |}|xj                  dz  c_        ||j                  j                  j                         k(  r'|j                  j                  j                  |       |S |j                  d	d
d      }|j                  |       |S  	| i |S )Nr   r#   z                    /*  z -> .z */   ->z<-)len
isinstance
call_level	__class____name__r*   bufferstreamtellputlntruncatereplace)
argskwdsnodecodemarkerpristinestartrescodewriter_classfuncs
           r+   fzwrite_func_call.<locals>.fw   s9   t9q=ZQ1AB bqJD$doo%''	F
 {{))..0HJJvKK&&++-EOOq O%%COOq O**//11""++H5 J  dA6

6"J&&&r-    )rr   rq   rs   s   `` r+   write_func_callru   v   s    '2 Hr-   c                        e Zd Z fdZ xZS )VerboseCodeWriterc                     ddl m} ddlm} t	        |      }|j                         D ]!  \  }}t        ||      st        ||      ||<   # t        t        | +  | |||      S )Nr   FunctionTyper   )CCodeWriter)typesrz   Coder{   dictitemsr_   ru   superrw   __new__)	clsrF   basesattrsrz   r{   mnamemra   s	           r+   r   zVerboseCodeWriter.__new__   s`    &%U 	?HE1!\*.q+>e	? &4S$uMMr-   )rb   
__module____qualname__r   __classcell__ra   s   @r+   rw   rw      s    N Nr-   rw   c                   6     e Zd ZdZ eg 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        |      }|j                         D ]-  \  }}t	        ||      s|| j
                  v s" |||      ||<   / t        t        | #  | |||      S )Nr   ry   c                       fd}|S )Nc                  B     | i |}|t        d| d|       |S )NrZ   )print)ri   kwargsretvalrr   rF   s      r+   callz3CheckAnalysers.__new__.<locals>.check.<locals>.call   s+    t.v.>dF;<r-   rt   )rF   rr   r   s   `` r+   checkz%CheckAnalysers.__new__.<locals>.check   s    
 Kr-   )	r|   rz   r~   r   r_   methodsr   r   r   )	r   rF   r   r   rz   r   r   r   ra   s	           r+   r   zCheckAnalysers.__new__   sm    &	 U 	/HE1!\*u/C$UAe	/ ^S1#tUEJJr-   )rb   r   r   __doc__setr   r   r   r   s   @r+   r   r      s#     + ,GK Kr-   r   c                 P    t         j                  r t        t              |       S | S N)r   debug_trace_code_generationr$   rw   )r   s    r+   _with_metaclassr      s#    --/}./44Jr-   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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y)Noder   FNc                 H    || _         | j                  j                  |       y r   )r*   __dict__update)selfr*   kws      r+   __init__zNode.__init__   s    R r-   	Operationc                 J    t        | j                  d| j                  z         y )Nz%s not allowed without gil)r   r*   gil_messager   rO   s     r+   	gil_errorzNode.gil_error   s    dhh4t7G7GGHr-   c                 F    |j                         s| j                          y y r   )is_cpp	cpp_errorr   s     r+   	cpp_checkzNode.cpp_check   s    zz|NN r-   c                 J    t        | j                  d| j                  z         y )Nz%s only allowed in c++)r   r*   cpp_messager   s    r+   r   zNode.cpp_error   s    dhh043C3CCDr-   c           	          t        j                   |       }|j                  D ]:  }t        ||      }t        |t              s t        |||D cg c]  }| c}       < |S c c}w )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.)r   child_attrsgetattrr_   listsetattr)r   resultattrnamerB   xs        r+   
clone_nodezNode.clone_node   s_     4** 	>HFH-E%&e*<1*<=	>  +=s   	A!c                      y r   rt   r   s     r+   analyse_declarationszNode.analyse_declarations      r-   c                 F    t        d| j                  j                  z        )Nz*analyse_expressions not implemented for %sr   ra   rb   r   s     r+   r   zNode.analyse_expressions  s$    HNN##$ % 	%r-   c                 F    t        d| j                  j                  z        )Nz$generate_code not implemented for %sr   r   rl   s     r+   generate_codezNode.generate_code  s$    BNN##$ % 	%r-   c                 \    t        | t              r| j                  j                  |       y y r   )r_   	BlockNodebodyannotater   s     r+   r   zNode.annotate"  s#    dI&IIt$ 'r-   c                 j   	 | j                   S # t        $ r | j                  }| j                  s|| _         |cY S | j                  D ]]  }t	        | |      }|t        |t              r"|D ]  }t        ||j                               } Dt        ||j                               }_ || _         |cY S w xY wr   )	_end_posAttributeErrorr*   r   r   r_   r   maxend_pos)r   r*   attrchildcs        r+   r   zNode.end_pos'  s    	==  	((C## #
(( 	4d+=t," 4!#qyy{34 c5==?3C	4  DMJ!	s    *B2A5B21B2c                 T  
 dk(  ry
t               t        |       v r$d| j                  j                  t        |       fz  S j	                  t        |              
fd
| j
                  j                         D cg c]  \  }}|vs||f }}}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 c c}}w )zYDebug helper method that returns a recursive string representation of this node.
        r   z<...nesting level cutoff...>z<%s (0x%x) -- already output>c           
          t        | t              r| j                  |dz
        S t        | t              r)ddj	                  | D cg c]  } ||       c}      z  S t        |       S c c}w )Nr   z[%s], )r_   r   dumpr   joinrepr)r   levelitemcutoff
dump_childencountered
filter_outs      r+   r   zNode.dump.<locals>.dump_childG  se    !T"vveZ;GGAt$		q*Qt:dE+B*Q RRRAw +Rs   	A-
z<%s (0x%x)>z  z<%s (0x%x)
z: r   r/   z%s>)r   idra   rb   addr   r   r^   )r   r   r   r   r   keyrB   r   indentrp   r   s     ```     @r+   r   z	Node.dump<  s(    Q;1%Kd8{"2dnn6M6MrRVx5XXX4!	 150C0C0E_*#uT^I^#u__u:? DNN$;$;RX#FFFE\F DNN$;$;RX#FFC# T
UjPQ	6RSST56>!CJ `s   D$D$c                 >   | j                   sy| j                   \  }}}|j                  dd      }|t        d|dz
        | }|d   }|r|d| |z   ||d z   }|j                         d	z   |d<   ||||d
z    z  }d|j	                         ||dj                  |      fz  S )z[Debug helper method that returns the source code context of this node as a string.
         ASCIIignore)r1   error_handlingr   r%   Nz             # <<<<<<<<<<<<<<
r#   z"%s":%d:%d
%s
)r*   	get_linesr   rstripget_escaped_descriptionr   )	r   mark_columnrm   source_desclinecolcontentslinescurrents	            r+   dump_poszNode.dump_posZ  s     xx!%T3(('((SQQ-)dsmf,wst}<GNN$'IIb	$tAv&&"//14chhuo&O O 	Or-   r   )r   r)   d   N)Fz(#))rb   r   r   rD   is_noneis_nonecheck
is_literalis_terminator
is_wrappertempsr   outer_attrscf_statecoercion_typer   r   nogil_checkin_nogil_contextr   r   r   r   r   r   r   r   r   r   r   r   rt   r-   r+   r   r      s     GGLJMJE
 K KH M! KKI KEJ%%%
*<Or-   r   c                   4    e Zd ZdZdgZd Zd Zd Zd Zd Z	y)	CompilerDirectivesNodez9
    Sets compiler directives for the children nodes
    r   c                     |j                   }| j                   |_         | j                  j                  |       ||_         y r   )
directivesr   r   r   rO   olds      r+   r   z+CompilerDirectivesNode.analyse_declarationst  s/    nn		&&s+r-   c                     |j                   }| j                   |_         | j                  j                  |      | _        ||_         | S r   )r   r   r   r  s      r+   r   z*CompilerDirectivesNode.analyse_expressionsz  s8    nnII11#6	r-   c                     |j                   }|j                  j                   }| j                   |j                  _         | j                  j                  ||       ||_         ||j                  _         y r   )r   globalstater   generate_function_definitions)r   rO   rl   env_oldcode_olds        r+   r  z4CompilerDirectivesNode.generate_function_definitions  sW    ..##..&*oo#		//T: &.#r-   c                     |j                   j                  }| j                  |j                   _        | j                  j                  |       ||j                   _        y r   )r  r   r   generate_execution_coder   rl   r  s      r+   r
  z.CompilerDirectivesNode.generate_execution_code  sE    ))&*oo#		))$/&)#r-   c                     |j                   j                  }| j                  |j                   _        | j                  j                  |       ||j                   _        y r   )r  r   r   r   r  s      r+   r   zCompilerDirectivesNode.annotate  sE    ))&*oo#		4 &)#r-   N)
rb   r   r   r   r   r   r   r  r
  r   rt   r-   r+   r   r   k  s)     (K/**r-   r   c                       e Zd Zd Zd Zy)r   c                     |j                         j                  }|D ]  }|j                  j                  |        |d d = y r   )global_scopeundeclared_cached_builtinsr  add_cached_builtin_decl)r   rO   rl   entriesentrys        r+   generate_cached_builtins_declsz(BlockNode.generate_cached_builtins_decls  s@    ""$?? 	<E44U;	<AJr-   c                 J    |j                   D ]  }|j                  ||        y r   )lambda_defsr  )r   rO   rl   rk   s       r+   generate_lambda_definitionsz%BlockNode.generate_lambda_definitions  s%    OO 	:D..sD9	:r-   N)rb   r   r   r  r  rt   r-   r+   r   r     s    :r-   r   c                   @    e Zd ZdgZed        Zd Zd Zd Zd Z	d Z
y)	StatListNodestatsc                 $    t        | g|i |}|S r   )r  )r*   rO   ri   r   rk   s        r+   create_analysedzStatListNode.create_analysed  s    C-$-"-r-   c                 H    | j                   D ]  }|j                  |        y r   r  r   r   rO   stats      r+   r   z!StatListNode.analyse_declarations  s#    JJ 	+D%%c*	+r-   c                 l    | j                   D cg c]  }|j                  |       c}| _         | S c c}w r   )r  r   r  s      r+   r   z StatListNode.analyse_expressions  s7     #'**. ..s3 .
.s   1c                 J    | j                   D ]  }|j                  ||        y r   r  r  r   rO   rl   r   s       r+   r  z*StatListNode.generate_function_definitions  s%    JJ 	:D..sD9	:r-   c                 ~    | j                   D ].  }|j                  |j                         |j                  |       0 y r   )r  mark_posr*   r
  r   rl   r   s      r+   r
  z$StatListNode.generate_execution_code  s3    JJ 	/DMM$((#((.	/r-   c                 H    | j                   D ]  }|j                  |        y r   r  r   r'  s      r+   r   zStatListNode.annotate  !    JJ 	 DMM$	 r-   N)rb   r   r   r   staticmethodr  r   r   r  r
  r   rt   r-   r+   r  r    s6     )K +
:
/ r-   r  c                       e Zd Zd Zd Zy)StatNodec                      y r   rt   r   rO   rl   s      r+   r  z&StatNode.generate_function_definitions  r   r-   c                 F    t        d| j                  j                  z        )Nz.generate_execution_code not implemented for %sr   r   s     r+   r
  z StatNode.generate_execution_code  s$    LNN##$ % 	%r-   N)rb   r   r   r  r
  rt   r-   r+   r-  r-    s    %r-   r-  c                   *    e Zd ZdgZd Zd Zd Zd Zy)CDefExternNoder   c                 l   |j                   }d|_         | j                  j                  |       ||_         | j                  s| j                  rg| j                  j
                  }|j                  d   sd}n|sd}nt        d |D              }|j                  | j                  | j                  |       y y )Nr   preliminary_late_includes_cy28Fc              3   <   K   | ]  }t        |t                y wr   )r_   CVarDefNode).0rk   s     r+   	<genexpr>z6CDefExternNode.analyse_declarations.<locals>.<genexpr>  s     KT:dK8Ks   )	in_cincluder   r   include_fileverbatim_includer  r   alladd_include_file)r   rO   old_cinclude_flagr  lates        r+   r   z#CDefExternNode.analyse_declarations  s    OO		&&s++ 5 5IIOOE>>"BCKUKK  !2!2D4I4I4P !6r-   c                     | S r   rt   r   s     r+   r   z"CDefExternNode.analyse_expressions      r-   c                      y r   rt   r   s     r+   r
  z&CDefExternNode.generate_execution_code  r   r-   c                 :    | j                   j                  |       y r   r   r   r   s     r+   r   zCDefExternNode.annotate      		4 r-   N)rb   r   r   r   r   r   r
  r   rt   r-   r+   r2  r2    s     
 (KQ$!r-   r2  c                       e Zd Zg ZdZd Zy)CDeclaratorNoder   c                      y r   rt   r   s    r+   analyse_templatesz!CDeclaratorNode.analyse_templates  s    r-   N)rb   r   r   r   calling_conventionrI  rt   r-   r+   rG  rG    s     Kr-   rG  c                       e Zd ZdgZdZddZy)CNameDeclaratorNodedefaultNc                    |r| j                   dk(  r}|j                  s|j                  s|j                  rt	        | j
                  d       nB|j                  rt	        | j
                  d       n|j                  ddd      | _         t        }|j                  r'|j                  r|j                  |j                        }|| _        | |fS )Nr   Missing argument nameJUse spam() rather than spam(void) to declare a function with no arguments.r   )for_displaypyrex)rF   is_ptris_array	is_bufferr   r*   is_voiddeclaration_coder   is_fusedfused_to_specific
specializer9   )r   rQ   rO   nonempty
visibilityin_pxds         r+   analysezCNameDeclaratorNode.analyse  s    		R9#5#59L9Ldhh 78""dhh lm%66rqPQ6R	*	#"7"7!,,S-B-BCI	Yr-   r   NF)rb   r   r   r   rM  r^  rt   r-   r+   rL  rL    s    
 +KGr-   rL  c                        e Zd ZdgZd ZddZy)CPtrDeclaratorNodebasec                 6    | j                   j                         S r   rb  rI  r   s    r+   rI  z$CPtrDeclaratorNode.analyse_templates5      yy**,,r-   Nc                     |j                   rt        | j                  d       t        j                  |      }| j
                  j                  |||||      S )Nz+Pointer base type cannot be a Python objectr[  r\  r]  )rG   r   r*   r   
c_ptr_typerb  r^  )r   rQ   rO   r[  r\  r]  ptr_types          r+   r^  zCPtrDeclaratorNode.analyse8  sK      $((IJ((3yy  3jag hhr-   r_  rb   r   r   r   rI  r^  rt   r-   r+   ra  ra  0       (K-ir-   ra  c                        e Zd ZdgZd ZddZy)CReferenceDeclaratorNoderb  c                 6    | j                   j                         S r   rd  r   s    r+   rI  z*CReferenceDeclaratorNode.analyse_templatesD  re  r-   Nc                     |j                   rt        | j                  d       t        j                  |      }| j
                  j                  |||||      S )Nz-Reference base type cannot be a Python objectrg  )rG   r   r*   r   
c_ref_typerb  r^  )r   rQ   rO   r[  r\  r]  ref_types          r+   r^  z CReferenceDeclaratorNode.analyseG  sK      $((KL((3yy  3jag hhr-   r_  rj  rt   r-   r+   rm  rm  ?  rk  r-   rm  c                       e Zd ZddgZddZy)CArrayDeclaratorNoderb  	dimensionNc                    |j                   r|j                         s|j                  rddlm} t        | j                  |      r| j                  j                  }n| j                  f}|D cg c]  }|j                  |       }	}d |	v r1|	j                  d       }
t        ||
   j                  d       t        }n|j                  | j                  |	      }| j                  j                  |||||      S | j                  r| j                  j!                  |      | _        | j                  j"                  j$                  s t        | j                  j                  d       | j                  j'                         }|	 t)        |      }nd }|j-                         st        | j                  d|z         |j.                  rt        | j                  d       |j                  rt        | j                  d       t1        j2                  ||      }| j                  j                  |||||      S c c}w # t*        $ r Y w xY w)	Nr   	TupleNodezTemplate parameter not a typerg  zArray dimension not integerz%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	ExprNodesrw  r_   rt  ri   rC   indexr   r*   r   specialize_hererb  r^  analyse_const_expressionr9   is_intget_constant_c_result_coder;   
ValueErroris_completerG   r   c_array_type)r   rQ   rO   r[  r\  r]  rw  ri   vvaluesixsize
array_types                r+   r^  zCArrayDeclaratorNode.analyseT  s   ""y'A'A'C	H^H^,$..)4~~**~~6:;a'',;F;v~\\$'d2hll$CD&	%55dhhG	99$$YhS]fl$mm>>!^^DDSIDN>>&&--dnn((*GH>><<>Dt9D
 D$$&$((CiOP  $((EF!!$((@A,,Y=
yy  S8PZci jj9 <  " s   -H2H7 7	IIr_  rb   r   r   r   r^  rt   r-   r+   rs  rs  N  s     ;'K#kr-   rs  c                   :    e Zd Zg dZdZdZdZdZd ZddZ	ddZ
y)	CFuncDeclaratorNode)rb  ri   exception_valuer   Nc                    t        | j                  t              rddlm}m} | j                  j                  }t        ||      r|j                  }n't        ||      r|g}nt        |j                  d       y g | _
        |D ]]  }t        ||      r9| j                  j                  t        j                  |j                               Ht        |j                  d       _ | j                  j                  | _        | j                  S y )Nr   )rw  NameNodez*Template arguments must be a list of names)r_   rb  rs  r{  rw  r  rt  ri   r   r*   	templatesappendr   TemplatePlaceholderTyperF   )r   rw  r  template_nodetemplate_nodestemplates         r+   rI  z%CFuncDeclaratorNode.analyse_templates  s    dii!566 II//M-3!.!3!3M84"/m'')UVDN* Vh1NN))**L*LX]]*[\(,,(TU	V
 		DI>>!r-   c                 2    |i }|r|dz  }g }t         j                        D ]  \  }}	|	j                  ||dk(  xr j                  xr dj                  v      \  }
}|
j
                  }||v r||   }|j                        }|t        |j                  d       n\|t        j                  urH|j                  |      s7t         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	       |j)                  t        j*                  |||	j                               |	j,                  r xj.                  dz  c_        ŉ j.                  st         j                  d
        d }d} j0                  dk(  rDj3                  d       j3                  d       j3                  d       j3                  d       |j4                  r? j6                  s j0                  r' j0                  dk7  rt         j                  d       n* j6                  d j0                  rX j0                  dk7  rI|j6                  =|dk7  r8|s6j                  s*ddlm}  | j                  |j6                  |       _         j6                  r j6                  j=                         _         j0                  dk(  r j6                  j>                  }|j@                  s|j4                  sz|jB                  r"|jD                  j4                  s|j                  rL|t        jF                  k(  r j6                  jH                  dk(  s t         j6                  j                  d        j6                  }n j6                  jK                  |      j=                         _         j6                  jM                         }|,tO        d j6                  jP                  jR                  z        |jU                   j6                  j>                        s t         j6                  j                  d        j0                  }|jB                  rt         j                  d       t        jV                  || jX                   j.                  || j                  jZ                   j\                   j^                   j`                   jb                   jd                        } j.                  r,|jf                  r fd}||_4        n jk                  |       j                  d   }|r7|jZ                  }|r"||k7  rt         j                  d|d|d       ||_-         j                  j                  |||      S ) Nr   r   r+  r[  is_self_arg
Not a type2Signature does not agree with previous declarationPrevious declaration herez2Function argument cannot have C name specificationrP  z-Non-default argument follows default argument+iosnew	stdexcepttypeinfozAException clause not allowed for function returning Python objectextern	ConstNoderB   r9   *zSException value must be a Python exception or cdef function with no arguments or *.z1get_constant_c_result_code not implemented for %sz6Exception value incompatible with function return typez!Function cannot return a function)	optional_arg_countr  exception_checkrJ  nogilwith_gilis_overridableis_const_methodr  c                 ,    j                  | |       y r   )declare_optional_arg_struct)	func_typefused_cnamerO   r   s     r+   declare_opt_arg_structz;CFuncDeclaratorNode.analyse.<locals>.declare_opt_arg_struct
  s    44Y[Qr-   callspeczcannot have both 'z' and 'z' calling conventionsr\  r]  )6	enumerateri   r^  is_c_class_scoper   rF   rC   r   r*   r   r   same_asrb  cnameis_unspecifiedparent_typerT  rh  rQ   rV  r  CFuncTypeArgrM  r  r  r=  rG   r  r{  r  r~  r9   is_errorrz  return_typec_char_typerB   	coerce_tor  r   ra   rb   assignable_from	CFuncTypehas_varargsrJ  r  r  overridabler  r  rX  r  r  )r   r  rO   r[  directive_localsr\  r]  func_type_argsiarg_nodename_declaratorr9   rF   	type_node
other_typeexc_val	exc_checkr  exc_val_typer  r  r  r   s   ` `                    r+   r^  zCFuncDeclaratorNode.analyse  s5   #!MH$TYY/  	QKAx$,$4$4h!Ve(<(<eWZWeWeAe %5 %h!OT #''D'',T2	&66s;
%)--6*";";;"ll:6$))--)]^)--)DE%D$$dhh TUAv#..43F3F}}!,,T^^<||hll$pq!!''dHLLAC''1,'((dhh OPA 	QD 	3&  '  '  -  ,##))T-A-A((C/$((_`##+0D0DI]I]adId ..:
h@V_e//8/8 HHK,G,Gk0[,##'+';';'T'TUX'Y$''3.#'#7#7#<#<L(11$0$<$<%1%>%>-9-E-E-Q-Q-9->->%1Z5K5K%K)-)=)=)C)Cs)Jd2266su"22G+/+?+?+I+I#S,**B*B3*G ("22MMOG+O 00::CCDE E '66t7K7K7P7PQd2266VX,,I##$((?@(()9)9#66#Y#yy;;**t}}TEUEU 00nn&	 ""!!R 4J	000C@>>*-22G7h.dhh/6!B C+3I(yy  CJv VVr-   c                    t               }dt        j                  z  }|j                  |t        j
                  | j                         |j                  t        |j                        | j                  z
  d D ]6  }|j                  |j                  |j                  |j                  dd       8 |j                  t        j                  | j                  j                        }|t	        j                  ||      }|j!                         j#                  |d|d| j                  |      }d|_        d|_        t	        j(                  |j                        |_        y)	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   )rF   kindscopetypedef_flagr*   r  r   )r   r
   pyrex_prefixdeclare_varr   rJ   r*   ri   r^   r  rF   r9   mangleopt_arg_prefixrb  get_fused_cnamer  declare_struct_or_uniondefined_in_pxdusedrh  op_arg_struct)	r   r  rO   r  r  arg_count_memberargstruct_cnameop_args_structs	            r+   r  z/CFuncDeclaratorNode.declare_optional_arg_struct  s)    #$ 6#6#66*J,A,A488L>>#inn"58O8O"O"PQ 	gCchh#''$aef	g zz&"7"7H"%55k<PL))+CC D   )*%","7"78K8K"L	r-   )r   NNFr   )rb   r   r   r   r  r  r  r  rI  r^  r  rt   r-   r+   r  r  z  s1     6KKOI,vWpMr-   r  c                       e Zd ZdgZddZy)CConstDeclaratorNoderb  Nc                     |j                   rt        | j                  d       t        j                  |      }| j
                  j                  |||||      S )N)Const base type cannot be a Python objectrg  )rG   r   r*   r   c_const_typerb  r^  )r   rQ   rO   r[  r\  r]  consts          r+   r^  zCConstDeclaratorNode.analyse@  sM      $((=?''	2yy  h:^d eer-   r_  r  rt   r-   r+   r  r  ;  s     (Kfr-   r  c                   j    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dZd Zd	 Zd
 ZddZy)CArgDeclNode)rQ   
declaratorrM  rN   rM  rN   r   r   Nc                 R   |rdx| j                   _        | _        | j                  it        | j                  t
              r| j                  j                  dk(  r|r| j                   j                  r.| j                   j                  |d      }|j                         }n| j                   j                  }t        |      | j                  _        d | j                   _        d| j                   _        d}nd}d| j                   _        | j                   j                  ||      }t        | j                   d      r;| j                   j                  r%| j                   j                  | j                  _        |j                  rt        | j                   t              rt        | j                  t               rt| j                  }t        |j"                  t               r'|j"                  }t        |j"                  t               r'| j                   j$                  |_        |j                   }| j&                  r<|r:|j(                  d   r+| j                   j                  | j+                  |      }	|	|	}| j                  j                  |||      S | j,                  | j                  fS )NTr   )could_be_nameFarg_nameannotation_typingr[  )rQ   r  r9   r_   r  rL  rF   is_basic_c_typer^  empty_declaration_coder   r>   hasattrr  rT  TemplatedTypeNoders  rb  array_declaratorrN   r   inject_type_from_annotationsr  )
r   rO   r[  r  r9   r  r  rQ   r  rU   s
             r+   r^  zCArgDeclNode.analyseg  s   <@@DNN&)999$//+>?DOODXDX\^D^~~55#~~55c5N#'#>#>#@#'>>#6#6+8+BDOO(*.DNN'5:DNN2 $ %$(DNN!..s-.PIt~~z2t~~7N7N'+~~'>'>$
 """4>>3DE"4??4HI!__
 2FG!+J !2FG"&.."A"A
%//	 33>>:M+NSWSaSaSfSfSn<<SA' (I??**9cH*MM''22r-   c                 l    | j                   }|sy t        ||| j                        \  }}||| _        |S )N)rP   )rN   rW   rM  rQ   )r   rO   rN   rQ   rU   s        r+   r  z)CArgDeclNode.inject_type_from_annotations  s=    __
5j#VZVbVbc	8 &DNr-   c                 R   | j                   | j                  r| j                  j                  rN| j                  j                  |       | j                  j                  | j                  j                               S |j                  | j                        | _         | j                   S r   )default_valuerM  r   generate_evaluation_coder9   	cast_coder   get_argument_default_constr   s     r+   calculate_default_value_codez)CArgDeclNode.calculate_default_value_code  sy    %||<<**LL99$?99..t||/B/B/DEE%)%D%DTYY%O"!!!r-   c                 T    | j                   r| j                   j                  |       y y r   )rM  r   r   s     r+   r   zCArgDeclNode.annotate  s     <<LL!!$' r-   c                    | j                   }||j                  ry || j                  |      }|j                  |       |j	                  |       |r|j                         n|j                  | j                        }|j                  |d|d       | j                  j                  r|j                  |j                                |j                  |       |j                  |       y N = ;)rM  r   r  r  make_owned_referencer   	result_asr9   rf   rG   put_giverefgenerate_post_assignment_code
free_temps)r   rl   targetoverloaded_assignmentrM  r   s         r+   generate_assignment_codez%CArgDeclNode.generate_assignment_code  s    ,,?g00>66t<F((.$$T*%:!@Q@QRVR[R[@\

0199  W^^-.--d34 r-   )r   FNF)rb   r   r   r   r   r  is_type_arg
is_generickw_onlynot_noneor_noner9   r  r  rN   
is_dynamicr^  r  r  r   r  rt   r-   r+   r  r  H  se      GKl+KKKJGHGDOMJJ,3\"(!r-   r  c                       e Zd Zd Zy)CBaseTypeNodec                 $    | j                  |      S r   )r^  r   s     r+   rC   zCBaseTypeNode.analyse_as_type  s    ||C  r-   N)rb   r   r   rC   rt   r-   r+   r  r    s    !r-   r  c                       e Zd Zg ZddZy)rM   c                     | j                   S r   r9   )r   rO   r  s      r+   r^  zCAnalysedBaseTypeNode.analyse  s    yyr-   NFr  rt   r-   r+   rM   rM     s     Kr-   rM   c                   (    e Zd Zg ZdZg ZdZdZddZy)CSimpleBaseTypeNodeNFc                 d   d }| j                   rPt        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                  ru|}| j                  D ];  }|j                  |      }|#|j                  r|j                  j                   }9d } n |)|j#                  | j                  | j                        }n|}|r|j                  r|j%                         }|j'                  | j
                        }|n|rF| j                  r|j                  r|j                  }nt        }t)        | j
                        | _        n| j,                  r[| j
                  | j,                  vr#t        | j                  d| j
                  z         t        j.                  | j
                        }n#t        | j                  d| j
                  z         |r3|j0                  r'|j2                  r|j5                  |j2                        }| j6                  rU|j8                  r|j:                  rt        | j                  d       t        j<                  |      }|j?                  |       n:|t@        jB                  u r(t        jD                  }|j?                  |       d| _        |r|S t        jF                  S )Nz&Unrecognised type modifier combinationobjectz'%s' is not a type identifierz#can only complexify c numeric typesT)$r  r   simple_c_typesignedlongnessrF   r   r*   module_pathr   r  r  r  lookuprx  r9   r  find_imported_moduler  lookup_typer   r  r  r  rX  rY  rZ  complex
is_numeric
is_complexCComplexTypecreate_declaration_utility_coder   complex_typec_double_complex_typer   )r   rO   r  r9   r  r   r  s          r+   r^  zCSimpleBaseTypeNode.analyse  sv    ++DKK		RDdhh HIYY("4+;+;!DYYC$8$8 & ,, D!LL.E(U-?-? %

 0 0 $ =44T5E5EtxxPE))!..0E((3#"''C,@,@"  .$1$))$<DM~~#yyDNN:!$((,Kdii,WX)AA$))Ldhh(G$))(STDMMc&;&;??3#8#89D<<??doodhh EF**40D005W)))
 33D005DLK(((r-   r  )	rb   r   r   r   r  r  r  r   r^  rt   r-   r+   r  r    s#     KHKOGL)r-   r  c                   &    e Zd ZdZddgZddZd Zy)MemoryViewSliceTypeNode
memoryviewbase_type_nodeaxesc                 p   | j                   j                  |      }|j                  r|S ddlm} 	 |j                  || j                        }|j                  | j                  |      st         | _        | j                  S t        j"                  ||      | _        | j                  j%                  | j                         | j'                  |       | j                  S # t        $ rO}t        |j                  |j                         t        j                         | _        | j                  cY d }~S d }~ww xY wNr   
MemoryView)r*  r^  r  r   r/  get_axes_specsr+  r   r   positionmessage_onlyr   	ErrorTyper9   validate_axesr*   r   MemoryViewSliceTypevalidate_memslice_dtypeuse_memview_utilities)r   rO   r  rQ   r/  
axes_specses          r+   r^  zMemoryViewSliceTypeNode.analyse4  s    ''//4	i/ 	#223		BJ ''*="DI yy	 #66y*MDIII--dhh7&&s+yy  	!**ann-",,.DI99	s   C 	D5&AD0*D50D5c                 F    ddl m} |j                  |j                         y r-  )r   r/  use_utility_codeview_utility_code)r   rO   r/  s      r+   r7  z-MemoryViewSliceTypeNode.use_memview_utilitiesK  s     Z99:r-   Nr  )rb   r   r   rF   r   r^  r7  rt   r-   r+   r(  r(  /  s    D#V,K.;r-   r(  c                       e Zd ZdgZddZy)CNestedBaseTypeNoderQ   Nc                    | j                   j                  |      }|t        j                  u rt        j                  S |j                  s)t        | j                  d|z         t        j                  S |j                  j                  | j                        }|r|j                  s7t        | j                  d|d| j                  d       t        j                  S |j                  S )Nz'%s' is not a valid type scope'r[   z' is not a type identifier)rQ   r^  r   r   rx  r   r*   r  lookup_hererF   is_typer9   )r   rO   r  rQ   
type_entrys        r+   r^  zCNestedBaseTypeNode.analyseX  s    NN**3/	
---(((%%$((<yHI(((__00;
!3!3$(()TYYWX(((r-   r   r  rt   r-   r+   r>  r>  P  s     -Kr-   r>  c                   $    e Zd Zg dZdZdZddZy)r  )r*  positional_argskeyword_args
dtype_nodeNc           	         || j                   j                  |      }|j                  r|S |j                  r|j	                         r| j
                  rC| j
                  j                  r-t        | j                  d       t        j                  | _        n`g }| j                  D ]B  }|j                  |      }|t        |j                  d       t        }|j                  |       D |j                  | j                  |      | _        n|j                   rddlm} |j'                  | j                  || j                  | j
                  |j(                        }t*        j,                  d   dk  r=t/        |j1                         D 	
cg c]  \  }	}
|	j3                  d      |
f c}
}	      }t        j4                  |fi || _        t7        |      r t9        | j                        r
t        j:                  t=        | j                        | j                        | _        nt?        | j                  dd 	      }tA        | j                        dkD  s| j
                  j                  r,t        | j                  d
       t        j                  | _        n_| j                  sd }n| j                  d   }tC        | j                  ||      | _"        | jD                  j                  ||      d   | _        | j                  jF                  r6|jH                  r*| j                  jK                  |jH                        | _        | j                  S c c}
}	w )Nz+c++ templates cannot take keyword argumentsz!unknown type in template argumentr   Bufferr   r%   r   r   rF   r  zinvalid array declaration)rb  rt  )&r*  r^  r  rx  ry  rF  r@   r   r*   r   r   r9   rE  rC   r  r}  rG   r   rJ  analyse_buffer_optionsbuffer_defaultsr   version_infor~   r   r2   
BufferTyper    r"   PythranExprr!   rL  r^   rs  r  rX  rY  rZ  )r   rO   r  rQ   template_typesr  r9   rJ  optionsrF   rB   empty_declaratorrt  s                r+   r^  zTemplatedTypeNode.analysev  s   ++33C8Ii/!!i&@&@&B  T%6%6%F%Fdhh MN&11	!#%)%9%9 0M(88=D|m//1TU)"))$/0 &55dhhO	"" 33$$!!))+G "Q&3:==? D$/D% "&W!5u =  D E #--iC7CDIc"'8'C&22<		3JDIIV	  3488"DQ4''(1,0A0A0Q0Qdhh ;<&11	 ++ $I $ 4 4Q 7I(<HH)'))% !1199)SI!L	99#"7"7		,,S-B-BCDIyy; Ds   M
)FN)rb   r   r   r   rG  rF   r^  rt   r-   r+   r  r  f  s    1K JD>r-   r  c                       e Zd ZddgZddZy)CComplexBaseTypeNoderQ   r  c                 |    | j                   j                  ||      }| j                  j                  ||      \  }}|S r   )rQ   r^  r  )r   rO   r  rb  _r9   s         r+   r^  zCComplexBaseTypeNode.analyse  s7    ~~%%c=9//))$44r-   Nr  r  rt   r-   r+   rU  rU    s     -Kr-   rU  c                       e Zd ZdgZddZy)CTupleBaseTypeNode
componentsc                    g }| j                   D ]N  }|j                  |      }|j                  rt        |j                  d       t
        c S |j                  |       P |j                  | j                  |      }d|_        |j                  S )Nz/Tuple types can't (yet) contain Python objects.T)
rZ  r^  rG   r   r*   r   r  declare_tuple_typer  r9   )r   rO   r  component_typesr   r9   r  s          r+   r^  zCTupleBaseTypeNode.analyse  s|     	)A99S>DaeeNO!!""4(	) &&txxA
zzr-   Nr  r  rt   r-   r+   rY  rY    s      .K
r-   rY  c                   "    e Zd ZdZg Zd ZddZy)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                  | j                  || j                        }d|_        y )NT)r^  declare_typedefrF   r*   r9  )r   rO   r9   r  s       r+   r   z"FusedTypeNode.analyse_declarations  s6    ||C ##DIItTXX> !r-   c                    g }| j                   D ]X  }|j                  |      }|st        |j                  d       -||v rt        |j                  d       H|j	                  |       Z t        j                  || j                        S )Nr  zType specified multiple timesrF   )r|   rC   r   r*   r  r   	FusedTyperF   )r   rO   r  r|   r  r9   s         r+   r^  zFusedTypeNode.analyse  sy     
	#I,,S1Dimm\2u}imm%DET"
	# ##E		::r-   Nr  )rb   r   r   r   r   r   r^  rt   r-   r+   r_  r_    s     K!;r-   r_  c                       e Zd ZdgZddZy)CConstTypeNoderQ   c                     | j                   j                  ||      }|j                  rt        | j                  d       t        j                  |      S )Nr  )rQ   r^  rG   r   r*   r   r  )r   rO   r  rb  s       r+   r^  zCConstTypeNode.analyse  sC    ~~%%c=9$((=?&&t,,r-   Nr  r  rt   r-   r+   rf  rf    s     -K-r-   rf  c                   $    e Zd ZddgZdZdZddZy)r6  rQ   declaratorsNc                 
   | j                   i | _         |s|}|| _        | j                  r| j                  d   j                         }nd }|| j                  dk7  rt        | j                  d       t        | j                        dkD  r#t        | j                  d   j                  d       t        d|      }|j                  j                  |_
        |D ])  }|j                  |j                  || j                         + | j                  j                  |      }|j                  r@| j                   s4|j"                  s|j$                  rt        | j                  d       t&        S d | _        | j                  }| j                  D ]  }t        | j                        dkD  r6t+        |t,              s&|j                  d   rt/        |j                  d	d       | j0                  xr | j                  dk(  xr |j$                  }|rd
|_        t+        |t2              r.|j                  ||| j                   || j                         \  }	}
n"|j                  |||| j                         \  }	}
|
j5                         s@| j                  dk(  r|
j6                  s%|
j8                  st        |j                  d|
z         | j                  dk(  r"|
j:                  rt        |j                  d       |	j                  }|	j<                  }|dk(  rt        |j                  d        y |
j>                  r%| j                  dk7  rt        |j                  d       |
j@                  rd|j                  v rd|
_!        |jE                  ||
|j                  || j                  | j                   | jF                  | jH                  | j0                  	      | _        | j(                  .tK        jJ                  | j                         | j(                  _         |s| j(                  jL                  jO                  |       d| j(                  _(        | j0                  rt/        | j                  dd       | j                   rt        | j                  d       |jS                  ||
|j                  ||| j                   | jF                  d      | _        tT        jV                  sRtY        | j                  | jZ                        | j(                  _-         y )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  r\  r]  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 insteadr+  T)r  r\  r]  api	modifiersr  zfcpdef variables will not be supported in Cython 3; currently they are no different from cdef variablesr#   z,Decorators can only be followed by functions)r  r\  r]  rl  is_cdef).r  
dest_scoperi  rI  r\  r   r*   r^   r   outer_scoper   declare_typerF   rQ   r^  rX  r]  r  is_module_scoper   r  r_   rL  r	   r  r  r  rT  is_memoryviewslicerG   r  is_referencerz  is_static_methoddeclare_cfunctionrl  rm  r   r9   create_to_py_utility_codecreate_wrapperr  r   
docstringsr7   r6   )r   rO   ro  r  template_paramrQ   r\  r  create_extern_wrapperr  r9   rF   r  s                r+   r   z CVarDefNode.analyse_declarations  s5     ($&D!J$((+==?II (*dhh ?@4##$q(d&&q)--/VW5C __77CN"+ P  !4!4ndhhOP NN**3/	dkks7K7K7:7J7J$((:;
__
** 8	HJD$$%)&z3FG'BCNNJKLN
 &*%5%5 &=)-H)D&=),)<)< " %).
&*&9:(2(:(:sT5J5JWajnjuju ); )w% )3(:(:sz$++ ); )O%##%83I`I`*..*Lt*ST(*t/?/?jnn&OP"''D#))Erzjnn&DE  T__%@jnn&`a  !S^^3,0D)'99$
DOODKKDNNHXHX : Z
 ::)26))D<Q<Q2RDJJ/(JJOO==cB04DJJ-##DHH 'RSTV(($(($RS'33$
Jt{{! 4 -
 %%%3DHHdhh%GDJJNq8	Hr-   r   )rb   r   r   r   
decoratorsr  r   rt   r-   r+   r6  r6  	  s      .KJWHr-   r6  c                   ,    e Zd ZdgZddZd Zd Zd Zy)CStructOrUnionDefNode
attributesNc                     |j                  | j                  | j                  || j                  | j                  | j
                  | j                  | j                  | j                  	      | _	        y )N)r\  rl  packed)
r  rF   r  r  r*   r  r\  rl  r  r  r   rO   r  s      r+   declarezCStructOrUnionDefNode.declare  sP    00IItyy%):):DHHJJ4??;; 1  
r-   c                 $   d }| j                   t        | j                        }| j                  ||       | j                   | j                  r|j
                  sd| j                  _        | j                   D ]  }|j                  ||        | j                  dk7  rs|j                  D ]c  }|j                  }|j                  r|j                  }|j                  r|| j                  j                  k(  sNt        |j                  d       e y y y )Nr   r  z)Struct cannot contain itself as a member.)r  r   rF   r  r]  r9  r  r  r   r\  var_entriesr9   rT  rQ   r   r*   )r   rO   r  r   r9   s        r+   r   z*CStructOrUnionDefNode.analyse_declarations  s    ??&&tyy1ES% ??&{{3??,-

) 6))#u56(*!-- UD99D--#~~ --tzz.dhh(STU + 'r-   c                     | S r   rt   r   s     r+   r   z)CStructOrUnionDefNode.analyse_expressions  rA  r-   c                      y r   rt   r   s     r+   r
  z-CStructOrUnionDefNode.generate_execution_code  r   r-   r   rb   r   r   r   r  r   r   r
  rt   r-   r+   r~  r~  v  s       .K U$r-   r~  c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)CppClassNodeNc           	         | j                   d }n| j                   D cg c]  \  }}t        j                  ||        }}}t        d | j                   D              }|r6t	        d | j                   d |  D              st        | j                  d       |j                  | j                  d | j                  | j                  g | j                  |      | _        y c c}}w )Nc              3   (   K   | ]
  \  }}|   y wr   rt   r7  rW  requireds      r+   r8  z'CppClassNode.declare.<locals>.<genexpr>  s     (X+!XX(Xs   c              3   &   K   | ]	  \  }}|  y wr   rt   r  s      r+   r8  z'CppClassNode.declare.<locals>.<genexpr>  s     1w{q((1ws   zGRequired template parameters must precede optional template parameters.)base_classesr\  r  )r  r   r  sumr<  r   r*   declare_cpp_classrF   r  r\  r  )r   rO   rQ  template_namer  num_optional_templatess         r+   r  zCppClassNode.declare  s    >>!!N >B^^M"9- )@@T\P\] MN M%((X(X%X"%c1wdnn]u_u^uNv1w.wdhh ij**IItTXXtzz> + S
Ms   !Cc           
           j                   d x}}nQ j                   D cg c]  \  }}|	 }}} j                   D cg c]  \  }}t        j                  ||        }}}d } j                  t	         j
                  ||      } fd}t        | j                  D 	cg c]  }	|	j                  |xs |       c}	      }
|j                   j
                  | j                   j                  |
 j                  |       _         j                  y d j                  _        | j                  j                  |_        g }fd j                   j                   r|j"                  sd j                  _         j                  D ]3  }t'        |dd       }|r|j)                  |       |j+                  |       5   j                        D ]9  }|j-                  |        j                   !ddj/                  |      z  |_        ; t3         j                  |	       _        | _        y c c}}w c c}}w c c}	w )
N)r  c                 j    | j                   s| j                  ryt        j                  d| z         y )NTz&Base class '%s' not a struct or class.)rx  	is_structr   r*   )
base_classr   s    r+   base_okz2CppClassNode.analyse_declarations.<locals>.base_ok  s+    &&**>*>dhh H: UVr-   )r\  r  r   c              3      K   | D ]M  }t        |t              r| t        |t              s) |j                  j                        D ]  }|  O y wr   )r_   CFuncDefNoder   r   r  )r  r   sub_attrfunc_attributess      r+   r  z:CppClassNode.analyse_declarations.<locals>.func_attributes  sQ     " 'dL1J&<=$3DIIOO$D '&'	's
   +A(Ar  ztemplate <typename %s>z, typename r  )r  r   r  r  r   rF   filterr  r^  r  r*   r  r\  r  rx  r9   r]  r9  r  r   r  r   r  r   template_declarationr  r   r  )r   rO   rQ  template_namesr  rW  r  r  r  bbase_class_typesdefined_funcsr   r  rr   r  s   `              @r+   r   z!CppClassNode.analyse_declarations  s   >>!.22N^DHNNS0@qmSNS=A^^M"9- )@@T\P\] MN M??&!$))SNKE	W
 "'TM^M^+_AIIels,C+_`**IIudhhJJ(T__P^ + `
 ::"#

EJ	' ??&{{3??,-

) 1!$	48LL'))%0	1
 (8 n$$T*>>-0H=K]K]^lKm0mD-n !?	
S TM ,`s   H7!H=$I
c                     | j                   j                  | j                  j                  j                        | _         | S r   )r   r   r  r9   r  r   s     r+   r   z CppClassNode.analyse_expressions  s+    II11$**//2G2GH	r-   c                 x    | j                   j                  | j                  j                  j                  |       y r   )r   r  r  r9   r  r/  s      r+   r  z*CppClassNode.generate_function_definitions  s$    		//

0E0EtLr-   c                 :    | j                   j                  |       y r   r   r
  r   s     r+   r
  z$CppClassNode.generate_execution_code      		))$/r-   c                 :    | j                   j                  |       y r   rD  r   s     r+   r   zCppClassNode.annotate  rE  r-   )
rb   r   r   r|  r  r   r   r  r
  r   rt   r-   r+   r  r    s*     JS-^M0!r-   r  c                   *    e Zd ZdgZd Zd Zd Zd Zy)CEnumDefNoder   c           	          |j                  | j                  | j                  | j                  | j                  | j
                  | j                  | j                        | _        y )N)r  r  r\  rl  rx  )	declare_enumrF   r*   r  r  r\  rl  rx  r  r   s     r+   r  zCEnumDefNode.declare  sK    &&YY::D,=,=TXX //	 ' 1r-   c                     | j                   W| j                  r|j                  sd| j                  _        | j                   D ]  }|j                  || j                           y y Nr   )r   r]  r9  r  r  r   )r   rO   r   s      r+   r   z!CEnumDefNode.analyse_declarations  sQ    ::!{{3??,-

)

 ;))#tzz:; "r-   c                     | S r   rt   r   s     r+   r   z CEnumDefNode.analyse_expressions  rA  r-   c                    | j                   dk(  s| j                  r9|j                  | j                         |j                  j                  t        j                  d      }| j                  j                  D ]  }|j                  |d|j                  d|j                  ||j                               |j                  |       |j                  dt        j                  d|j                   d|d	|j#                  |j                               |j%                  |t        j                          |j                  j'                  |       y y )
NpublicT
manage_refz = PyInt_FromLong(); zif (PyDict_SetItemString(, "", ) < 0) )r\  rl  r&  r*   	funcstateallocate_tempr   r   r  enum_valuesrf   r  error_goto_if_null
put_gotrefr
   moddict_cnamerF   
error_gotoput_decref_clearrelease_temp)r   rl   tempr   s       r+   r
  z$CEnumDefNode.generate_execution_code  s   ??h&$((MM$((#>>//
0I0IVZ/[D

.. G

JJ++D$((;= > %

((IIOODHH-	/ 0
 %%dJ,E,EFG NN''- +3r-   Nr  rt   r-   r+   r  r    s     )K1;.r-   r  c                       e Zd ZdgZd Zy)CEnumDefItemNoderB   c                    | j                   r| j                   j                  |      | _         | j                   j                  j                  sO| j                   j	                  t
        j                  |      | _         | j                   j                  |      | _         |j                  | j                  |j                  | j                   | j                  | j                  |j                  |j                  |j                  xr |j                  d u       }|j                  j                  |       |j                  r0|j                  j                   j                  |j                         y y )N)r  r\  rl  rx  )rB   r~  r9   r  r  r   rJ   declare_constrF   r*   r  r\  rl  rx  r  r  r  )r   rO   
enum_entryr  s       r+   r   z%CEnumDefItemNode.analyse_declarations3  s    ::<<SADJ::??))!ZZ11*2G2GM
!ZZ@@E
!!IIzJJ

!,,*..%44PD9P	 " R
 	%%e,??OO""))%**5 r-   N)rb   r   r   r   r   rt   r-   r+   r  r  ,  s    
 )K6r-   r  c                   &    e Zd ZddgZd Zd Zd Zy)CTypeDefNoderQ   r  c                    | j                   j                  |      }| j                  j                  ||| j                  | j                        \  }}|j
                  }|j                  }|j                  ||| j                  || j                  | j                        }|j                  rd|_        | j                  r|j                  sd|_        y y y )Nr  )r  r\  rl  Tr   )rQ   r^  r  r\  r]  rF   r  ra  r*   rl  rX  r9  r  )r   rO   rb  r  r9   rF   r  r  s           r+   r   z!CTypeDefNode.analyse_declarationsL  s    ~~%%c* $ 7 7#$//$++ !8 !G##%%##$DOO $ C == $E;;s#$E   /;r-   c                     | S r   rt   r   s     r+   r   z CTypeDefNode.analyse_expressions]  rA  r-   c                      y r   rt   r   s     r+   r
  z$CTypeDefNode.generate_execution_code`  r   r-   Nrb   r   r   r   r   r   r
  rt   r-   r+   r  r  C  s     -K%"r-   r  c                       e 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"y)FuncDefNodeNFc                    d}| j                   D ]  }|j                  rxd}|j                  rL|j                  j                  |      |_        |j                  j	                  |j
                  |      |_        it        |j                  d       d |_        |j                  rd}|st        |j                  d        y )Nr   r   z)This argument cannot have a default valuez/Non-default argument following default argument)	ri   rM  r	  r   r  r9   r   r*   r
  )r   rO   default_seenr  s       r+   analyse_default_valuesz"FuncDefNode.analyse_default_values  s    99 	RC{{ >>"%++";";C"@CK"%++"7"7#"FCK#''#NO"&CK cggPQ	Rr-   c                 n    |y |j                   d   r|j                  |      |j                  |      }|S )Nr  )r   rC   r   )r   rO   rN   s      r+   analyse_annotationzFuncDefNode.analyse_annotation  s?    ~~12j6P6PQT6U6]#11#6Jr-   c                     | j                   D ]0  }|j                  s| j                  ||j                        |_        2 y r   )ri   rN   r  r   rO   r  s      r+   analyse_annotationszFuncDefNode.analyse_annotations  s6    99 	NC~~!%!8!8cnn!M	Nr-   c                    | j                   }|j                  }|j                  |v r!||j                     }|j                  |      }nNt	        |t
              r<|j                  r0|j                  d   r!|j                  }|j                  |      }||S |S |t        |j                  d       |S |t        urI|j                  |      s8t        |j                  j                  d       t        |j                  d       |S ||_        |S )Nr  r  r  r  )r  r9   rF   rC   r_   r  rN   r   r  r   r*   r   r  rQ   )r   rO   r  r  	orig_typer  r  s          r+   align_argument_typezFuncDefNode.align_argument_type  s    00HH	88''(2I"2237J\*s~~#..QdBeI99#>J!
J)--. 
 n,Y5F5Fz5R#--##%YZ)--!<= 
 "CH
r-   c                      yNr   rt   r   lenvs     r+   need_gil_acquisitionz FuncDefNode.need_gil_acquisition  s    r-   c                 (   |}|j                   s|j                  r&|j                  }|j                   r|j                  r&| j                  r8t	        | j
                  j                  ||| j
                  j                        }n"t        | j
                  j                  ||      }| j                  |_	        | j
                  j                  }|j                  r |j                  xr |j                   |_        || _        |j                  |_        |S )N)rF   rp  parent_scope
scope_name)rF   rp  r  )is_py_class_scoper  rp  needs_closurer   r  rF   r  r   r  r9   rz  r  r  local_scoper   )r   rO   genvr  r9   s        r+   create_local_scopezFuncDefNode.create_local_scope  s    $$(=(=##D $$(=(=TZZ__,0-0+/::+;+;=D
 4::??*.+.0D  ++zz9DMM(9DJ..r-   c                 :    | j                   j                  |       y r   r  r/  s      r+   generate_function_bodyz"FuncDefNode.generate_function_body  r  r-   c                  .   ddl m} | j                  j                  rddl m} | j
                  }|j                  r0|j                  s$t        j                  dt        j                  }nt        j                  }|j                  |       | j                  j                  ||       | j                  ||       | j                  j                   dk(  xr  | j                  j"                  j$                  }| j                  j                   dk(  xr  | j                  j"                  j$                  }|xs |}	|	r#d| j&                  vr| j&                  dgz   | _        | j)                         }
|j*                  j,                  d   }|j*                  j,                  d	   }|s|r/|j*                  j/                  t1        j2                  d
d             |j5                  |       |j7                         |_        |j:                   |j<                  _        |jA                  | jB                         | jE                  ||       |jG                  d       |
r|jG                  |
       | jI                  ||      xs | jJ                  }| jL                  r| jL                  jO                  ||d       | jO                  ||       |}|jP                  s|j$                  r&|jR                  }|jP                  r|j$                  r&| jT                  rT|jW                  |jX                  jZ                  j]                  t        j                               |jG                  d       n| j^                  r|j                  rS|jW                  |jX                  jZ                  j]                  t        j                               |jG                  d       |jW                  |jX                  jZ                  j]                  t        j                               |jG                  d       | ja                  ||       |jb                  D ]-  }|jd                  r|jf                  r|ji                  |       / d}| j                  jj                  s{| j                  jl                  rd}n%| j                  j                  rdjn                  z   }|jG                  | j                  j]                  t        jp                        |d       |js                         }| ju                  |       | jv                  }| jT                  xs | j^                  }|jx                  D ]  }|jZ                  jl                  sd} n |jz                  D cg c]  }|j|                  s| }}|j:                  xr |j~                  xr |xs |}|j:                  xr |j~                  xr | }|j:                   xs |j~                  }|s|r"|j                          d|j<                  _        n(|j:                  r|j~                  r|j                          |s|rV| j                  sJ|j                          | j                  r| j                  j                  |      nd }|j                  |       |r| j                  |       |r7|j                          |j                  | j                  j                   |       |r| j                  |       | jT                  rt        j                  dd      }t        j                  |jX                  jZ                  j"                  |      }|s#d|jX                  jZ                  j                  z  }|jG                  t        j                  d|jX                  jZ                  j                         d|d|jX                  jZ                  j                  dt        j                  d
       |jG                  dt        j                  z         |jG                  t        j                  d|jX                  jZ                  j                  d      d       |j                  dt               |jG                  |j                  | jB                               |jG                  d       |j                  t        j                         |jG                  d       | j^                  r| j                  rK|jG                  |d|jX                  jZ                  j                         d t        j                  d!       nJ|jG                  |d|jX                  jZ                  j                         d"t        j                  d       |j                  r&|jG                  t        j                  d|d       nC| jT                  r7|j                  ||jX                  jZ                         |j                  |       |s|r| j                  so| j                  r| j                  j                   d#z   }n| j                  j                   }|j                  || jB                  |j<                  j>                   $       d|j<                  _[        | j                  ||       t        | t              }|jx                  D ]  }|jZ                  jl                  r:|st        |j                        dkD  s4|jd                  rA|j                  |       S|sV|jZ                  j                  smt        |j                        dkD  s|j                  |j                  |j<                  j>                  %        |jb                  D ]d  }|jf                  st        |j                        dkD  s)|jd                  r6|j                  r|j                  |       T|j                  |       f |jb                  |jx                  z   D ]L  }|jZ                  j                  s|j                  j                  j|                  s;|j                  ||       N | j                  |       |jx                  D ]6  }|jZ                  j                  s|j                  ||| jB                         8 |r!|j                          d&|j<                  _        | j                  ||       |jA                  | jB                  d&'       |jG                  d       |jG                  d(       | j                  j                  s| j                  jl                  r-t        jp                  }|j                  || j                         nv| j                  j                  }|r&|jG                  t        jp                  d|d       n8| j                  jj                  s"|jG                  d)t        jp                  z         |j                  |j                  v rn| j                  j                  s|j                  |j                         |j                  |j                         |j<                  j                         D ]$  \  } }!|j                  | |!|j:                   %       & t        |      d*kD  }"|"r|j*                  j/                  t               |jG                  d+       |jG                  d,       |jG                  d-       |jG                  d.       |D ]  }|j                  ||        |jG                  d/       | j                  j                  r1j                  t        jp                  |       t        jp                  }#n| j                         }#| j                         }$|#|$r|j:                  r-|j~                  s!|jG                  d0       |j                          |j                  | j                  j                         |j:                  r|j~                  s|j                          |jG                  d       nit        | j                  jB                  d1| j                  j                  z  d*       |j                  | j                  j                  |j:                         | j                  j                  }%|#|%r|%}#|#9|#t        jp                  k7  r^|jG                  t        jp                  d|#d       n8| j                  jj                  s"|jG                  d)t        jp                  z         |r| j                  |       |"s|s| j                  j                  r|j                  |j8                         |j                  |j                         |D ]  }|j                  ||        |r| j                  |       | j                  j                  r|j                  | j                  j	                  t        jp                              }&|jG                  d2|&z         |j:                  r|j                          |jG                  d3       |j:                  r|j                          |jG                  d       |j                  |j8                         |jb                  D ]  }|j|                  r|jd                  r|jZ                  j                  r*|j                  |j                  |j:                   %       \|jZ                  jl                  ss|jf                  rt        |j                        dkD  s|j                  r|j                  |       |j                  |        |jx                  D ]  }|jZ                  jl                  r;|st        |j                        dkD  s4|jd                  rA|j                  |       T|jZ                  j                  sk|rt        |j                        dkD  s|j                  |j                  |j:                   %        | jT                  r5|j                  t        j                  |jX                  jZ                         |j:                  s|| j                  j                  }%| j                         }#|#|%r|%}#| j                  jl                  r:|j                  | j                  j                  t        jp                               | j                  j                  rM| j                  j                   d4k(  r4|jG                  d5t        jp                  d6t        jp                  d7       |s|rd&|j<                  _[        | j                  sw| j                  jl                  r8|j                  t        jp                  |j<                  j>                   $       n)|j                  d|j<                  j>                   $       |j:                  s|j                          |s|j:                  r-|j~                  r!|j                          d&|j<                  _        | j                  jj                  s"|jG                  d8t        jp                  z         |jG                  d       |
r|jG                  d9|
z         |j                  |j<                         |j                          | jL                  r| jL                  j                  ||       | j!                  |       y c c}w ):Nr   rI  r.  r]   __getbuffer____releasebuffer__cython_unusedprofile	linetraceProfilez	Profile.cr   Twith_pymethdef
proto_only)r  r  z = NULLr  )acquire_giltp_newr   z
%s->tp_new = ()(r   , NULL);if (unlikely(!%s)) {Py_None} else {}z) __Pyx_CyFunction_GetClosure();z) z
 (wrapper)r  have_gilFtrace/* function exit code */z!__Pyx_pretend_to_initialize(&%s);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);}{z&Unraisable exception in function '%s'.	if (%s) {zOPyErr_SetString(PyExc_TypeError, "Memoryview return value is not initialized");__hash__if (unlikely(z == -1) && !PyErr_Occurred()) z = -2;
return %s;#endif /*!(%s)*/)r   rJ  r  rs  r/  r  is_closure_scopeis_passthroughr
   cur_scope_cnameouter_scope_cnamemangle_closure_cnamesr   r  r  r  rF   r  r  rm  get_preprocessor_guardr  r   r;  r   load_cachedenter_cfunc_scope	new_labelreturn_from_error_cleanup_labelr  r  	gil_ownedr&  r*   r  rf   needs_assignment_synthesispymethdef_requiredpy_funcgenerate_function_headerr  rp  r  putscope_classr9   rW  needs_outer_scopegenerate_argument_declarationsr  
in_closurer>   put_var_declarationrV  rG   memslice_entry_initretval_cnameinsertion_pointgenerate_keyword_listr  arg_entriesbuffer_entriesr  has_with_gil_blockput_ensure_gildeclare_gilstateis_generatorput_trace_declarationscode_objectcalculate_result_codeput_trace_frame_initgetbuffer_checkput_declare_refcount_contextput_setup_refcount_contextgetbuffer_initr   ConstructorSlotget_slot_functiontypeptr_cnamer  empty_tupler  
put_increfr   r  r  is_cyfunction
self_cnamer  r   put_trace_call	can_tracegenerate_argument_parsing_coder_   r  r^   cf_assignmentsput_var_increfput_incref_memoryviewslicer  xdecref_cleanupput_var_xincrefrU  
buffer_auxbuflocal_nd_varput_init_varsgenerate_argument_type_testsput_acquire_arg_bufferput_release_ensured_gilr  r   put_init_to_py_noner  error_labellabels_usedput_gotoreturn_label	put_labelall_managed_tempsput_xdecrefrestore_exception_utility_codeput_release_buffer_codeput_init_entryerror_valuecaller_will_check_exceptionsput_add_tracebackqualified_namer	   put_unraisablegetbuffer_error_cleanupgetbuffer_normal_cleanupunlikelyerror_conditionput_xdecref_memoryviewsliceput_var_xdecrefput_var_decref
put_decrefput_xgiverefas_pyobject
is_specialput_trace_returnput_finish_refcount_contextput_temp_declarationsexit_cfunc_scopegenerate_wrapper_functions)'r   rO   rl   rJ  r/  r  r  is_getbuffer_slotis_releasebuffer_slotis_buffer_slotpreprocessor_guardr  r  r  cenvr  inittempvardecl_coder  have_object_argsr  used_buffer_entriesacquire_gil_for_var_decls_onlyacquire_gil_for_refnanny_onlyuse_refnannyr.  tp_slotslot_func_cname
trace_namern  lhsvalr  r9   buffers_presenterr_valr  default_retvalconds'                                          r+   r  z)FuncDefNode.generate_function_definitions  s   ..$  )<)<,2,B,B,2,D,D!F !' 8 8""#45		//d;((t4!ZZ__? ?!ZZ-->> 	!%4G!G "C!%!1!1!B!B 	*C.Cdnn4!%?2C!C!88:""--i8$$//<	i--''	;?A 	t$/3~~/?,'+zz>  	dhh++D$7

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

3HHT%%**;;F<T<TUVJJsO++D$7%% 	0E$$((/	0
 ''++ !!44z===JJ  11&2E2EF   //1""4( &&  --G1G1G## 	Cxx###' 	
 372E2ETuTT JJ 6422 64!4 	'
 JJ +422 +*8+ 	&  ::~@)@)@8!'+DNN$ZZD33!!#i$$ 779NRN^N^d..DDTJdh))+6   & 99;++

-J , L %//)DG'99$:J:J:O:O:U:UW^_O"".1A1A1F1F1T1T"TJJ&&  %%<<>  %%33""$ % JJ-0F0FFGJJ&&  %%//	:< = OOI~6JJttxx01JJz"OOF223JJsO!!!!

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

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

)?)?ARST## 143C3C3H3HI  !23i $$??!%<!?J!%J##DNN4L4L0L $ N'+DNN$++C6 T<0%% 
	`Ezz%%3u';';#<q#@%JZJZ''. UZZ::s5CWCW?X[\?\//dnnF^F^/_
	` %% 	/E||E$8$8 9A =eFVFV((((/''.	/ %%(8(88 	2Ezz##(8(8(H(H(M(M$$UD1	2
 	))$/%% 	EEzz##--eT488D	E *((*',DNN$
 	##C.dhhe,

2

-. yy&&++ ))((d.>.>?&&44JJV-@-@#FG))11JJBVEXEXXYt///99**d//0NN4++,#~~??A Gt  4::~ FG
 ""56:O  112PQ

MN

89

78

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

RS22))&*=*=tD --**,99;I"i
 ::d&=&=JJsO'')&&tzz'@'@A::d&=&=002JJsO

@

112346 ##DJJ$=$=tzzJ!--;;N>("f111JJV-@-@'JK%%--

>ATATTU ,,T2
 "3t7G7G7Z7ZdBBC 	t(()( 	8E**47	8))$/.. ==!1!1!A!A&BUBU!VWDJJd"$yy##%JJacyy,,.JJ 	t;;<%% 	3E::!1!1zz,,004::~0V''||s5+?+?'@1'D,,,,U3++E2	3 %% 		JEzz%%3u';';#<q#@%JZJZ''.**//#e&:&:";a"? 00>Bjj. 1 J		J OOF22D4D4D4I4IJ zz!--;;N&&(G>(++!!$"2"2">">v?R?R"ST::  TZZ__
%B JJ##V%8%8: ; i',DNN$$$##//))++t~~7O7O3O * Q ))!T^^-E-E)E * G zz,,.4::$*A*A((*',DNN$''JJ|f&9&99:

3JJ),>>? 	..t~~> 	<<LL66sDA''-I
 Us   ?A\A\c                    |j                   j                  rt        |j                  d       ni|j                   j	                         sO|j                   j
                  s9|j                   j                  s#t        |j                  d|j                   z         |j                  |j                  |j                   |j                        }|j                  r|j                  |_	        |S )NzInvalid use of 'void'z Argument type '%s' is incomplete)
r9   rV  r   r*   r  rT  rs  declare_argrF   rN   )r   rO   r  r  s       r+   declare_argumentzFuncDefNode.declare_argument  s    88#''23%%'1B1BchhFaFa#''=HI#((CGG<>>"~~Er-   c                    |j                   j                         r|j                  j                  t	        j
                  dd             |j                   j                  }d|j                  j                  z  }|j                  d|||j                  |j                  |j                   j                  xr |j                   j                  |j                  |j                        fz         y t!        |j                  d       y )NArgTypeTestFunctionArguments.c((PyObject *)%s)z:if (unlikely(!__Pyx_ArgTypeTest(%s, %s, %d, "%s", %s))) %szICannot test type of extern C class without type object name specification)r9   typeobj_is_availabler  r;  r   r  r7  r  r  rf   accept_nonerF   is_builtin_typerequire_exactr  r*   r   )r   r  rl   r7  arg_codes        r+   generate_arg_type_testz"FuncDefNode.generate_arg_type_test  s    88((*--''7LMOHH22M)CIIOO;HJJL!OOHHHH,,G1G1GOOCGG,P. ./ #''fgr-   c           	         |j                   j                  rd|j                  j                  z  }n|j                  j                  }|j	                  d|z         |j	                  dt        dt        |j                              |j                  |j                  |j                        fz         |j	                  d       y )Nz
%s.memviewz,if (unlikely(((PyObject *)%s) == Py_None)) {zMPyErr_Format(PyExc_TypeError, "Argument '%%.%ds' must not be None", "%s"); %s   r  )
r9   rs  r  r  rf   r   r^   rF   r  r*   )r   r  rl   r  s       r+   generate_arg_none_checkz#FuncDefNode.generate_arg_none_check  s    88&& 399??2EIIOOE

AEIJ

fS]#SXXOOCGG$j& & 	' 	

3r-   c                      y r   rt   r   s     r+   ri  z&FuncDefNode.generate_wrapper_functions  r   r-   c                     |j                  | j                         | j                  D ]   }|j                  r|j	                  |       " y r   )r&  r*   ri   r  r  r   rl   r  s      r+   r
  z#FuncDefNode.generate_execution_code  s:    dhh99 	3C>>,,T2	3r-   c                     | j                   j                  d   }	 |j                  j                  j                  j
                  d   j                  }||fS # t        t        f$ r d }Y ||fS w xY w)Nr   obj)r  r'  r9   rQ   r  r  r   KeyError)r   	py_bufferobj_types      r+   _get_py_buffer_infozFuncDefNode._get_py_buffer_info  sv    $$003		 ~~//55==eDIIH ("" ) 	H(""	s   7A A-,A-c                     | j                         \  }}|j                  }|j                  d|z         |j                  d       |j                  d       |j                  d       y )Nzif (%s == NULL) {zZPyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete");z
return -1;r  )r  r  rf   )r   rl   r  rW  views        r+   r1  zFuncDefNode.getbuffer_check  sY    //1	1

&-.

 O 	P

< 

3r-   c                     | j                         \  }}|j                  }|r6|j                  r*|j                  d|z  |       |j	                  d|z         y |j                  d|z         y )N%s->objz%s->obj = NULL;)r  r  rG   rJ  r  rf   r   rl   r  r  r  s        r+   r4  zFuncDefNode.getbuffer_init  sc    "668	8,,$$Y%5x@Y-.JJ(4/0r-   c                 $   | j                         \  }}|j                  }|r[|j                  rO|j                  d|z         |j	                  d|z         |j                  d|z  |       |j                  d       y |j                  d|z         y )Nzif (%s->obj != NULL) {r  r  zPy_CLEAR(%s->obj);r  r  rG   rf   r  r  r  s        r+   rZ  z#FuncDefNode.getbuffer_error_cleanup  s~    "668	8,,JJ/$67OOI,-!!)d"2H=JJsOJJ+d23r-   c                     | j                         \  }}|j                  }|r\|j                  rO|j                  d|z         |j	                  d|z         |j                  d|z  |       |j                  d       y y y )Nzif (%s->obj == Py_None) {r  r  r  r  s        r+   r[  z$FuncDefNode.getbuffer_normal_cleanup  ss    "668	8,,JJ2T9:OOI,-!!)d"2H=JJsO	 -8r-   c                 `   | j                   j                  sy | j                   j                  }t        j                  j                  |      }|sy |dk(  r&| j                   j                  j                  d      sy |dv r!| j                   j                  j                  ry |j                         S )N__long____int__r  r  )
r  rd  rF   r   method_name_to_slotgetr  rA  r  preprocessor_guard_code)r   rF   slots      r+   r  z"FuncDefNode.get_preprocessor_guard  s    zz$$zz,,006:djj&6&6&B&B9&M99djj>N>N>_>_++--r-   )#rb   r   r   r  r  r  r  r,  is_generator_bodyis_async_defrm  has_fused_argumentsstar_argstarstar_argr:  r.  r  r  r  r  r  r  r  r  r  r  r  ri  r
  r  r1  r4  rZ  r[  r  rt   r-   r+   r  r  d  s    * GMLLIHLMKR N
.*0k.Zh$3# 1	4.r-   r  c                        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e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! xZ"S )r  )rQ   r  r   py_func_statFNc                 .    | j                   j                  S r   )r  rF   r   s    r+   unqualified_namezCFuncDefNode.unqualified_name 	  s    zzr-   c                 J    | j                   r| j                   j                  S d S r   )r  r.  r   s    r+   r.  zCFuncDefNode.code_object#	  s     ,0<<t||''ATAr-   c                     |j                   | _        | j                  i | _        | j                  j                  |j                  j                  di              | j                  N| j                  j                  |      }|Lt        | j                  j                  d       t        j                  }n| j                  j                  |      }d|j                  v xr |j                  d       | _        t!        | j"                  t$              rG| j"                  j                  ||d| j&                  d uz  | j                  | j(                        \  }}n;| j"                  j                  ||d| j&                  d uz  | j(                        \  }}|j*                  st        | j                  d       || _        | j.                  |_        | j"                  }t3        |d      s|j4                  }t3        |d      s|| _        |j8                  | _        | j6                  j:                  }| j(                  d	k(  s| j<                  r"|r t        | j6                  j                  d
       |j>                  dk(  r/| j(                  dk7  r tA        | j6                  j                  d       tC        | j8                  |j8                        D ]L  \  }}| jE                  ||       |j,                  |_        |jF                  |_#        |jH                  |_$        | jK                  |j,                  |j                  |       |j,                  jL                  rd| _'        |j,                  jP                  r%d| jR                  v rtA        |j                  dd       |j,                  jP                  s|j,                  jT                  s| j,                  jV                  rt        |j                  d       &d| jR                  v s6tA        |j                  dd       O | jK                  |jX                  | j                  |       |jF                  }	|jH                  }
| jZ                  |_-        | j                  |_        |j]                  |	|| j                  |
| j(                  | j<                  | j&                  d u| jR                  | j.                  	      | _/        | j`                  | j^                  _1        |jX                  | _,        | jX                  jd                  r%| j(                  dk7  rt        | j                  d       | jX                  jf                  r&| jX                  ji                  | j                  d       | j.                  rZ|jj                  sN| j                  sBtm        | j8                        dk  s#| j8                  d   j,                  jn                  sd| _        | jq                  |       | js                  |       y )Nlocalsr  r+  r#   )r[  r  r\  )r[  r\  z*Suite attached to non-function declarationri   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  r\  rl  definingrm  r  zFunction cannot return an arrayzused as a return valuer   F):r  is_c_class_methodr  r   r   r  directive_returnsrC   r   r*   r   r   rQ   r^  rA  ru  r_   r  r  r   r\  rz  r9   r  r  r  rb  cfunc_declaratorri   r  rl  r  r	   zipr  rF   r  _validate_type_visibilityrX  r  rU  rm  is_pythran_exprr  r  r  rv  r  inline_in_pxdinline_func_in_pxdrT  rx  check_nullary_constructorrr  r^   rG   declare_cpdef_wrapperr  )r   rO   rQ   r  r9   r  opt_arg_count
formal_argtype_argrF   r  s              r+   r   z!CFuncDefNode.analyse_declarations(	  s   !$!5!5  ($&D!$$S^^%7%7"%EF!!-..>>sCI d,,00,?&11	..s3I .#.. @ hYgIhEhdoo':;$(OO$;$;3diit.C)D!%!6!64?? %< %T!OT %)OO$;$;3diit.C)DQUQ`Q` %< %b!OT  $((HI
 	"..__
*f-#J *f- !+OO	--@@OOx'488$''++VX 3&4??h+FD))--EG %(		499$= 	W J$$S(3&mmJO&mmJO'~~J**8==(,,L}}%%+/(}}&&8t~~+E
(NPQR}}&&(--*G*G99??*..qs/JNN,RTUV'	W* 	&&t'7'73G##%%#33 $ 5 5**$DOOYYd*dnn((	 + *

 )-(:(:

%++$$H)D$((=>((66txxAYZC$7$7@U@U499~!1):):)F)F#( ""3'$r-   c                 2   | j                   r| j                  rt        | j                  d       | j                  j
                  }| j                  |j                        }| j                  rOddlm	} t        | j                   || j                  d            g}|d   j                  j                  |       ng }t        | j                  | j                  j
                  | j                  d d | j                  ||d		      | _        |j                  | j                   _        | j                   j#                  |       d
| j                   j                  _        t'        | j                  | j                   g      | _        t*        j,                  | j                   _        | j                   j                  | j                  _        d
x| j                  _        | j                  j0                  _        | j                  |j4                  |<   | j                  j6                  sv|j                  rt8        j:                  rYt=        | j                  | j                         | _        t'        | j                  | j>                  | j@                  g      | _         y y y y )Nz&static cpdef methods not yet supported)rr  r   )r  r+  rc  )	decoratorr   )	r*   rF   ri   r  r  r6   r   r|  r   Tr  )r  )!r  ru  r   r*   r  rF   call_self_noderr  r{  r  DecoratorNoder  r   DefNoderi   r6   r  r   r  r  r  r   r   r9   as_variabler  r  is_final_cmethodr   lookup_module_cpdefOverrideCheckNodeoverrider   )r   rO   rF   py_func_bodyr  r|  s         r+   r  z"CFuncDefNode.declare_cpdef_wrapper	  s   $$dhh HI::??D..s?R?R.SL$$/+DHHXf@ghi
1''55c:
"txx(,

(,		,004'+xx(4.8./1DL ,/+>+>DLL(LL--c204DLL- ,TXXdll^ LD * 9 9DLL%)\\%7%7DJJ"<@@DJJOdjj449 $

CKKJJ//,,0K0K 1$((DLL Q($--9ST	 1L 0= r-   c                     | j                   dk(  xs | j                  }t        |dd      }|rF|rC|j                  r6|j                   dv s'|j                  s|j                  st        |d       yyyyyyy)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)r\  rl  r   rr  r9  r   )r   r9   r*   rO   public_or_apir  s         r+   r  z&CFuncDefNode._validate_type_visibility	  st    
 H4@gt,Us':':$$(<<II!2!2cWX "3I = (;U=r-   c                    ddl m} | j                  j                  }|r%|d t	        |      | j                  j
                  z
   }|D cg c]  }|j                   }}|rE|j                  | j                  | j                  j                        }|}t        j                  }	n0| j                  j                  r| j                  j                  j                  j                  }
|j                  | j                  |
j                        }|
|_	        |j                  | j                  || j                  j                        }d}	n| j                  j                  d   j                  j                  }|j                  | j                  |j                        }||_	        |j                  | j                  || j                  j                        }| xs t        j                  }	|j!                  | j                  ||D cg c]  }|j                  | j                  |      ! c}|	      }t#        | j                  t$        j&                  |      S c c}w c c}w )	Nr   r{  rc  )r  	attributeTr   )functionri   wrapper_call)r*   r  rB   )r   r{  r9   ri   r^   r  rF   r  r*   r  r   r  ru  r  r  AttributeNodeSimpleCallNodeReturnStatNoder   r   )r   omit_optional_argsrr  r{  ri   r  	arg_namescfunccall_arg_namesskip_dispatchclass_entry
class_noderC  r  nc_calls                   r+   r  zCFuncDefNode.call_self_node	  s   yy~~ATTYY%A%AABD)-.#SXX.	.&&txxdjjoo&FE&N#77MYY''****66<<K"++DHH;;K;K+LJ*J++DHH*PTPZPZP_P_+`E !M*//55J ))$(()IH'HN++DHH(djjoo+^E++Jw/J/J))HH@IJ1)$$TXXA$6J&	 * (
 $((
8Q8QY_``1 /, Ks   I$Ic                     | j                   j                  D ]6  }|j                  st        |j                  d       | j                  ||       8 y )NrO  )r9   ri   rF   r   r*   r  r  s      r+   declare_argumentszCFuncDefNode.declare_arguments	  s?    99>> 	,C88cgg67!!#s+	,r-   c                 .    | j                   j                  S r   )r9   r  r  s     r+   r  z!CFuncDefNode.need_gil_acquisition	  s    yy!!!r-   c                 V   | j                   }|j                  }|j                  r|s|j                  j                  rt        | j                  d       | j                  j                  D ]<  }|j                   j                  s|j                  r't        | j                  d       > y y y )Nz9Function with Python return type cannot be declared nogilz8Function declared nogil has Python locals or temporaries)
r9   r  r  r  rG   r   r*   r  r  in_with_gil_block)r   rO   r9   r  r  s        r+   r   zCFuncDefNode.nogil_check	  s    yy==::h++dhhQS))55 `::))%2I2I$(($^_`	 ':r-   c                 t   |j                   | j                  _         | j                  !| j                  j                  |      | _        nO| j                  !| j                  j                  |      | _        n"| j                  |       | j                  |       | j                  | j                        | _        | S r   )	r   r  r  r   r  r  r  r  r  r   s     r+   r   z CFuncDefNode.analyse_expressions	  s    &)nn#( $ 1 1 E Ec JD\\%<<;;C@DL'',$$S)44T5E5EFr-   c                      yr  rt   r/  s      r+   r  z'CFuncDefNode.needs_assignment_synthesis	  s    r-   c                    | j                   }g }| j                  }|j                  d t        |j                        |j                  z
   D ]O  }	|	j                         }
|j                  |	j                        }|j                  sd|
z  }
|j                  |
       Q |rk| j                  r_t        j                  j                  t        j                        }| j                  r|j                  |       n|j                  d|z         |j                  r:|r8|j                  |j                   j                  t        j"                               |j$                  r|j                  d       |sdg}|| j&                  j(                  }|j+                  |dj-                  |            }| j&                  j.                  dk(  rd|vrd}nd}d }|j1                  | j&                  j2                        }| j4                  j                  ||	      }| j6                  }| j8                  rO|r2|j:                  j<                  d
   j?                  | j8                         |j?                  | j8                         |r/|j:                  j<                  d
   j?                  |||d       |j?                  |||d       y )NzCYTHON_UNUSED %sz...voidr   privatez::static r   )dll_linkagemodule_declarationsz; /* proto*/z {) r  r9   ri   r^   r  rW  r  rF   cf_usedr  r  r   rJ   r
   skip_dispatch_cnamer  r  optional_args_cnamer  r  
func_cnamefunction_header_coder   r\  build_function_modifiersfunc_modifiersr  r  r  r  partsrf   )r   rl   r  with_opt_argswith_dispatchr  r  	arg_declsr9   r  arg_declr  dispatch_argentitystorage_classr  rm  headerneeds_protos                      r+   r  z%CFuncDefNode.generate_function_header	  sJ     	yy99Dc$))nT-D-DDE 	'C++-HLL*E==-8X&	' T--%00AA**,L}}  .  !3l!BC""}T//@@A[A[\]U#I=JJ))E**5$))I2FG::  I-$e2C%MM11$**2K2KL	!!226{2S,,$$  &&'<=CCDD]D]^JJt001""#89??(5y&IK

	6BCr-   c                 V   | j                   }| j                  D ]  }|j                  s|j                  |j                        }| j
                  s|j                  sD|j                  |      }|j                  |j                  j                  |j                        d|d        y r  )r  ri   rM  r  rF   r  r  r  rf   r9   rW  r  )r   rO   rl   r  r  r  r   s          r+   r   z+CFuncDefNode.generate_argument_declarations&
  s      99 	GC{{SXX.==EMM ==dCFJJ11#))<f F G	Gr-   c                      y r   rt   r   s     r+   r&  z"CFuncDefNode.generate_keyword_list0
  r   r-   c           
        
 d}d}| j                   }| j                  j                  rnj                  dt        j
                  z         | j                  D ]
  

j                  s|j                  
j                        }| j                  s|j                  rj                  dt        j
                  dt        j                  d|d       
j                  }t        |d      s|j                  }t        |d      sj                  
j                   dt        j
                  d| j                  j#                  |j                        d	       |d
z  }|d
z  } t%        |      D ]  }j                  d        j                  d       
fd}	| j                  D ]#  
 |	|j'                  
j                               % y )Nr   r	  if (r]   zn > ) {rF   r  r  r   r  c                 <   | j                   rj                  sj                  | j                  d| j                  d       | j
                  j                  rj                  | j                  d       y j                  |        j                  |        y y y )Nr  r  Tr  )
r!  rM  rf   r  original_cnamer9   rs  rA  r@  put_var_giveref)r  r  rl   s    r+   put_into_closurezECFuncDefNode.generate_argument_parsing_code.<locals>.put_into_closureM
  su    

e6J6JKL::0033EKK$3O''.((/ )4r-   )r  r9   r  rf   r
   r  ri   rM  r  rF   r  r  r  r  r  rb  r  opt_arg_cnamerangerA  )r   rO   rl   r  r  r  r  r  rW  r  r  s     `       @r+   r>  z+CFuncDefNode.generate_argument_parsing_code3
  sl     99''JJ{V%?%??@yy ;;!LL2E}}

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

$'IIv/I/I$(II$;$;JOO$L$N O 	FA 4[  

3 JJsO	0 99 	:CU..sxx89	:r-   c                      y r   rt   r   s     r+   !generate_argument_conversion_codez.CFuncDefNode.generate_argument_conversion_codeY
  r   r-   c                     | j                   j                  D ]W  }|j                  r| j                  ||       "|j                   j                  s9|j
                  rF| j                  ||       Y y r   )r9   ri   needs_type_testr  rG   r  r  r  s      r+   rG  z)CFuncDefNode.generate_argument_type_tests\
  sW     99>> 	8C""++C6%%coo,,S$7		8r-   c                    |j                   j                  d   r,|j                  | j                         |j	                  d       t
        t        |   |       | j                  r| j                  j                  |       y y )Nr  r   )	r  r   r&  r*   rf   r   r  r
  r  )r   rl   ra   s     r+   r
  z$CFuncDefNode.generate_execution_codee
  sc    &&{3MM$((#JJrNlD9$?55d; r-   c                 p    | j                   j                  ry| j                  j                  j                  S )N0)r  rG   r  r9   r  r   s    r+   rU  zCFuncDefNode.error_valuem
  s*    '' ::??222r-   c                 B    | j                   j                  j                  S r   )r  r9   r  r   s    r+   rV  z)CFuncDefNode.caller_will_check_exceptionst
  s    zz...r-   c                    d}| j                   }|j                  }|j                  |dz  }|j                  }| j                   j                  t        j
                  d||_        |j                          | j                  |d|j                  j                  |j                  j                  |j                         | j                  j                  s|j                  d       | j                  j                  }|d t        |      | j                  j                  z
   D cg c]  }|j                   }}|j                  j                  r |j!                  t        j"                         n|j                  r|j!                  d       |j                  j                  r |j!                  t        j$                         n|j                  r|j!                  d       |j                  | j                   j                  dd	j'                  |      d
       |j                  d       |j                  y y c c}w )Nr   r   wrap_)r  r  r  zreturn r  NULLr  r   r  r  )r  r9   
prev_entryr  r
   r  rf   r  r  r  r  rV  r  ri   r^   r  r  r  r  r   )r   rl   kr  r  ri   r  arglists           r+   ri  z'CFuncDefNode.generate_wrapper_functionsw
  s    

JJ	*FA$$E04

0E0EvGZGZ\]^EJJL))a#jj77#jj;;&&	 * (
 ##++#99>>D,01X#d)DII<X<X2X,YZSsyyZGZzz((v99:))s#zz,,v99:--v&JJDJJ$9$9499W;MNOJJsO/ * [s   %H;)r   r   r   )r   r   N)#rb   r   r   r   r  r|  r  r  r  r  r  r  r  propertyr.  r   r  r  r  r  r  r   r   r  r  r   r&  r>  r  rG  r
  rU  rV  ri  r   r   s   @r+   r  r    s    0 FKMJHOL B B[%z"UH
Ya>,"	`+DZG#:L8<3/r-   r  c                       e Zd Zg ZdZdZd Zy)PyArgDeclNodeFc                 <    | j                   j                  ||       y r   )r  r  r/  s      r+   r  z+PyArgDeclNode.generate_function_definitions
  s    

00d;r-   N)rb   r   r   r   r  r  r  rt   r-   r+   r  r  
  s     KKK<r-   r  c                       e Zd ZdgZy)r  r  N)rb   r   r   r   rt   r-   r+   r  r  
  s     -Kr-   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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.y)!r  )ri   r  r  r   r|  return_type_annotationr|  r  FNr  r   Tc                     t        j                  | |fi | dx}x}}| j                  D ]6  }|j                  r|dz  }|j                  s|dz  }|j                  r2|dz  }8 || _        || _        || _        y r'   )r  r   ri   r
  rM  num_kwonly_argsnum_required_kw_argsnum_required_args)r   r*   rj   r  rkrr  s          r+   r   zDefNode.__init__
  s    T3/$/B99 	C{{Q{{!GB;;Q	  !$&!!"r-   c	                 z   | j                   r t        | j                   j                  d       | j                  r t        | j                  j                  d       |xs d\  }	}
|g }| j                  D ]c  }|j                  |d      \  }}|j                  t        j                  |j                  d |j                  t        |j                               e t        j                  t        |dd |
|||      }t        | j                  |	      }n||j                  }|j                  }t!        | j                        t!        |j                        k7  s|j"                  r,t        | j                  d
       t        |j                  d       t%        t'        | j                  |j                              D ]]  \  }\  }}|j                  |d|dk(  xr |j(                        \  }}||t        j                  u sF|j                  |_        ||_        _ |	;|j,                  /ddlm}  || j                  |j,                  |j2                        }	t5        | j                  t7        | j                  | j                  d       | j                  d|j8                  |	|j:                  |j<                        }t?        | j                  |xs g tA        | j                  |j2                  	      || jB                  | jD                  |jF                  ||j:                  |j<                  ddtI        |di       |      S )Nz'cdef function cannot have star argumentz+cdef function cannot have starstar argumentr  r   r  )rF   r  rN   r9   r*   F)r  ri   r  r  r  r  r  r  r  zwrong number of argumentszprevious declaration herer   r  r  r  rK  )rb  ri   r  r  r  r  r  r  r  )rm  rQ   r  r   r6   r  r9   r  r  r\  rl  r  r  )%r  r   r*   r  ri   r^  r  r   r  rF   rN   r   r  r6  r  r9   r^   r  r  r  r  r  r  r{  r  r  r  rL  r  r  r  r  rM   r   r6   r  r   )r   r  r  r  returns
except_valrm  r  r  r  r  
cfunc_argsr  r  r9   
cfunc_typer  r  r  r  s                       r+   as_cfunctionzDefNode.as_cfunction
  s   ==$--##%NO$##'')VW+5+F(=J"ii O
(2(:(:51(:(M%!!*"9"9?S?S@DEOEZEZ?M>Hnn	#N OO $--.3=:?>B>M497?=HJJ  z:E}J499~Z__!559O9Odhh ;<eii!<=-6s499joo7V-W A))J(2(:(:51HIQHiSXSiSi ); )l%<4:+D+D#D&.mmJO1@J.A "z'A'A'M,'
 : :AWAWYO(.A$((QUQZQZbf.g.2ii5:9C9S9S9H2<2E2E/9/?/?A
 DHH&/o2&;DHH:KaKa&b'1!% $(2(A(A!+%/%8%8","2"2'0 %-4U<NPR-S.57 	7r-   c                 P    | j                   ry| j                  s| j                  ryy)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)r  r  r  r   s    r+   is_cdef_func_compatiblezDefNode.is_cdef_func_compatible0  s%    
 ==D--r-   c           	         | j                   rn| j                   D ]_  }|j                  }|j                  s| xj                  |j                  dk(  z  c_        | xj
                  |j                  dk(  z  c_        a | j                  r|j                  d      rd| _        | j
                  r|j                  d      rd| _        | j                  dk(  r|j                  rd| _        | j                  |       | j                  dk(  r| j                  |       n| j                  |       | j                  |       | j                  j                  j                         | _        | j                  t        u r_| j                   rS|j"                  d   rD| j                  j$                  s.t'        | j                   |      \  }}|r|j(                  r|| _        | j+                  |       t-        | j.                  | | j                  j                  | j0                  | j2                  | j4                  | j                        | _        | j6                  j9                  |       y )	Nclassmethodr+  Fr   r   z<lambda>r  )r  rF   ri   r  r  r  )r|  r  rD   is_classmethodrF   is_staticmethodrA  r  analyse_argument_typesdeclare_lambda_functiondeclare_pyfunctionanalyse_signaturer  	signaturer  r   r  r   rd  rW   rG   r  DefNodeWrapperr*   ri   r  r  
py_wrapperr   )r   rO   r  rr   rW  r  s         r+   r   zDefNode.analyse_declarations;  s   ??!__ H	 **<<''499+EE'((DII,GG(	H 3??=#A"'DCOON$C#(D 99	!c&;&;#$D ##C(99
"((-##C(s#:://;;=~-$2M2M~~124::;P;P!89T9TVY!Z;;#:#:'2D$$(HH]]**((* 	,,S1r-   c                 N   |j                   j                  di       | _        |j                   d   }|j                  }d |_        | j                  D ]n  }t        |d      rd }n|j                  j                  |      }t        |      r-|j                  r!t        j                  ||j                  g      }|j                  j                  ||      \  }}|j                  |_        ||_        |j                   rd| _        | j%                  ||       |r"|j&                  rt)        | j*                  d       |j                  j-                         |_        d |_        d|_        d|_        d|_        |j                  j6                  s,|j                  j8                  s|j                  j:                  r|j<                  r	d|_        x|j@                  r	d|_        |j                  jB                  sB|j                  jD                  s,|j                  j8                  s|j                  j:                  r4|jF                  r|jF                  jH                  	d|_        ||_        d|_        "d|_        |j@                  rt)        |j*                  d	       |j<                  sYt)        |j*                  d
       q ||_        t        |      rEtK        | j                        D 	cg c]  \  }}	|	j                  jL                  s|  c}	}| _'        y g | _'        y c c}	}w )Nr  allow_none_for_extension_argsrF   Tz9Python function argument cannot have C name specificationr   r   Fz.Only Python type arguments can have 'not None'z-Only Python type arguments can have 'or None')(r   r  r  rY  ri   r  rQ   r^  r    r  r   rd  
org_bufferr  rF   r9   rX  r  r  r  r   r*   as_argument_typehdr_typeneeds_conversionr  r	  rG   rU  rs  r  r  r  is_extension_typer  rM  constant_resultr  is_numpy_buffernp_args_idx)
r   rO   r9  f2sr  r  rQ   r9   r  as
             r+   r1  zDefNode.analyse_argument_typesh  sk    # 2 28R @(+7V(W%## $99 1	TCsF#"&MM11#6	 "#&9+D+D * 4 4!!,,6. !/I
 NN**9c: &*//==/3D,$$S#.?#8#8dhh [\xx002CHCL#$C "#CCNxx##sxx'9'9SXX=X=X;;&*CO\\&+COhh00CHH4L4L88--1L1L{{s{{'B'B'J*. +H '+CO"&<<#''#ST;;#''#RSc1	Td !$#-6tyy-A\caQVVE[E[\D!D  ]s   ,L!L!c                 :   | j                   j                  rh| j                  rt        | j                  d       t        | j                        dk(  xr | j                  xs | j                   | j                   _	        n|j                  d   s| j                  s| j                  s| j                   j                  t        j                  u rt        | j                        dk(  r!t        j                  | j                   _        n3t        | j                        dk(  r| j                  d   j                   | j                  d   j                   st        j"                  | j                   _        n| j                   j                  t        j$                  u rt        | j                        dk(  r t        j&                  | j                   _        nit        | j                        dk(  rQ| j                  d   j                  8| j                  d   j                   st        j(                  | j                   _        | j                   j                  }|j+                         }|t        j$                  u rS|dk(  rNt        | j                        dk(  r6| j                  r*t        j                  x}| j                   _        d| _        d}| j.                  rP|j0                  rDd}d| _        t3        j2                  |      x| j                   _        }d|_        d|_        d|_        | j8                  s| j.                  r1| j:                  r%|j0                  r| j<                  j>                  d d = tA        tC        |t        | j                                    D ]U  }| j                  |   }d|_"        |jG                  |      rc| j.                  sW| j8                  r$d|_$        tJ        jL                  x|_'        |_(        nd|_#        |jR                  x|_'        |_(        d|_*        nv|jW                  |      |_'        |jP                  jY                  |jN                        s;|jN                  jZ                  r|jP                  jZ                  rd|_.        nd|_*        |jT                  r$t^        j`                  |jb                  z   |_2        4t^        jf                  |jb                  z   |_2        X |t        | j                        kD  r| ji                          y |t        | j                        k  ro|j6                  s| ji                          | j                  D ]C  }|jD                  s|jP                  jj                  s|jP                  jl                  s=d|_.        E y y )Nz8special functions of cdef classes cannot have decoratorsr   always_allow_keywordsr   r#   Tr  )7r  rd  r|  r   r*   r^   ri   r  r  trivial_signaturer   r5  r   pyfunction_signaturepyfunction_noargsrM  r
  pyfunction_oneargpymethod_signature	unaryfuncibinaryfuncnum_fixed_argsself_in_starargr0  r  r   fixed_arg_formathas_generic_argsr/  r  decorator_indirectionr  r	  minr	  r  r  r   	type_typer<  r9   r  r=  fixed_arg_typer  rG   r  r
   
arg_prefixrF   	hdr_cname
var_prefixbad_signaturer>  r  )r   rO   signfixedr  r  s         r+   r4  zDefNode.analyse_signature  s   ::  dhh Z[+.tyy>Q+>+kHjY]YjYjCkDJJ( 78$--SWSdSdzz##y'E'EEtyy>Q&+4+F+FDJJ(^q(yy|++3DIIaL<P<P/8/J/J

,%%)E)EEtyy>Q&+4+>+>DJJ(^q(yy|++3DIIaL<P<P/8/D/D

,jj""##%9///FaKtyy>Q&4== *3)G)GGC$**&#$D FC$8$8F#'D )-37DJJ 3#&C "&C#'C   D$8$8((S-A-A**003s63tyy>23 	=A))A,CCNq!$*>*>&&&'CO.5.?.??CL38&'CO.1oo=CL38'($"11!4xx''5||//CHH4H4H./+/0,## & 1 1CHH < & 1 1CHH <+	=. C		N" c$))n$''""$yy ,>>sxx'A'ASXXE]E]*+C', %r-   c           	      R   | j                   j                  }d|j                         z  }|j                  r|dz  }| j                  }|j                  d      r|j                  d      rd}nd}t        | j                  d|| j                  t        | j                        |fz         y )Nz%dz or more__zSpecial methodMethodz>%s %s has wrong number of arguments (%d declared, %s expected))r  r5  rM  rP  rF   
startswithendswithr   r*   r^   ri   )r   rY  expected_strrF   descs        r+   rX  zDefNode.bad_signature  s    jj""c0022J&Lyy??4 T]]4%8#DDdhhX$))S^\\; ; 	<r-   c                    | j                   }|j                  |      }|r}|j                  r,|j                  j                  st        | j                  d       |j                  j                  r/|j                  s#| j                  st        | j                  dd       |j                  || j                  | j                         }|| _        |j                  |j                        }t         j"                  |z   |z   | j                  _        t&        j(                  rt+        | j                  | j,                        |_        t         j.                  |z   |z   |_        |j2                  ri|j                   t4        j6                  v s)|j,                  r|j                   dv r|j8                  d   rd |_        y t         j<                  |z   |z   |_        y y d |_        y )Nz:Only final types can have final Python (def/cpdef) methodsz'Overriding cdef method with def method.   )allow_redefine__getattr__fast_getattr)rF   rA  r  r  is_final_typer   r*   r9   rz  is_builtin_cmethodr   r	   r3  r  next_idscope_prefixr
   pyfunc_prefixpyfunc_cnamer   ry  r7   r6   funcdoc_prefix	doc_cnamerd  r   	invisibler   wrapperbase_cnamewrapperbase_prefix)r   rO   rF   r  prefixs        r+   r3  zDefNode.declare_pyfunction  se   yy%%%coo.K.Kdhh \]zz&&u/G/GPTP_P_"KQO&&tTXX$//FY&Z
S--."("6"6"?$"F

&txx:EI$33f<tCEO::!4!44EII

m3~8V.2E+.4.G.G&.PSW.WE+   EIr-   c                     |j                  | j                  | j                        }d |_        || _        |j
                  | j                  _        y r   )r2  lambda_namer*   r6   r  r  rl  )r   rO   r  s      r+   r2  zDefNode.declare_lambda_function  s<    ++D,<,<dhhG	
"'++

r-   c                 V   | j                   D ]  }|j                  st        |j                  d       |j                  r^|j                  |j                  |j                  |j                        |_        |j                  j                  r)d|j                  _	        n| j                  ||      |_        d|j                  _        d|j                  _        |j                  |j                  _         | j                  || j                         | j                  || j                          y )NrO  r  r   )ri   rF   r   r*   r=  r  r9   r  rG   ro  r  r>   r  r  declare_python_argr  r  r  s      r+   r  zDefNode.declare_arguments!  s    99 	4C88cgg67##OOCHHchhH	88''%(CIIN 11#s;	 CIICIIN$'OOCII!	4 	T]]3T%6%67r-   c                     |rt|j                   d   dk7  rt        j                  }nt        }|j	                  |j
                  ||j                        }d|_        d|_        d|_	        d|_
        ||_        y y )Ninfer_typesFr   r  )r   r   unspecified_typer   r  rF   r*   r>   r  ro  rB  r  )r   rO   r  r9   r  s        r+   rv  zDefNode.declare_python_arg1  si    ~~m,5!22%OOCHHdCGG<EELEJEJ$%E!CI r-   c                    |j                   | j                  _         | j                  |       | j                  |       | j                  r!| j                  || j                        | _        | j                  |      sC| j                  r7| j                  d d d   D ]"  }|j                  j                  |      |_        $ | j                  j                  |       | S )Nr   )r   r  r  r  r  r  r  r|  r  r   r7  prepare_argument_coercion)r   rO   r  s      r+   r   zDefNode.analyse_expressions>  s    &)nn###C(  %&&*.*A*A#tGbGb*cD'..s3!__TrT2 S	&/&9&9&M&Mc&R	#S 	11#6r-   c                    | j                   ry| j                  s| j                  j                  ry| j                  ry| j                  j
                  ry| j                  j                  ry|j                  s|j                  r4|| j                  j                  d   S |j                  j                  d   S |j                  xs |j                  S )NTFbinding)r0  specialized_cpdefsr  is_fused_specializedno_assignment_synthesisrd  is_anonymousrr  r  r  r   r  r  r  r/  s      r+   r  z"DefNode.needs_assignment_synthesisL  s    ""djj&E&E''::  ::""#"6"6|''229==''229==$$<(<(<<r-   c                 B    | j                   j                  j                  S r   )r  r5  rU  r   s    r+   rU  zDefNode.error_value^  s    zz##///r-   c                 B    | j                   j                  j                  S r   )r  r5  r  r   s    r+   rV  z$DefNode.caller_will_check_exceptionsa  s    zz##333r-   c                 8   | j                   r*| j                   j                  |j                         |       | j                  rA| j                  j
                  | j                  _        | j                  j                  ||       t        j                  | ||       y r   )defaults_getterr  r  py_wrapper_requiredr  r  r7  r  r/  s      r+   r  z%DefNode.generate_function_definitionsd  sr      >>s?O?O?QSWX ##)-)>)>DOO&OO99#tD11$TBr-   c                    |r*| j                   r| j                  j                  ||d       y g }| j                  j                  j
                  r5dt        j                  z  }| j                  sd|z   }|j                  |       d }| j                  D ]  }|j                   ||              | j                  r!|j                   || j                               | j                  r!|j                   || j                               |rdj                  |      }nd}| j                  j                  | j                  j                         }	|j"                  d   }
| j%                         }|r|
j'                  |       |
j'                  d|	d	|d
       |r|
j'                  d       |j'                  d|	d	|d       y )NTPyObject *%sCYTHON_UNUSED c                     | j                   }|j                  r|j                  }n|j                  }|j                  j                  |      }|j                  sd|z   }|S )Nr  )r  r!  r  r  r9   rW  r  )r  r  r  decls       r+   arg_decl_codez7DefNode.generate_function_header.<locals>.arg_decl_code}  sR    IIE,,::..u5D=='$.Kr-   r   r  declsr  r  z); /* proto */#endifr  )r  r7  r  r  r5  has_dummy_argr
   r;  r  r  ri   r  r  r   r  rW  rl  r  r  rf   )r   rl   r  r  arg_code_listself_argr  r  r  dc
decls_coderm  s               r+   r  z DefNode.generate_function_headerp  s   ''88.$0::--%(9(99H))+h6  *		 99 	5C  s!34	5==  t}}!=>  t/@/@!AByy/HH..tzz/F/FG%%g.
!88:/0,.9	;X&

H56r-   c                      y r   rt   r/  s      r+   r   z&DefNode.generate_argument_declarations  r   r-   c                      y r   rt   r   s     r+   r&  zDefNode.generate_keyword_list  r   r-   c                     fd}| j                   D ]  } ||j                          | j                  | j                  fD ]  }|s ||j                          y )Nc                    | j                   r}j                  | j                  d| j                  d       | j                  r#j                  |        j                  |        y j                  |        j                  |        y y r  )	r!  rf   r  r  rB  rC  put_var_xgiverefr@  r  )r  rl   s    r+   r  z@DefNode.generate_argument_parsing_code.<locals>.put_into_closure  so    

e6J6JKL(( ((/))%0''.((/  r-   )ri   r  r  r  )r   rO   rl   r  r  s     `  r+   r>  z&DefNode.generate_argument_parsing_code  sV    
	0 99 	(CSYY'	(==$"3"33 	,C +	,r-   c                      y r   rt   r   s     r+   rG  z$DefNode.generate_argument_type_tests  r   r-   )NNTNNNFFr   r   )/rb   r   r   r   r   r0  r/  rt  reqd_kw_flags_cnamer   r  r|  r  r  r  rN  py_cfunc_noderequires_classobjdefaults_structr6   fused_py_funcr~  r7  r  r  r  r   r*  r,  r   r1  r4  rX  r3  r2  r  rv  r   r  rU  rV  r  r  r   r&  r>  rG  rt   r-   r+   r  r  
  s    , gK!9:KONKJJ!EKOMO
CMJJO# os+0A7F	+2Z>"@K,Z<2.8 =$04
C,7\,&r-   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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y)r6  Nc                    t        j                  | g|i | | j                  j                  | _        | j                  j                  | _        | j                  j
                  | _        | j                  j                  | _        d | _        y r   )r  r   r  r   r!  r"  rN  r5  )r   ri   r   s      r+   r   zDefNodeWrapper.__init__  si    T3D3F3#{{::$(KK$D$D!!%!>!>#{{::r-   c                 B   | j                   j                  }| j                  }|j                  |j                        }t
        j                  |z   |z   |_        t
        j                  |z   |z   |_	        |j                  | _
        | j                   j                  | _        y r   )r  r  rF   ri  rj  r
   pywrap_prefixr  pymethdef_prefixpymethdef_cnamer5  rA  )r   rO   target_entryrF   rr  s        r+   r   z#DefNodeWrapper.analyse_declarations  s}    {{((yyS--."("6"6"?$"F'-'>'>'G$'N$%//;;22r-   c                 .   | j                   D ]u  }|j                  j                  s|j                  j                  |      r56|j                  sC|j                  j                  rZ|j                  j                  |      rvw | j                  r| j                  j                  j                  sd| j                  j                  }d|_	        |j                  D ]7  }|j                  r|j                  j                  s'd|j                  _        9 y y y )Nr   T)ri   r9   rG   create_from_py_utility_coder<  rw  r  r  r  rB  r?  r>   ry  rD   cf_maybe_null)r   rO   r  r  asss        r+   r{  z(DefNodeWrapper.prepare_argument_coercion  s    
 99 	C88''xx;;C@cll&>&>||==cB	 T%6%6%<%<%D%D %%++E$%E!++ 1zzcggoo,0CGG)1 &Er-   c                     t        | j                        }|dk(  s7|dk(  r3| j                  d   j                  s| j                  d   j                  ryyr'   )r^   ri   r  r  )r   argcounts     r+   signature_has_nongeneric_argsz,DefNodeWrapper.signature_has_nongeneric_args  sD    tyy>q=A499Q<#;#;#'99Q<#;#;r-   c                 .    | j                   j                  S r   )r5  rP  r   s    r+   signature_has_generic_argsz)DefNodeWrapper.signature_has_generic_args  s    ~~...r-   c                    g }| j                   j                  r|j                  t        j                         | j
                  D ]  }|j                  r|j                  j                  sk|j                  j                  sU|j                  j                  s?|j                  |j                  j                  |j                  j                               |j                  |j                  j                          | j                  r/|j                  | j                  j                  j                         | j                  r/|j                  | j                  j                  j                         dj!                  |      }| j"                  j$                  s"|j'                  dt        j(                  z         |j+                  | j,                  j                  j.                  d|d       y )Nr   z%s = r  r  )r5  r  r  r
   r;  ri   r<  r9   rs  r  r"  r  r  r  r  r  r   r  rV  r  r$  rf   r  rl  )r   rl   ri   r  s       r+   r  z%DefNodeWrapper.generate_function_body  sB   >>''KK))*99 	-C||SXX%@%@%(XX%7%7%(XX%8%8CHH..syy?@CIIOO,	- ==KK++112KK))//556yy''HHWv2223

KK**D2 	3r-   c                    | j                   j                  }|j                  | j                         |j	                  d       |j	                  d       | j                   j                         }|r|j	                  |       |j                  |       |j                         |_        | j                   j                  ||      xs | j                   j                  }| j                  ||       | j                  ||       |j                         }| j                  j                  rd}nd}| j                  j                   s=|j	                  | j                  j#                  t$        j&                        |d       |j)                          |j+                  d| j,                  z         | j/                  ||       | j1                  |       | j3                  |       |j5                  |j6                         |j                  | j                         |j	                  d       |j	                  d       |j8                  |j:                  v r|j=                  |j>                         |jA                  |j8                         |j6                  jC                         D ]  \  }}	|jE                  ||	        | jG                         }
|
%|j	                  t$        j&                  d|
d       |jA                  |j>                         |jH                  D ]7  }|jJ                  s|jL                  j                  s'|jO                  |       9 |jQ                          | j                  j                   s"|j	                  dt$        j&                  z         |j	                  d	       |jS                          |r|j	                  d
|z         y y )Nr   z/* Python wrapper */z = 0r  z%s (wrapper)r  r  r  r  r  )*r  r  r&  r*   rf   r  r  r  r  r  r  r  r   r%  r  rG   rV  rW  r
   r$  r2  r3  rF   r>  rG  r  rg  r  rK  rL  rM  rN  rO  rP  rQ  rU  r  r>   r9   r`  rf  rh  )r   rO   rl   r  rm  r  rp  retval_initr  r9   r|  r  s               r+   r  z,DefNodeWrapper.generate_function_definitions
  s   {{&&dhh

2

)*![[??AJJ)*t$/3~~/?,++@@dK 9++88 	%%dN;++D$7//1'' KK''JJ  11&2E2EF  	))+''(BC++D$7))$/##D) 	..t~~>dhh

2

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

)<)<gFG 	t(()%% 	+E||

 6 6##E*	+ 	((*''JJ|f&9&99:

3JJ),>>? r-   c                    g }| j                   }|j                  s| j                  r5dt        j                  z  }|j                  sd|z   }|j                  |       | j                  D ]z  }|j                  r|j                  s|j                  r|j                  d|j                  z         G|j                  |j                  j                  |j                               | | j                  j                  }|j                  s3|j!                         t"        j$                  gk(  r|j                  d       |j&                  j(                  r |j*                  dk(  r|j                  d       |j,                  r3|j                  dt        j.                  dt        j0                         dj3                  |      }d}	|j*                  d	v r|j&                  j(                  rd}	d
}| j4                  j                  |j6                        }
d|	|
d|d}|j9                  d|z         |r?| j                  j:                  r(| j                  j:                  j=                  ||d       y t>        j@                  r|jB                  r| j                  j:                  s|j&                  jD                  s|j                  r|jF                  r|jB                  }|jH                  r|jK                         }|j                  r|j*                  d	v s0|j9                  d|jL                  d|jO                         d       |j                  r@|j9                  d       |j9                  d|jF                  z         |j9                  d       |s| j                  j:                  rF|jQ                  d|jR                  z         |jU                  | j                  j                  dd
       |j9                  d|z         y )Nr  r  zCYTHON_UNUSED PyObject *unused__ipow__z
PyObject *, PyObject *r   r   r  Fr  r  r  z%s; /*proto*/T)r  zstatic char z[] = r   #if CYTHON_UPDATE_DESCRIPTOR_DOCzstruct wrapperbase %s;r  zstatic PyMethodDef %s = )
allow_skipz%s {)+r5  r  rN  r
   r;  r  ri   r	  r  r  rV  r<  rW  r  r  rd  method_flagsr   method_noargsr  r  rF   rP  
args_cname
kwds_cnamer   r  r  rf   r  r  r   ry  r6   is_property_scoperp  
is_unicodeas_utf8_stringrn  as_c_string_literalr  r  put_pymethoddef)r   rl   r  r  r  rY  r  r  r  mfr  r  docstrs                r+   r  z'DefNodeWrapper.generate_function_headerK  s&   nn 4 4%(9(99H$$+h6  *99 	FC>>??coo!((#--)GH!((55cmmDF	F !!C$4$4$69;R;R:S$S  !AB;;''EJJ*,D  !AB  %%v'8'8:; 99]+ JJ@@KK00!B"N..u/?/?@&("h7

?V+,{{(( ))BB.T C ;599KK--KK11%%)@)@YYF  ..0$$7])]

OO..02 3 

=>

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

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

6F?#r-   c                 *   | j                   D ]U  }|j                  s|j                  r|j                  d|j                  z         ;|j                  |j                         W |j                  D ]   }|j                  s|j                  |       " y )NzPyObject *%s = 0;)	ri   r	  r=  rf   rV  r"  r  r  r>   )r   rO   rl   r  r  s        r+   r   z-DefNodeWrapper.generate_argument_declarations  sw    99 	8C~~''JJ2S]]BC,,SYY7	8 __ 	0E||((/	0r-   c                    |j                         }|j                  }|j                  d      }| j                  dkD  }| j                  d uxs | j
                  d uxs |}| j                  D ]5  }|j                  j                  r|j                  j                  |      r67 | j                         s*|rt        | j                  d       | j                  |       n?| j                         s| j                  |       n| j!                  | j                  ||       ||_        |j#                  |      r)|j#                  |      s|j%                  |       |j'                  |       |r| j)                  | j                  |       | j
                  rk| j
                  j*                  j,                  r&|j/                  | j
                  j*                         n%|j1                  | j
                  j*                         |j3                  | j4                  j*                  j6                         |j9                          |j;                  d| j=                         z         |j#                  |      r|j'                  |       y y )Nargument_unpacking_doner   z.This method cannot have * or keyword argumentsr  )new_error_labelrK  r  r   r  r  ri   r9   rG   r  r  r   r*   r  r  generate_stararg_copy_code'generate_tuple_and_keyword_parsing_code
label_usedrM  rO  generate_arg_decrefr  rB  put_var_xdecref_clearput_var_decref_clearrW  r  rX  rf  rf   rU  )	r   rO   rl   old_error_labelour_error_label	end_labelhas_kwonly_argshas_star_or_kw_argsr  s	            r+   r>  z-DefNodeWrapper.generate_argument_parsing_code  s    ..0**NN#<=	..2"mm47 @  ,@0? 	 99 	C88''xx;;C@	
 ..0"dhh PQ2248335++D1 88ItT*???+??9-i(NN?+"((=$$((..>>2243D3D3J3JK11$2C2C2I2IJ""4;;#4#4#C#CD,,.JJ|d&6&6&889??9%NN9% &r-   c                 @    |r|j                  |j                         y y r   )r  r  r   r  rl   s      r+   generate_arg_xdecrefz#DefNodeWrapper.generate_arg_xdecref  s    &&syy1 r-   c                 @    |r|j                  |j                         y y r   )r  r  r  s      r+   r  z"DefNodeWrapper.generate_arg_decref  s    %%cii0 r-   c                    | j                   s|j                  j                  t        j                  dd             |j                  dt        j                  z         |j                  d| j                  dt        j                  d| j                         d       |j                  d       | j                  rT| j                   s | j                  j                  j                  sd	t        j                  z  }n9d
t        j                  z  }n%dt        j                  dt        j                  d}|j                  j                  t        j                  dd             |j                  d|t        j                  | j                  t        | j                        | j                         fz         | j                  r\| j                  j                  j                  r;t!        d | j                  j                  j"                  D              r(|j                  d|z         |j                  | j                  j                  j$                  dt        j                  d| j                  j                  j$                  d| j                         d       |j'                  | j                  j                  j$                         |j                  d       |j                  | j                  j                  j$                  d       |j                  d       d| j                  j                  _        n|j                  | j                  j                  j$                  dt        j                  dt        j                  d       |j                  d| j                  j                  j$                  d| j                         d       d| j                  j                  _        |j'                  | j                  j                  j$                         | j*                  r| j,                  j.                  s|j                  | j                   j                  j$                  dt        j                  d| j                   j                  j$                  d       | j                  r| j                  j                  j                  ry|j                  d        |j1                  | j                  j                  j$                  t2               |j                  d!| j                         z         |j                  d       n"|j                  d!| j                         z         |j'                  | j                   j                  j$                         |j5                  t        j6                  t2               |j9                  t        j6                         |j                  d"| j                   j                  j$                  d#t        j6                  d$       |j:                  j=                  t>        j@                  d%&      }|j                  d'|d(|d)t        j                  d*|d+	       |j                  d,t        j                  d-|d$       |j5                  d.t2               |j9                  d.       |j                  d"| j                   j                  j$                  d-|d/       |j                  d       |j:                  jC                  |       d| j                   j                  _        y | j                   r|j5                  t        j                  t2               |j                  | j                   j                  j$                  d0t        j                  d       d| j                   j                  _        y y )1NRaiseArgTupleInvalidr  z)if (unlikely(PyTuple_GET_SIZE(%s) > 0)) {z__Pyx_RaiseArgtupleInvalid("z", 1, 0, 0, PyTuple_GET_SIZE(z)); return r  r  zunlikely(%s)%sz	unlikely(z) && unlikely(PyDict_Size(z) > 0)KeywordStringCheckzHif (%s && unlikely(!__Pyx_CheckKeywordStrings(%s, "%s", %d))) return %s;c              3   H   K   | ]  }|j                   j                    y wr   )rk   
allow_null)r7  refs     r+   r8  z<DefNodeWrapper.generate_stararg_copy_code.<locals>.<genexpr>  s     X3388&&Xs    "r	  z = PyDict_Copy(z); if (unlikely(!
)) return r  z = NULL;r   r  z) ? PyDict_Copy(z) : PyDict_New(); zif (unlikely(!r   z  = PyTuple_New(PyTuple_GET_SIZE(z)+1); if (unlikely(!z)) r  r  zPyTuple_SET_ITEM(z, 0, r  Fr  for (z=0; z < PyTuple_GET_SIZE(r  z++) {z"PyObject* item = PyTuple_GET_ITEM(r   r   z
+1, item);r  )"r  r  r;  r   r  rf   r
   r  r  rF   rU  r  r  r  r  boolr<  cf_referencesr  r  rB  rN  r  r0  put_xdecref_clearr   r9  r;  r  r  r  r   c_py_ssize_t_typer  )r   rl   kwarg_checkr  s       r+   r  z)DefNodeWrapper.generate_stararg_copy_code  s|   }}--''(>@UVXJJB(() *HH		6,,d.>.>.@B CJJsO}}D$5$5$;$;$C$C,v/@/@@"V%6%66	  !!6#4#46K))##$8:OP	R

XV..		T&&')9)9);\= =	>
 !2!2!8!8!@!@X$2C2C2I2I2W2WXX

;45

%%++11%%%%++11$$&	( )
  1 1 7 7 = =>

:&

4+<+<+B+B+H+HJK

3:;!!''7%%++11%%%%' ( 

%%++1143C3C3EG H:;!!''7 1 1 7 7 = =>(C(CHH##))!!##))+ ,   T%6%6%<%<%D%D

3&&t'8'8'>'>'D'DnU

<$*:*:*<<=

3

<$*:*:*<<=OODMM//556OOF--~>V../JJ##))6+<+<> ?>>//
0L0LY^/_DJJdF--t5 6JJ!!4) *OOFN3V$JJ##))41 2JJsONN''-23DMM/]]OOF--~>JJ##))!!# $ 34DMM/ r-   c                 ^   |j                  d      }g }g }g }|D ]  }|j                  s|j                  rJ|j                  r)|j                  r6|j
                  r|j                  |       T|j                  |       f|j
                  r|j                  |       |j                  r|j                  r|j                  |        ||z   }	| j                  | j                  z
  }
t        |      dkD  r#|d   j                  s|d   j                  r|
dz  }
t        |      }| j                   xr |
|k(  }t        |	      }| j                  s| j                  r| j                  ||       |j                  d       t        |      t        |	      z   }|j                  dt         j"                  ddj%                  |D cg c]   }d|j'                  |j(                        z  " c}      d	       | j+                  ||       |j                  d
| j                  dkD  xr dxs ddt         j,                  d       | j/                  |
||||||       | j                  r|
dkD  s|
|k(  rL|
|k(  r| j                  sd}nd}|j                  dt         j0                  ||
fz         |j3                  |       | j                  r||
kD  rA| j                  s5|j                  dt         j0                  |fz         |j3                  |       |j                  d       t5        |	      D ]  \  }}|j                  r|j'                  |j(                        }|j6                  j9                  t;        j<                  dd             |j?                  d| j(                  d|d       |j                  |jA                  | jB                                n n|j                  d       |
|k(  r:t5        |      D ]*  \  }}|j                  d|t         j0                  |fz         , nw|j                  dt         j0                  z         | j                  r|j                  d       tE        t5        |            d d d   }|D ]e  \  }}||
dz
  k\  r3||d   d   k7  r|j                  d       |j?                  d|dz   z         |j                  d|t         j0                  |fz         g |
dk(  r"|j                  d       |j?                  d       |j                  d        | j                  r=|
r]tG        |
dz
  dd      D ]  }|j                  d!|z          |j3                  |       n"|j?                  d"       |j3                  |       |j                  d#       |j                  d#       t5        |      D ]  \  }}| jI                  |d$|z  |        |j                  d#       |jK                  |      r|j3                  |       |jM                  |       |j6                  j9                  t;        j<                  d%d             |j?                  d&| j(                  ||
|t         j0                  fz         |j                  |jA                  | jB                               y y c c}w )'Nargtuple_errorr   r   r  zstatic PyObject **z[] = {,&%sz,0};r  likelyr\  r  )) {z!=<z(} else if (PyTuple_GET_SIZE(%s) %s %d) {z'} else if (PyTuple_GET_SIZE(%s) > %d) {r  RaiseKeywordRequiredr  __Pyx_RaiseKeywordRequired("r  r  &values[%d] = PyTuple_GET_ITEM(%s, %d);zswitch (PyTuple_GET_SIZE(%s)) {default:r   CYTHON_FALLTHROUGH;
case %2d: z	case  0: break;	case %2d:	default: r  z
values[%d]r  zD__Pyx_RaiseArgtupleInvalid("%s", %d, %d, %d, PyTuple_GET_SIZE(%s)); )'r  r	  rM  r  r  r
  r  r"  r!  r^   r  r  r  generate_stararg_init_coderf   tupler
   pykwdlist_cnamer   intern_identifierrF   #generate_argument_values_setup_coder  generate_keyword_unpacking_coder  rM  r  r  r;  r   r  r  r  r*   r   r	  generate_arg_assignmentr  rO  )r   ri   success_labelrl   argtuple_error_labelrE  required_kw_only_argsoptional_kw_only_argsr  kw_only_argsmin_positional_argsmax_positional_argshas_fixed_positional_counthas_kw_only_argsall_argscomparer  pystring_cnamereversed_argss                      r+   r  z6DefNodeWrapper.generate_tuple_and_keyword_parsing_code,  s   #~~.>? " " 	0C~~;;??3??;;188=+2237[[)005#**3/	0 -/DD"44t7P7PPt9q=d1g11T!W5H5H1$!/2)-%6 &7#66 	#-++,?F

3)E,,??

""HH!)+ d44SXX>> + ,- 	. 	004@ 	

&&*8FJF 	  	,,!4&(8*D	2 %%*=*AFY]pFp #&99$--JJA!!7,?EA A BMM./$$"%88

D%%':H< < =23JJz"#L1 
3{{%)%;%;CHH%EN$$55#//0FH]^`HH		&( ) JJttxx89
 JJz""&99 (8 eFAsJJG1fN_N_abJccde
 

<v?P?PPQ==JJz* $Y%? @2 F+ eFAs/11a 0 33 JJ'<=1!56JJG1fN_N_abJccde '!+JJ45HH[)

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

3

3
  ) 	FFAs((lQ.>E	F 	

3??/0MM-(NN/0--''(>@UVXHH[		5#%8!!_# # $ JJttxx01 1E+s   %Z*c                    |j                   j                  ri|j                  r/t        j                  |j                   t        j
                  |      }|j                  }|j                  |j                  d|d       y |j                   j                  r|j                  r|j                  d|z         |j                  |j                   j                  ||j                  j                  |j                  |             |j                  r|j                  d       |j                  |j                  j                  d|j                  |      d       |j                   j                  r'|j                  |j                  j                  d       |j                  d       y y t!        |j                  d|j                   z         y )	Nr  r  r	  r  Tr  r  2Cannot convert Python object argument to type '%s')r9   rG   r	  r   typecastr   r  rf   r  from_py_functionrM  from_py_call_coder*   r  rs  rA  r   )r   r  r   rl   r  s        r+   r  z&DefNodeWrapper.generate_arg_assignment  sF   88~~!**388Z5N5NPTUIIEJJU[[$78xx((;;JJ{T12

38855#))//377D: ;;;JJz*JJ		88> @ A xx2277		AE 8 GJJsO  cggSVYV^V^^_r-   c                    | j                   rd| j                   j                  _        |j                  | j                   j                  j                  d| j                   j                  j                  d| j                         d       |j                  | j                   j                  j                         | j                  rd| j                  j                  _        |j                  dt        j                  |fz         |j                  d| j                  j                  j                  t        j                  |t        j                  fz         |j                  d| j                  j                  j                  z         | j                   r4|j                  | j                   j                  j                  t               |j                          |j                  d| j                         z         |j                  d	       |j                  | j                  j                  j                         |j                  d
       |j                  | j                  j                  j                  dt        j                  d       |j                  t        j                  t               |j                  d	       y y )Nr   z = PyDict_New(); if (unlikely(!r  r  z if (PyTuple_GET_SIZE(%s) > %d) {z4%s = PyTuple_GetSlice(%s, %d, PyTuple_GET_SIZE(%s));r  r  r  r  r  ; )r  r  rB  rf   r  rU  r  r  r
   r  r  r   rf  r  r8  r9  )r   r  rl   s      r+   r  z)DefNodeWrapper.generate_stararg_init_code  s   67D##3JJ!!''--!!''--  "$ % OOD--3399:==23DMM/JJ9!!#=% % & JJM##))6+<+<#V%6%6Q8 8 9 JJ-0C0C0I0IIJ  %%d&7&7&=&=&C&C^T,,.JJ|d&6&6&889JJsOOODMM//556JJz"HHDMM$7$7$=$=v?Q?QRSOOF..?JJsO% r-   c           
      F   t        |      }|j                  d|dj                  d|z        fz         | j                  j                  ra|j                  | j                  j                  dt
        j                  d| j                  j                  dt
        j                  d       t        |      D ]i  \  }}|j                  s|j                  j                  s*|j                  |      }|j                  d||j                  j                  |      fz         k y )	NzPyObject* values[%d] = {%s};r  r  z *z = __Pyx_CyFunction_Defaults(r   r  zvalues[%d] = %s;)r^   rf   r   r  r  r
   dynamic_args_cnamer;  r  rM  r9   rG   r  rc  )r   ri   rl   max_argsr  r  r  s          r+   r  z2DefNodeWrapper.generate_argument_values_setup_code  s    t9 	

1chhs8|,5. . 	/ ;;&&JJ++V-F-F++V->->@ A  o 	ZFAs{{sxx33 # @ @ F

-CHH4H4H4W0XXY	Zr-   c                 
   |j                  d       |j                  dt        j                  z         |j                  d       | j                  r|j                  d       t	        |dz
  dd      D ]O  }|j                  d|dz   z         |j                  d|t        j                  |fz         |j                  d	       Q |j                  d
       | j                  s"|j                  d       |j                  |       |j                  d       |j                  dt        j                  z         | j                  s|dkD  rd}	t        |      D ]  \  }}
|
j                  r|}	 |	|k  r|dz
  }	|dkD  r|j                  d       t        |d |	dz          D ]  \  }}
|dkD  rR||k  rM|dk7  r|j                  d	       | j                  r||k(  r|j                  d       n|j                  d|z         |j                  |
j                        }|
j                  rj|
j                  r|j                  d       |j                  dt        j                  d|d       |j                  d|z         |j                  d       |j                  d|t        j                  |fz         ||k  r|dk(  r$|j                  d       |j                  |       B|j                  d       |j                  j                  t!        j"                  dd             |j                  d| j                  ||||fz         |j                  |j%                  | j&                               |j                  d       |
j                  s|j                  d       |j                  j                  t!        j"                  dd             |j                  d| j                  d|d       |j                  |j%                  | j&                               |j                  d        |dkD  r|j                  d       |r| j)                  ||       |j                  d       |dk(  rd }n'| j                  r|j                  d!||fz         d"}nd#}|j                  j                  t!        j"                  d$d             |j                  d%t        j                  dt        j*                  d| j,                  xr  | j,                  j.                  j0                  xs d d&|d'| j                  d(|j%                  | j&                               |j                  d       y ))NzPy_ssize_t kw_args;z1const Py_ssize_t pos_args = PyTuple_GET_SIZE(%s);zswitch (pos_args) {r  r   r   r  r  r  zcase  0: break;r  r  zkw_args = PyDict_Size(%s);r   r  zif (kw_args > 0) {*PyObject* value = __Pyx_PyDict_GetItemStr(r   r  z-if (value) { values[%d] = value; kw_args--; }zKif (likely((values[%d] = __Pyx_PyDict_GetItemStr(%s, %s)) != 0)) kw_args--;zelse else {r  r  z2__Pyx_RaiseArgtupleInvalid("%s", %d, %d, %d, %d); r  r  r  r  zif (unlikely(kw_args > 0)) {r  zAconst Py_ssize_t used_pos_args = (pos_args < %d) ? pos_args : %d;used_pos_argspos_argsParseKeywordsz)if (unlikely(__Pyx_ParseOptionalKeywords(z
, values, r  z	") < 0)) )rf   r
   r  r  r	  r  rM  r  r"  r  rM  r  rF   r
  r  r;  r   r  r  r*   ,generate_optional_kwonly_args_unpacking_coder  r  r  r  )r   r   r  r  r  r  r  rl   r  last_required_argr  r  pos_arg_counts                r+   r  z.DefNodeWrapper.generate_keyword_unpacking_code  s    	

()

FIZIZZ[

()==JJz"*1,b"5 	.AHH\QqS)*JJ?6$$aC) ) *JJ,-		.
 	

$%}}HH[!MM./

3 	

/&2C2CCD!!%81%< "#H- *3{{()%* !#66$7$9!"Q&

01#H-A.?.A$BC .(3&*q4G/GAv

#89}}.A)A

:.

;?3!%!7!7!A;;{{ JJ34JJ))> ; <JJNQRRSJJsOJJl6,,np>  > ?..6 HHW- MM*>?
 !JJx0 ,,== + 7 78NPe fh HH%Y $		+E 35H!]M &M N !JJttxx'@A JJsO

8,((99'334JLabd II~"7 8

4??488#<=

3].(^ #Q&

3 ==hM

12 !#M]]JJZ#%8^: : ;+M&M))##O5JK	M

""?$"3"3"9"9"?"?F3FIIOODHH%' 	( 	

3r-   c                    g }d}t        |      D ]=  \  }}|j                  r|j                  s|s|}|j                  |j                         ? |rt        |      dkD  rf|j                  d| j                   xr dxs dt        |      fz         |j                  d       |j                  d||t        |      z   fz         n%|j                  d       |j                  d	|z         |j                  d
t        j                  dt        j                  d       |j                  d       t        |      dkD  r|j                  d       |j                  d       y y )Nr   r   z'if (kw_args > 0 && %s(kw_args <= %d)) {r  r   zPy_ssize_t index;z6for (index = %d; index < %d && kw_args > 0; index++) {zif (kw_args == 1) {zconst Py_ssize_t index = %d;r  z, *z	[index]);z0if (value) { values[index] = value; kw_args--; }r  )r  r
  rM  r  rF   r^   rf   r  r
   r  r  )r   r  rl   optional_argsfirst_optional_argr  r  s          r+   r  z;DefNodeWrapper.generate_optional_kwonly_args_unpacking_code  sQ   ) 	+FAs;;ckk %&"  *	+ =!A% 

D)))6h<"&H( ( ) 

./

S&(:S=O(OWQ Q R 

01

9<NNOJJ!!6#9#9; <JJIJ=!A%

3JJsO) r-   c                 d    | j                   D ]!  }|j                  s| j                  ||       # y r   )ri   r=  generate_arg_conversionr  s      r+   r  z0DefNodeWrapper.generate_argument_conversion_code  s0     99 	8C##,,S$7	8r-   c                 ,   |j                   }|j                  }|j                  rm|j                  r|j	                  d|j
                  z         n|j	                  d|j
                  z         | j                  ||       |j	                  d       y |j                  r| j                  ||       y |j                  |      r6|j	                  |j                  j                  d|j
                  d       y t        |j                  d|d|d       y )	Nr	  zassert(%s); {r  r  r  z Cannot convert 1 argument from 'z' to 'r@  )r<  r9   rG   rM  rf   rV  %generate_arg_conversion_from_pyobject#generate_arg_conversion_to_pyobjectr  r  r  r   r*   )r   r  rl   old_typenew_types        r+   r  z&DefNodeWrapper.generate_arg_conversion  s    <<88{{

;67

?S]]:;66sDAJJsO!!44S$?''1

#--HIcggPXZbcdr-   c                     |j                   }|j                  rL|j                  |j                  |j                  |j
                  j                  |j                  |             y t        |j                  d|z         y )Nr	  )	r9   r  rf   r  rV  r  r  r*   r   )r   r  rl   r$  s       r+   r!  z4DefNodeWrapper.generate_arg_conversion_from_pyobject  s`    88$$JJx11			  #''ORZZ[r-   c                 r   |j                   }|j                  }|r|j                  |j                  j                  d|d|j
                  d|j                  |j                  j                  |j                               |j                  |j                         y t        |j                  d|z         y )Nr  r  r  z5Cannot convert argument of type '%s' to Python object)
r<  to_py_functionrf   r  r  rV  r  r*   put_var_gotrefr   )r   r  rl   r#  rr   s        r+   r"  z2DefNodeWrapper.generate_arg_conversion_to_pyobject  s    <<&&JJ		''		A	C D
 		*#''RU]]^r-   c                 (   | j                   D ]  }|j                  r| j                  ||       "|j                  r/|j                  j
                  s-|j                  j                  s|j                  j                  sr| j                  ||        y r   )	ri   r  r  r  r9   rG   rU  rs  r  r  s      r+   rG  z+DefNodeWrapper.generate_argument_type_tests  sm     99 	8C""++C6__#((*>*>*-((*<*<*-((*E*E,,S$7	8r-   c                 .    | j                   j                  S r   )r5  rU  r   s    r+   rU  zDefNodeWrapper.error_value  s    ~~)))r-   r  )rb   r   r   defnoder  r   r   r{  r  r  r  r  r  r   r>  r  r  r  r  r  r  r  r  r  r  r  r!  r"  rG  rU  rt   r-   r+   r6  r6    s     GF	31,/3*?@BI$V	0,&\21S4jQ2f`48Z&wr>8e&\_
8*r-   r6  c                   p     e Zd Zd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                 P    t        |g d      |d<   t        t        |   |fi | y )NT)r  r   r   )r  r   r-  r   r   r*   r   ra   s      r+   r   zGeneratorDefNode.__init__  s*    %c4Hv.s=f=r-   c                     t         t        |   |       | j                  | j                  _        | j                  j                  |       y r   )r   r-  r   r  r/  r   rO   ra   s     r+   r   z%GeneratorDefNode.analyse_declarations  s7    :3?!%!1!1



'',r-   c                 l   | j                   j                  j                  }|j                  | j                        }|j                  | j
                        }|j                  | j                        }|j                  d       |j                  d| j                  d|d| j                  r| j                  j                  |      nddt        j                  d|d|d|d|j                  d| j                               |j                  t        j                  t                | j"                  rNd	}|j                  |d
t        j$                  d       |j'                  |t                |j)                  |       |j+                          |j                  d       |j                  d       y )Nr  z#__pyx_CoroutineObject *gen = __Pyx_z_New((__pyx_coroutine_body_t) r   r  z, (PyObject *) r  genzgen->classobjz  = __Pyx_CyFunction_GetClassObj(r  zreturn (PyObject *) gen;r  )r/  r  r  r  rF   qualnamemodule_namerf   gen_type_namer.  r/  r
   r  r  r*   ra  r   r  r;  r9  r  rf  )r   rO   rl   
body_cnamerF   r6  r7  classobj_cnames           r+   r  z'GeneratorDefNode.generate_function_body  sD   ZZ%%00
%%dii0))$--8,,T-=-=>

3

))!SWScSc4#3#3#I#I$#Oio#o--tX{..udhh?A 	B 	..?!!,NJJ 1 13 4OONN;^,((*

-.

3r-   c                     |j                  t        j                  | j                  d             | j                  j                  |d       t        t        | #  ||       | j                  j                  ||       y )NCoroutine.cT)proto)	r;  r   r  r8  r/  r  r   r-  r  )r   rO   rl   ra   s      r+   r  z.GeneratorDefNode.generate_function_definitions  sa    [44T5G5GWX

++D+=CCN

00d;r-   )rb   r   r   r,  is_coroutineis_iterable_coroutineis_asyncgenr8  r  r  r   r   r   r  r  r   r   s   @r+   r-  r-    sO     LL!KMM%%	1K>
-
0< <r-   r-  c                       e Zd ZdZdZy)AsyncDefNode	CoroutineTN)rb   r   r   r8  r>  rt   r-   r+   rB  rB    s    MLr-   rB  c                       e Zd ZdZdZy)IterableAsyncDefNodeIterableCoroutineTN)rb   r   r   r8  r?  rt   r-   r+   rE  rE  "  s    'M r-   rE  c                       e Zd ZdZdZy)AsyncGenNodeAsyncGenTN)rb   r   r   r8  r@  rt   r-   r+   rH  rH  '  s    MKr-   rH  c                   J     e 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         t        |   ||||d g d d        y )N)r*   r   rF   is_async_gen_bodyr6   ri   r  r  )r   rK  r   )r   r*   rF   r   rM  ra   s        r+   r   zGeneratorBodyDefNode.__init__5  s,    "D2$T=N24 	3 	Ar-   c                 .   |j                  |j                        }|j                  d      }t        j                  |z   |z   }|j	                  d t
        | j                  |d      }||_        t        | j                        |_
        d|_        || _        y )N	generatorr  )r  r\  T)ri  rj  r
   genbody_prefixr  r   r*   r  r   rF   rX  r  r  )r   rO   rr  rF   r  r  s         r+   declare_generator_bodyz+GeneratorBodyDefNode.declare_generator_body:  s    S--.{{;'%%.5ndhh&+	   C ,TYY7 

r-   c                 H    | j                  |       | j                  |       y r   )r1  rQ  r   s     r+   r   z)GeneratorBodyDefNode.analyse_declarationsH  s    ##C(##C(r-   c           	          d| j                   j                  dt        j                  dt        j                  dt        j
                  d	}|r|j                  d|z         y |j                  d|z         y )Nzstatic PyObject *z(__pyx_CoroutineObject *z, CYTHON_UNUSED PyThreadState *r  r  z%s; /* proto */z%s /* generator body */
{)r  r  r
   generator_cnamelocal_tstate_cnamesent_value_cnamerf   )r   rl   r=  r  s       r+   r  z-GeneratorBodyDefNode.generate_function_headerL  sZ    JJ!!""%%##	%
 JJ(612JJ3f<=r-   c           
      z   | j                   }| j                  j                  ||       |j                  |       |j	                         |_        |j                  | j                         | j                  ||       |j                  d       | j                  |       |j                         }|j                  dt        j                  z         |j                         }|j                          |j                  | j                   j"                  xs | j                   j$                         |j&                  j(                  d   }|j&                  j(                  d   }|s|r[|j+                          d|j,                  _        | j0                  r| j0                  j3                  |      nd }|j5                  |       |j,                  j7                  |j8                  j:                  j<                         |j                         }	|j	                  d      }
|j?                  |
       |jA                  |
       |j                  d|jC                  t        jD                  | j                        z         | jF                  r| jH                  | jH                  }|tJ        jL                  u rd}n8|tJ        jN                  u rd	}n#|tJ        jP                  u rd
}ntS        d|z        |j                  t        j                  d|d|jC                  t        j                  | j                               |jU                  t        j                         | jW                  ||       |j8                  j:                  j<                  jX                  r|j                  |j8                  j:                  j[                  t        j\                        d|j8                  j:                  j_                  dt        j`                  z        d       |j                  dt        j\                  z         |s|rd|j,                  _        |j                  | j                         |j                  d       |j                  d       | jF                  ss| j                  jb                  s]| jd                  r/|j&                  jg                  ti        jj                  dd             |j                  d| jd                  rdndz         |jm                  |jn                        rk| j                  jb                  s|jq                  |jr                         |jA                  |jn                         | jF                  r0| jH                  $|ju                  t        j                  tv               tx        jz                  |j}                         j~                  j                  v rV|j&                  jg                  ti        jj                  dd             |j                  dt        | jd                        z         |j,                  j                         D ]  \  }}|j                  ||        |j                  | j                   j$                         |jA                  |jr                         | jF                  r |j                  t        j                         n$|ju                  t        j                  tv               |j                  d       |j                  dt        j`                  z         |j                  d       |j                  dt        j`                  z         |j                  dt        j`                  z         |s|r6|j                  t        j                  |j,                  j                          |j                          |j                  d t        j                  z         |j                  d!       |j                  |j,                         |s|rG|	j                  | j                   j$                  | j                  |j,                  j                          |	j                  d"t        j`                  z         |	j                  d#|
z         |j                  D ]  \  }}|	j                  d$||fz          |	j                  d%       |s|r(|	j                  d&|j,                  j                          |	j                          |	j                  d'       |	j                  d!       |j                          y )(Nr   zPyObject *%s = NULL;r  r  T	first_runr  zPyList_New(0)zPySet_New(NULL)zPyDict_New()z)invalid type of inlined comprehension: %sr  r  z%s->closurer  zCYTHON_MAYBE_UNUSED_VAR(%s);Fr  StopAsyncIterationr<  zPyErr_SetNone(%s);__Pyx_PyExc_StopAsyncIterationPyExc_StopIterationpep479z*__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   r  r  zswitch (%s->resume_label) {zcase 0: goto %s;zcase %d: goto %s;z2default: /* CPython raises the right error here */r  zreturn NULL;)Mr  r   r  r  r  r  r&  r*   r  rf   r  r%  r
   r$  r2  r3  r  rF   rX  r  r   r-  r  r=  r.  r/  r0  init_closure_tempsr  r9   r  	use_labelrO  r  rV  
is_inlinedinlined_comprehension_typer   	list_typeset_type	dict_typer   r  r  r  rW  r  r  rT  r   rM  r;  r   r  r  rK  rM  rN  r  r   r   generator_stopr  contextfuture_directivesr  rP  rQ  rW  rb  re  r  rf  rg  r<  yield_labelsrh  )r   rO   rl   r  closure_init_coderp  r  r  r.  resume_codefirst_run_labeltarget_type	comp_initr  r9   r  labels                    r+   r  z2GeneratorBodyDefNode.generate_function_definitionsW  s+    			//d; 	t$/3~~/?, 	dhh++D$7

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

)F,?,??@//1))+''

(T4::;T;TU""--i8$$//<	i335'+DNN$JNJZJZ$**@@F`dK%%k2 	))$*:*:*?*?*E*EF**,..5''

4++F,C,CTXXNP 	Q ??t>>J99Kg///+	 0 00-	 1 11*	#?+MO OJJ##Y''(;(;TXXFH I OOF//0 	##C.  &&22##  %%66v7M7MN  %%//060F0F1G H%I J
 JJ58N8NNOi',DNN$dhh

2

-. tyy'>'>%%  11++,@-PRJJ+484J4J0Peg h ??4++,99**d//0NN4++,4#B#B#N&&v':':NK$$(8(8(:(B(B(T(TT  11+2I2I(Ta2bc

G$tOeOeJffg#~~??A .t  -.""4::#<#<= 	t(()??f112""6#6#6G

34

@6CYCYYZ

8

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

:V=S=SSTi!!&"5"5,0NN,D,D(D " F((*

<&"5"556

3 	..t~~>i&&tzz'@'@$((151I1I-I ' K7--/ 	0 	,>?)) 	@HAu1QJ>?	@NOi((37>>3K3K/K ) M//1.)#r-   )NNNFr  )rb   r   r   r  r_  rM  r`  r   rQ  r   r  r  r   r   s   @r+   rK  rK  ,  s7     J!%A
)	>J r-   rK  c                   "    e Zd ZdgZdZd Zd Zy)r  r   Nc                    |j                   | _        | j                  j                  rd}nd}ddlm} |j                  | j                  t              | _	        |j                  | j                  | j                  | j                  |d  D cg c])  }|j                  | j                  |j                        + c}      }|j                  j                  s|j                  j                  rIt!        | j                  t#        | j                  |      t%        | j                  d       g      | _        nt%        | j                  |      | _        | j&                  j)                  |      | _        | S c c}w )	Nr   r   r  rc  r  ri   )exprrB   r  )r'  ri   r  rr  r   r{  RawCNameExprNoder*   r   	func_noder  r  rF   r  rV  is_returncoder  ExprStatNoder  r   r   )r   rO   	first_argr{  r  	call_nodes         r+   r   z%OverrideCheckNode.analyse_expressions  s   OO	<<''II"33DHHnM,,HHt~~!YYyz24 $$TXXCHH$= 4 - 5	 ??""coo&C&C$TXXTXXI6txxt466 7DI 'txxyADIII11#6	4s   
.E3c           	         |j                  | j                  j                  j                        }| j                  j                  rdt
        j                  z  }nd| j                  d   j                  z  }|j                  d       |j                  dt
        j                  z         |j                  d       | j                  j                  r|j                  d       n|j                  d|d|d	       |j                  d
       |j                  j                  t        j                  dd             |j                  dt
        j                  dt
        j                   d       |j                  d|dt
        j                  dt
        j                   d       |j                  dt
        j"                  d|d       |j                  d       |j$                  j'                  t(        d      }| j*                  j-                  |       |j                  j                  t        j                  dd             |j/                  || j0                        }|j                  |d|d|d|       |j3                  |       d|z  }d|d| j                  j                  j4                  d}|j                  d |d!|d"       | j6                  j9                  |       |j                  d#       |j                  d
       |j                  t
        j                  d|d       |j                  t
        j                   d$|d       |j                  d%t
        j"                  d&t
        j                  d'       |j                  t
        j                  d(t
        j                   d       |j                  d#       |j                  d       |j;                  |t<        j(                         |j$                  j?                  |       |j                  d
       |j                  d#       |j                  d       |j                  d#       y ))Nr  r   z /* Check if called by wrapper */zif (unlikely(%s)) ;z#/* Check if overridden in Python */r  zelse if (unlikely((Py_TYPE(z#)->tp_dictoffset != 0) || (Py_TYPE(zA)->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) {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(r  r  Tr  PyObjectGetAttrStrz = __Pyx_PyObject_GetAttrStr(r  zPyCFunction_Check(%s)z(PyCFunction_GET_FUNCTION(z) != (PyCFunction)(void*)r  zif (! || r  r  z! = __Pyx_get_object_dict_version(r  z != r  r  ) r  r  r  rF   rr  r
   module_cnameri   r  rf   r  r  r;  r   r  tp_dict_version_tempobj_dict_version_temptype_dict_guard_tempr  r  r   rt  	set_cnamer  r*   r  r  r   r
  r  r   r  )r   rl   interned_attr_cnamer  func_node_temperris_builtin_function_or_methodis_overriddens           r+   r
  z)OverrideCheckNode.generate_execution_code  sJ   "44T\\5G5G5L5LM<<'')F,?,??H)DIIaL,>,>>H

56

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

89<<''JJx JJ($ % 	

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

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

f1163O3OQ 	R

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

855nQU5V  0))##$8:LM	O%%ndhh?

H&93@ 	A'(?.(P%DLL..99;

)FVW		))$/

3
 	

fg

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

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

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

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

3

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

fg

3

8

3r-   )rb   r   r   r   r   r   r
  rt   r-   r+   r  r    s     (KD*Lr-   r  c                       e Zd Zy)ClassDefNodeNrb   r   r   rt   r-   r+   r  r  V      r-   r  c                   X    e Zd Zg 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y)PyClassDefNode)	r   r~   	metaclassmkwr   class_resultr  
class_cellr|  NFc	                 N   t         j                  | |       || _        || _        || _        || _        || _        ddlm}	 | j                  rDt        j                  r4t        | j                  | j                        }|	j                  ||      }
nd }
| }|rd}d| _        |j                  r|j                   rt#        t%        |j                               d d d   D ]_  \  }}|j&                  j(                  dk(  s | j*                  t-        |j                  d       |j(                  | _        |j                   |= a || _        n$| j*                  J |	j1                  |      | _        |s$| j                  s| j.                  s| j*                  r| j*                  g|r|j                  s| j.                  }nd }|s-| j                  j2                  r| j                  j4                  sn|	j7                  || 	      | _        d}nd}|	j9                  |||
| 
      | _        |	j=                  ||| |
||      | _        n2|	jA                  |g       | _        |	jC                  ||| |
      | _        |	jE                  ||      | _#        |	jI                  | j                        | _%        y )Nr   r  rr  FTr   r  z2keyword argument 'metaclass' passed multiple times)class_def_node)rF   r6   r  )rF   r  r6   calculate_metaclassallow_py2_metaclassr@   )rF   r  r6   rc  )&r-  r   rF   r6   r   r|  r   r   r{  r   ry  r7   r*   
StringNodeis_py3_style_classr?   r@   r   r  r   rB   r  r   r  	ProxyNodeis_sequence_constructorri   PyClassMetaclassNodePyClassNamespaceNoder~   Py3ClassNodeclassobjDictNode	ClassNoder  r  ClassCellInjectorNoder  )r   r*   rF   r   r6   r   r|  rF  force_py3_semanticsr{  doc_noder  r  r   mkdictneeds_metaclass_calculations                   r+   r   zPyClassDefNode.__init__r  so   $$		$
88** 4884C ++Cs+;HH"55"'&*D#++//#'	,2N2N(O#PQUSUQU#V @488>>[8#~~9 %dhh0d e .2ZZDN , < <Q ?@  ,DH>>55 %..|<$**DNN~~%(D(D!XXF!F

:: JJOO%.%C%CD &D &2DN.3+.2+!66$HT 7 CDI%22$t$?$7 3 9DM "**3*CDI%//$t 0 CDM  ((4(8#99$((Cr-   c                 F   | j                   r!t        | j                  j                  d       yddlm} t        | j                  dd| j                  | j                  xs |j                  | 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   r  r  ri   F)r\  r7  
class_namer   r|  r   r]  r6   )r  r   r  r*   r   r{  CClassDefNoderF   r   rw  r|  r   r6   r   r{  s     r+   	as_cclasszPyClassDefNode.as_cclass  s     ""$--##%^_TXX(1)-(,		#'::#W1D1DTXXTV1D1W(,"&))$)!%+ 	+r-   c                     |}|j                   s|j                  r&|j                  }|j                   r|j                  r&t        | j                  |      x}| _        |S )N)rF   rp  )r  r  rp  r   rF   r  )r   rO   r  rn  s       r+   create_scopezPyClassDefNode.create_scope  sR    $$(=(=##D $$(=(=(diiTJJtzr-   c                    | j                   }| j                  rDddlm} | j                  d d d   D ]"  } ||j                  |j
                  |g      }$ d | _        || _        | j                  r| j                  j                  |       | j                  r| j                  j                  |       | j                  j                  |       | j                  j                  |       | j                  |      }|j                  |_        | j                  j                  j                  |_        | j"                  j                  |       y )Nr   )r  r   rp  )r  r|  r{  r  r*   r  r  r   r   r  r  analyse_target_declarationr  r   r  r  class_obj_cnamer   )r   rO   r  r  r  rn  s         r+   r   z#PyClassDefNode.analyse_declarations  s    }}??1!__TrT2 )	-MM&00& ))
 #DO(::JJ++C088HH))#...s3..s3  %..#{{0066		&&t,r-   c                 r   | j                   r | j                   j                  |      | _         | j                  r | j                  j                  |      | _        | j                  r | j                  j                  |      | _        | j                  j                  |      | _        | j
                  j                  |      | _        | j                  }| j                  j                  |      | _        | j                  j                  || j                         | j                  j                  |      | _        | S r   )r   r   r  r  r~   r  r  r   r  analyse_target_expressionr  r  )r   rO   rn  s      r+   r   z"PyClassDefNode.analyse_expressions  s    ::77<DJ88xx33C8DH>>!^^??DDNII11#6	 --AA#FzzII11$7	--c4==A//==dCr-   c                     | j                  | j                  |       | j                  j                  | j                  |       y r   )r  r  r   r  r/  s      r+   r  z,PyClassDefNode.generate_function_definitions  s.    ((T:		//

DAr-   c                 "   |j                  | j                         |j                  j                  |        | j                  }| j
                  r| j
                  j                  |       | j                  r| j                  j                  |       | j                  r| j                  j                  |       | j                  j                  |       | j                  j                         x|_        |_        | j                  }||j                  sd }||j                  |       | j                  j!                  |       | j"                  j                  |       |*|j%                  || j"                  j                                |"|j'                  |       |j)                  |       | j*                  j                         x|_        |_        | j,                  j/                  | j"                  |       | j                  j'                  |       | j                  j)                  |       | j                  r6| j                  j'                  |       | j                  j)                  |       | j                  r6| j                  j'                  |       | j                  j)                  |       | j
                  r6| j
                  j'                  |       | j
                  j)                  |       |j                  j1                          y r   )r&  r*   pyclass_stackr  r  r   r  r  r  r~   r   namespace_cnamer  r  	is_activer   r
  r  generate_injection_codegenerate_disposal_coder  r  r  r  pop)r   rl   rn  r  s       r+   r
  z&PyClassDefNode.generate_execution_code  s7   dhh!!$'zz::JJ//588HH--d3>>NN33D9		**406:ii6F6F6HHt3__
!**>*>J!//5		))$/2248!..d''..02!--d3!!$'6:mm6J6J6LLt3,,T->->E		((.		T">>NN11$7NN%%d+88HH++D1HH%::JJ--d3JJ!!$' r-   )NNF)rb   r   r   r   r|  r  r  r  r  r   r  r  r   r   r  r
  rt   r-   r+   r  r  Z  sP     9KJLI
C?C8=DDL+&-,B)!r-   r  c                   r    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 Zd Zd Zd	 Zedd
       Zd Zy)r  r   NFc                     t        | d      sTddlm} | j                  r;|j	                  | j
                  |g | j                  d      | _        | j                  S d | _        | j                  S )N_buffer_defaultsr   rI  F)need_complete)r  r   rJ  buffer_defaults_noderL  buffer_defaults_posr  )r   rO   rJ  s      r+   rM  zCClassDefNode.buffer_defaultsH  so    t/0 (((.(E(E,,T66"' )F ))% $$$ )-%$$$r-   c                    | j                   rI| j                  dk7  r:| j                   j                  d      }|j                  || j                        }|sy |}|j                  | j                  | j                  dd| j                   d | j                  | j                  | j                  | j                  | j                  | j                  | j                  |      | j                        | _        y )Nr  r[   r   )rF   r*   r  implementingr7  rQ   objstruct_cnametypeobj_cnamer\  r  
check_sizerl  rM  shadow)r7  r\  splitr  r*   declare_c_classr  objstruct_nametypeobj_namer  r  rl  rM  r  r  )r   rO   r  
home_scopes       r+   r  zCClassDefNode.declareT  s    8 ;**005K11+txxHJJ//(( //++** 005;; 0  
r-   c                     j                   r" j                  st         j                  d        j                  r#t         j                  d j
                  z         d  _         j                  rd  _        j                  D ]#  }|j                   j                  k(  s| _        %  j                  Rt         j                  d j                         _        d j                  _        j                   j                          j                  j                   r& j                  j                   d   }|j#                        }|t$        j&                  t$        j(                  t$        j*                  fv r)j-                  |j/                               j0                  }|%t        |j                  d j
                  z         n2|t$        j2                  k(  rd }n|j4                  s2|j6                  r|j8                  st        |j                  d|z         n|j;                         s2t        |j                  d|j                  d j
                  d	       n|j<                  rJ|j<                  j>                  r4|j@                  r(t        |j                  d|d j
                  d
       nE|j6                  r2|j                  dv r$t        |j                  d|j                  z         n| _        j>                  jC                  dd      dkD  r*|t$        j2                  k7  rtE         j                  dd        jF                  d u}|rL j                  r@ j                  j<                  s* j                  jH                  jK                   fd       y  j                  rI jL                  dk7  r: j                  jO                  d      }jQ                  | j                        }|sy } jL                  dk(  ra j                  dk(  rR j
                  tR        jT                  v r6jV                  d d dk7  r$tE         j                  d j
                  z  d       |jY                   j
                   j                  |xr  jZ                  |xr  jZ                    j                   j                   j                   j\                   j^                   jL                   j`                   jb                   je                         jf                         _4         jf                  r* jh                  |j-                   j
                        _5        |ur@ jL                  dk(  r1jm                   j
                   jh                   j                          jh                  j0                  j<                  x _        }	|	j>                  |	_         jn                  r5tp        jr                  r%tu         j                   jn                        |	_7        |rȉ jF                  jw                  |	        j<                  jy                  d      }
|
ru|
jz                  ri|	j|                  s]|	j~                  sQ j<                  j                  d      |
_A         j<                  j                  d|
jn                  |
j                          jZ                  rd|	_>        nd|	_?        t         j                  j                         dkD  r|r jZ                  r-t         j                  j                   d   j                  d        j                  j                   dd  D ]*  }|j#                        st        |j                  d       , d jh                  j0                  _D        ddlEmF} |j                   j                  |j                   j                   j
                         j                  |j                   j                  g       g       _J        n} j                  rO j                  j                  xs  j                  j                   jh                  j0                  _D        d  _J        n"d jh                  j0                  _D        d  _J        j                   jh                          jh                  j0                  jH                  D ]	  } |         y )NzTObject struct name specification required for C class defined in 'extern from' blockz:Decorators not allowed on cdef classes (used on type '%s')r   r   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  strbyteszGinheritance from PyVarObject types like '%s' is not currently supportedfreelistzIfreelists cannot be used on subtypes, only the base class can manage themc                  &    j                         S r   )r   )rO   r   s   r+   <lambda>z4CClassDefNode.analyse_declarations.<locals>.<lambda>  s    @Y@YZ]@^ r-   r  r[   __builtin__   zcpython.z %s already a builtin Cython type)rF   r*   r  r  r7  rQ   r  r  r  r\  r  rl  rM  r  r   __dict__getterz'Only declare first base in declaration.z+Only one extension type base class allowed.r  rr  r  r  )Mr9  r  r   r*   r|  r  rQ   r7  modulecimported_modulesrF   r   re  has_extern_classadd_imported_moduler   ri   rC   r   rJ   rI   rK   r  sign_and_namer9   r   r>  r  r  r  r  r   rg  r  r	   r   defered_declarationsr  r\  r  r  r   builtin_typesrX  r  r]  r  r  r  rl  rM  r  r  r  add_imported_entryr6   r   ry  r7   r   rA  is_variabledefinedimplementedmangle_internalgetter_cnamedeclare_propertyr^   
early_initr   r{  rw  IdentifierStringNoder  type_init_argsis_externalallocate_vtable_names)r   rO   r  rb  rQ   base_class_scopehas_bodyr  r  r  
dict_entry
other_baser{  thunks   ``            r+   r   z"CClassDefNode.analyse_declarationsm  s   
 ??4#6#6$((rs??$((X[_[j[jjk DK// );;$"2"22"(DK) {{")$*:*:D#++N/0,''4::??::??1%D,,S1IZ22J4J4JJLcLcddJJy'>'>'@AFF	 dhh MPTP_P_ _`j777#' 00#33	8Q8Qdhh ?) KL**,dhhNNDOO!5 6Y__%?%?,,dhht!0 1**^^'@@dhh i!!' ( "+~~!!*a014jF_F_9_"mopq99D(t~~/C/C NN//667^_8 ;**005K11+txxHJJ??h&  M1OOw'<'<<&&r*j8"Dt"VXYZ//-$++!5$++o((nn //++** 005;; 0  
  ;;=AZZJdoo.:S T__%@""4??DJJI!ZZ__222
U"~~E88**&txx:EIII**51//
;Jj44emmTYTeTe*.***D*DEU*V
'

++J

W{{ !$%!tzz!#t{{djjooa(,,.WX #jjooab1 Y
--c2*..*WXY *+DJJOO&#"+"5"544TXXT__4Ujj((2(FH #6 #ID
 ^^)-)C)C)`t~~G`G`DJJOO&"&D)*DJJOO&"&D!!$**-ZZ__99 	EG	r-   c                     | j                   r@| j                  j                  j                  }| j                   j	                  |      | _         | j
                  r| j
                  j	                  |       | S r   )r   r  r9   r  r   r  r  s      r+   r   z!CClassDefNode.analyse_expressions  sT    99JJOO))E		55e<DI33C8r-   c                     | j                   rC| j                  | j                  |       | j                   j                  | j                  |       y y r   )r   r  r  r  r/  s      r+   r  z+CClassDefNode.generate_function_definitions  s:    99,,TZZ>II33DJJE r-   c                 j   |j                  | j                         | j                  r| j                  j                  |       | j                  j
                  j                  sP| j                  r%| j                  j                  |       d| j                  j                         z  }d|z  }|j                  j                  t        j                  d      }|j                  |d| j                  j                         d       |j                  |j                  || j                               |j!                  |       |j                  d|d|d       |j                  d	       |j                  d
|d|d       |j                  |j#                  | j                               |j                  d       |j                  j%                  |       |j'                  |t        j                         |j)                  |       |j                  | j                  j
                  j*                  d|d       |j-                  |t        j                         | j                  j/                  |       | j                  j1                  |       | j3                  | j                  |d       y y )NzPyTuple_GET_ITEM(%s, 1)z(((PyTypeObject*)PyTuple_GET_ITEM(%s, 0))Tz$ = PyType_Type.tp_new(&PyType_Type, r  zif (((PyTypeObject*) z)->tp_base != r  zPPyErr_Format(PyExc_TypeError, "best base '%s' must be equal to first base '%s'",z             ((PyTypeObject*) z)->tp_base->tp_name, z->tp_name);r  z.tp_bases = r  )r&  r*   r   r
  r  r9   r  r  r  r   r  r  r   r   rf   r  r  r  r  r9  r  r  r  r  r  generate_type_ready_code)r   rl   r   
first_base
trial_types        r+   r
  z%CClassDefNode.generate_execution_code  s    	dhh99II--d3zz))""##<<TB1D4G4G4N4N4PPG%O
!^^99*:S:SUYZ


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

422:txxHI
+


, -

op

%z3 4

4??48845

3++J7z'@'@A  '

$**//2O2OQVWX%%j*2K2KL##::4@##..t4))$**dDA5 *r-   c                    | j                   }|j                  }|j                  }|sy | j                  dk7  rt        j
                  D ]  }|j                  ||        |r2|j                  j                  t        j                  dd             d}nd}|j                  d|d|d|j                  | j                               |j                  d       |j                  d	|z         |j                  d
       t	        j                  |d      }t	        j                  |d      }	|dk(  r|	dk(  r|j                  rd}
d}nd}
d}|j                  j                  t        j                  |d             |j                  d|d|d       |j                  |d|
d       |j                  d       | j                   j                  j                   D ]  }|j"                  dv }|j$                  st&        j(                  s0|j*                  s=|r@t        j,                  j/                  |j"                        }|r|j1                         nd }|r|j                  |       |j                  d       |j                  d       |j                  d|d|j"                  d|j3                  d| j                               |j                  d        |j                  d!|j*                  z         |j                  |j*                  d"|j4                  d       |j                  d#|j*                  z         |j                  d       |j                  d       |j                  d
       |s|j                  d
        |j6                  r|j                  j                  t        j                  d$d%             |j                  d&|d'|j8                  d|j                  | j                               |r_|j                  j                  t        j                  d(d%             |j                  d)|d|j                  | j                               |j                  j:                  s|j                  j<                  j/                  d*      s]|j                  d+t>        j@                  d,|jC                  |jD                        d-|d|j                  | j                               |jF                  s|jI                  d.      nd }|r~|j                   tJ        u rVd/|z  }|jL                  r|jN                  }nd0|jN                  z  }|j                  d|d1|d2|d,|jP                  d3	       ntS        |j                  d4       |jF                  s|jI                  d5      rann_|j                  j                  t        j                  d6d             |j                  d7|d|j                  | j                               |j                  r,|j                  |jT                  d8|j                  d       y y )9Nr  PyType_ReadyzExtensionTypes.c__Pyx_PyType_Readyr  z(&r  z#if PY_VERSION_HEX < 0x030800B1z%s.tp_print = 0;r  tp_getattrotp_dictoffsetr  #__Pyx_PyObject_GenericGetAttrNoDictPyObject_GenericGetAttrNoDict__Pyx_PyObject_GenericGetAttrPyObject_GenericGetAttrr{  zCif ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!z.tp_dictoffset && z+.tp_getattro == PyObject_GenericGetAttr)) {z.tp_getattro = r  r  r  r  r  z8PyObject *wrapper = PyObject_GetAttrString((PyObject *)&r  z"); wrapperz/if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {z0%s = *((PyWrapperDescrObject *)wrapper)->d_base;z.doc = z0((PyWrapperDescrObject *)wrapper)->d_base = &%s;	SetVTableImportExport.czif (__Pyx_SetVtable(z
.tp_dict, MergeVTableszif (__Pyx_MergeVtables(&internalzif (PyObject_SetAttr(r   z, (PyObject *)&__weakref__z%s.tp_weaklistoffsetz	struct %sz == 0) z = offsetof(r  z)__weakref__ slot must be of type 'object'__reduce_cython__SetupReducez#if (__Pyx_setup_reduce((PyObject*)&z = &)+r9   r  r  r\  r   
slot_tablegenerate_dynamic_init_coder  r;  r   r  rf   r  r*   get_slot_code_by_namerg  pyfunc_entriesrF   rd  r   ry  rp  r  r  r  r  rn  vtable_cnamevtabptr_cnameis_internalr   r
   r~  r  r  is_closure_class_scoperA  r   r  r  r  r   r7  )r  rl   heap_type_basesr9   r  r  r  	readyfuncgetattr_slot_funcdictoffset_slot_funcpy_cfuncutility_funcrr   rU  rm  weakref_entrytp_weaklistoffset	objstructs                     r+   r  z&CClassDefNode.generate_type_ready_code&  sE    zz**

x'!,, =//t<=  11++N<NOQ0	*	JJ!OOEII.01 JJ89JJ)M9:JJx  !* ? ?} U#,#B#B5/#Z  C',@C,G%%DH#BL>H#<L  11+2I2I,Xj2kl

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

!8- .

3
 

((77 - II)OO	OO(:(:..y$88<<TYYGDKO)E)E)GUY&)

#56JJABJJsOJJ) II 33IuyyIKL
 JJIKJJJ 2245 JJ*.*@*@$..QSJJJ 2245 JJsOJJsOJJx()

8,;-<     11++K9IJL

%**		245
 #$$55#//@PQSJJ%		2 4 5 ::))$**2G2G2K2KJ2W 

++..u/?/?@%		2	45 EJD`D`E--m<fjM %%7(>(N%(($($8$8	$/$2F2F$F	JJ))!%++	 - . -++-XY=B=Y=Yu  !45_c   11++M;MNP

+"ooeii8: ;
 JJ&&(:(:<= r-   c                     | j                   r| j                   j                  |       | j                  r| j                  j                  |       y y r   )r  r   r   r   s     r+   r   zCClassDefNode.annotate  s=    ((.99IIt$ r-   r  )rb   r   r   r   r  r  r  rl  r  r  r  r|  r  rM  r  r   r   r  r
  r+  r  r   rt   r-   r+   r  r  '  sy    , (KL
CNLJJF
% 2GRF
 BF F= F=P%r-   r  c                   0    e Zd ZdgZd Zd Zd Zd Zd Zy)PropertyNoder   c                    |j                  | j                  | j                  | j                        | _        |j
                  | j                  j                  _        | j                  j                  | j                  j                         y r   )	r  rF   r6   r*   r  r   r  r   r   r   s     r+   r   z!PropertyNode.analyse_declarations  sV    ))$))TXXtxxH
&)nn

#		&&tzz'7'78r-   c                 F    | j                   j                  |      | _         | S r   )r   r   r   s     r+   r   z PropertyNode.analyse_expressions      II11#6	r-   c                 <    | j                   j                  ||       y r   )r   r  r/  s      r+   r  z*PropertyNode.generate_function_definitions      		//T:r-   c                      y r   rt   r   s     r+   r
  z$PropertyNode.generate_execution_code  r   r-   c                 :    | j                   j                  |       y r   rD  r   s     r+   r   zPropertyNode.annotate  rE  r-   N)	rb   r   r   r   r   r   r  r
  r   rt   r-   r+   r  r    s$     (K9
;!r-   r  c                   "    e Zd Zg Zd Zd Zd Zy)
GlobalNodec                 ^    | j                   D ]  }|j                  || j                           y r   )namesdeclare_globalr*   r   rO   rF   s      r+   r   zGlobalNode.analyse_declarations  s)    JJ 	/DtTXX.	/r-   c                     | S r   rt   r   s     r+   r   zGlobalNode.analyse_expressions  rA  r-   c                      y r   rt   r   s     r+   r
  z"GlobalNode.generate_execution_code  r   r-   Nr  rt   r-   r+   r   r     s    
 K/r-   r   c                   "    e Zd Zg Zd Zd Zd Zy)NonlocalNodec                 ^    | j                   D ]  }|j                  || j                           y r   )r"  declare_nonlocalr*   r$  s      r+   r   z!NonlocalNode.analyse_declarations  s)    JJ 	1D  txx0	1r-   c                     | S r   rt   r   s     r+   r   z NonlocalNode.analyse_expressions  rA  r-   c                      y r   rt   r   s     r+   r
  z$NonlocalNode.generate_execution_code  r   r-   Nr  rt   r-   r+   r(  r(    s    
 K1r-   r(  c                   :    e Zd ZdgZd Zd Zd ZdZd Zd Z	d Z
y	)
rv  rq  c                    ddl m} | j                  }t        ||j                        r|j
                  j                         }|dk(  r|j                         \  }}t        |      rt        |j                  d       |j                  D ]X  \  }}|j                  |      }	|	t        |j                  d       0|j                  |j                  |	|j                  d       Z t        | _        y y t#        |dd       N|j$                  r|j'                  |       t        | _        y |j(                  s|j*                  rt        | _        y y y )	Nr   r  r  z!Variable names must be specified.Unknown typeT)rn  rN   )r   r{  rq  r_   GeneralCallNoder  as_cython_attributeexplicit_args_kwdsr^   r   r*   r@   rC   r  rB   PassStatNodera   r   rD   declare_from_annotationis_attributeis_subscript)
r   rO   r{  rq  rr   ri   rj   varr  r9   s
             r+   r   z!ExprStatNode.analyse_declarations  s   yydI556==446Dz!!446
dt9$(($GH&*&:&: PNC$44S9D|imm^<		4$OP ". " T<.:||,,S1!-""d&7&7!- '8 ;r-   c                     d| j                   _        | j                   j                  |      | _         d| j                   _        | S r  )rq  result_is_usedr   r   s     r+   r   z ExprStatNode.analyse_expressions  s5    #(		 II11#6	#(		 r-   c                     | j                   j                  j                  r(| j                   j                  r| j	                          y y y r   )rq  r9   rG   is_tempr   r   s     r+   r   zExprStatNode.nogil_check  s1    99>>%%$))*;*;NN +<%r-   zDiscarding owned Python objectc                    |j                  | j                         d| j                  _        | j                  j	                  |       | j                  j
                  sm| j                  j                         rS| j                  j                         }| j                  j                  j                  sd|z  }|j                  d|z         | j                  j                  |       | j                  j                  |       y )NFz
(void)(%s)z%s;)r&  r*   rq  r9  r  r;  r   r9   rV  rf   r  r  )r   rl   r   s      r+   r
  z$ExprStatNode.generate_execution_code$  s    dhh#(		 		**40yy  TYY%5%5%7YY%%'F99>>))%.JJuv~&		((.		T"r-   c                 <    | j                   j                  ||       y r   )rq  r  r/  s      r+   r  z*ExprStatNode.generate_function_definitions0  r  r-   c                 :    | j                   j                  |       y r   )rq  r   r   s     r+   r   zExprStatNode.annotate3  rE  r-   N)rb   r   r   r   r   r   r   r   r
  r  r   rt   r-   r+   rv  rv    s0    
 (K.2 3K
#;!r-   rv  c                       e Zd Zd Zd Zy)AssignmentNodec                    | j                  |      }t        |t              r`t        |t              sP|j                  j
                  j                  r0|j                  j                         rt        | j                  d       |S )Nz9Storing unsafe C derivative of temporary Python reference)
r   r_   r@  ParallelAssignmentNoderhsr9   rS  is_ephemeralr   r*   )r   rO   rk   s      r+   r   z"AssignmentNode.analyse_expressions@  sZ    !!#&dN+JtE[4\xx}}##(=(=(?dhh [\r-   c                 ~    |j                  | j                         | j                  |       | j                  |       y r   )r&  r*   generate_rhs_evaluation_coder  r   s     r+   r
  z&AssignmentNode.generate_execution_codeK  s.    dhh))$/%%d+r-   N)rb   r   r   r   r
  rt   r-   r+   r@  r@  7  s    ,r-   r@  c                   `    e Zd Zddg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y)SingleAssignmentNodery  rC  Fc                    ddl m} t        | j                  |j                        r
| j                  j
                  j                         }|r| j                  j                         \  }}|dv rt        |      dkD  rt        |d   j                  d       y |7|j                  d       }|dk(  sd|vrt        |j                  d       y |d   }nd	}|d
   j                  |      }|t        |d
   j                  d       y | j                  }	|dk(  rt        |	|j                        r|	j                  |	j                  fg}
n]t        |	|j                         r0|	j"                  D cg c]  }|j                  |j                  f }
}nt        |	j                  d       y |
D ]  \  }}|j%                  |||d|        t        |      dk(  r|d   | _        nVd| _        nMd| _        t        |	|j                        st        |	j                  d       |j)                  |	j                  || j                  d	       n|dv rkd| _        t        |      d
kD  s|!t        | j                  j                  d       y g }|j*                  D ]W  \  }}|j                  |      }|t        |j                  d       0|j-                  |j.                  ||j                  f       Y t        |      t        |j*                        k  ry t        | j                  |j                        s t        | j                  j                  d       | j                  j                  }t1        |      }|j3                  |||d| j                  j                         |D ]  \  }}}|j%                  |||        n|dk(  rzd| _        |r*t        | j                  j
                  j                  d       t5        | j                  j                  | j                  j                  |      }|j7                  |       | j&                  ry | j                  j9                  |       y c c}w )Nr   r  )r  typedefr#   zInvalid positional argument.rJ  r\  zInvalid keyword argument.r  r   r/  r  zInvalid declarationT)rn  r\  zInvalid declaration.)r\  )r  unionz.Struct or union members must be given by name.F
fused_typez*fused_type does not take keyword arguments)rF   r|   )r   r{  r_   rC  CallNoder  r1  r2  r^   r   r*   compile_time_valuerC   ry  r  rF   rw  ri   r  declaration_onlyra  r@   r  rB   r   r  r_  r   r  )r   rO   r{  	func_nameri   rj   kwdictr\  r9   ry  varsr7  r*   membersmemberr  rF   r  	fusednodes                      r+   r   z)SingleAssignmentNode.analyse_declarationsb  s    dhh	 2 23))==?I!XX88:
d 664y1}d1gkk+IJ'!%!8!8!>$	1\5O!$((,GH"%+L%9
%.
72237D|d1gkk>:((C I-%c9+=+=>%(XXsww$7#8D'Y-@-@ACF88#LCSXXsww$7#LD#L!#''+@A"(, aHCOOCsDU_O`at9>'+AwDH48D104-)#y/A/AB!#''+AB++CHHdDHHQZ+["55,0D)4y1}dhhll,\] G-1-A-A M)	(88=<!)--@#NNFLL$

+KLM 7|c$*>*>&??%dhh	0B0BCdhhll,BC88==D.t4E//itxx||\-4 =)c))&$<= ,.,0D)dhh//33JL !.dhhll3788==!NI2237  HH//4k $Ms   )Qc                    ddl m} | j                  j                  |      | _        | j	                  |      }|r|S | j
                  j                  |      | _        | j
                  j                  |       | j                  |      }|r|S t        | j
                  |j                        rP| j
                  j                  | j                         | j
                  j                  | j                        | _        n| j
                  j                  j                  rxt        | j
                  |j                        sX|j                  | j
                  j                   | j
                  d d       | _        | j
                  j                  |      | _        | j
                  j                  j"                  r|j%                  | j                   d| j
                  j                  | j                  j                  g      }|r| j                  }d| _        |j                  j(                  | _        |j                  j*                  | _        | j(                  dk(  r| j*                  |j-                  t/        j0                  dd             na| j                  j3                  | j
                  j                  |      }n0| j                  j3                  | j
                  j                  |      }|s:|j4                  s.|j6                  s4|j8                  s(|j                  j:                  r|j=                  |      }n'|j                  j:                  r|j?                  |      }|| _        | S )	Nr   r  )rb  ro   stop=Tr  CppExceptionConversionzCppSupport.cpp) r   r{  rC  r   
unroll_rhsry  r   gil_assignment_check
unroll_lhsr_   MemoryViewIndexNodeanalyse_broadcast_operation$analyse_as_memview_scalar_assignmentr9   rT  SliceIndexNoder*   rx  lookup_operator_for_typesis_overloaded_assignmentr  r  r;  r   r  r  r5  rD   r   rG   coerce_to_tempcoerce_to_simple)r   rO   use_tempr{  unrolled_assignmentoprC  s          r+   r   z"SingleAssignmentNode.analyse_types  sa   88))#."ooc2&&88005%%c*"ooc2&&dhh	 = =>HH00:xxDDTXXNDHXX]]##dhh	(@(@A$33DHHLLtxxW[bf3g8888=88==%%..txxtxx}}dhhmm>\]Bhh04-')ww'>'>$')ww'>'>$''3.43G3G3O(()@)@AY[k)lmhh((<(($$TXX]]C8Cs''KK$$$$S)CXX!!&&s+Cr-   c           
      
   ddl m}m} |}d x}x}x}	}
|j                  j                  r|j                  j
                  }n`|j                  j                  s|j                  j                  r2t        ||j                        rU|j                  sI|j                  s=|j                  x}}t        ||j                        r|j                  s|j                  s=t        ||j                        rr|j                  }|j                  }|r |j                  t        j                  |      }|j                  }|r!|j                  t        j                  |      }n|j                  j                  r|j                  j
                  r|j!                  | j"                  t%        |j                  j
                        t        |j                  j
                  t&              r|j                  j
                  n|j(                        }nt+        | j"                  d       y d }	|	r |	j                  t        j                  |      }	d }	  ||d        ||d      z
   ||	d      z  }n?|j                  j                  r'|j                  j
                  }t        |t&              sy y y ||k7  rt+        | j"                  d|d	|       y g }|j/                  |      }|g}|r.|j0                  s"|j/                  |      }|j3                  |       |r.|j0                  s"|j/                  |      }|j3                  |       |	r.|	j0                  s"|j/                  |	      }	|j3                  |	       t5        |      D ]i  }|j!                  | j"                  t%        |      |t        j                  
      }|	p|	j7                         rA|j8                  |	j8                  z  }|j!                  | j"                  t%        |      |      }n|j;                  | j"                  d|	|      }||j7                         rQ|j7                         rA|j8                  |j8                  z   }|j!                  | j"                  t%        |      |      }n|j=                  | j"                  d||      }|j3                  |j?                  | j"                  ||jA                  |                   l |
||fS # t,        $ r t+        | j"                  d       Y y w xY w)Nr   )r{  	UtilNodes)rB   r?  z*C array iteration requires known end indexc                 X    | |S | j                         r| j                  S t        d      )NzNot a constant.)has_constant_resultr?  r  )rk   
none_values     r+   	get_constz.SingleAssignmentNode.unroll.<locals>.get_const  s1    |))113#333():;;r-   r   z5C array assignment currently requires known endpointsz3Assignment to/from slice of wrong length, expected z, got )rB   r?  r9   r  )operatoroperand1operand2r  )rb  r|  )!r   r{  ri  r9   	is_ctupler  rS  rT  r_   r`  ro   rW  rb  r  r   r  IntNoder*   r  r   constant_value_not_setr   r  
LetRefNoder   r  r	  rk  r?  MulNodeAddNode	IndexNoder   )r   rk   target_sizerO   r{  ri  rb  
start_node	stop_node	step_node
check_node
slice_sizerm  r   refsr  ix_node
step_valueindex_values                      r+   unrollzSingleAssignmentNode.unroll  s5   *:>>
>Y>Z99JYY!3!3T9#;#;<djjTXT]T]"ii't T9#;#;<djjTXT]T]$	 8 89yy!ZZ
!+!5!5j6R6RTW!XJ II	 ) 3 3J4P4PRU VIyy))diinn$-$5$5 HHC		,??I$))..Zg?hTYY^^2;2R2R %6 %U	
 dhh(TU 	 ) 3 3J4P4PRU VI<"+It"<yUV?W"W[denpq[r!rJ
 ##!YY^^
!*m< $$((K) *##D)vj33"--j9JKK
#Y11!,,Y7IKK	"Y11!,,Y7IKK	"$ 	eB''BQSZdZvZv'wG$002!(!8!89;T;T!TJ'//Jak/lG'//3QZel/mG%1138S8S8U")"9"9J<V<V"VK'//K@Pbm/nG'//3g 0 WGLL,,TXXDH]H]^aHb,cd	e  4&&a " $(($[\s   S& &TTc           	      b   ddl m} g }t        ||      D ]7  \  }}	|j                  t	        | j
                  ||	| j                               9 t        | j
                  |      j                  |      }
|rt        | j
                  ||
g      }
|d d d   D ]  }|j                  ||
      }
 |
S )Nr   )ri  )ry  rC  first)r*   r  r   )r   ri  r  r  rH  r*   r  rB  r   r  LetNode)r   r~  r|  lhs_listrhs_listrO   ri  assignmentsry  rC  rk   r  s               r+   unroll_assignmentsz'SingleAssignmentNode.unroll_assignmentsD  s    Hh/ 	cHC3DHH#3VZV`V`ab	c%$((+FZZ[^_DHHZ4FGD": 	0C$$S$/D	0r-   c                 v   ddl m} t        | j                  |j                        sy t        d | j                  j                  D              ry | j                  | j                  t        | j                  j                        |      }|sy |\  }}}| j                  ||| j                  j                  ||      S )Nr   r  c              3   4   K   | ]  }|j                     y wr   )
is_starred)r7  r  s     r+   r8  z2SingleAssignmentNode.unroll_rhs.<locals>.<genexpr>T  s     7#s~~7s   )r   r{  r_   ry  rw  anyri   r  rC  r^   r  )r   rO   r{  unrolledr|  r~  rC  s          r+   rZ  zSingleAssignmentNode.unroll_rhsP  s    $((I$7$78777;;txxTXX]]);SA (
D#&&tZSQQr-   c                 j   | j                   j                  j                  ry ddlm} t        | j                  |j                        sy | j                  | j                   t        | j                  j                        |      }|sy |\  }}}| j                  |||| j                  j                  |      S Nr   r  )ry  r9   rq  r   r{  r_   rC  rw  r  r^   ri   r  )r   rO   r{  r  r|  r~  ry  s          r+   r\  zSingleAssignmentNode.unroll_lhs]  s    88==""$((I$7$78;;txxTXX]]);SA (
D#&&tZdhhmmSQQr-   c                 :    | j                   j                  |       y r   rC  r  r   s     r+   rF  z1SingleAssignmentNode.generate_rhs_evaluation_codek      ))$/r-   c                     | j                   rI| j                  j                  | j                  || j                   | j                  | j
                         y | j                  j                  | j                  |       y )N)r  r  r  )rb  ry  r  rC  r  r  )r   rl   r  s      r+   r  z-SingleAssignmentNode.generate_assignment_coden  sa    ((HH--&*&C&C $ 4 4 $ 4 4 . 6 HH--dhh=r-   c                 <    | j                   j                  ||       y r   rC  r  r/  s      r+   r  z2SingleAssignmentNode.generate_function_definitionsy      ..sD9r-   c                 p    | j                   j                  |       | j                  j                  |       y r   ry  r   rC  r   s     r+   r   zSingleAssignmentNode.annotate|  &    $$r-   Nr  r  )rb   r   r   r   r  rb  rO  r   r   r  r  rZ  r\  rF  r  r  r   rt   r-   r+   rH  rH  Q  sW     %.KE$R5h.`\'|
RR0	>: r-   rH  c                   H    e Zd Zg dZdZdZdZd Zd	dZd Z	d
dZ
d Zd Zy)CascadedAssignmentNode)r  rC  coerced_valuescloned_valuesNc                 H    | j                   D ]  }|j                  |        y r   )r  r  )r   rO   ry  s      r+   r   z+CascadedAssignmentNode.analyse_declarations  s#    == 	0C**3/	0r-   c                    ddl m}m} t               }t	        | j
                        D ]Q  \  }}|j                  |      x}| j
                  |<   |j                  |       |j                  |j                         S | j                  j                  |      }t        |      dk(  rt        t        |            j                  rA|j!                  d| j                  g      }	|	sA|j#                  |j%                         |      }n |j#                  |j%                         |      }|j&                  sB|j(                  s6|s"|j*                  s|j                  j,                  r|j/                  |      }n|j1                  |      }|j2                  r ||      n|| _
        g | _        i }
g | _        | j
                  D ]  }|j                  j                  xr |j!                  d|| j                  g      }| j6                  j9                  |       |j                  |
vsc|j                  |j                  k7  s} || j                        }|s|j#                  |j                  |      }| j4                  j9                  |       ||
|j                  <    g | _        | j
                  D ]I  }|
j=                  |j                  | j                        }| j:                  j9                   ||             K | S )Nr   )	CloneNoder  rX  )r{  r  r  r   r  r  r   r[  r   r9   rC  r   r^   nextiterrx  lookup_operatorr  r  rD   r   r5  rG   rc  rd  r;  r  assignment_overloadsr  r  r  )r   rO   re  r  r  	lhs_typesr  ry  rC  rg  r  
overloadeds               r+   r   z$CascadedAssignmentNode.analyse_types  s\   3 E	. 	$FAs%(%=%=c%BBC$--"$$S)MM#((#	$
 hh$$S)y>QDO$11((sDHHo>--	=CmmIMMOS9{{3>>C,,0D0D$$S)C&&s+C%([[9S>c !$&!== 	/C..\33F3FsSRVRZRZO3\J%%,,Z8xx~-#((chh2F)!--#6C##**3/+.sxx(	/  == 	6C $$SXXtxx8C%%in5	6 r-   c                 :    | j                   j                  |       y r   r  r   s     r+   rF  z3CascadedAssignmentNode.generate_rhs_evaluation_code  r  r-   c                    | j                   D ]  }|j                  |        t        | j                  | j                  | j
                        D ]+  \  }}}|j                  |       |j                  |||       - | j                   D ]$  }|j                  |       |j                  |       & | j                  j                  |       | j                  j                  |       y )N)r  )
r  r  r  r  r  r  r  r  r  rC  )r   rl   r  rC  ry  overload	rhs_values          r+   r  z/CascadedAssignmentNode.generate_assignment_code  s    && 	/C((.	/ #&dmmT5G5GIbIb"c 	TCh((.((d((S	T ,, 	'I,,T2  &	' 	''-D!r-   c                 <    | j                   j                  ||       y r   r  r/  s      r+   r  z4CascadedAssignmentNode.generate_function_definitions  r  r-   c                    | j                   D ]  }|j                  |        t        | j                  | j                        D ]'  \  }}|j                  |       |j                  |       ) | j
                  j                  |       y r   )r  r   r  r  r  rC  )r   rl   rC  ry  s       r+   r   zCascadedAssignmentNode.annotate  ss    && 	CLL	DMM4+=+=> 	HCLLLL	 	$r-   r  r  )rb   r   r   r   r  r  r  r   r   rF  r  r  r   rt   r-   r+   r  r    s9     IKMN0/b0": r-   r  c                   0    e Zd ZdgZd Zd Zd Zd Zd Zy)rB  r  c                 H    | j                   D ]  }|j                  |        y r   r  r  s      r+   r   z+ParallelAssignmentNode.analyse_declarations  s#    JJ 	+D%%c*	+r-   c                 p    | j                   D cg c]  }|j                  |d       c}| _         | S c c}w )Nr   )re  )r  r   r  s      r+   r   z*ParallelAssignmentNode.analyse_expressions  s:    "&**. ((q(9 .
.s   3c                     |j                  | j                         | j                  D ]  }|j                  |        | j                  D ]  }|j	                  |        y r   )r&  r*   r  rF  r  r'  s      r+   r
  z.ParallelAssignmentNode.generate_execution_code  sT    dhhJJ 	4D--d3	4JJ 	0D))$/	0r-   c                 J    | j                   D ]  }|j                  ||        y r   r#  r$  s       r+   r  z4ParallelAssignmentNode.generate_function_definitions  s%    JJ 	:D..sD9	:r-   c                 H    | j                   D ]  }|j                  |        y r   r)  r'  s      r+   r   zParallelAssignmentNode.annotate  r*  r-   N	rb   r   r   r   r   r   r
  r  r   rt   r-   r+   rB  rB    s$     )K+0: r-   rB  c                   2    e Zd ZddgZd Zd Zd Zd Zd Zy)	InPlaceAssignmentNodery  rC  c                 :    | j                   j                  |       y r   ry  r  r   s     r+   r   z*InPlaceAssignmentNode.analyse_declarations*      ++C0r-   c                    | j                   j                  |      | _         | j                  j                  |      | _        | j                  j                  s| j                  j
                  r7| j                   j                  | j                  j                  |      | _         | S | j                  j                  j                  r=| j                  dv r/| j                   j                  t        j                  |      | _         | S )Nz+-)rC  r   ry  r   is_memview_indexis_buffer_accessr  r9   	is_stringrn  r   r  r   s     r+   r   z#InPlaceAssignmentNode.analyse_types-  s    88))#.88005 88$$(A(Axx))$((--=DH  XX]]$$$)>xx))**F*FLDHr-   c                    |j                  | j                         | j                  | j                  }}|j	                  |       |j                  |       | j                  }|dk(  rd}n|dk(  rt        | j                  d       |j                  s|j                  r|j                  j                  rt        | j                  d       |dv rE|j                  j                  r/|j                  j                  d   st        | j                  d       |j                  |||       nY|j                   rt        | j                  d	       n6|j#                  |j%                         d
|d|j%                         d       |j'                  |       |j)                  |       |j+                  |       |j-                  |       y )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 slicesrZ   z= r  )r&  r*   ry  rC  r   generate_subexpr_evaluation_codern  r   r  r  r9   rG   r  r  r   generate_buffer_setitem_codeis_memview_slicerf   r   generate_subexpr_disposal_codefree_subexpr_tempsr  r  )r   rl   ry  rC  c_ops        r+   r
  z-InPlaceAssignmentNode.generate_execution_code9  sM   dhh88TXXS$$T*,,T2}}4<DT\$((9:3#7#7xx##dhh cdz!chhood>N>N>Y>YZe>fdhh ]^,,S$=!!$((RS JJszz|T3::<HI**40t$""4(tr-   c                 p    | j                   j                  |       | j                  j                  |       y r   r  r   s     r+   r   zInPlaceAssignmentNode.annotateT  r  r-   c                     ddl m} |j                  | j                  | j                  | j
                  | j                        S r  )r   r{  
binop_noder*   rn  ry  rC  r  s     r+   create_binop_nodez'InPlaceAssignmentNode.create_binop_nodeX  s,    ##DHHdmmTXXtxxPPr-   N)	rb   r   r   r   r   r   r
  r   r  rt   r-   r+   r  r    s'    $ %.K1
6 Qr-   r  c                   H    e Zd ZddgZd Zej                  ZdZd Z	d Z
d Zy)	PrintStatNode	arg_tuplerd   c                    | j                   r1| j                   j                  |      }|j                  |      | _         | j                  j                  |      }|j                  |      | _        |j	                  t
               t        | j                  j                        dk(  r!| j                  r|j	                  t               | S r  )
rd   r   coerce_to_pyobjectr  r;  printing_utility_coder^   ri   append_newlineprinting_one_utility_code)r   rO   rd   r  s       r+   r   z!PrintStatNode.analyse_expressionsf  s    ;;[[44S9F 33C8DKNN66s;	"55c:23t~~""#q(T-@-@  !:;r-   zPython print statementc           
         |j                  | j                         | j                  r6| j                  j                  |       | j                  j	                         }nd}t        | j                  j                        dk(  r| j                  r| j                  j                  d   }|j                  |       |j                  d|d|j	                         d|j                  | j                               |j                  |       |j                  |       n| j                  j                  |       |j                  d|| j                  j	                         | j                  |j                  | j                        fz         | j                  j                  |       | j                  j                  |       | j                  r7| j                  j                  |       | j                  j                  |       y y )Nr  r   r   zif (__Pyx_PrintOne(r   r  z#if (__Pyx_Print(%s, %s, %d) < 0) %s)r&  r*   rd   r  	py_resultr^   r  ri   r  rf   r  r  r  )r   rl   stream_resultr  s       r+   r
  z%PrintStatNode.generate_execution_codet  sy   dhh;;KK006 KK113MMt~~""#q(T-@-@..%%a(C((.JJ!MMOOODHH-/0
 &&t,NN4 NN33D9JJ5!NN,,.''OODHH-	9/ /0 NN11$7NN%%d+;;KK..t4KK""4( r-   c                     | j                   r| j                   j                  ||       | j                  j                  ||       y r   )rd   r  r  r/  s      r+   r  z+PrintStatNode.generate_function_definitions  s1    ;;KK55c4@44S$?r-   c                     | j                   r| j                   j                  |       | j                  j                  |       y r   )rd   r   r  r   s     r+   r   zPrintStatNode.annotate  s-    ;;KK  &%r-   Nrb   r   r   r   r   r   r   r   r   r
  r  r   rt   r-   r+   r  r  ]  s4     )K	 ..K*K)B@
&r-   r  c                   @    e Zd ZdgZd Zej                  ZdZd Z	d Z
y)ExecStatNoderi   c                     t        | j                        D ]6  \  }}|j                  |      }|j                  |      }|| j                  |<   8 |j	                  t
        j                         | S r   )r  ri   r   r  r;  r   pyexec_utility_coder   rO   r  r  s       r+   r   z ExecStatNode.analyse_expressions  sf    		* 	FAs))#.C((-CDIIaL	 	W889r-   zPython exec statementc           	         |j                  | j                         g }| j                  D ]2  }|j                  |       |j	                  |j                                4 t        |ddgd dt        |      z
   z         }|j                  j                  t        j                  d      }|j                  d|f|z   z         | j                  D ]$  }|j                  |       |j                  |       & |j                  |j                  || j                               |j!                  |       |j#                  |t               |j                  j%                  |       y )Nr  r%   Tr  z%s = __Pyx_PyExec3(%s, %s, %s);)r&  r*   ri   r  r  r  r  r^   r  r  r   r   rf   r  r  r  r  r  r  )r   rl   ri   r  temp_results        r+   r
  z$ExecStatNode.generate_execution_code  s$   dhh99 	)C((.KK(	) TS#J|#d)445nn22:3L3LY]2^

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

##K:	<$k>:##K0r-   c                 H    | j                   D ]  }|j                  |        y r   ri   r   r  s      r+   r   zExecStatNode.annotate  !    99 	CLL	r-   N)rb   r   r   r   r   r   r   r   r   r
  r   rt   r-   r+   r  r    s*    
 (K ..K)K1$r-   r  c                   8    e Zd ZdgZdZd Zd Zd ZdZd Z	d Z
y	)
DelStatNoderi   Fc                 H    | j                   D ]  }|j                  |        y r   )ri   r  r  s      r+   r   z DelStatNode.analyse_declarations  s#    99 	0C**3/	0r-   c                    t        | j                        D ]Z  \  }}|j                  |d       x}| j                  |<   |j                  j                  s"|j
                  rQ|j                  j                  r;|j
                  sm|j                  j                  st        |j                  d       |j                  j                  r2|j                  j                  j                  r| j                  |       |j                  j                  rt        |j                  d       |j                  r(|j                   j                  t"        j$                  u rEt        |j                  d       ] | S )NzDeletion of global C variablezDeletion of non-heap C++ objectz&Deletion of non-Python, non-C++ object)r  ri   r  r9   rG   rD   rs  r  
is_cglobalr   r*   rS  rQ   rx  r   r6  rb  r   bytearray_typer  s       r+   r   zDelStatNode.analyse_expressions  s    		* 	IFAs!$!>!>sD!IIC$))A,xx##8S8S;;399#7#7#''#BCSXX%7%7%D%Ds#&&cgg@A!!chhmmw7M7M&McggGH	I r-   c                 t    | j                   D ])  }|j                  j                  s| j                          + y r   )ri   r9   rG   r   r  s      r+   r   zDelStatNode.nogil_check  s,    99 	!Cxx## 	!r-   zDeleting Python objectc                 r   |j                  | j                         | j                  D ]  }|j                  j                  sH|j                  j
                  s2|j                  rD|j                  j                  t        j                  u r|j                  || j                         |j                  j                  s|j                  j                  j                  s|j                  |       |j!                  d|j#                         z         |j%                  |       |j'                  |        y )N)ignore_nonexistingz
delete %s;)r&  r*   ri   r9   rG   rs  r6  rb  r   r  generate_deletion_coder  rS  rQ   rx  r  rf   r   r  r  r  s      r+   r
  z#DelStatNode.generate_execution_code  s    dhh99 
	%C$$HH//$$':P:P)P**T-D-D + FSXX%7%7%D%D,,T2

<#**,67**40t$
	%r-   c                 H    | j                   D ]  }|j                  |        y r   r  r  s      r+   r   zDelStatNode.annotate  r  r-   N)rb   r   r   r   r  r   r   r   r   r
  r   rt   r-   r+   r  r    s1    
 (K0"!
 +K%r-   r  c                       e Zd Zg Zd Zd Zy)r3  c                     | S r   rt   r   s     r+   r   z PassStatNode.analyse_expressions  rA  r-   c                      y r   rt   r   s     r+   r
  z$PassStatNode.generate_execution_code	  r   r-   N)rb   r   r   r   r   r
  rt   r-   r+   r3  r3    s     Kr-   r3  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                 J    t         t        |   |d   j                  |       y )Nr   r  )r   r  r   r*   )r   r  ra   s     r+   r   zIndirectionNode.__init__  s    ot-eAhll%-Hr-   )rb   r   r   r   r   r   r   s   @r+   r  r    s    
I Ir-   r  c                        e Zd Zg ZdZd Zd Zy)BreakStatNodeTc                     | S r   rt   r   s     r+   r   z!BreakStatNode.analyse_expressions  rA  r-   c                     |j                  | j                         |j                  st        | j                  d       y |j	                  |j                         y )Nzbreak statement not inside loop)r&  r*   break_labelr   rM  r   s     r+   r
  z%BreakStatNode.generate_execution_code  s<    dhh$((=>MM$**+r-   Nrb   r   r   r   r   r   r
  rt   r-   r+   r  r    s    KM,r-   r  c                        e Zd Zg ZdZd Zd Zy)ContinueStatNodeTc                     | S r   rt   r   s     r+   r   z$ContinueStatNode.analyse_expressions,  rA  r-   c                     |j                   st        | j                  d       y |j                  | j                         |j	                  |j                          y )Nz"continue statement not inside loop)continue_labelr   r*   r&  rM  r   s     r+   r
  z(ContinueStatNode.generate_execution_code/  s?    ""$((@Adhhd))*r-   Nr  rt   r-   r+   r  r  '  s    KM+r-   r  c                   J    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y)r  rB   TFc                 >   |j                   }|| _         |st        | j                  d       | S | j                  r| j                  rt        | j                  d       | j                  j                  |      | _        |j                  s|j                  r"t        | j                  j                  d       | S | j                  j                  |j                   |      | _        | S |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 functionzReturn value required)
r  r   r*   rB   in_async_genr   rV  ru  r  rG   )r   rO   r  s      r+   r   z"ReturnStatNode.analyse_expressionsG  s    oo&$((?@K::  dhh FG11#6DJ""k&?&?djjnn&JK  "ZZ11#//3G
 	  '''33'55dhh 78r-   c                 R    | j                   j                  r| j                          y y r   )r  rG   r   r   s     r+   r   zReturnStatNode.nogil_check\  s     ''NN (r-   zReturning Python objectc                    |j                  | j                         | j                  sy | j                  }| j                  j                  r:|j                  t        j                  | j                         |r|j                  rd }|rt|j                  |       | j                  j                  r[ddlm} |j                  t        j                  | j                  |j                  ||| j                         |j                  |       n| j                   rt|j"                  j%                  t'        j(                  dd             |j+                  t        j                  d|j-                         d       |j/                  |       n`|j1                  |       |j+                  t        j                  d|j3                  | j                        d	       |j                  |       |j5                  |       n| j                  j                  r| j                   ro| j6                  r@|j"                  j%                  t'        j(                  d
d             |j9                  d       |j+                  dt        j                  z         ng|j;                  t        j                  | j                         n<| j                  j<                  r&| j?                  || j                  j@                         |jB                  jE                         D ]  \  }}|jG                  ||        |jI                  |jJ                         y )Nr   r.  )	lhs_cnamelhs_typelhs_posrC  rl   r  ReturnWithStopIterationr<  z' = NULL; __Pyx_ReturnWithStopIteration(r  r  r  rY  z/PyErr_SetNone(__Pyx_PyExc_StopAsyncIteration); 
%s = NULL;)&r&  r*   r  rB   rG   rQ  r
   r$  r   r  rs  r   r/  put_acquire_memoryviewslicer   r  in_generatorr  r;  r   r  rf   r  r  r  r   r  r  r  rJ  ru  
put_returnr  r  temps_holding_referencer  rM  rN  )r   rl   rB   r/  r  r9   s         r+   r
  z&ReturnStatNode.generate_execution_codeb  s}   dhh

''V00$2B2BC**4022(66$11!--!II!22 7 4 33D9""  11++,E}UW

''OO%' ( ,,T2**40

''OOD$4$457 8 33D9T"++$$((((99'334H-XZ!RSJJ|f.A.AAB,,V-@-@$BRBRS!!//d&6&6&D&DE>>AAC 	/KE4!!%.	/ 	d''(r-   c                     | j                   r|j                  d       |j                  t        j                  d|d       y )Nz%#pragma omp critical(__pyx_returning)r  r  )in_parallelputln_openmprf   r
   r$  )r   rl   rB   s      r+   r  zReturnStatNode.put_return  s1    EF

!4!4e<=r-   c                 V    | j                   | j                   j                  ||       y y r   )rB   r  r/  s      r+   r  z,ReturnStatNode.generate_function_definitions  s%    ::!JJ44S$? "r-   c                 T    | j                   r| j                   j                  |       y y r   )rB   r   r   s     r+   r   zReturnStatNode.annotate  s     ::JJ% r-   N)rb   r   r   r   r   r  r  r  r   r   r   r
  r  r  r   rt   r-   r+   r  r  7  sH     )KMLL K* ,K8)t>
@&r-   r  c                   L    e Zd Zg dZdZd Zej                  ZdZ	d Z
d Zd Zy)	RaiseStatNode)exc_type	exc_valueexc_tbcauseTc                    | j                   r1| j                   j                  |      }|j                  |      | _         | j                  r1| j                  j                  |      }|j                  |      | _        | j                  r1| j                  j                  |      }|j                  |      | _        | j
                  r1| j
                  j                  |      }|j                  |      | _        d | _        | j                   r| j                  s| j                  s| j                   }ddlm} t        ||j                        r:|j                  s.|j                  |j                  j                  s|j                  }|j                  r=|j                  j                   r'|j"                  | _        | j                  dk(  rd | _         | S )Nr   r  MemoryError)r  r   r  r  r  r  builtin_exc_namer   r{  r_   r  ri   r  r  rD   r  
is_builtinrF   )r   rO   r  r  r  r  excr{  s           r+   r   z!RaiseStatNode.analyse_expressions  sK   ==}}2237H$77<DM>>44S9I&99#>DN;;[[..s3F 33C8DK::JJ,,S1E11#6DJ $==--C#3	 8 89cmm&?CMMDVDVll{{syy33(+%((M9$(DMr-   Raising exceptionc                    |j                  | j                         | j                  dk(  r.|j                  d|j	                  | j                        z         y | j
                  r{| j
                  j                  |       | j
                  j                         }| j
                  j                  r2|j                  j                  | j
                  j                         nd}| j                  r6| j                  j                  |       | j                  j                         }nd}| j                  r6| j                  j                  |       | j                  j                         }nd}| j                  r6| j                  j                  |       | j                  j                         }nd}|j                  j                  t                |j                  d|d|d|d|d	       | j
                  | j                  | j                  | j                  fD ]'  }|s|j#                  |       |j%                  |       ) |j                  |j	                  | j                               y )Nr  zPyErr_NoMemory(); %sr  z__Pyx_Raise(r   r  )r&  r*   r  rf   r  r  r  r  rD   r  use_entry_utility_coder  r  r  r  r;  raise_utility_coder  r  )r   rl   	type_code
value_codetb_code
cause_coder  s          r+   r
  z%RaiseStatNode.generate_execution_code  s   dhh  M1JJ-0IIJ==MM2248//1I}}$$  778K8KLI>>NN33D9113JJ;;KK006kk++-GG::JJ//5--/JJ))*<=

		 MM4>>4;;

K 	%C**40t$	% 	

OODHH%	'r-   c                 F   | j                   | j                   j                  ||       | j                  | j                  j                  ||       | j                  | j                  j                  ||       | j                  | j                  j                  ||       y y r   )r  r  r  r  r  r/  s      r+   r  z+RaiseStatNode.generate_function_definitions  s    ==$MM77TB>>%NN88dC;;"KK55c4@::!JJ44S$? "r-   c                 >   | j                   r| j                   j                  |       | j                  r| j                  j                  |       | j                  r| j                  j                  |       | j                  r| j                  j                  |       y y r   )r  r   r  r  r  r   s     r+   r   zRaiseStatNode.annotate  sk    ==MM""4(>>NN##D);;KK  &::JJ% r-   N)rb   r   r   r   r   r   r   r   r   r   r
  r  r   rt   r-   r+   r  r    s4     ?KM6 ..K%K('T@&r-   r  c                   <    e Zd Zg ZdZd Zej                  ZdZ	d Z
y)ReraiseStatNodeTc                     | S r   rt   r   s     r+   r   z#ReraiseStatNode.analyse_expressions  rA  r-   r  c                    |j                  | j                         |j                  j                  }|r|j                  j                  t               |j                  |d          |j                  |d          |j                  |d          |j                  dt        |      z         |D ]  }|j                  d|z          |j                          |j                  |j                  | j                               y |j                  j                  t        j                  dd             |j                  d|j                  | j                        z         y )	Nr   r   r#   &__Pyx_ErrRestoreWithState(%s, %s, %s);z%s = 0; ReRaiseExceptionExceptions.cz__Pyx_ReraiseException(); %s)r&  r*   r  exc_varsr  r;  rR  r  rb  rf   r  r  r  r   r  )r   rl   rR  varnames       r+   r
  z'ReraiseStatNode.generate_execution_code  s   dhh~~&&--.LMT!W%T!W%d1g&JJ?%+MN /g-./JJLJJttxx01--''(:NKMJJ58QQRr-   N)rb   r   r   r   r   r   r   r   r   r   r
  rt   r-   r+   r)  r)    s'    KM ..K%KSr-   r)  c                   H    e Zd ZddgZd Zej                  ZdZd Z	d Z
d Zy)	AssertStatNoder~  rB   c                    | j                   j                  |      | _         | j                  r| j                  j                  |      }|j                  t
        j                  u s|j                  j                  sEddlm	}  ||j                  |gd      }|j                  |d      j                  |      | _        | S |j                  |      | _        | S )Nr   rv  T)ri   slow)skip_children)r~  analyse_boolean_expressionrB   r   r9   r   
tuple_typer  r{  rw  r*   r  )r   rO   rB   rw  s       r+   r   z"AssertStatNode.analyse_expressions8  s    II88=	::JJ,,S1EzzW///uzz7Q7Q0!%))5'E"00D0I\\]`a
  #55c:
r-   r  c                    |j                   j                  t        j                  dd             |j	                  d       |j	                  d       |j                  | j                         | j                  j                  |       |j	                  d| j                  j                         z         | j                  r~| j                  j                  |       |j	                  d| j                  j                         z         | j                  j                  |       | j                  j                  |       n|j	                  d       |j	                  |j                  | j                               |j	                  d       | j                  j                  |       | j                  j                  |       |j	                  d       |j	                  d	       y )
NAssertionsEnabledr.  z!#ifndef CYTHON_WITHOUT_ASSERTIONSz+if (unlikely(__pyx_assertions_enabled())) {r  z*PyErr_SetObject(PyExc_AssertionError, %s);z$PyErr_SetNone(PyExc_AssertionError);r  r  )r  r;  r   r  rf   r&  r*   r~  r  r   rB   r  r  r  r  r   s     r+   r
  z&AssertStatNode.generate_execution_codeH  s]   ))##$7H	J

67

@Adhh		**40

"TYY%5%5%77	9::JJ//5JJ<tzz?S?S?UUWJJ--d3JJ!!$'JJ68

OODHH%	'

			((.		T"

	

8r-   c                     | j                   j                  ||       | j                  | j                  j                  ||       y y r   )r~  r  rB   r/  s      r+   r  z,AssertStatNode.generate_function_definitionsd  s9    		//T:::!JJ44S$? "r-   c                     | j                   j                  |       | j                  r| j                  j                  |       y y r   )r~  r   rB   r   s     r+   r   zAssertStatNode.annotatei  s2    		4 ::JJ% r-   Nr  rt   r-   r+   r2  r2  0  s3     7#K ..K%K8@
&r-   r2  c                   :    e Zd ZddgZd Zd Zd Zd
dZd Zd Z	y	)
IfStatNode
if_clauseselse_clausec                     | j                   D ]  }|j                  |        | j                  r| j                  j                  |       y y r   )r>  r   r?  r   rO   	if_clauses      r+   r   zIfStatNode.analyse_declarationsw  sE     	0I**3/	011#6 r-   c                     | j                   D cg c]  }|j                  |       c}| _         | j                  r | j                  j                  |      | _        | S c c}w r   )r>  r   r?  rA  s      r+   r   zIfStatNode.analyse_expressions}  sP    OS_)988=_#//CCCHD `s   Ac                    |j                  | j                         |j                         }t        | j                        }| j
                  r,| j                  | j                  d   | j
                  d       n|dz  }t        | j                        D ]8  \  }}| j                  ||j                         |j                  ||||k(         : | j
                  rb|j                  | j
                  j                         |j                  d       | j
                  j                  |       |j                  d       |j                  |       y )Nr   T)inverser   )is_last
/*else*/ {r  )r&  r*   r  r^   r>  r?  _set_branch_hintr  r   r
  rf   rO  )r   rl   r  lastr  rB  s         r+   r
  z"IfStatNode.generate_execution_code  s   dhhNN$	4??#!!$//""5t7G7GQU!VAID%doo6 	RLAy!!)Y^^<--dIqDy-Q	R MM$**../JJ|$44T:JJsOy!r-   c                 `   |j                   sy t        |t              r|j                  sy t        |j                  d   t        t
        f      rat        |j                        dkD  r=t        t        t        t        t        f}|j                  d d D ]  }t        ||      r y  |rdnd|_        y y )Nr   r   r  r\  )r   r_   r  r  r  r)  r^   rv  r@  r  r   r(  branch_hint)r   clausestatements_noderE  non_branch_nodesrk   s         r+   rH  zIfStatNode._set_branch_hint  s    ,,/<8@U@Uo++B/-1QR?(()A-$0.+z[g#h +11#26 D%d,<= .5*F Sr-   c                     | j                   D ]  }|j                  ||        | j                  | j                  j                  ||       y y r   )r>  r  r?  )r   rO   rl   rL  s       r+   r  z(IfStatNode.generate_function_definitions  sL    oo 	<F00d;	<'::3E (r-   c                     | j                   D ]  }|j                  |        | j                  r| j                  j                  |       y y r   )r>  r   r?  )r   rl   rB  s      r+   r   zIfStatNode.annotate  sE     	%It$	%%%d+ r-   Nr  )
rb   r   r   r   r   r   r
  rH  r  r   rt   r-   r+   r=  r=  o  s.      /K7"&EF,r-   r=  c                   6    e Zd ZddgZdZd Zd Zd Zd Zd Z	y)	IfClauseNode	conditionr   Nc                 :    | j                   j                  |       y r   )r   r   r   s     r+   r   z!IfClauseNode.analyse_declarations  s    		&&s+r-   c                     | j                   j                  |      | _         | j                  j                  |      | _        | S r   )rS  analyse_temp_boolean_expressionr   r   r   s     r+   r   z IfClauseNode.analyse_expressions  s3    GGLII11#6	r-   c                 X   | j                   j                  |       |j                  | j                         | j                   j	                         }| j
                  r| j
                  d|d}|j                  d|z         | j                   j                  |       | j                   j                  |       | j                  j                  |       |j                  | j                  d       |s'| j                  j                  s|j                  |       |j                  d       y )Nr  r  r	  Fr  r  )rS  r  r&  r*   r   rK  rf   r  r  r   r
  r   rM  )r   rl   r  rF  rS  s        r+   r
  z$IfClauseNode.generate_execution_code  s    //5dhhNN))+	$($4$4i@I

;*+--d3!!$'		))$/dhhe,49922MM)$

3r-   c                 t    | j                   j                  ||       | j                  j                  ||       y r   )rS  r  r   r/  s      r+   r  z*IfClauseNode.generate_function_definitions  s*    44S$?		//T:r-   c                 p    | j                   j                  |       | j                  j                  |       y r   )rS  r   r   r   s     r+   r   zIfClauseNode.annotate  s&    %		4 r-   )
rb   r   r   r   rK  r   r   r
  r  r   rt   r-   r+   rR  rR    s,     'KK,
;!r-   rR  c                   ,    e Zd ZddgZd Zd Zd Zd Zy)SwitchCaseNode
conditionsr   c                 H    | j                   D ]  }|j                  |        y r   )r\  r  r   rl   r~  s      r+   "generate_condition_evaluation_codez1SwitchCaseNode.generate_condition_evaluation_code  s#    OO 	0D))$/	0r-   c                    t        | j                        }|j                  j                  d   }t	        | j                  d      D ]\  \  }}|j                  d|j                         z         |j                  |j                         |sF||k  sL|j                  d       ^ | j                  j                  |       |j                  | j                  d       |j                  d       y )Nr  r   zcase %s:r  Fr  r  )r^   r\  r  r   r  rf   r   r&  r*   r   r
  )r   rl   num_conditionsline_tracing_enabledr  r~  s         r+   r
  z&SwitchCaseNode.generate_execution_code  s    T__-#//::;G !4 	2GAtJJzDKKM12MM$((##N(:

01	2 			))$/dhhe,

8r-   c                     | j                   D ]  }|j                  ||        | j                  j                  ||       y r   )r\  r  r   )r   rO   rl   r~  s       r+   r  z,SwitchCaseNode.generate_function_definitions  s9    OO 	:D..sD9	:		//T:r-   c                 ~    | j                   D ]  }|j                  |        | j                  j                  |       y r   )r\  r   r   r^  s      r+   r   zSwitchCaseNode.annotate  s3    OO 	 DMM$	 		4 r-   N)rb   r   r   r   r_  r
  r  r   rt   r-   r+   r[  r[    s"      (K0;
!r-   r[  c                   &    e Zd Zg dZd Zd Zd Zy)SwitchStatNode)testcasesr?  c                    | j                   j                  |       | j                  D ]  }|j                  |        |j	                  | j
                         |j                  d| j                   j                         z         | j                  D ]  }|j                  |        | j                  >|j                  d       | j                  j                  |       |j                  d       n|j                  d       |j                  d       | j                   j                  |       | j                   j                  |       y )Nswitch (%s) {r  r  zdefault: break;r  )rg  r  rh  r_  r&  r*   rf   r   r
  r?  r  r  r   rl   cases      r+   r
  z&SwitchStatNode.generate_execution_code  s    		**40 JJ 	:D33D9	:dhh

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

3		((.		T"r-   c                     | j                   j                  ||       | j                  D ]  }|j                  ||        | j                  | j                  j                  ||       y y r   )rg  r  rh  r?  )r   rO   rl   rl  s       r+   r  z,SwitchStatNode.generate_function_definitions  s`    		//T:JJ 	:D..sD9	:'::3E (r-   c                     | j                   j                  |       | j                  D ]  }|j                  |        | j                  | j                  j                  |       y y r   )rg  r   rh  r?  rk  s      r+   r   zSwitchStatNode.annotate&  sX    		4 JJ 	 DMM$	 '%%d+ (r-   N)rb   r   r   r   r
  r  r   rt   r-   r+   rf  rf    s     3K#.F,r-   rf  c                       e Zd Zy)LoopNodeNr  rt   r-   r+   rp  rp  .  r  r-   rp  c                   2    e Zd Zg dZd Zd Zd Zd Zd Zy)WhileStatNode)rS  r   r?  c                     | j                   j                  |       | j                  r| j                  j                  |       y y r   )r   r   r?  r   s     r+   r   z"WhileStatNode.analyse_declarations;  s6    		&&s+11#6 r-   c                     | j                   r | j                   j                  |      | _         | j                  j                  |      | _        | j                  r | j                  j                  |      | _        | S r   )rS  rV  r   r   r?  r   s     r+   r   z!WhileStatNode.analyse_expressions@  s\    >>!^^KKCPDNII11#6	#//CCCHDr-   c                 T   |j                  | j                         |j                         }|j                  d       | j                  r}| j                  j                  |       | j                  j                  |       |j                  d| j                  j                         z         | j                  j                  |       | j                  j                  |       |j                  |j                         |j                  d       |j                  }|j                  |       | j                  rb|j                  | j                  j                         |j                  d       | j                  j                  |       |j                  d       |j                  |       y )Nzwhile (1) {zif (!%s) break;r  rG  )r&  r*   new_loop_labelsrf   rS  r  r  r   r  r   r
  rO  r  r  set_loop_labelsr?  )r   rl   old_loop_labelsr  s       r+   r
  z%WhileStatNode.generate_execution_codeH  s-   dhh..0

	>>NN33D9NN11$7JJ!DNN$9$9$;;=NN%%d+		))$/t**+

3&&_-MM$**../JJ|$44T:JJsO{#r-   c                     | j                   r| j                   j                  ||       | j                  j                  ||       | j                  | j                  j                  ||       y y r   )rS  r  r   r?  r/  s      r+   r  z+WhileStatNode.generate_function_definitions_  sX    >>NN88dC		//T:'::3E (r-   c                     | j                   r| j                   j                  |       | j                  j                  |       | j                  r| j                  j                  |       y y r   )rS  r   r   r?  r   s     r+   r   zWhileStatNode.annotatef  sO    >>NN##D)		4 %%d+ r-   Nr  rt   r-   r+   rr  rr  2  s#     7K7
$.F,r-   rr  c                   D    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y)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                 t    t         j                  | |j                  |||||||dt        j                         y )NT)	r}  r~  r  r  r  r  r  r;  r9   r   r   r*   r   c_bint_type)r   r}  r~  r  r  r  r  r  s           r+   r   zDictIterationNextNode.__init__z  s=    (,,''!%%%'' 	 
	)r-   c                    ddl m} | j                  j                  |      | _        | j                  j                  |      | _        | j
                  r | j
                  j                  |      | _        | j                  r| j                  j                  |      | _        |j                  | j                  j                  t        j                        | _        | j                  j                  | j                  j                  |      | _        | j                   r| j                   j                  |      | _        |j                  | j                   j                  t        j                        | _        | j"                  j                  | j                   j                  |      | _        | j&                  r| j&                  j                  |      | _        |j                  | j&                  j                  t        j                        | _        | j(                  j                  | j&                  j                  |      | _        | j,                  j                  |      | _        | S Nr   r  r  )r   r{  r}  r   r~  r  r  r   TempNoder*   r   r   key_refr  r9   r  r  	value_refr  r  	tuple_refr  r  r   rO   r{  s      r+   r   z)DictIterationNextNode.analyse_expressions  s   33C8!//==cB!%!3!3!A!A#!FD??"ooBB3GDO$--doo.A.A:C\C\]DL#'<<#9#9$//:N:NPS#TD  $ 1 1 F Fs KD&//0A0A0E0EJLeLe/fDN%)^^%=%=d>O>O>T>TVY%ZD" $ 1 1 F Fs KD&//0A0A0E0EzG`G`aDN%)^^%=%=d>O>O>T>TVY%ZD" --;;C@r-   c                 <    | j                   j                  ||       y r   )r}  r  r/  s      r+   r  z3DictIterationNextNode.generate_function_definitions  s    33C>r-   c                 8   |j                   j                  t        j                  dd             | j                  j                  |       g }g }| j                  | j                  | j                  f| j                  | j                  | j                  f| j                  | j                  | j                  ffD ]T  \  }}}|d}n8|j                  |||f       |j!                  |       d|j#                         z  }|j                  |       V |j$                  j'                  t(        j*                  d      }|j-                  |d| j                  j/                         d| j0                  j#                         d| j2                  j#                         d|d	   d|d
   d|d   d| j4                  j#                         d       |j-                  d|z         |j-                  |j7                  d|z  | j8                               |j$                  j;                  |       |D ]%  \  }}}|j=                  |j#                                ' |D ]  \  }}}|j                  |        |D ])  \  }}}|j?                  ||       |jA                  |       + y )N	dict_iter
Optimize.cr  r  Fz = __Pyx_dict_iter_next(r   , &r   r   r#   r  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   rJ   rf   r  r~  r  r  error_goto_ifr*   r  r  r  release)	r   rl   r  temp_addressesr7  r   r  addrresult_temps	            r+   r
  z-DictIterationNextNode.generate_execution_code  sG   ))+*A*A+|*\]..t4%)\\43G3G$Y%)^^T5K5KTM^M^$_%)^^T5K5KTM^M^$_$a 		(C ~""C#89T"szz|+!!$'		( nn22:3H3H%P

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

2[@A

4%%j;&>IJ##K0 $/ 	*COOCJJL)	*#. 	2C++D1	2#. 	C++FD9KK	r-   )rb   r   r   r   r  r  r  r  r  r  r   r   r  r
  rt   r-   r+   r|  r|  n  s@    QK !%$Og$((	$((	)*?'r-   r|  c                   4    e Zd Zg dZdxZZd Zd Zd Zd Z	y)SetIterationNextNode)set_objr~  r  r  r  is_set_flagNc                 p    t         j                  | |j                  |||||dt        j                  	       y )NT)r  r~  r  r  r  r;  r9   r  )r   r  r~  r  r  r  s         r+   r   zSetIterationNextNode.__init__  s7    '++''%#'' 	 	)r-   c                 0   ddl m} | j                  j                  |      | _        | j                  j                  |      | _        | j
                  j                  |      | _        | j                  j                  |      | _        |j                  | j                  j                  t        j                        | _        | j                  j                  | j                  j                  |      | _        | j                   j                  |      | _        | S r  )r   r{  r  r   r~  r  r  r   r  r*   r   r   r  r  r9   r  r  r  s      r+   r   z(SetIterationNextNode.analyse_expressions  s    ||11#6!//==cB!//==cB --BB3G"++D,=,=,A,A
HaHa+b!%!9!9$:K:K:P:PRU!V++99#>r-   c                 <    | j                   j                  ||       y r   )r  r  r/  s      r+   r  z2SetIterationNextNode.generate_function_definitions  s    223=r-   c                    |j                   j                  t        j                  dd             | j                  j                  |       | j                  }|j                  |       |j                  j                  t        j                  d      }|j                  |d| j                  j                         d| j                  j                         d| j                   j                         d|j                         d| j"                  j                         d       |j                  d|z         |j                  |j%                  d	|z  | j&                               |j                  j)                  |       |j+                  |j                                | j,                  j                  |       | j.                  j1                  | j,                  |       |j3                  |       y )
Nset_iterr  Fz = __Pyx_set_iter_next(r   r  r  r  r  )r  r;  r   r  r  r  r  r  r  r  r   rJ   rf   r  r~  r   r  r  r  r*   r  r  r  r  r  r  )r   rl   r  r  s       r+   r
  z,SetIterationNextNode.generate_execution_code  sk   ))+*A*A*l*[\--d3NN	4 nn22:3H3H%P

LL""$%%'%%'##%
 	 	

2[@A

4%%j;&>IJ##K0 		((*+77=2243I3I4P$r-   )
rb   r   r   r   r  r  r   r   r  r
  rt   r-   r+   r  r    s+    GK %)(		)	> r-   r  c                 p    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     r+   ForStatNoder    sG    Rj>""#C.2.. +++s)b))r-   c                   @    e Zd Zg dZdZdZd Zd Zd Zd Z	d Z
d	 Zy)
_ForInStatNode)r  r   r  r   r?  NFc                     t        d      )Nz!must be implemented by subclasses)NotImplementedErrorr   s    r+   _create_item_nodez _ForInStatNode._create_item_node  s    !"EFFr-   c                     | j                   j                  |       | j                  j                  |       | j                  r| j                  j                  |       | j                          y r   )r  r  r   r   r?  r  r   s     r+   r   z#_ForInStatNode.analyse_declarations!  sO    ..s3		&&s+11#6 r-   c                    | j                   j                  |      | _         | j                  j                  |      | _        | j	                          | j
                  j                  |      | _        | j                  sz| j                  j                  j                  s | j                  j                  j                  r:| j                   j                  j                  | j                  j                        rn5| j
                  j                  | j                   j                  |      | _        | j                  j                  |      | _        | j                  r | j                  j                  |      | _        | S r   )r  r   r  r   r  r   r  r9   rS  rT  r  r  r   r?  r   s     r+   r   z"_ForInStatNode.analyse_expressions(  s    kk66s;99#> II11#6	##**dmm.@.@.I.I  001C1CD		++DKK,<,<cBDIII11#6	#//CCCHDr-   c                    |j                  | j                         |j                         }| j                  j	                  |       |j                  d       | j                  j	                  |       | j                  j                  | j                  |       | j                  j                  |       |j                  | j                         |j                  |j                         |j                  d       |j                  }|j                  |       | j                  rR|j                  |j                  f}|j!                  d      |_        |j!                  d      |_        |j                  d       | j                  j                  |       |j                  d       | j                  j"                   }t%        |j                  |j                  g|      D ]  \  }}|j'                  |      s|r|j)                  |       d}|j                  | j                         |j                  |       | j                  j+                  |       |j)                  |        |j                  |       |j                  | j                         |j'                  |      r|j                  |       | j                  j+                  |       | j                  j-                  |       y )Nz
for (;;) {r  outer_continueouter_breakrG  F)r&  r*   rv  r  r  rf   r   r  r  r   r
  rO  r  r  rw  r?  r  r   r  r  rM  r  r  )r   rl   rx  r  orig_exit_labelsneeds_goto_end
exit_labelorig_exit_labels           r+   r
  z&_ForInStatNode.generate_execution_code9  s*   dhh..0..t4

< 		**40,,TYY=		))$/dhht**+

3&&_- !% 3 3T5E5EF"&..1A"BD#~~m<DJJ|$44T:JJsO!%!1!1!?!??N/2D4G4GIYIY3Z\l/m 	/+
Oz2!MM+.%*Ndhh'z*44T:o.	/   1dhh??;'NN;',,T2  &r-   c                     | j                   j                  ||       | j                  j                  ||       | j                  j                  ||       | j                  | j                  j                  ||       y y r   )r  r  r  r   r?  r/  s      r+   r  z,_ForInStatNode.generate_function_definitionsf  se    11#t<33C>		//T:'::3E (r-   c                 *   | j                   j                  |       | j                  j                  |       | j                  j                  |       | j                  r| j                  j                  |       | j
                  j                  |       y r   )r  r   r  r   r?  r   r   s     r+   r   z_ForInStatNode.annotatem  sg    T"t$		4 %%d+		4 r-   )rb   r   r   r   r   r  r  r   r   r
  r  r   rt   r-   r+   r  r    s5     HKDHG!"+'ZF!r-   r  c                       e Zd ZdZd Zy)r  Fc                 >    ddl m}  || j                        | _        y )Nr   )NextNode)r{  r  r  r   )r   r  s     r+   r  zForInStatNode._create_item_node{  s    'T]]+	r-   N)rb   r   r   r  r  rt   r-   r+   r  r  v  s     H,r-   r  c                       e Zd ZdZd Zd Zy)r  Tc                     d|vsJ ddl m} |j                  |d   j                  d       |d<   t	        j
                  | |fi | y )Nr   r   r  r  )r  )r   r{  AwaitIterNextExprNoder*   r  r   )r   r*   r   r{  s       r+   r   zAsyncForStatNode.__init__  sH    R44R
^5G5GT4R6
c0R0r-   c                 d    ddl m} |j                  | j                        | j                  _        y r  )r   r{  AsyncNextNoder  r   r  r  s     r+   r  z"AsyncForStatNode._create_item_node  s    !//>		r-   N)rb   r   r   r  r   r  rt   r-   r+   r  r    s     H1?r-   r  c                   `    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y)r  )r  bound1bound2stepr   r?  FNz&For-loop using object bounds or targetc                     | j                   | j                  | j                  fD ])  }|j                  j                  s| j                          + y r   )r  r  r  r9   rG   r   )r   rO   r   s      r+   r   zForFromStatNode.nogil_check  s;    ++t{{DKK8 	!Avv!! 	!r-   c                     | j                   j                  |       | j                  j                  |       | j                  r| j                  j                  |       y y r   )r  r  r   r   r?  r   s     r+   r   z$ForFromStatNode.analyse_declarations  sH    ..s3		&&s+11#6 r-   c                    ddl m} | j                  j                  |      | _        | j                  j                  |      | _        | j                  j                  |      | _        | j                  at        | j                  |j                        r!t        | j                  j                  dd       | j                  j                  |      | _        | j                  |       | j                  j                  }|j                  s,|j                  s t!        | j                  j                  d       | j"                  j%                  |      | _        | j&                  r | j&                  j%                  |      | _        | S )Nr   r  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{  r  r   r  r   r  r  r_   UnaryMinusNoder	   r*   set_up_loopr9   rG   r!  r   r   r   r?  )r   rO   r{  rk  s       r+   r   z#ForFromStatNode.analyse_expressions  s   kk66s;kk//4kk//499 $))Y%=%=>		 (NOPR		//4DIkk&&'';+A+A$++//#cdII11#6	#//CCCHDr-   c                    ddl m} | j                  j                  }|j                  r|}nB|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                  J| j                  j                  j                  s*t        j                  || j                  j                        }| j                  j!                  ||      | _        | j                  j!                  ||      | _        | j                  j"                  s | j                  j%                  |      | _        | j                  W| j                  j!                  ||      | _        | j                  j"                  s | j                  j%                  |      | _        |j                  s|j
                  rVd| _        t)        | j                  |j*                        rt-        | j                  d      | j                  | _        d | _        y d| _        |j3                  | j                  ||      }|| _        |j5                  |      j7                  |      | _        y )Nr   r  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{  r  r9   r!  is_enumr	   r*   rG   r   rI   rJ   r  widest_numeric_typer  r  r  r   rc  is_py_targetr_   BufferIndexNoder   loopvar_nodepy_loopvar_noder  r  r  )r   rO   r{  rk  	loop_typec_loopvar_nodes         r+   r  zForFromStatNode.set_up_loop  s    kk&&!!#I""qs2=2I2I
..zOdOdI;;##//&::9dkkFVFVW	;;##//&::9dkkFVFVW	yy$TYY^^-G-G&::9diinnU	kk++Is;kk++Is;{{%%++44S9DK99 		++Is;DI99'' II44S9	!![%8%8 %D$++y'@'@ADHH&mnn $D#'D  $D&//)SIN .D#,#6#6~#F#Y#YZ]#^D r-   c                 X   |j                  | j                         |j                         }| j                  }| j                  j                  |       | j                  j                  |       | j                  | j                     \  }}| j                  @| j                  j                  |       | j                  j                         }|d   d|}nd}ddlm} t        | j                  |j                        r| j                  j!                  |       t        | j"                  |j                        r| j"                  j!                  |       | j$                  j&                  j(                  rt*        j,                  n| j$                  j&                  }|r)| j.                  s|j0                  j3                  |d      }	n| j                  j                         }	|j4                  r|j6                  s{| j8                  d   dk(  ri|j;                  d|	d	| j                  j                         |d
|d|	d| j8                  d| j                  j                         d
|d|	|d       nb|j;                  d|	d	| j                  j                         |d|	d| j8                  d| j                  j                         d|	|d       | j"                  }
|
)|r'|j=                  | j$                  j                  ||	      }
|
-|
j                  |       | j$                  j?                  |
|       | j@                  jC                  |       |jE                  |jF                         |s| j"                  r| j$                  jH                  jJ                  r|jM                  | j$                  j                  d       }|j!                  |       |jO                  | j$                  jH                  jP                        }| j$                  jH                  jR                  jT                  r2|jV                  jY                  t[        j\                  dd             d}nh|jV                  jY                  t[        j\                  dd             dj_                  | j$                  jH                  jR                  j`                        }|j;                  ||j                         ||jc                  |j                         | j$                  j                        fz         |je                  |j                                n| j$                  }|jg                  | j                  j&                  || j$                  jH                  jR                        }|	|_4        |jk                  |       | j$                  jH                  jJ                  r;|jm                  |j                         |j&                         |jo                  |       |j;                  d       |sM| j"                  rA| j"                  j                  |       | j$                  j?                  | j"                  |       |r'| j.                  s|j0                  jq                  |	       |jr                  }|ju                  |       | jv                  r=|j;                  d       | jv                  jC                  |       |j;                  d       |jE                  |       | j                  jy                  |       | j                  j{                  |       | j                  jy                  |       | j                  j{                  |       t        | j                  |j                        r| j                  jo                  |       t        | j"                  |j                        r| j"                  jo                  |       | j                  7| j                  jy                  |       | j                  j{                  |       y y )Nr   rX  1r   r  F>r  r  z + r  rZ   z; ) { r  r  GetModuleGlobalNamer{  z%__Pyx_GetModuleGlobalName(%s, %s); %sGetNameInClassz$__Pyx_GetNameInClass(%s, {}, %s); %sr  rG  )>r&  r*   rv  
from_ranger  r  r  relation_table	relation1r  r   r   r{  r_   r  r  r  r  r  r9   r  r   rI   r  r  r  r  r  	relation2rf   rs  r  r   r
  rO  r  r  is_pyglobal
PyTempNoder  rF   r  rr  r  r;  r   r  formatr  r  r  CoerceFromPyTypeNode	temp_codegenerate_result_codera  r  r  r  rw  r?  r  r  )r   rl   rx  r  offsetincopr  r{  loopvar_typeloopvar_namecoerced_loopvar_nodetarget_nodeinterned_cnamelookup_funcfrom_py_noder  s                   r+   r
  z'ForFromStatNode.generate_execution_code  s   dhh..0__
,,T2,,T2++DNN;99 II..t499##%D$Qx.EDd''););<&&t,d**I,>,>?  ))$/151A1A1I1Iz--t{{O_O_d//>>77eLL,,335L|':':t~~a?PTW?W JJ""$fddnndkk.@.@.BDe	% & JJ""$fdnndkk.@.@.Be	% &  $33'J#,#=#=dkkoo|]i#j + 99$?KK001EtL		))$/t**+d22 {{  ,,'224;;??DI$$T*!%!7!78I8I8N8N!O;;$$**::$$55#//0EGYZ\"IK$$55#//0@BTUW"H"O"O))//??#AK

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

3d22   99$?KK001E1EtLd//NN''5&&_-JJ|$44T:JJsO{#**40t$**40t$d''););<%%d+d**I,>,>?  ((.99 II,,T2II  & !r-   )r   ++)z+1r  )r   --)z-1r  )z<=r  z>=r  c                    | j                   j                  ||       | j                  j                  ||       | j                  j                  ||       | j                  | j                  j                  ||       | j
                  j                  ||       | j                  | j                  j                  ||       y y r   )r  r  r  r  r  r   r?  r/  s      r+   r  z-ForFromStatNode.generate_function_definitionsn  s    11#t<11#t<11#t<99 II33C>		//T:'::3E (r-   c                 z   | j                   j                  |       | j                  j                  |       | j                  j                  |       | j                  r| j                  j                  |       | j
                  j                  |       | j                  r| j                  j                  |       y y r   )r  r   r  r  r  r   r?  r   s     r+   r   zForFromStatNode.annotatex  s    T"T"T"99IIt$		4 %%d+ r-   )rb   r   r   r   r  r  r  r  r   r   r   r   r  r
  r  r  r   rt   r-   r+   r  r    s`    $ PKLLOJ:K!
7*$_Lo'f NF,r-   r  c                   8    e Zd ZdZg dZdZdZd Zd Zd Z	d Z
y)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_callr  r   Nc                     | j                   j                  |       | j                  j                  |       | j                  j                  |       y r   )r  r   r  r   r   s     r+   r   z!WithStatNode.analyse_declarations  s8    ))#.,,S1		&&s+r-   c                 V   | j                   j                  |      | _         | j                  j                  |      | _        | j                  r<ddlm}  || j                  j                  | j                  j                        | _        | j                  j                  |      | _	        | S )Nr   )r  )r  r   r  r  r{  r  r*   r9   target_tempr   r   )r   rO   r  s      r+   r   z WithStatNode.analyse_expressions  sv    ||11#6//77<;;+'(;(;T__=Q=QRDII11#6	r-   c                     | j                   j                  ||       | j                  j                  ||       | j                  j                  ||       y r   )r  r  r  r   r/  s      r+   r  z*WithStatNode.generate_function_definitions  s>    223=55c4@		//T:r-   c                    |j                  | j                         |j                  d       | j                  j	                  |       |j
                  j                  t        d      | _        |j                  j                  t        j                  dd             |j                  | j                  d| j                  j                         d|j                  t        | j                   rdnd	            d
|j#                  | j                  | j                               |j%                  | j                         |j'                         }|j(                  }| j*                  j	                  |       | j,                  r| j.                  j1                  |       | j*                  j3                  |       |j                  | j.                  j5                         d| j*                  j5                         d       | j*                  j7                  |       n| j*                  j9                  |       | j*                  j;                  |       | j                  j9                  |       | j                  j;                  |       ||_        | j<                  j?                  |       |jA                  |      rt|jC                         }|jE                  |       |jG                  |       |jI                  | j                  t               |jE                  |       |jG                  |       |j
                  jK                  | j                         |j                  d       y )Nz/*with:*/ {Fr  PyObjectLookupSpecialr{  z  = __Pyx_PyObject_LookupSpecial(r   	__aexit____exit__r  r  r  r  )&r&  r*   rf   r  r  r  r  r   exit_varr  r;  r   r  r  r  r   r  r  r  r  rK  r  r  r  r  r  r   r  r  r  r   r
  r  r  rM  rO  r  r  )r   rl   r  intermediate_error_labelstep_over_labels        r+   r
  z$WithStatNode.generate_execution_code  s^   dhh

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

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

3r-   )rb   r   r   r   r   r  r  r   r   r  r
  rt   r-   r+   r  r    s,    8 >KJK,
;
.r-   r  c                   4    e Zd ZddgZdZdZd Zd Zd Zd Z	y)WithTargetAssignmentStatNoderC  ry  Nc                 :    | j                   j                  |       y r   r  r   s     r+   r   z1WithTargetAssignmentStatNode.analyse_declarations  r  r-   c                     | j                   j                  |      | _         | j                   j                  |       | j                  j                  j                  | j                   j                  |      | _        | S r   )ry  r   r[  	with_noder  r  r9   rC  r   s     r+   r   z0WithTargetAssignmentStatNode.analyse_expressions  sU    88005%%c*>>--77sKr-   c                     | j                   j                  |       | j                  j                  | j                   |       | j                  j
                  j                  |       y r   )rC  r  ry  r  r  r  r  r   s     r+   r
  z4WithTargetAssignmentStatNode.generate_execution_code  sD    ))$/))$((D9""**40r-   c                 p    | j                   j                  |       | j                  j                  |       y r   r  r   s     r+   r   z%WithTargetAssignmentStatNode.annotate  r  r-   )
rb   r   r   r   r  rC  r   r   r
  r   rt   r-   r+   r  r    s+     %.KI
C11
 r-   r  c                   R    e Zd Zg dZdZd Zd Zej                  Z	dZ
d Zd Zd Zy	)
TryExceptStatNode)r   except_clausesr?  Fc                     | j                   j                  |       | j                  D ]  }|j                  |        | j                  r| j                  j                  |       y y r   )r   r   r  r?  )r   rO   except_clauses      r+   r   z&TryExceptStatNode.analyse_declarations  sY    		&&s+!00 	4M..s3	411#6 r-   c                 x   | j                   j                  |      | _         d}t        | j                        D ]L  \  }}|j                  |      x}| j                  |<   |rt	        |j
                  d       |j                  rKd}N || _        | j                  r | j                  j                  |      | _        | S )Nr   zdefault 'except:' must be lastr   )	r   r   r  r  r   r*   patternhas_default_clauser?  )r   rO   default_clause_seenr  r  s        r+   r   z%TryExceptStatNode.analyse_expressions  s    II11#6	 )$*=*= > 	(A}5B5V5VWZ5[[MD//2"m'')IJ ((&'#	( #6#//CCCHDr-   zTry-except statementc           
      "   j                  | j                         j                  d       j                  }j                  }j
                  }j                         }j                  }j                  d      }j                  d      }j                  d      }	j                  d      }
|rj                  d      nd }|rj                  d      nd }j                  d      }t        d	      D cg c]"  }j                  j                  t        d
      $ c}j                         }j                  d       |
_        |_        |_        | j                  j                         j                  | j                  d
       j                  d       j                  j!                         }j#                  |      }|rj$                  j'                  t(               | j*                  s"|j                  d       |j                  d       |j                  ddj-                  D cg c]  }d|z  	 c}      z         D ]  }|j/                  |        fd}n8D cg c]  }d|z  	 }}|j                  ddj-                  |      z         d }|_        |	_        | j                  j0                  }| j2                  rzj                  | j2                  j                         j                  d       | j2                  j                         j                  d       |s| j2                  j0                  }|r|s.D ]  }j5                  |t                j7                  |       j9                  |       |D ]  \  }}j5                  ||        j                  j:                  }| j                  _        | j<                  D ]  }|j?                  |        |j                  _        | j@                  sj7                  |       ||f||f||f|
|f|	|ffD ]  \  }}j#                  |      s|s"j#                  |      sj7                  |       j9                  |       j                  | j                  d
       |r |        j7                  |        j#                  |      r>|s"j#                  |      sj7                  |       j9                  |       |r |        j#                  |      rj9                  |       j                  d       D ]  }j                  jC                  |        |_        |_        |_        |_        y c c}w c c}w c c}w )Nr  exception_handledexcept_errorexcept_return
try_return	try_breaktry_continuetry_endr%   F
/*try:*/ {r  r  r  r  z__Pyx_ExceptionSave(%s);r   r  c                  |    D ]  } j                  |         j                  ddj                        z         y )Nz__Pyx_ExceptionReset(%s);r   )rb  rf   r   )rF   rl   exc_save_varss    r+   restore_saved_exceptionzJTryExceptStatNode.generate_execution_code.<locals>.restore_saved_exceptionX  s@    ) ,D%%d+,

699]34 5r-   z	(void)%s;z%s /* mark used */rZ   c                       y r   rt   rt   r-   r+   r  zJTryExceptStatNode.generate_execution_code.<locals>.restore_saved_exceptionc  s    r-   z/*else:*/ {)"r&  r*   rf   rN  r  r  r  rK  r  r	  r  r  r   r%  r   r
  all_free_managed_tempsr  r  r;  reset_exception_utility_coder  r   put_xgotrefr   r?  r  rM  rO  current_exceptr  generate_handling_coder  r  )r   rl   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_labelrW  save_exctemps_to_clean_up	can_raiser7  r  mark_vars_usednormal_case_terminates	temp_name	temp_typeouter_exceptr  r  	old_labelr  r  s    `                           @r+   r
  z)TryExceptStatNode.generate_execution_code-  s   dhh

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

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

	 NNAACOOO4	--.JK$$<=;<NN5		-@353;@AC D$ *$$S)*5 =JJS{S0JNJNN/#((>2JJK ./!%!8!8MM$**../JJ44T:JJ))-)9)9)G)G&)( @C**3?@m,NN?+(9 =$	9&&y)<=  >>88L,0DNN)!%!4!4 M44T;KLM,8DNN)**01'9?&K'6&H'9;M&N'79I&J':<L&M	&O 	)!J	
 z*-doom6TMM-0z*dhhe4+-i(	) ??+,)$//-2Pm,NN+,')??=)NN=)

3" 	/ENN''.	/ -*0*M,, A Ks   ;'V9V5Vc                     | j                   j                  ||       | j                  D ]  }|j                  ||        | j                  | j                  j                  ||       y y r   )r   r  r  r?  )r   rO   rl   r  s       r+   r  z/TryExceptStatNode.generate_function_definitions  sd    		//T:!00 	CM77TB	C'::3E (r-   c                     | j                   j                  |       | j                  D ]  }|j                  |        | j                  r| j                  j                  |       y y r   )r   r   r  r?  )r   rl   except_nodes      r+   r   zTryExceptStatNode.annotate  sY    		4 .. 	'K  &	'%%d+ r-   N)rb   r   r   r   r  r   r   r   r   r   r   r
  r  r   rt   r-   r+   r  r    s:     <KL7 ..K(Kw+rF,r-   r  c                   >    e Zd Zg dZdZdZdZd Zd Zd Z	d Z
d Zy)	ExceptClauseNode)r  r  r   r  NFc                     | j                   r| j                   j                  |       | j                  j                  |       y r   )r  r  r   r   r   s     r+   r   z%ExceptClauseNode.analyse_declarations  s-    ;;KK2237		&&s+r-   c                    |j                   | _        | j                  rLt        | j                        D ]4  \  }}|j	                  |      }|j                  |      | j                  |<   6 | j                  rQddlm} |j                  | j                        | _        | j                  j                  || j                        | _        | j                  j	                  |      | _        | S r  )rX  function_namer  r  r   r  r  r   r{  ExcValueNoder*   r  r  r   )r   rO   r  r  r{  s        r+   r   z$ExceptClauseNode.analyse_expressions  s     //<<'5 B
7!55c:")"<"<S"AQB ;;#&33DHH=DN++??T^^TDKII11#6	r-   c           	         |j                  | j                         | j                  ryt        d | j                  D               }|rt	        d      D cg c]#  }|j
                  j                  t        d      % }}|j                  j                  t        j                  dd             |j                  dt        |      z         |j                  j                  t        j                  dd	             d
|d   z  }n3d}|j                  j                  t        j                  dd             d}g }| j                  D ]5  }|j                  |       |j                  ||j!                         z         7 |j
                  j                  t"        j$                  d      }	|j                  |	ddj'                  |      d       | j                  D ]$  }|j)                  |       |j+                  |       & |rp|j                  dt        |      z         |j                  dj'                  |D 
cg c]  }
d|
z  	 c}
             |D ]  }|j
                  j-                  |        |j                  d|	z         |j
                  j-                  |	       n|j                  d       t/        | j0                  dd      s{| j2                  o| j4                  c|j                  j                  t        j                  dd             |j                  d       |j7                  |       |j                  d       y t	        d      D cg c]#  }|j
                  j                  t        d      % }}|j9                  | j:                         |j                  j                  t<               dt        |      z  }|j                  d|d|j?                  | j                               |D ]  }
|jA                  |
        | j4                  r_| jB                  jE                  |d          | jB                  j                  |       | j4                  jG                  | jB                  |       | j2                  9tI        || j2                  jJ                        D ]  \  }}|jE                  |        |jL                  |jN                  }}|jQ                  d      |_&        |jQ                  d       |_'        |j
                  jR                  }||j
                  _)        | j0                  jU                  |       ||j
                  _)        | j0                  jV                  s.|D ]  }
|jY                  |
t                |j7                  |       |jL                  |f|jN                  |ffD ]V  \  }}|j[                  |      s|j]                  |       |D ]  }
|j_                  |
t                |j7                  |       X ||_&        ||_'        |D ]  }|j
                  j-                  |        |j                  d       y c c}w c c}
w c c}w )!Nc              3   v   K   | ]1  }|j                   xs |j                         xr |j                    3 y wr   )r   	is_simpler;  )r7  r  s     r+   r8  z:ExceptClauseNode.generate_handling_code.<locals>.<genexpr>  s;      '- ""Qg&7&7&9&Q'//>QQ'-s   79r%   Tr  PyErrFetchRestorer.  z__Pyx_ErrFetch(&%s, &%s, &%s);FastTypeChecksModuleSetupCode.cz*__Pyx_PyErr_GivenExceptionMatches(%s, %%s)r   rt   PyErrExceptionMatchesz __Pyx_PyErr_ExceptionMatches(%s)Fr  r}  r  __Pyx_ErrRestore(%s, %s, %s);rZ   %s = 0;r	  z/*except:*/ {r  z__Pyx_ErrRestore(0,0,0);r  z&%s, &%s, &%szif (__Pyx_GetException(r  r   except_breakexcept_continue)0r&  r*   r  r<  r	  r  r  r   r  r;  r   r  rf   r  r  r  r  r   rJ   r   r  r  r  r   r   excinfo_targetr  rM  rW  r?  get_exception_utility_coder  r  r  set_varr  r  ri   r  r  r  r/  r
  r   r  r  rO  r  )r   rl   r  has_non_literalsrW  r/  exc_test_func	exc_testsr  
match_flagr7  r  exc_argstempvarrk   r&  r'  old_exc_varsr  r7  s                       r+   r$  z'ExceptClauseNode.generate_handling_code  sx   dhh<<#& '-#||'- $-  -   &+1X/ ! !NN88TX8Y / /  11+2I2IJ]_m2no

;eHoMN  11+2I2IJZ\o2pq LxXY{ Z  11+2I2IJacq2rs BI<< F006  1B1B1D!DEF 55j6K6KX]5^JJJZY1GHI<< )..t4""4()  

:U8_LM

388$IY_$IJK$ 6DNN//56 JJ  NN''
3JJ'		7D1''/KK' --k.E.EFY[i.jkJJ12MM)$JJsO #1X' NN00D0Q ' 't112 	))*DE"U8_4

doodhh/1 	2 	!COOC 	!;;NN""8A;/NN33D9KK00F*!$Xt/B/B/G/G!H &W%& /3.>.>@S@S+>>.9"nn->?~~.."*		))$/".yy&& < &&sN;< MM)$&*&6&6%H&*&9&9;M%N%P 	) Iyy)y)# ?C))#~>?i(	) +0 	.DNN''-	. 	

	/0 %J,'s   (Y9Y(Yc                     | j                   | j                   j                  ||       | j                  j                  ||       y r   )r  r  r   r/  s      r+   r  z.ExceptClauseNode.generate_function_definitionsM  s4    ;;"KK55c4@		//T:r-   c                     | j                   r"| j                   D ]  }|j                  |        | j                  r| j                  j                  |       | j                  j                  |       y r   )r  r   r  r   )r   rl   r  s      r+   r   zExceptClauseNode.annotateR  sU    <<<< '  &';;KK  &		4 r-   )rb   r   r   r   r  rL  is_except_asr   r   r$  r  r   rt   r-   r+   r<  r<    s3    " =KINL,
 jX;
!r-   r<  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y)TryFinallyStatNode)r   finally_clausefinally_except_clauser   TNFc                 "    t        | ||      }|S )Nr   r[  )rZ  )r*   rO   r   r[  rk   s        r+   r  z"TryFinallyStatNode.create_analysedu  s    !#DPr-   c                     | j                   j                  |       t        j                  | j                        | _        | j
                  j                  |       | j                  j                  |       y r   )r   r   r   deepcopyr[  r\  r   s     r+   r   z'TryFinallyStatNode.analyse_declarationsz  sS    		&&s+%)]]43F3F%G"""77<005r-   c                 ,   | j                   j                  |      | _         | j                  j                  |      | _        | j                  j                  |      | _        |j                  r'|j                  j
                  s|j                  | _        | S r   )r   r   r[  r\  r  rV  func_return_typer   s     r+   r   z&TryFinallyStatNode.analyse_expressions  so    II11#6	"11EEcJ%)%?%?%S%STW%X"??3??#:#:$'OOD!r-   zTry-finally statementc           
          |j                   j                         |j                  d       |j                  }|j	                         }|j                         }|j                  } j                  s||_        |j                         }|j                  j                  }d|j                  _	         j                  j                  |       ||j                  _	        |j                  d       |j                  j                         }|j                   j                  j                         |j                  d       |j                  |        j                  gf fd	}	 j                  xr |j!                  |      }
 j                  j"                   } j                  j"                  s_|j                  d        |	       j                  |        j                  j"                  s|j%                  |       |j                  d       |
r|j'                  |       |j                  d        j(                  s|j                  d        j*                  r|j-                          |rt/        t1        d	      D cg c]-  }|j                  j3                  t4        j6                  d
      / c}      }|j                  j3                  t5        j8                  t5        j:                  t4        j<                              d
      }nd x}}t/        t1        d      D cg c]#  }|j                  j3                  t>        d
      % c}      } jA                  |||||       |j	                         }|j                  d       |j                  jB                  }|d d |j                  _!         jD                  j                  |       ||j                  _!        |j                  d       |rf jG                  ||||       |r"|D ]  }|j                  jI                  |        |r|j                  jI                  |       |j%                  |       tK        |j                         |      D ]K  \  }}|j!                  |      s|j'                  |        jM                  ||       |j%                  |       M |D ]  }|j                  jI                  |        |j                  d       |j                  |       |jN                  }d}tQ        tK        ||            D ]j  \  }\  }}|j!                  |      s||k(  r|
r$|j                  d|z         d }||k(  r, j(                  rTt/        t1        d      D cg c]#  }|j                  j3                  t>        d
      % c}      } jA                  |g |        j                  j"                  s jR                  r j*                  stU         j                  tV              s|j                  j3                   jR                  d
      }|j                  |dtX        jZ                  d        jR                  j\                  r"|j                  dtX        jZ                  z          |	       j                  |       ||k(  r|rj|j                  tX        jZ                  d|d        jR                  j\                  r|j                  d|z         |j                  jI                  |        j(                  r4 jG                  ||       |D ]  }|j                  jI                  |         j                  j"                  s|j%                  |       |j                  d       m |j'                  |       |j                  d       y c c}w c c}w c c}w )Nr  r   r  z/*finally:*/ {c                 j    | d   }t        j                  |      }|j                  u r|| d<   |S |}|S r  )r   r`  r[  )_nextrk   	node_copyr   s      r+   fresh_finally_clausezHTryFinallyStatNode.generate_execution_code.<locals>.fresh_finally_clause  sD    8Dd+It***$a K !Kr-   z/*normal exit:*/{z/*exception exit:*/{r  r#   Fr     r  r%   rt   z%s: {r  r  rI  )/r&  r*   rf   rK  all_new_labelsget_all_labelshandle_error_caser  r  in_try_finallyr   r
  r   r[  set_all_labelspreserve_exceptionr  r   rM  rO  r  is_try_finally_in_nogilr+  r  r	  r  r   rJ   CPtrTyper  r  r   put_error_catcherr/  r\  put_error_uncatcherr  r  put_error_cleanerrN  r  rb  r_   GILExitNoder
   r$  rG   )r   rl   r  
old_labels
new_labelsr  catch_labelwas_in_try_finallyr0  rg  preserve_errorneeds_success_cleanuprW  exc_lineno_cnamesexc_filename_cnamer/  finally_old_labelsrU  r  r  r7  rN  r  ret_temps   `                       r+   r
  z*TryFinallyStatNode.generate_execution_code  sh   dhh

< **((*
((*
**%%.Dnn&!^^::()%		))$/(:%

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

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

89++%%'$$)"1X+' NN001F1FSX0Y+' %(! &*^^%A%A''
(?(?
@V@V(WX$ &B &&" :>=!$6q# ,,^,N# $H ""'3DFXZ!%!4!4!6JJsO>>22L&.rlDNN#&&>>tD&2DNN#JJsO$((x9JL^_$!2 ;33E:;%NN//0BCo.(+D,?,?,ACU(V )$	9y1y)&&tX6i() " 3++E23JJsOJ'(()23z:3N)O )	%A%	9??9-O+JJw*+HL($$$!&q&+ 44^PU4V&+  ,H **4X>**88-- $ < < *4+>+> L#'>>#?#? 11e $@ $E

6;N;N#OP00<< JJy63F3F'FG "::4@L(JJV-@-@(KL,,88

9x#78NN//9$$,,T8<!) ;33E:; &&44i(JJsOS)	X 	{#

	w+'#b&+s   =2^2(^7?(^<
c                     | j                   j                  ||       | j                  j                  ||       | j                  r| j                  j                  ||       y y r   )r   r  r[  r\  r/  s      r+   r  z0TryFinallyStatNode.generate_function_definitions   sP    		//T:99#tD%%&&DDS$O &r-   c                 6   |j                   j                  t               |j                   j                  t               |j                   j                  t               | j
                  r|j                  d       |j                  d       |j                  dj                  |D cg c]  }d|z  	 c}             |D ]  \  }}|j                  ||        |j                  d|dd  z         |j                  d|d d d	z  z         |D ]  }|j                  |        |rS|j                  |d
   dt        j                  d|d   dt        j                  d|dt        j                  d       | j
                  r|j                          y y c c}w )NFr+  r  rZ   rI  z>if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&%s, &%s, &%s);r%   zmif ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&%s, &%s, &%s) < 0)) __Pyx_ErrFetch(&%s, &%s, &%s);r#   r   r  r  r   r  )r  r;  rR  rM  swap_exception_utility_codero  r*  rf   r   r  r"  r
   lineno_cnameclineno_cnamefilename_cnamerI  )	r   rl   r0  r/  r{  r|  r7  r4  r9   s	            r+   rq  z$TryFinallyStatNode.put_error_catcher&  s{   ))*HI))*DE))*EF''7

/0

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

 :<DQRLI 	J

 4 8@|a7G	I 	J
  	"CS!	"JJ!!$f&9&9!!$f&:&:"F$9$9; <
 ''((* (+ Bs   'Fc                    |j                   j                  t               |j                   j                  t               | j                  r|j                  d       |j                  d       |dd  D ]  }|j                  |        |j                  d|dd  z         |j                  d       |d d D ]  }|j                  |        |j                  d|d d z         | j                  r|j                          |j                  dj                  |D cg c]  }d	|z  	 c}             |rT|j                  t        j                  d
|d   dt        j                  d
|d   dt        j                  d
|d       y y c c}w )NFr  if (PY_MAJOR_VERSION >= 3) {r%   !__Pyx_ExceptionReset(%s, %s, %s);r  rH  rZ   rI  r  r   r  r   r  )r  r;  rR  r!  ro  r*  rf   rb  rI  r   r
   r  r  r  )r   rl   r/  r{  r|  r7  s         r+   rr  z&TryFinallyStatNode.put_error_uncatcherH  s\   ))*HI))*FG''7 	

12AB< 	#Cc"	#

6!"EF

3BQ< 	#Cc"	#

2Xbq\AB''((*

388AY_ABCJJ##%6q%9$$&7&:%%'9; <  Bs   Fc                    |j                   j                  t               | j                  r|j	                  d       |j                  d       |dd  D ]  }|j                  |        |j                  d|dd  z         |j                  d       |d d D ]  }|j                  |t                | j                  r|j                          |j                  dj                  dgdz        |dd  z         y )	NFr  r  r%   r  r  rZ   rI  )r  r;  r!  ro  r*  rf   rb  r  r   rI  r   )r   rl   r/  r7  s       r+   rs  z$TryFinallyStatNode.put_error_cleanerd  s    ))*FG''7 	

12AB< 	#Cc"	#

6!"EF

3BQ< 	8C""37	8''((*

388YKM*Xab\9:r-   c                 p    | j                   j                  |       | j                  j                  |       y r   )r   r   r[  r   s     r+   r   zTryFinallyStatNode.annotatev  s(    		4 $$T*r-   )NN)rb   r   r   r   rn  rk  rb  r\  ro  r  r+  r  r   r   r   r   r   r   r
  r  rq  rr  rs  r   rt   r-   r+   rZ  rZ  [  s     FK  #L 6 ..K)KSjP FJ +D<8;$+r-   rZ  c                       e Zd ZdZdZdZy)NogilTryFinallyStatNodezJ
    A try/finally statement that may be used in nogil code sections.
    FN)rb   r   r   r   rn  r   rt   r-   r+   r  r  {  s     Kr-   r  c                   :     e Zd ZdZd Zd Z fdZd Zd Z xZ	S )GILStatNodeNc           
          || _         | j                  |||       t        j                  | ||t	        ||| j
                               y )N)state
state_tempr^  )r  create_state_temp_if_neededrZ  r   rt  r  )r   r*   r  r   s       r+   r   zGILStatNode.__init__  sI    
((eT:###&5T__> 	$ 	?r-   c                     ddl m}  |       }|j                  |       |j                  sy |dk(  rt        j
                  }nt        j                  }ddlm} |j                  ||      | _
        y )Nr   )YieldNodeCollectorgilr  )ParseTreeTransformsr  visitchildrenyieldsr   c_gilstate_typec_threadstate_ptr_typer   r{  r  r  )r   r*   r  r   r  	collectorr5  r{  s           r+   r  z'GILStatNode.create_state_temp_if_needed  s[    ;&(	%E>"22I"99I#,,S)<r-   c                 ~    | j                   dk(  |_        | j                   dk(  rd|_        t        t        |   |      S )Nr  T)r  _in_with_gil_blockr)  r   r  r   r3  s     r+   r   z GILStatNode.analyse_declarations  s:    "&**"5::%)C"[$<SAAr-   c                     |j                  t        j                  dd             |j                  }| j                  dk(  |_        t
        j                  | |      }||_        |S )NForceInitThreadsrF  r  )r;  r   r  r  r  rZ  r   )r   rO   	was_nogilrk   s       r+   r   zGILStatNode.analyse_expressions  sZ    ##$68KL	NII	JJ')	!55dC@	r-   c                 v   |j                  | j                         |j                          | j                  r6| j                  j	                  |       | j                  j                         }nd }|j                  j                  }| j                  dk(  r$|j                  |       d|j                  _        n#|j                  |       d|j                  _        t        j                  | |       | j                  r| j                  j                  |       ||j                  _        |j                          y )Nr  )variableTF)r&  r*   begin_blockr  r  r   r  r  r  r*  put_release_gilrZ  r
  r  	end_block)r   rl   r  old_gil_configs       r+   r
  z#GILStatNode.generate_execution_code  s    dhh??OO$$T*--/HH11::2'+DNN$  ( 3',DNN$224>??OO##D)#1 r-   )
rb   r   r   r  r   r  r   r   r
  r   r   s   @r+   r  r    s$    
 J?=Br-   r  c                   $    e Zd ZdZg ZdZd Zd Zy)rt  z]
    Used as the 'finally' block in a GILStatNode

    state   string   'gil' or 'nogil'
    Nc                     | S r   rt   r   s     r+   r   zGILExitNode.analyse_expressions  rA  r-   c                     | j                   r| j                   j                         }nd }| j                  dk(  r|j                  |       y |j	                  |       y )Nr  )r  r   r  rI  put_acquire_gil)r   rl   r  s      r+   r
  z#GILExitNode.generate_execution_code  sH    ??--/HH::((2  *r-   )rb   r   r   r   r   r  r   r
  rt   r-   r+   rt  rt    s     KJ	+r-   rt  c                       e Zd ZdZd Zy)EnsureGILNodezI
    Ensure the GIL in nogil functions for cleanup before returning.
    c                 (    |j                  d       y )NFr  )r*  r   s     r+   r
  z%EnsureGILNode.generate_execution_code  s    U3r-   N)rb   r   r   r   r
  rt   r-   r+   r  r    s    4r-   r  c                  &    ddl m}  | j                  S r-  )r   r/  r<  r.  s    r+   cython_view_utility_coder    s    '''r-   c                  .    t        j                  dd      S NArrayAPIzarrayarray.hr   r  rt   r-   r+   r  r        {'>'>z>'Z r-   c                  .    t        j                  dd      S r  r  rt   r-   r+   r  r    r  r-   )zcpython.arrayzcpython.array.arrayzcython.view)__Pyx_patch_asyncioPatchAsyncIOr<  )__Pyx_patch_inspectPatchInspectr<  )asyncioinspectc                   &    e Zd Zg ZdZd Zd Zd Zy)CImportStatNodeFc                    |j                   st        | j                  d       y |j                  | j                  | j                  | j
                  rdnd      }d| j                  v r| j                  j                  d      D cg c]  }t        |       }}|d   }|j                  j                  |      }|}|dd  D ]2  }|j                  |      }|j                  ||| j                         |}4 | j                  r(|j                  | j                  || j                         nf|j                  |       |j                  ||| j                         n7| j                  xs | j                  }|j                  ||| j                         | j                  t        v r'|j                  t        | j                                   y y c c}w )N$cimport only allowed at module levelr   r   relative_levelr[   r   )rr  r   r*   find_moduler7  is_absoluter  r   re  find_submoduledeclare_moduleas_namer  utility_code_for_cimportsr;  )r   rO   module_scoperF   r"  top_nametop_module_scopesubmodule_scopes           r+   r   z$CImportStatNode.analyse_declarations  s   ""$((BCdhhD<L<LqRT ' V$"""595E5E5K5KC5PQT]4(QEQQxH"{{99(C+Lab	 /"."="=d"C++D/488L./ ||""4<<txxH''5""8-=txxH<<34#3#3Dt\488<88  !:4;K;K!L!NO 9! Rs   G	c                     | S r   rt   r   s     r+   r   z#CImportStatNode.analyse_expressions'  rA  r-   c                      y r   rt   r   s     r+   r
  z'CImportStatNode.generate_execution_code*  r   r-   N)rb   r   r   r   r  r   r   r
  rt   r-   r+   r  r    s     KKP4r-   r  c                   4    e Zd Zg ZdZdZdZd Zd Zd Z	d Z
y)FromCImportStatNodeNc           	      P   |j                   st        | j                  d       y | j                  r?| j                  |j                  j                  d      kD  rt        | j                  d       y |j                  | j                  | j                  | j                        }|j                  }|j                  |       | j                  D ]P  \  }}}}|dk(  r?t        |j                  j                               D ]  \  }}	|j                  ||	|        M|j                  |      }	|	r-|r#| j                  |	|      s|	j!                  |       d|	_        n|dk(  s|dk(  r|j%                  ||d d	|
      }	n|dk(  r|j'                  |||      }	nl|j(                  j                  ||| j                  d      }
|
j*                  |u r"|j-                  |xs ||
| j                         nt        |d|d|d       |	s8|xs |}|j                  ||	|       S |j/                  d      s|j/                  d      rg|t0        v r|j3                  t1        |                 | j                  D ]3  \  }}}}|d|}|t0        v s|j3                  t1        |                 5 y y )Nr  r[   z3relative cimport beyond main package is not allowedr  r  r   r  rK  r   )r  r  r  r*   class)r*   r7  F)relative_tor*   absolute_fallbackzName 'z' not declared in module 'r@  cpythoncython)rr  r   r*   r  rX  countr  r7  r  imported_namesr   r  r   r  r  declaration_matches
redeclaredr  r  r  re  parent_moduler  r^  r  r;  )r   rO   r  r7  r*   rF   r  r  
local_namer  r  rW  fqnames                r+   r   z(FromCImportStatNode.analyse_declarations:  s   ""$((BC4#6#69K9K9Q9QRU9V#V$((QRt'7'7RVReRef"11-(,(;(; 	C$Cws{)-l.B.B.H.H.J)K C%J**:ucBC %++D1D$<$<UD$I((-!"EJx'47? , D D t4aS !E !R , < <TsXc < d*-++*A*A l\a +B +c*88LH..w$QUQYQYZ!#RVXc'de!(DJ**:ucB5	C8 !!),0F0Fx0P77$$%>{%K%MN!%!4!4 N4A$/666(()B6)J)LMN 1Qr-   c                     |j                   sy|j                  }|dk(  r|j                  syy|j                  sy||j                  k7  ryy)Nr   r  r   )rB  r9   r>  is_struct_or_unionr  )r   r  r  r9   s       r+   r  z'FromCImportStatNode.declaration_matchesh  sM    }}zz7?)) 	 **tyy r-   c                     | S r   rt   r   s     r+   r   z'FromCImportStatNode.analyse_expressionsv  rA  r-   c                      y r   rt   r   s     r+   r
  z+FromCImportStatNode.generate_execution_codey  r   r-   )rb   r   r   r   r7  r  r  r   r  r   r
  rt   r-   r+   r  r  .  s.     KKNN,N\r-   r  c                   (    e Zd ZdgZdZd Zd Zd Zy)FromImportStatNoder  r   c                     | j                   D ]N  \  }}|dk(  r3|j                  st        | j                  d        y d|_        d| _        >|j                  |       P y )Nr  z%import * only allowed at module levelr   )r   rr  r   r*   has_import_starimport_starr  )r   rO   rF   r  s       r+   r   z'FromImportStatNode.analyse_declarations  sY     JJ 	7LD&s{**$(($KL&'##$ 11#6	7r-   c                    ddl m} | j                  j                  |      | _        |j	                  | j
                  t              | _        g | _        | j                  D ]  \  }}|dk(  rm|j                  j                         D ]O  \  }}|j                  r|j                  j                  s*|j                  t        j                   dd              w y|j#                  |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(                  |j0                  k(  r~	 |j5                  |d       }|j                  t        u rd }n&| j                  j7                  |j                  |      }| j                  j9                  |||f        | S # t2        $ r Y {w xY w)Nr   r  r  ExtTypeTestr{  r7  )r*   r  )r   r{  r  r   rs  r*   r   r   interned_itemsr   r  rB  r9   r>  r;  r   r  r  rF   r  r7  rB   r  r   rX  r   r  r  r  )	r   rO   r{  rF   r  rW  r  r  coerced_items	            r+   r   z&FromImportStatNode.analyse_expressions  s   kk55c:..txxH	  JJ 	ILD&s{ # 1 1 3 HAu ==UZZ-I-I,,[-D-D]Tf-gh
 

6;;/MMejjoo&=#EJJ>zz--1H1H1N1NN !$1H1H1N1NTXT\T\@D@Q@Q "1 "S ::11V5J5JJ$ K  99#tD;;.0#'L#'99#6#6v{{C#HL##**D&,+GH7	I8  * s   (A3I	IIc                    |j                  | j                         | j                  j                  |       | j                  rZ|j                  dt        j                  d| j                  j                         d|j                  | j                        d       |j                  j                  t        d      }| j                  j                  |       | j                  r/|j                  j!                  t#        j$                  dd             | j                  D ]  \  }}}|j                  |d	| j                  j                         d
|j'                  |      d|j)                  || j                               |j+                  |       ||j-                  | j                  |       n4|j/                  |       |j1                  |       |j-                  ||       |j3                  |t                |j                  j5                  |       | j                  j7                  |       | j                  j9                  |       y )Nr  r  r  r  Tr  
ImportFromr  z = __Pyx_ImportFrom(r   r  )r&  r*   r  r  r  rf   r
   r  r  r  r  r   r   r  r  r  r;  r   r  r  r  r  r  allocate_temp_resultr  r  r  r  r  )r   rl   	item_temprF   r  r  s         r+   r
  z*FromImportStatNode.generate_execution_code  s   dhh,,T2JJ&&KK))+OODHH-/0
 NN00D0Q			I&--''6FGI*.*=*= 	=&D&,JJKK))+**40++Itxx@	BC OOI&#//		4@11$711$7//dC!!)^<	= 	##I.**40t$r-   N)rb   r   r   r   r  r   r   r
  rt   r-   r+   r  r  }  s      *KK	7!F%r-   r  c                       e Zd ZdZdZy)ParallelNodez4
    Base class for cython.parallel constructs.
    N)rb   r   r   r   r   rt   r-   r+   r  r    s     Kr-   r  c                       e Zd ZdZddg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Z/dZ0de/d e0d!Z1d" Z2d# Z3 xZ4S )(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_threadsNFr   c                     t        t        | 
  |fi | |j                  d      xs i | _        t               | _        i | _        g | _        y )Nr  )	r   r  r   r  r  r   seen_closure_varsprivatesassigned_nodesr1  s      r+   r   zParallelStatNode.__init__    sO    .s=f= "::m4: "%
  !r-   c                 X   | j                   j                  |       d | _        | j                  rgg }t	               }| j                  j
                  D ]  }|j                  j                  |v r-t        | j                  d|j                  j                  z         |j                  |j                  j                         |j                  j                  dk(  r)|j                  j                  r|j                  | _        | j                  rB|j                  j                  dk(  r)|j                  j                  r|j                  | _        |j                  |        || j                  _        	 | j                  j                  |      | _        ni | _        | j                  j#                         D ]:  \  }}|| j$                  vrt        | j                  d|z         .t'        | ||       < y # t         $ r*}t        | j                  j                  d       Y d }~d }~ww xY w)Nz$Duplicate keyword argument found: %sr  	chunksizez=Only compile-time values may be supplied as keyword argumentszInvalid keyword argument: %s)r   r   r  r   r   r@   r   rB   r   r*   r   r   	is_pranger  r  rN  	Exceptionr   valid_keyword_argumentsr   )r   rO   pairsseendictitemr9  r   rz  s           r+   r   z%ParallelStatNode.analyse_declarations1   s   		&&s+;;E5D KK77 +<<%%-$(($JX\\M_M_$_`++,<<%%6#>>11*2..t'^^(:(:k(I#>>11)1LL*+ +0DKK'H"kk<<SA
 DK{{((* 	'GB555dhh > CDb#&		'  Hdkkoo (G H HHs   6 G6 6	H)? H$$H)c                    | j                   r | j                   j                  |      | _         | j                  r | j                  j                  |      | _        | j                  j                  |      | _        | j	                  |       | j                   j| j
                  rC| j
                  j                   -| j
                  j                  st        | j                  d       n| j
                  r-| j
                  j                  st        | j                  d       nj| j                   j                  j                  rJ| j                   j                  r4| j                   j                  |      dk  rt        | j                  d       | j                   j                         r | j                   j                  j                  r>| j                   j                  t         j"                  |      j%                  |      | _         | S )Nz-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)r  r   r  r   analyse_sharing_attributesparentr  r   r*   r9   r  r   rN  rC  rG   r  r   rJ   rc  r   s     r+   r   z$ParallelStatNode.analyse_expressionsW   sl   #//CCCHD>>!^^??DDNII11#6	'','{{t{{66B4;;K`K`dhh OPT[[%:%:dhh ]^""''..$$//$$77<Adhh PQ##--/43C3C3H3H3T3T#'#3#3#=#=))3$00>s0C  r-   c                 *   | j                   j                         D ]v  \  }\  }}| j                  r1| j                  s%|| j                  j                   v rt        |d       F| j                  s|rt        |d       ad}| j                  ||||       x y)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  r   r  is_parallelr	  r   propagate_var_privatization)r   rO   r  r*   rg  lastprivates         r+   r 	  z+ParallelStatNode.analyse_sharing_attributesp   s     !% 0 0 6 6 8 	JE9C~~d&6&6 DKK333#QR>>bcGH K,,UC[I%	Jr-   c                 L   ||f| j                   |<   |j                  j                  rt        |d       y| j                  rd| j
                  s/|| j                  j                  vr| j                  j                  }n| j                  }|r|s|r|j                  ||||       yyyy)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)	r  r9   rs  r   r  r	  r	  r  r	  )r   r  r*   rg  r	  r	  s         r+   r	  z,ParallelStatNode.propagate_var_privatization   s    j !#K0e::((#RS>>##T[[5L5L(L++ 2225#r;O "-v r-   c                    | j                   r| j                   j                  ||      S |j                  | j                  v r|j                  S |j                  j                  |j                  d      }| j                  j                  |j                         | j                  j                  |       | j                  j                  ||j                  f       |j                  |d|j                  d       ||_        y)zo
        Helper function that allocate a temporary for a closure variable that
        is assigned to.
        Tr  r  N)r	  _allocate_closure_tempr  r  r  r  r9   r   modified_entriesr  rf   )r   rl   r  r  s       r+   r	  z'ParallelStatNode._allocate_closure_temp   s    
 ;;;;55dEBB;;$000;;,,UZZ> 	""5;;/""5)$$eU[[%9:

45r-   c                 R   d}t        | j                  j                               D ]  \  }\  }}|r|r||k7  s|j                  j	                         }|s1|r|j                  d       d}|j                  |j                  d|j                  j                  |      d        y )NTz4/* Initialize private variables to invalid values */Fr  r  )sortedr  r   r9   invalid_valuerf   r  r  )r   rl   excluder  r  rg  r	  r	  s           r+   initialize_privates_to_nanz+ParallelStatNode.initialize_privates_to_nan   s    (.t}}/B/B/D(E 
	S$E$Bw%7*: %

 8 8 : 

 $7 8 %JJU[[-2ZZ-A-A--P R S
	Sr-   c                     | j                   }|j                  j                  }||j                  _        |j                  |       ||j                  _        |j	                         S r   )1begin_of_parallel_control_block_point_after_declsr  ownerr  r   )r   rl   rq  r   r	  s        r+   evaluate_before_blockz&ParallelStatNode.evaluate_before_block   sP    BB !!%%a(!{{}r-   c                 z    | j                   /|j                  d| j                  || j                         z         yy)zS
        Write self.num_threads if set as the num_threads OpenMP directive
        Nz num_threads(%s))r  r  r	  r   s     r+   put_num_threadsz ParallelStatNode.put_num_threads!  s:     'HH'$*D*DT4K[K[*\\] (r-   c                     g | _         t        | j                        D ]-  }|j                  s|j                  s| j                  ||       / y)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   rl   r  s      r+   declare_closure_privatesz)ParallelStatNode.declare_closure_privates
!  sG     !#D,,- 	9E!!U%5%5++D%8	9r-   c                     | j                   D ]R  \  }}|j                  |d|j                  d       |j                  j	                  |j                         ||_        T y)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.
        r  r  N)r		  rf   r  r  r  )r   rl   r  r  s       r+   release_closure_privatesz)ParallelStatNode.release_closure_privates!  sP     &*%:%: 	)!E>JJ^U[[ABNN''4(EK	)r-   c                    | j                   }d| _         | j                  rD|j                  j                         x| _        }g g }}t        |      D ]@  \  }}|j                  s|j                  r|j                  |       0|j                  |       B |r#|j                  ddj                  |      z         |r#|j                  ddj                  |      z         | j                  rzt        j                  g}	| j                  r9|	j                  | j                          |j                  d| j"                  z         |j                  ddj                  |	      z         yyy)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)z private(%s, %s, %s)z shared(%s))privatization_insertion_pointr	  r  stop_collecting_tempsr   r	  rG   rs  r  r  r   breaking_label_usedr
   parallel_whyerror_label_usedextendparallel_excpos_info)
r   rl   exclude_tempsr   r   r  firstprivatesr  r9   shared_varss
             r+   privatize_tempsz ParallelStatNode.privatize_temps"!  s/   
 ..-1*!%!E!E!GGDJ&("mH$Um *
d##t'>'>!((.OOD)	* ntyy'::;)DIIm,DDE''%223((&&t'8'89EE04==@Amdii&<<= ( r-   c                 :   | j                   r| j                  s|j                  d       t        | j                        D ]X  \  }}|j
                  r|j                  |d       &|j                  s3|j                  ||       |j                  d|z         Z y y y )Nz/* Clean up any temporaries */Fr  r	  )	r	  is_nested_prangerf   r	  r   rs  r^  rG   rQ  )r   rl   r  r9   s       r+   cleanup_tempszParallelStatNode.cleanup_temps@!  s    D$9$9JJ78$TZZ0 4
d**44TE4J%%$$T40JJ|d234 %:r-   c                 >   |j                         | _        |j                         | _        |j                  | _        |j                  d      |_        |j                          |j                         | _	        |j                         | _
        | j                  |       y)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;
        }
        returnrc  N)rv  rx  r  r  rN  r%  r  r  r%  %begin_of_parallel_control_block_pointr	  "undef_builtin_expect_apple_gcc_bugr   s     r+   !setup_parallel_control_flow_blockz2ParallelStatNode.setup_parallel_control_flow_blockK!  s    4  $335#335 $ 1 1 NNN9595I5I5K2AEAUAUAW>//5r-   c                 .    |j                         | _        y)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)r%  begin_of_parallel_blockr   s     r+   begin_parallel_blockz%ParallelStatNode.begin_parallel_blockp!  s     (,';';'=$r-   c                 F   | j                   }d| _         | j                  r|}|j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j	                  d	       |j                          |j                  d       | j                  |       |j                          |j                  d
       |j	                  d       |j                  d       yy)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_THREADSz#elsez{
z#ifndef _OPENMPz}
)r1	  r 	  rf   r*  put_safer*	  rI  )r   rl   
begin_codeend_codes       r+   end_parallel_blockz#ParallelStatNode.end_parallel_block{!  s     11
'+$  H-.%%t%<5634NN+,NN12NN7#e$##%NN12x(,,.NN,-e$NN12% !r-   c                    |j                         }|j                         }d| _        d| _        d| _        g | _        |j                         }|D ]=  }|j                  |      s| j                  xs ||j                  k7  | _        d| _        ? | j                  r|j                  |       t        |      D ]  \  }}|j                  |      s||j                  k(  }|j                  |       |r|sN||j                  k(  rd| _        | j                  |       |j                  dt        j                  |dz   fz         | j                  r | j                   r|s|j                  |       |j                  |        | j                  r~| j                   r.| j                  r"|j                  |       | j#                  |       |j                  |       |r0| j                  r#|j%                  dt        j                  z         yyyy)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_tempsrj  r  r  rM  r  rO  rK  fetch_parallel_exceptionrf   r
   r	  r  save_parallel_varsr  )	r   rl   should_flushsave_lastprivates_labeldont_return_label
all_labelsrm  r  is_continue_labels	            r+   trap_parallel_exitz#ParallelStatNode.trap_parallel_exit!  s    #'.."2 NN,##(  %&(#((*
   	+Eu%,0,D,D -I,1T5H5H,H (&*#		+ MM+,!*- 	1HAu??5) %)<)< <NN5! %6D,,,,0D)11$7

:)<)<a!e(DDE((T^^%56/0'	1* ~~$":":67''-NN,- 8 8!!"9F<O<O"OP !9| r-   c                    d| j                   z  }|j                  d|z         t        xj                   dz  c_         |j                          | j                  }d}t        | j                  j                               D ]  \  }\  }}|r|j                  j                  r"|j                  j                         }d|z  }	|j                  }
|dz  }|j                  j                         }|rd|j                  j                  |      z   }nd}|j                  |d|	|d	       |j                  |	d|
d	       | j                  j!                  |	|
f        |j#                          y
)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   z__pyx_parallel_temp%dr  r   rZ   r  N)critical_section_counterr  r  r  r-	  r	  r  r   r9   rG   r  r  r	  r  rf   r?	  r  r  )r   rl   section_namer   
temp_countr  rg  r	  	type_decl
temp_cnameprivate_cnamer	  ro  s                r+   rA	  z#ParallelStatNode.save_parallel_vars!  s@    79V9VV4|CD11Q6166
(.t}}/B/B/D(E 	L$E$B%**"8"8

99;I0:=J!KKM!OJ!JJ446Muzz33MBBGG)Z>? JJZ?@''..
M/JK+	L. 	r-   c                 T   |j                          |j                  d       |j                  dt        j                  z         |j                  dt        j                  z         |j                  d| j                  z         t        t        | j                  | j                         }d|j                  _        |j                  dt        |      z         |j                  t        j                         |j                  d       |j                          |j!                          y)	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=	  z
if (!%s) {z'__Pyx_ErrFetchWithState(&%s, &%s, &%s);%s = %s; %s = %s; %s = %s;r  N)r  r*  r  r
   parallel_exc_typerf   r"	  r   r  parallel_pos_infor#	  r  uses_error_indicatorr  r  rI  r  r   rl   r#	  s      r+   r@	  z)ParallelStatNode.fetch_parallel_exception
"  s    6 	T21F4L4LLM

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

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

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

	 	$$&r-   c                    |j                          |j                  d       |j                  t        j                         |j                  d| j                  z         t        t        | j                  | j                         }|j                  dt        |      z         |j                          |j                          y)zRe-raise a parallel exceptionTr  r,  rP	  N)r  r*  r  r
   rQ	  rf   r"	  r   r  r#	  rR	  r  rI  r  rT	  s      r+   restore_parallel_exceptionz+ParallelStatNode.restore_parallel_exception8"  s    T2112

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

/%/AB$$&r-   c                 l    |j                  | j                  | j                  | j                  fz          y)z
        Restore all old labels. Call this before the 'else' clause to for
        loops and always before ending the parallel control flow block.
        N)rm  rx  r%  r  r   s     r+   restore_labelszParallelStatNode.restore_labelsE"  s8    
 	D00D4I4I484H4H4J J 	Kr-   c                 $   | j                   }d| _         d| _        | j                  6| j                  j                  |       | j                  j	                  |       | j
                  r|j                  d| j                  z         |j                  d| j                  z         |j                  dt        j                  z         |j                  d       |j                  dt        j                  z         |j                  d       |r| j                  }n| j                  }|r|j                  dt        j                  z         |j                  d	t        j                  z         |j                  dt        j                  z         | j                  D ]  \  }}|j                  |d
|d        |j                  dt        j                  z         |r,|j                  d       |j!                  |j"                         |r,|j                  d       |j!                  |j$                         |r,|j                  d       |j!                  |j&                         | j
                  r\|j(                  j+                  t,               |j                  d       | j/                  |       |j!                  |j0                         |j                  d       |j                  d       |j3                          | j5                  |       y)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.
        Nz*const char *%s = NULL; int %s = 0, %s = 0;z,PyObject *%s = NULL, *%s = NULL, *%s = NULL;r	  zg/* This may have been overridden by a continue, break or return in another thread. Prefer the error. */z%s = 4;r  zint %s;rI  r  r  rj  z    case 1: z    case 2: z    case 3: z    case 4:)r-	  r	  r  r  r  r 	  rf   rR	  r"	  r
   rQ	  r	  r>	  r	  r?	  r  rM  r  r  rN  r  r;  rR  rV	  rK  r  "redef_builtin_expect_apple_gcc_bug)	r   rl   break_	continue_return_r   r>	  rM	  rN	  s	            r+   end_parallel_control_flow_blockz0ParallelStatNode.end_parallel_control_flow_blockM"  sp    66592AE>'33D9''-   GG@4CYCYYZGGBTEVEVVWJJf6668JJ Q RJJy6#6#667JJ !00N!55NGGI 3 334GGI 3 334JJf1113 .2-H-H E)
M


CDE JJ)<)<<=(d112(d../(d//0$$  112PQ

=)//5d../JJsOJJ 	//5r-   z((defined(__APPLE__) || defined(__OSX__))zQ(defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))))r  z && r  c                 T    | j                   s|j                  | j                         yy)z]
        A bug on OS X Lion disallows __builtin_expect macros. This code avoids them
        N)r	  undef_builtin_expectredef_conditionr   s     r+   r.	  z3ParallelStatNode.undef_builtin_expect_apple_gcc_bug"  s$     {{%%d&:&:; r-   c                 T    | j                   s|j                  | j                         y y r   )r	  redef_builtin_expectra	  r   s     r+   rZ	  z3ParallelStatNode.redef_builtin_expect_apple_gcc_bug"  s"    {{%%d&:&:; r-   r   )rt   r  )FFF)5rb   r   r   r   r   r   r  r)	  r 	  r  r  r
   rQ	  parallel_exc_valueparallel_exc_tbr"	  parallel_filenameparallel_linenoparallel_clinenorR	  r  r  r  r#	  rI	  r   r   r   r 	  r	  r	  r	  r	  r	  r	  r	  r'	  r*	  r/	  r2	  r;	  rG	  rA	  r@	  rV	  rX	  r^	  buggy_platform_macro_conditionhave_expect_conditionra	  r.	  rZ	  r   r   s   @r+   r  r    sV   < =)KDIKI 	  !!L 	   	H  !!"$'L2J4EPN,S
^9	)><	4#6J	>3BAQF)V,\K @EM6` &P"[&DF[\O<<r-   r  c                   2     e Zd ZdZdgZdZ fdZd Z xZS )ParallelWithBlockNodezI
    This node represents a 'with cython.parallel.parallel():' block
    r  Nc                 r    t         t        |   |       | j                  rt	        | j
                  d       y y )Nz=cython.parallel.parallel() does not take positional arguments)r   rl	  r   ri   r   r*   r3  s     r+   r   z*ParallelWithBlockNode.analyse_declarations"  s2    #T?D99$(( 3 4 r-   c                 l   | j                  |       | j                  |       |j                  d       |j                  d       | j                  re| j                  D cg c]$  }|j
                  j                  s|j                  & }}|j                  ddj                  t        |            z         |j                         | _        | j                  |       |j                  d       |j                  d       |j                          | j                  |       | j                  |       |j                   j#                          | j$                  j'                  |       | j)                  |       | j+                  |       | j-                  |       |j/                          |j1                  |j2                        }|j1                  |j4                        }|j1                  |j6                        }| j9                  |       | j;                  ||||       | j=                  |       y c c}w )Nr4	  z#pragma omp parallel zprivate(%s)r   r   r6	  )r[	  r\	  r]	  )r	  r/	  rf   r  r  r9   rG   r  r   r	  r%  r	  r	  r  r2	  r	  r  start_collecting_tempsr   r
  rG	  r'	  r;	  r  r  r  r  rN  rX	  r^	  r	  )r   rl   r9  r  r\	  r[	  r]	  s          r+   r
  z-ParallelWithBlockNode.generate_execution_code"  s   %%d+..t4

#$()==)- 3A vv11  3H 3HH]TYYvh/?%@@A-1-A-A-C*T"

2

)*!!$'''---/		))$/%T"%OOD$7$78	!1!12//$"3"34D!,,T&7@5< 	- 	> 	%%d+93s   )H1)	rb   r   r   r   r  r  r   r
  r   r   s   @r+   rl	  rl	  "  s!      -oK4$,r-   rl	  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   r  r?  ri   r  r  NT)scheduler  r  r  c                 N    t        t        | 
  |fi | t        |      | _        y r   )r   rq	  r   r3  r  )r   r*   rj   ra   s      r+   r   zParallelRangeNode.__init__"  s$    /<t<$S)r-   c                    t         t        |   |       | j                  j	                  |       | j
                  | j
                  j                  |       | j                  rt        | j                        dkD  rt        | j                  d       y t        | j                        dk(  r| j                  \  | _
        nQt        | j                        dk(  r| j                  \  | _        | _
        n| j                  \  | _        | _
        | _        t        | j                  d      r | j                  j                  d      | _        | j                  dvr$t        | j                  d| j                         y y )	Nr%   z0Invalid number of positional arguments to pranger   r#   decodeascii)Nstaticdynamicguidedruntimez%Invalid schedule argument to prange: )r   rq	  r   r  r  r?  ri   r^   r   r*   rW  ro   r  r  rr	  ru	  r3  s     r+   r   z&ParallelRangeNode.analyse_declarations"  s   ;C@..s3'11#6yyC		NQ.$((NOtyy>QJDI^q $(II!DJ	/3yy,DJ	494==(+ MM009DM== PP$((XY Qr-   c                 P	   |j                   }| j                   rd|_         | j                  t        | j                  d       | S | j                  j	                  |      | _        | j                  j
                  j                  sm| j                  j
                  j                  s7t        | j                  j                  d| j                  j
                  z         t        j                  | _
        n| j                  j
                  | _
        d| _        | j                  | j                  | j                  f}t        || j                        D ]  \  }}|	|j!                  |       |j
                  j                  st        |j                  d|z         J|j"                  s|j%                  |      }t'        | ||       t        j(                  | j                  |j
                        | _
         | j*                   | j*                  j-                  |      | _        t/        | j                  d      r9| j                  j                  d f| j0                  | j                  j2                  <   t4        t6        | [  |      }|j8                  r|j:                  s!t        |j8                  j                  d       n|j:                  dk(  r!t        |j8                  j                  d	       nt|j8                  j
                  j<                  rT|j8                  j"                  r>|j8                  j?                  |      d
k  r t        |j8                  j                  d       |j8                  jA                  t        jB                  |      j%                  |      |_        |j                   r||_         |jD                  xr |jD                  jF                  |_$        |jH                  r|}|jD                  rE|jD                  jF                  r/|jD                  }|jD                  r|jD                  jF                  r/|j0                  jK                  |j0                         |jL                  jK                  |jL                         |jN                  jQ                  |jN                         |S )NTz/prange() can only be used as part of a for loopzMust be of numeric type, not %s)ro   rW  r  z%s argument must be numericr  z$Must provide schedule with chunksizerz	  z,Chunksize not valid for the schedule runtimer   zChunksize must not be negative))r  r  r   r*   r   r9   r!  rG   r   r  
index_typer"  ro   rW  r  r  r   r   rc  r   r  r?  r   r  r  r  r   rq	  r  rr	  r  rN  r  rJ   r	  r  r)	  r   r  r  r!	  )r   rO   r  start_stop_steprk   rF   r	  ra   s          r+   r   z%ParallelRangeNode.analyse_expressions#  sd   II	::CI;;$((MNKkk66s;{{** ;;##//dkkoo7$++:J:JJL )::DO"kk..DO -
**dii:otzz: 	0JD$""3'yy++$(($AD$HI..s3DD$- #-"@"@OOTYY#0	0  '#//CCCHD 4;;(26++//42GDT[[../&A#F>>==dnn((<>)+dnn((DF..%%,,..++..33C8A=dnn((*JK!^^55%%s,,:N3,? N ::!CI $ E0E0E  F--FMM$;$; --FMM$;$; %%d&6&67OO""4==1!!(()<)<=r-   c                     d}| j                   | j                  | j                  | j                  f}t	        ||      D ]8  \  }}|	|j
                  j                  s t        |j                  d|z         : y )N)ro   rW  r  r  z6%s may not be a Python object as we don't have the GIL)	ro   rW  r  r  r  r9   rG   r   r*   )r   rO   r"  nodesrF   rk   s         r+   r   zParallelRangeNode.nogil_checkk#  sp    1

DIItyy$++=eU+ 	CJD$DII$9$9dhh !;=A!B C	Cr-   c                    | j                  |       | j                  j                  j                  }|| j                  j                  j                         d}| j                  | j                  | j                  f}d}t        || j                  |      D ]N  \  }}}||}	n>|j                  r|j                         }	n!|j                  |       |j                         }	|	||<   P |j                  j!                  | j"                  d      |d<   |j                  j!                  | j"                  d      |d<   |j%                  d|z         | j'                  |       |j%                  d|z         |j%                  d	|z         |j)                          | j+                  ||       |j-                          | j/                  |       | j0                  rz| j2                  r"|j5                  d
t6        j8                  z         |j)                          |j%                  d       | j0                  j;                  |       |j-                          | j=                  |       || j>                  fz   D ]'  }
|
|
jA                  |       |
jC                  |       ) |j                  jE                  |d          |j                  jE                  |d          | jG                  |       y)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
        )r  rk  )r  r  r  NFr  nstepszif ((%(step)s == 0)) abort();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	  r  r  r  r9   r  ro   rW  r  r  r"  r   r  r  r   r  r  r|	  rf   r/	  r  generate_loopr  rX	  r?  r	  r  r
   r	  r
  r^	  r  r  r  r  r	  )r   rl   target_index_cnamefmt_dictr}	  defaultsrk   rF   rM  r   r  s              r+   r
  z)ParallelRangeNode.generate_execution_codes#  sw   P 	%%d+ "[[..44
 );;++BBD
 **dii: #&

H#M 		$D$| 88:--d3#HTN		$ 44T__eL!^^99$//5Q 	

2X=>..t4 	

hksst 	

(8344*D!'')<)<<=JJ|$44T:NN 	,,T2 $t~~&77 	&D++D1%	&
 	##HSM2##HX$67%%d+r-   c                    | j                   r|j                  d       n|j                  d       | j                  s=|j                  d       |j	                         | _        | j                  j
                  }n|j                  d       |j	                         | _        | j
                  }|j                  d       |j                  d       |j                          | j                  |       | j                   r|j                  d       n|j                  d       |j                  d       t        | j                  j                               D ]  \  }\  }}|rm|dv ri|| j                  j                  k7  rP|j                  j                  rt!        | j"                  d       V|j                  d	|d
|j$                  d       y|| j                  j                  k(  r=|j                  d|j$                  z         |j                  d|j$                  z         |j                  j                  r|rd}nd}|j                  d|d|j$                  d        | j&                  rO| j(                  r d| j+                  || j(                        z  }nd}|j                  d| j&                  |d       | j-                  |       |j                  d       |j                  d       |j                  d|z         |j                          |j	                         }	|j                          |j                  d|z         | j/                  || j                  j                         | j                  r&| j                   s|j0                  j3                          | j4                  j7                  |       | j9                  |d       | j                  r| j                   s| j;                  |       | j<                  r"|	j                  dt>        j@                  z         |jC                          |jC                          | j                  r"| jE                  |       |jC                          y y )Nz#if 0r4	  z#pragma omp forz#pragma omp parallelr   r6	  z+*-&^|z#Python objects cannot be reductionsz reduction(:r  r	  z lastprivate(%s)r	  r  rZ   r  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)rB	  r	  )#r)	  rf   r	  r  r%  r	  r	  r  r2	  r	  r  r   r  r  r9   rG   r   r*   r  rr	  r  r	  r	  r	  r  ro	  r   r
  rG	  r'	  r	  r
   r	  r  r;	  )
r   rl   r	  reduction_codepointr  rg  r	  r  r  guard_around_body_codepoints
             r+   r	  zParallelRangeNode.generate_loop#  st     JJwJJ'(HH&'151E1E1GD."&++"K"KHH+,151E1E1GD."&"D"DJJrNJJ-. %%d+$$

7#

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

2

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

RU]]^''dkk6G6G'HD$9$9NN113		))$/48D$9$9  &## (--mf>Q>Q.QR##D)NN r-   )rb   r   r   r   r   r   r  r?  ri   ro   rW  r  r  r  rr	  r  r   r   r   r   r
  r	  r   r   s   @r+   rq	  rq	  "  sn     K *.-D-6-K$ED4IEHO*
Z.SjCq,fbr-   rq	  c                   4    e Zd ZdZdgZd Zd Zd Zd Zd Z	y)	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
    rk   c                    | j                   j                  |       | j                   }t        |t              r|j                  j
                  d   }t        |t              | _        t        |t        t        f      }|j                  }| j                  rf| j                  |_        | j                  |_        d|_        |j                  r0d|j                  v r!| j                  |j                        |_        y y y |r#| j                  x|_        |j                   _        y |j"                  }| j                  |_        | j                  dz   |j                   _        t&        j(                  | j                  z   |j                   _        | j                  dz   |j                   _        |j                   j,                  |j                   j"                  _        |j                   j,                  |j0                  _        | j                  dz   |_        |j4                  j7                         D ]^  \  }}|j                  r | j                  |j                        |_        |j                  s?| j                  |j                        |_        ` y )Nr   Tr[   _obj_typerW  )rk   r   r_   r   r   r  r  is_functionr~  r  r  r  r  r  rl  r  r9   r  r  r
   typeobj_prefixr  r7  r  r  rj  r  r   )r   rO   rk   is_struct_or_enumr9  r  rF   r  s           r+   r   z'CnameDecoratorNode.analyse_declarations[$  s   		&&s+yyd2399??1%D%dK8&t.C\-RSJJjjAG::ALAF~~#"7!%Q^^!< #8~%)ZZ/AGafflJJEjjAG%)ZZ&%8AFF"#)#8#84::#EAFF #'::#7AFF +,66+?+?AFFLL("#&&"6"6AMM!%c!1E$}}224 Ie##'+{{5;;'?E$%%)-U5G5G)HE&	Ir-   c                 T    d|v r|j                  d      d   }| j                  d|S )Nr[   r   rW  )r  r  )r   r  s     r+   r  zCnameDecoratorNode.mangle$  s+    %<KK$R(E**e,,r-   c                 F    | j                   j                  |      | _         | S r   )rk   r   r   s     r+   r   z&CnameDecoratorNode.analyse_expressions$  r  r-   c                    | j                   r|j                  r|j                  d   }t        | j                  t
              r| j                  j                  |dd       ncddlm} | j                  j                  }|j                  }|j                  |_
        |j                  ||j                         |d       ||_
        | j                  j                  ||       y)	z=Ensure a prototype for every @cname method in the right placeutility_code_protoFTr  r   )
ModuleNode)
definitionN)r	  r  r  r_   rk   r  r  r   r	  r  r  r  generate_cfunction_declarationr  r  )r   rO   rl   h_coder	  r  r  s          r+   r  z0CnameDecoratorNode.generate_function_definitions$  s     4 4%%&:;F$))W-		225T 3 C )		#..99$$&#	 : % $		//T:r-   c                 :    | j                   j                  |       y r   )rk   r
  r   s     r+   r
  z*CnameDecoratorNode.generate_execution_code$  r  r-   N)
rb   r   r   r   r   r   r  r   r  r
  rt   r-   r+   r	  r	  K$  s+     (K$IL-;20r-   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PrintOnerD  r.  RaiseExceptionGetExceptionSwapExceptionSaveResetExceptionAddTracebackzR
static PyObject *__Pyx_GetExceptionTuple(PyThreadState *__pyx_tstate); /*proto*/
a1  
static PyObject *__Pyx_GetExceptionTuple(CYTHON_UNUSED PyThreadState *__pyx_tstate) {
    PyObject *type = NULL, *value = NULL, *tb = NULL;
    if (__Pyx_GetException(&type, &value, &tb) == 0) {
        PyObject* exc_info = PyTuple_New(3);
        if (exc_info) {
            Py_INCREF(type);
            Py_INCREF(value);
            Py_INCREF(tb);
            PyTuple_SET_ITEM(exc_info, 0, type);
            PyTuple_SET_ITEM(exc_info, 1, value);
            PyTuple_SET_ITEM(exc_info, 2, tb);
            return exc_info;
        }
    }
    return NULL;
}
)r=  implrequiresrt   r   )
__future__r   r  r  r  r   r   r   	itertoolsr   r   r   Errorsr   r	   r   r   r
   r   r   r   r   Symtabr   r   r   r   r   r   r   r}   r   StringEncodingr   r   r   r   Pythranr    r!   r"   Utilsr$   rN  r;   r   r<   r,   r7   rW   ru   r9   rw   r   r   r   r   r   r  r-  r2  rG  rL  ra  rm  rs  r  r  r  r  rM   r  r(  r>  r  rU  rY  r_  rf  r6  r~  r  r  r  r  r  r  r  r  r  r6  r-  rB  rE  rH  rK  r  r  r  r  r  r   r(  rv  r@  rH  r  rB  r  r  r  r  r3  r  r  r  r  r  r)  r2  r=  rR  r[  rf  rp  rr  r|  r  r  r  r  r  r  r  r  r  r<  rZ  r  r  rt  r  r  r  utility_code_for_importsr  r  r  r  r  rl	  rq	  r	  gcc_branch_hintsbranch_prediction_macrosr  r  r  rR  r!  rM  r  r!  traceback_utility_code get_exception_tuple_utility_codert   r-   r+   <module>r	     s  
 '   86 8f 86 88%+85;8DJ8W]8$8288EK8Z`8 #)8 8>8 $	8 28	8 HN	8
 !8
 178     ? ?    2U U U  )    D D ! A!M$KM64,^:
N 
NKT K0 iO6 iO iOV(*T (*T: :" 4 " J%t %* !X  !Fd ,/ 6i ii i)k? )kX~M/ ~MB
f? 
fq!4 q!h	!D 	!D \)- \)|;m ;B- ,N Nb	= 	 $$;M $;N
-] 
-jH( jHZ*H *ZU!() U!p..8 ..b6x 6.8 BV
.(I V
.rW; Wt<D < D  Kk K\g*[ g*T5<w 5<p# 
!< !
< 
u 7 u po od	8Y 	J!\ J!ZL%L L%^!8 !: $8 $=!8 =!@,X ,4m > m `	c ^ c L, ^ , ^DQN DQN@&H @&F&8 &R5( 5p	8 	Il I,H , +x + p&X p&fe&H e&PSh S<<&X <&~@, @,F&!4 &!R!!X !!H,,X ,,^	v 	9,Hh 9,xYD Yx9 4 9 x*c!Xx c!L,N ,?~ ?(l,h l,^d8 dN >  Bg, g,Tc!t c!L]+ ]+@	0 E) EP+( +24K 4( [Z6  FE	 (h (VL( L^Y% Y%x4 J<x J<Z3,, 3,ld( dNZ0 Z0F 
   0//F 3K33JM  "9!8!89Ln!] ,[,,-=~N 4[44^^T 5k55o~V 6{667K^\ 000P  $/$ ))5$+  r-   