o
    ÕjÈñ ã                   @   sR	  d dl Z e jdi de“de“de“de“de“de“de“d	e“d
e“de“de“de“de“de“de“de“de“de“Ž d dlZd dlmZ d dlZddlmZ ddl	m
Z
mZmZmZmZ ddlmZ ddlmZ ddlmZ ddlmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZ ddl m!Z! ddl"m#Z# ddlm$Z$ dd lm%Z% dd!lm&Z& dd"l'm(Z(m)Z)m*Z* d#d$l+m,Z,m-Z- d%d&hZ.G d'd(„ d(ej/ƒZ0d)d*„ Z1d+d,„ Z2d-d.„ Z3G d/d0„ d0e4ƒZ5G d1d2„ d2e4ƒZ6G d3d4„ d4ƒZ7d5d6„ Z8e8G d7d8„ d8ƒƒZ9G d9d:„ d:e9ƒZ:G d;d<„ d<ƒZ;G d=d>„ d>e9ƒZ<G d?d@„ d@e9ƒZ=G dAdB„ dBe=ƒZ>G dCdD„ dDe9ƒZ?G dEdF„ dFe?ƒZ@G dGdH„ dHe?ƒZAG dIdJ„ dJe?ƒZBG dKdL„ dLeBƒZCG dMdN„ dNeBƒZDG dOdP„ dPe?ƒZEG dQdR„ dRe?ƒZFG dSdT„ dTe?ƒZGG dUdV„ dVe9ƒZHG dWdX„ dXe9ƒZIG dYdZ„ dZe9ƒZJG d[d\„ d\eIƒZKG d]d^„ d^eIƒZLG d_d`„ d`eIƒZMG dadb„ dbeIƒZNG dcdd„ ddeIƒZOG dedf„ dfeIƒZPG dgdh„ dheIƒZQG didj„ djeIƒZRG dkdl„ dle=ƒZSG dmdn„ dne=ƒZTG dodp„ dpeTe;ƒZUG dqdr„ dre=ƒZVG dsdt„ dte=ƒZWG dudv„ dve=ƒZXG dwdx„ dxe=e;ƒZYG dydz„ dzeYƒZZG d{d|„ d|e9ƒZ[G d}d~„ d~e9ƒZ\G dd€„ d€eYƒZ]G dd‚„ d‚eYƒZ^G dƒd„„ d„e]ƒZ_G d…d†„ d†e_ƒZ`G d‡dˆ„ dˆe`ƒZaG d‰dŠ„ dŠe`ƒZbG d‹dŒ„ dŒe]ƒZcG ddŽ„ dŽe=ƒZdG dd„ de=e;ƒZeG d‘d’„ d’eeƒZfG d“d”„ d”eeƒZgG d•d–„ d–e=ƒZhG d—d˜„ d˜e=ƒZiG d™dš„ dše=ƒZjG d›dœ„ dœe=ƒZkG ddž„ dže=ƒZlG dŸd „ d e=ƒZmG d¡d¢„ d¢emƒZnG d£d¤„ d¤emƒZoG d¥d¦„ d¦emƒZpG d§d¨„ d¨emƒZqG d©dª„ dªe=ƒZrG d«d¬„ d¬e=ƒZsG d­d®„ d®e=ƒZtG d¯d°„ d°e=ƒZuG d±d²„ d²e<ƒZvG d³d´„ d´e=ƒZwG dµd¶„ d¶e=ƒZxG d·d¸„ d¸e=ƒZyG d¹dº„ dºe=ƒZzG d»d¼„ d¼e=ƒZ{G d½d¾„ d¾e=ƒZ|G d¿dÀ„ dÀe=ƒZ}G dÁdÂ„ dÂe9ƒZ~G dÃdÄ„ dÄe=ƒZG dÅdÆ„ dÆe=ƒZ€G dÇdÈ„ dÈƒZG dÉdÊ„ dÊee=ƒZ‚G dËdÌ„ dÌe9ƒZƒG dÍdÎ„ dÎe9ƒZ„dÏdÐ„ Z…G dÑdÒ„ dÒee=ƒZ†G dÓdÔ„ dÔe†ƒZ‡G dÕdÖ„ dÖe†ƒZˆG d×dØ„ dØee=ƒZ‰G dÙdÚ„ dÚe=ƒZŠG dÛdÜ„ dÜemƒZ‹G dÝdÞ„ dÞe=ƒZŒG dßdà„ dàe9ƒZG dádâ„ dâe=ƒZŽG dãdä„ däeŽƒZG dådæ„ dæeƒZG dçdè„ dèe=ƒZ‘G dédê„ dêe‘ƒZ’G dëdì„ dìeŽƒZ“G dídî„ dîe=ƒZ”G dïdð„ dðeŽƒZ•G dñdò„ dòe=e7ƒZ–dódô„ Z—dõdö„ d÷dö„ e—døœZ˜dùdú„ Z™G dûdü„ düe=ƒZšG dýdþ„ dþe=ƒZ›G dÿd „ d e=ƒZœG dd„ de9ƒZG dd„ de=eƒZžG dd„ dežƒZŸG dd„ dežƒZ G d	d
„ d
e=ƒZ¡G dd„ de9ƒZ¢e%j£rddZ¤ndZ¤e! ¥dd¡Z¦e! ¥dd¡Z§e! ¥dd¡Z¨e! ¥dd¡Z©e! ¥dd¡Zªe! ¥dd¡Z«e! ¥dd¡Z¬e! ¥dd¡Z­dS (  é    NÚosÚcopyÚchainÚBuiltinÚerrorÚwarningÚNamingÚ
PyrexTypesÚpy_object_typeÚModuleScopeÚ
LocalScopeÚClosureScopeÚStructOrUnionScopeÚPyClassScopeÚCppClassScopeÚUtilityCodeÚEncodedStringÚ
error_type)r   é   )r   )r   r   ÚInternalErrorÚCompileErrorÚCannotSpecialize)r   )r	   )Ú	TypeSlots)r
   r   )r   r   r   ÚPropertyScoper   r   r   ÚTemplateScopeÚGeneratorExpressionScopeÚCppScopedEnumScopeÚpunycodify_name)r   ©r   )ÚFuture)ÚOptions)Ú
DebugFlags)Úhas_np_pythranÚpythran_typeÚis_pythran_bufferé   )Úadd_metaclassÚstr_to_numberÚ__init_subclass__Ú__class_getitem__c                   @   s   e Zd ZdZdZdZdS )Ú
NoGilStater   r   r%   N)Ú__name__Ú
__module__Ú__qualname__ZHasGilÚNoGilÚ
NoGilScope© r0   r0   úV/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/Cython/Compiler/Nodes.pyr*   (   s    r*   c                 C   s   | d   ¡ | d fS ©Nr   r   )Zget_filenametable_entry©Úposr0   r0   r1   Úrelative_position0   s   r5   c                 C   s‚   t js|S dt| ƒ }|d u rt|ƒS |j}|d ur-z| |¡ W n ty,   d }Y nw |s4t|ƒ}nt|d | ƒ}||_|S )NzFile: %s (starting at line %s)Ú
)r    Zembed_pos_in_docstringr5   r   ÚencodingÚencodeÚUnicodeEncodeError)r4   Ú	docstringZpos_liner7   Údocr0   r0   r1   Úembed_position4   s"   ÿ
r<   c                    ó   ‡ ‡fdd„}|S )Nc                     sÎ   t | ƒdkr`t| d ˆ ƒr`| d d… \}}dd|j |jjˆj|jdd … f }| ¡ }|jj 	¡ }| jd7  _ˆ| i |¤Ž}| jd8  _||jj 	¡ kr^| 
| ddd¡¡ | 
|¡ |S ˆ| i |¤ŽS )Nr   r%   z(                    /* %s -> %s.%s %s */ú é   ú->z<-)ÚlenÚ
isinstanceZ
call_levelÚ	__class__r+   r4   Úinsertion_pointÚbufferÚstreamÚtellÚputlnÚreplace)ÚargsÚkwdsÚnodeÚcodeÚmarkerrD   ÚstartÚres©Úcodewriter_classÚfuncr0   r1   ÚfO   s$   ü
zwrite_func_call.<locals>.fr0   )rS   rR   rT   r0   rQ   r1   Úwrite_func_callN   s   rU   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚVerboseCodeWriterc                    s\   ddl m} ddlm} t|ƒ}| ¡ D ]\}}t||ƒr$t||ƒ||< qtƒ  	| |||¡S )Nr   ©ÚFunctionTyper   )ÚCCodeWriter)
ÚtypesrX   ÚCoderY   ÚdictÚitemsrB   rU   ÚsuperÚ__new__)ÚclsÚnameÚbasesÚattrsrX   rY   ÚmnameÚm©rC   r0   r1   r_   k   s   
€zVerboseCodeWriter.__new__)r+   r,   r-   r_   Ú__classcell__r0   r0   rf   r1   rV   h   s    rV   c                       s,   e Zd ZdZeh d£ƒZ‡ fdd„Z‡  ZS )ÚCheckAnalyserszCMetaclass to check that type analysis functions return a node.
    >   Úanalyse_expressionsÚanalyse_typesÚanalyse_target_typesc                    sb   ddl m} dd„ }t|ƒ}| ¡ D ]\}}t||ƒr'|| jv r'|||ƒ||< qtƒ  | |||¡S )Nr   rW   c                    r=   )Nc                     s,   ˆ | i |¤Ž}|d u rt dˆ| |f ƒ |S )Nz%s %s %s)Úprint)rJ   ÚkwargsÚretval©rS   ra   r0   r1   Úcall   s   z3CheckAnalysers.__new__.<locals>.check.<locals>.callr0   )ra   rS   rp   r0   ro   r1   Úcheck€   s   z%CheckAnalysers.__new__.<locals>.check)rZ   rX   r\   r]   rB   Úmethodsr^   r_   )r`   ra   rb   rc   rX   rq   rd   re   rf   r0   r1   r_   ~   s   €zCheckAnalysers.__new__)r+   r,   r-   Ú__doc__Ú	frozensetrr   r_   rg   r0   r0   rf   r1   rh   u   s    rh   c                   @   ó   e Zd Zdd„ ZdS )ÚCopyWithUpTreeRefsMixinc                 C   s\   | j }| |¡}| j ¡ D ]\}}|| jv r| t|ƒ|¡}nt ||¡}t	|||ƒ q|S ©N)
rC   r_   Ú__dict__r]   Úuptree_ref_attrsÚgetÚidr   ÚdeepcopyÚsetattr)ÚselfÚmemor`   ÚresultÚkÚvr0   r0   r1   Ú__deepcopy__   s   

z$CopyWithUpTreeRefsMixin.__deepcopy__N)r+   r,   r-   rƒ   r0   r0   r0   r1   rv      s    rv   c                 C   s   t jr	ttƒ| ƒS | S rw   )r!   Zdebug_trace_code_generationr&   rV   )r`   r0   r0   r1   Ú_with_metaclass£   s   r„   c                   @   s¶   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d„ ZdZdZdZd dd„ZdZd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd!dd„Zd"dd„ZdS )#ÚNoder   FNc                 K   s   || _ | j |¡ d S rw   )r4   rx   Úupdate)r~   r4   Úkwr0   r0   r1   Ú__init__Ê   s   zNode.__init__Z	Operationc                 C   ó   t | jd| j ƒ d S )Nz%s not allowed without gil)r   r4   Úgil_message©r~   Úenvr0   r0   r1   Ú	gil_errorÓ   ó   zNode.gil_errorc                 C   s   |  ¡ s
|  ¡  d S d S rw   )Úis_cppÚ	cpp_errorr‹   r0   r0   r1   Ú	cpp_checkØ   ó   ÿzNode.cpp_checkc                 C   r‰   )Nz%s only allowed in c++)r   r4   Úcpp_message©r~   r0   r0   r1   r   Ü   rŽ   zNode.cpp_errorc                 C   sD   t   | ¡}|jD ]}t||ƒ}t|tƒrt||dd„ |D ƒƒ q|S )ac  Clone the node. This is defined as a shallow copy, except for member lists
           amongst the child attributes (from get_child_accessors) which are also
           copied. Lists containing child nodes are thus seen as a way for the node
           to hold multiple children directly; the list is not treated as a separate
           level in the tree.c                 S   s   g | ]}|‘qS r0   r0   ©Ú.0Úxr0   r0   r1   Ú
<listcomp>é   s    z#Node.clone_node.<locals>.<listcomp>)r   Úchild_attrsÚgetattrrB   Úlistr}   )r~   r€   ÚattrnameÚvaluer0   r0   r1   Ú
clone_nodeß   s   



€zNode.clone_nodec                 C   ó   d S rw   r0   r‹   r0   r0   r1   Úanalyse_declarations  ó   zNode.analyse_declarationsc                 C   ó   t d| jj ƒ‚)Nz*analyse_expressions not implemented for %s©r   rC   r+   r‹   r0   r0   r1   ri     ó   ÿzNode.analyse_expressionsc                 C   r¢   )Nz$generate_code not implemented for %sr£   ©r~   rM   r0   r0   r1   Úgenerate_code  r¤   zNode.generate_codec                 C   s   t | tƒr| j |¡ d S d S rw   )rB   Ú	BlockNodeÚbodyÚannotater¥   r0   r0   r1   r©     s   
ÿzNode.annotatec              	   C   s’   z| j W S  tyH   | j}| js|| _ | Y S | jD ]%}t| |ƒ}|d u r'qt|tƒr9|D ]	}t|| ¡ ƒ}q.qt|| ¡ ƒ}q|| _ | Y S w rw   )	Z_end_posÚAttributeErrorr4   r™   rš   rB   r›   ÚmaxÚend_pos)r~   r4   ÚattrÚchildÚcr0   r0   r1   r¬     s&   


ÿðzNode.end_posr3   éd   c           
   	      sè   ˆ dkrdS ˆdu rt ƒ ‰t| ƒˆv rd| jjt| ƒf S ˆ t| ƒ¡ ‡ ‡‡‡fdd„‰‡fdd„| j ¡ D ƒ}t|ƒdkrId	| jjt| ƒf S d
| }d| jjt| ƒf }|D ]\}}	|d||ˆ|	|d ƒf 7 }qY|d| 7 }|S )zYDebug helper method that returns a recursive string representation of this node.
        r   z<...nesting level cutoff...>Nz<%s (0x%x) -- already output>c                    sN   t | tƒr|  ˆ ˆˆd ˆ¡S t | tƒr#dd ‡‡ fdd„| D ƒ¡ S t| ƒS )Nr   z[%s]ú, c                    s   g | ]}ˆ |ˆƒ‘qS r0   r0   )r–   Úitem)Ú
dump_childÚlevelr0   r1   r˜   8  ó    z1Node.dump.<locals>.dump_child.<locals>.<listcomp>)rB   r…   Údumpr›   ÚjoinÚrepr)r—   r´   ©Úcutoffr³   ÚencounteredÚ
filter_out©r´   r1   r³   4  s
   

zNode.dump.<locals>.dump_childc                    s    g | ]\}}|ˆ vr||f‘qS r0   r0   )r–   Úkeyr   )r¼   r0   r1   r˜   <  s     zNode.dump.<locals>.<listcomp>z<%s (0x%x)>z  z<%s (0x%x)
z%s  %s: %s
r   z%s>)Úsetr{   rC   r+   Úaddrx   r]   rA   )
r~   r´   r¼   rº   r»   rc   ÚindentrP   r¾   r   r0   r¹   r1   r¶   )  s"   z	Node.dumpú(#)c           
   	   C   s¶   | j sdS | j \}}}|jddd}|td|d ƒ|… }|d }|r1|d|… | ||d…  }| ¡ d	 |d< ||||d
 … 7 }d |¡}	d| ¡ › d|d›d|d›d|	› d	S )z[Debug helper method that returns the source code context of this node as a string.
        Ú ÚASCIIÚignore)r7   Zerror_handlingr   é   éÿÿÿÿNz             # <<<<<<<<<<<<<<r%   r6   ú"z":Údú:)r4   Ú	get_linesr«   Úrstripr·   Zget_escaped_description)
r~   Zmark_columnrN   Zsource_descÚlineÚcolÚcontentsÚlinesÚcurrentrM   r0   r0   r1   Údump_posG  s   
&zNode.dump_posrw   )r   r3   r°   N)FrÂ   ) r+   r,   r-   Úis_nameÚis_noneZis_nonecheckÚ
is_literalÚis_terminatorÚ
is_wrapperÚis_cpropertyÚis_templated_type_nodeÚtempsr™   Úouter_attrsZcf_stateZcoercion_typerˆ   rŠ   Únogil_checkÚin_nogil_contextr   r“   r‘   r   rž   r    ri   r¦   r©   r¬   r¶   rÒ   r0   r0   r0   r1   r…   ª   s<    
%
r…   c                   @   sV   e Zd ZdZdgZedd„ ƒZedd„ ƒZdd„ Zd	d
„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚCompilerDirectivesNodez9
    Sets compiler directives for the children nodes
    r¨   c                 K   s(   t j|jfi |¤Ž}| |j|||jdS ©N)r¨   Ú
directivesrÖ   )r    Zcopy_inherited_directivesrà   r4   rÖ   )r`   r¨   rŒ   rà   Únew_directivesr0   r0   r1   Úfor_directivesc  s   z%CompilerDirectivesNode.for_directivesc                 C   s    t  |j¡}| |j|||jdS rß   )r    Zcopy_for_internalrà   r4   rÖ   )r`   r¨   rŒ   rá   r0   r0   r1   Úfor_internalh  s   z#CompilerDirectivesNode.for_internalc                 C   s$   |j }| j |_ | j |¡ ||_ d S rw   )rà   r¨   r    ©r~   rŒ   Úoldr0   r0   r1   r    m  s   
z+CompilerDirectivesNode.analyse_declarationsc                 C   s&   |j }| j |_ | j |¡| _||_ | S rw   )rà   r¨   ri   rä   r0   r0   r1   ri   s  s
   z*CompilerDirectivesNode.analyse_expressionsc                 C   s8   |j }|jj }| j |j_ | j ||¡ ||_ ||j_ d S rw   )rà   Úglobalstater¨   Úgenerate_function_definitions)r~   rŒ   rM   Zenv_oldZcode_oldr0   r0   r1   rç   z  s   
z4CompilerDirectivesNode.generate_function_definitionsc                 C   ó*   |j j}| j|j _| j |¡ ||j _d S rw   )ræ   rà   r¨   Úgenerate_execution_code©r~   rM   rå   r0   r0   r1   ré   ‚  ó   
z.CompilerDirectivesNode.generate_execution_codec                 C   rè   rw   )ræ   rà   r¨   r©   rê   r0   r0   r1   r©   ˆ  rë   zCompilerDirectivesNode.annotateN)r+   r,   r-   rs   r™   Úclassmethodrâ   rã   r    ri   rç   ré   r©   r0   r0   r0   r1   rÞ   Z  s    

rÞ   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )r§   c                 C   s.   |  ¡ j}|D ]}|j |¡ q|d d …= d S rw   )Úglobal_scopeZundeclared_cached_builtinsræ   Zadd_cached_builtin_decl)r~   rŒ   rM   ÚentriesÚentryr0   r0   r1   Úgenerate_cached_builtins_decls’  s   
z(BlockNode.generate_cached_builtins_declsc                 C   s   |j D ]}| ||¡ qd S rw   )Zlambda_defsrç   )r~   rŒ   rM   rL   r0   r0   r1   Úgenerate_lambda_definitions˜  ó   
ÿz%BlockNode.generate_lambda_definitionsN)r+   r,   r-   rñ   rò   r0   r0   r0   r1   r§     s    r§   c                   @   sF   e Zd ZdgZedd„ ƒZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dS )ÚStatListNodeÚstatsc                 K   s   t | fi |¤Ž}|S rw   )rô   )r4   rŒ   r‡   rL   r0   r0   r1   Úcreate_analysed¢  s   zStatListNode.create_analysedc                 C   ó   | j D ]}| |¡ qd S rw   ©rõ   r    ©r~   rŒ   Ústatr0   r0   r1   r    §  s   
ÿz!StatListNode.analyse_declarationsc                    s   ‡ fdd„| j D ƒ| _ | S )Nc                    ó   g | ]}|  ˆ ¡‘qS r0   ©ri   ©r–   rú   ©rŒ   r0   r1   r˜   ®  s    ÿz4StatListNode.analyse_expressions.<locals>.<listcomp>©rõ   r‹   r0   rþ   r1   ri   ¬  s   
ÿz StatListNode.analyse_expressionsc                 C   ó   | j D ]}| ||¡ qd S rw   ©rõ   rç   ©r~   rŒ   rM   rú   r0   r0   r1   rç   ²  s   
ÿz*StatListNode.generate_function_definitionsc                 C   s&   | j D ]}| |j¡ | |¡ qd S rw   )rõ   Úmark_posr4   ré   ©r~   rM   rú   r0   r0   r1   ré   ·  s   
þz$StatListNode.generate_execution_codec                 C   r÷   rw   ©rõ   r©   r  r0   r0   r1   r©   ½  ó   
ÿzStatListNode.annotateN)r+   r,   r-   r™   Ústaticmethodrö   r    ri   rç   ré   r©   r0   r0   r0   r1   rô     s    
rô   c                   @   rí   )ÚStatNodec                 C   rŸ   rw   r0   ©r~   rŒ   rM   r0   r0   r1   rç   Ï  r¡   z&StatNode.generate_function_definitionsc                 C   r¢   )Nz.generate_execution_code not implemented for %sr£   r¥   r0   r0   r1   ré   Ò  r¤   z StatNode.generate_execution_codeN)r+   r,   r-   rç   ré   r0   r0   r0   r1   r  Â  s    r  c                   @   ó:   e Zd ZdgZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚCDefExternNoder¨   c                 C   sx   |j }d|_ | j |¡ ||_ | js| jr:| jj}|jd s!d}n|s&d}n	tdd„ |D ƒƒ}| | j| j|¡ d S d S )Nr   Zpreliminary_late_includes_cy28Fc                 s   s    | ]}t |tƒV  qd S rw   )rB   ÚCVarDefNode)r–   rL   r0   r0   r1   Ú	<genexpr>í  ó   € z6CDefExternNode.analyse_declarations.<locals>.<genexpr>)	Úin_cincluder¨   r    Zinclude_fileZverbatim_includerõ   rà   ÚallÚadd_include_file)r~   rŒ   Zold_cinclude_flagrõ   Zlater0   r0   r1   r    Þ  s   
öz#CDefExternNode.analyse_declarationsc                 C   ó   | j  |¡| _ | S rw   ©r¨   ri   r‹   r0   r0   r1   ri   ð  ó   z"CDefExternNode.analyse_expressionsc                 C   ó   | j  ||¡ d S rw   ©r¨   rç   r	  r0   r0   r1   rç   õ  ó   z,CDefExternNode.generate_function_definitionsc                 C   rŸ   rw   r0   r¥   r0   r0   r1   ré   ø  r¡   z&CDefExternNode.generate_execution_codec                 C   ó   | j  |¡ d S rw   ©r¨   r©   r¥   r0   r0   r1   r©   û  ó   zCDefExternNode.annotateN©	r+   r,   r-   r™   r    ri   rç   ré   r©   r0   r0   r0   r1   r  ×  s    r  c                   @   ó$   e Zd Zg ZdZdd„ Zdd„ ZdS )ÚCDeclaratorNoderÃ   c                 C   rŸ   rw   r0   r”   r0   r0   r1   Údeclared_name  r¡   zCDeclaratorNode.declared_namec                 C   rŸ   rw   r0   r”   r0   r0   r1   Úanalyse_templates  s   z!CDeclaratorNode.analyse_templatesN)r+   r,   r-   r™   Úcalling_conventionr  r  r0   r0   r0   r1   r  ÿ  s
    r  c                   @   s(   e Zd ZdgZdZdd„ Zd	dd„ZdS )
ÚCNameDeclaratorNodeÚdefaultNc                 C   ó   | j S rw   ©ra   r”   r0   r0   r1   r  !  ó   z!CNameDeclaratorNode.declared_namer   Fc                 C   s¨   |r,| j dkr,|js|js|jrt| jdƒ n|jr!t| jdƒ n|jdddd| _ t}|j	rM|j
rMz| |j
¡}W n tyL   t| jd| j  ƒ Y nw || _| |fS )NrÃ   úMissing argument nameúJUse spam() rather than spam(void) to declare a function with no arguments.r   )Zfor_displayÚpyrexúR'%s' cannot be specialized since its type is not a fused argument to this function)ra   Úis_ptrÚis_arrayÚ	is_bufferr   r4   Úis_voidÚdeclaration_coder
   Úis_fusedÚfused_to_specificÚ
specializer   Útype)r~   Ú	base_typerŒ   ÚnonemptyÚ
visibilityÚin_pxdr0   r0   r1   Úanalyse$  s&   ÿÿÿzCNameDeclaratorNode.analyse©r   NF)r+   r,   r-   r™   r"  r  r7  r0   r0   r0   r1   r!    s
    r!  c                   @   s,   e Zd ZdgZdd„ Zdd„ Zdd	d
„ZdS )ÚCPtrDeclaratorNodeÚbasec                 C   ó
   | j  ¡ S rw   ©r:  r  r”   r0   r0   r1   r  @  ó   
z CPtrDeclaratorNode.declared_namec                 C   r;  rw   ©r:  r  r”   r0   r0   r1   r  C  r=  z$CPtrDeclaratorNode.analyse_templatesr   NFc                 C   ó2   |j r	t| jdƒ t |¡}| jj|||||dS )Nz+Pointer base type cannot be a Python object©r4  r5  r6  )Úis_pyobjectr   r4   r	   Ú
c_ptr_typer:  r7  )r~   r3  rŒ   r4  r5  r6  Zptr_typer0   r0   r1   r7  F  ó   
zCPtrDeclaratorNode.analyser8  )r+   r,   r-   r™   r  r  r7  r0   r0   r0   r1   r9  ;  s
    r9  c                   @   s"   e Zd ZdgZdd„ Zdd„ ZdS )Ú_CReferenceDeclaratorBaseNoder:  c                 C   r;  rw   r<  r”   r0   r0   r1   r  P  r=  z+_CReferenceDeclaratorBaseNode.declared_namec                 C   r;  rw   r>  r”   r0   r0   r1   r  S  r=  z/_CReferenceDeclaratorBaseNode.analyse_templatesN)r+   r,   r-   r™   r  r  r0   r0   r0   r1   rD  M  s    rD  c                   @   ó   e Zd Zddd„ZdS )ÚCReferenceDeclaratorNoder   NFc                 C   r?  )Nz-Reference base type cannot be a Python objectr@  )rA  r   r4   r	   Z
c_ref_typer:  r7  ©r~   r3  rŒ   r4  r5  r6  Zref_typer0   r0   r1   r7  X  rC  z CReferenceDeclaratorNode.analyser8  ©r+   r,   r-   r7  r0   r0   r0   r1   rF  W  ó    rF  c                   @   rE  )Ú CppRvalueReferenceDeclaratorNoder   NFc                 C   r?  )Nz4Rvalue-reference base type cannot be a Python objectr@  )rA  r   r4   r	   Zcpp_rvalue_ref_typer:  r7  rG  r0   r0   r1   r7  `  rC  z(CppRvalueReferenceDeclaratorNode.analyser8  rH  r0   r0   r0   r1   rJ  _  rI  rJ  c                   @   s   e Zd ZddgZddd„ZdS )	ÚCArrayDeclaratorNoder:  Ú	dimensionr   NFc                    s˜  |j r| ¡ s|js|jrRddlm} t| j|ƒr| jj}n| jf}‡ fdd„|D ƒ}d |v r?| 	d ¡}	t
||	 jdƒ t}n| | jˆ |¡}| jj|ˆ |||dS d }
| jr| j ˆ ¡| _| jjjsjt
| jjdƒ | jjjr}| jjjdkr}t
| jjd	ƒ t| jjtƒrˆ| jjn| j ¡ }
zt|
ƒ}
W n	 tyœ   Y nw | ¡ s©t
| jd
| ƒ |jr²t
| jdƒ |jr»t
| jdƒ t ||
¡}| jj|ˆ |||dS )Nr   ©Ú	TupleNodec                    rû   r0   )Úanalyse_as_type)r–   r‚   rþ   r0   r1   r˜   v  rµ   z0CArrayDeclaratorNode.analyse.<locals>.<listcomp>zTemplate parameter not a typer@  zArray dimension not integerÚexternz(Array dimension cannot be const variablez%Array element type '%s' is incompletez'Array element cannot be a Python objectz"Array element cannot be a function)Úis_cpp_classÚis_template_typeÚis_cfunctionÚpython_type_constructor_nameÚ	ExprNodesrN  rB   rL  rJ   Úindexr   r4   r   Úspecialize_herer:  r7  Úanalyse_const_expressionr2  Úis_intÚis_constrð   r5  Úconstant_resultÚintÚget_constant_c_result_codeÚ
ValueErrorÚis_completerA  r	   Zc_array_type)r~   r3  rŒ   r4  r5  r6  rN  rJ   ÚvaluesÚixÚsizeZ
array_typer0   rþ   r1   r7  m  sN   ÿþ


ÿþzCArrayDeclaratorNode.analyser8  ©r+   r,   r-   r™   r7  r0   r0   r0   r1   rK  g  ó    rK  c                   @   sH   e Zd Zg d¢ZdZdZdZdZdd„ Zdd„ Z	dd	d
„Z
ddd„ZdS )ÚCFuncDeclaratorNode)r:  rJ   Úexception_valuer   Nc                 C   r;  rw   r<  r”   r0   r0   r1   r  ¬  r=  z!CFuncDeclaratorNode.declared_namec                 C   s¨   t | jtƒrRddlm}m} | jj}t ||ƒr|j}nt ||ƒr$|g}nt|j	dƒ d S g | _
|D ]}t ||ƒrC| j
 t |j¡¡ q1t|j	dƒ q1| jj| _| j
S d S )Nr   )rN  ÚNameNodez*Template arguments must be a list of names)rB   r:  rK  rU  rN  rg  rL  rJ   r   r4   Ú	templatesÚappendr	   ÚTemplatePlaceholderTypera   )r~   rN  rg  Útemplate_nodeZtemplate_nodesÚtemplater0   r0   r1   r  ¯  s"   



z%CFuncDeclaratorNode.analyse_templatesFc                    s4  |d u ri }|r|d8 }g }t ˆjƒD ]¢\}}	|	jˆ ||dko&ˆ jo&dˆ jvd\}
}|
j}||v r`|| }| ˆ ¡}|d u rFt|jdƒ n|t	j
ur^| |¡s^tˆjjdƒ t|jdƒ n|}|
jritˆjdƒ |dkrvˆ jrv|jrvˆ j}|jrt	 |j¡}|jrˆt|	jd	ƒ t	 |||	j¡}|	jr–d
|_|	jrœd
|_| |¡ |	jr¬ˆ jd7  _qˆjrµtˆjdƒ qd }d}ˆ jd r×|js×ˆjs×ˆjr×|dkr×dˆ_tˆjddd ˆjdkröˆ ˆ ¡ ˆ  d¡ ˆ  d¡ ˆ  d¡ ˆ  d¡ n	|jrÿˆjrÿdˆ_|jrˆj sˆjrˆjdkrtˆjdƒ n÷|jr1ˆjs1|dkr1ˆjr1tˆjddƒ nÞˆj d u roˆjroˆjdkro|j d uro|dkro|soˆ jsot!ˆjt"ƒsoddl#m$} |j%ˆjt&|j ƒ||j dˆ_ ˆj d urˆjdkr³ˆj  'ˆ ¡ˆ_ ˆj j(}|j)s¯|js¯|j*r›|j+js›|jr¯|t	j,kr¨ˆj j-dks¯tˆj jdƒ ˆj }nYˆj  .ˆ ¡ /|ˆ ¡ 'ˆ ¡ˆ_ ˆj  0ˆ ¡}| 1ˆj j(¡sÖtˆj jdƒ |dkr|j2sã|j3rˆj  4¡ rzt5|j6ƒ}W n
 t7yú   Y nw ˆj j8|krtˆjdˆj j8 ƒ ˆj}|j*rtˆjdƒ t	j9||ˆj:ˆj||ˆjj;ˆj<ˆj=ˆj>ˆj?ˆj@d }ˆjrL|jArF‡ ‡fd!d"„}||_Bnˆ C|ˆ ¡ ˆ jd# }|rl|j;}|ri||kritˆjd$||f ƒ ||_;|j+jDrxtˆjd%dƒ |jD ]}|j(jDrŽ| E¡ sŽtˆjd&dƒ q{ˆjj|ˆ ||d'S )(Nr   r   r  ©r4  Úis_self_argú
Not a typeú2Signature does not agree with previous declarationúPrevious declaration herez2Function argument cannot have C name specificationr'  Tz-Non-default argument follows default argumentZlegacy_implicit_noexceptrP  FzdImplicit noexcept declaration is deprecated. Function declaration should contain 'noexcept' keyword.r%   r½   ú+ÚiosÚnewZ	stdexceptZtypeinfozAException clause not allowed for function returning Python objectz?noexcept clause is ignored for function returning Python object©Ú	ConstNode©r   r2  r[  Ú*zTException value must be a Python exception, or C++ function with no arguments, or *.z6Exception value incompatible with function return typez;Ambiguous exception value, same as default return value: %rz!Function cannot return a function)	Úoptional_arg_countrf  Úexception_checkr   ÚnogilÚwith_gilÚis_overridableÚis_const_methodrh  c                    s   ˆ  | ˆ |¡ d S rw   )Údeclare_optional_arg_struct)Ú	func_typeÚfused_cname©rŒ   r~   r0   r1   Údeclare_opt_arg_structU  r  z;CFuncDeclaratorNode.analyse.<locals>.declare_opt_arg_structÚcallspecz2cannot have both '%s' and '%s' calling conventionsz6Rvalue-reference as function return type not supportedz3Rvalue-reference as function argument not supported©r5  r6  )FÚ	enumeraterJ   r7  Úis_c_class_scoperà   ra   rO  r   r4   r	   r
   Úsame_asr:  ÚcnameÚis_unspecifiedÚparent_typer+  rB  r3  r-  ÚCFuncTypeArgÚnot_noneÚor_noneri  r"  ry  rA  Úhas_explicit_exc_clauserz  r   r‘   r  rf  rB   r9  rU  rv  Úfor_typeÚstrrX  r2  Úis_errorrS  Úreturn_typeÚc_char_typer   rj   Ú	coerce_toZas_exception_valueÚassignable_fromrY  Zis_floatÚhas_constant_resultÚfloatÚdefault_valuer^  r[  Ú	CFuncTypeÚhas_varargsr   r{  r|  Úoverridabler~  rh  r/  rƒ  r  Úis_rvalue_referenceZis_forwarding_reference)r~   r“  rŒ   r4  Údirective_localsr5  r6  Zfunc_type_argsÚiZarg_nodeÚname_declaratorr2  ra   Ú	type_nodeÚ
other_typeZfunc_argÚexc_valÚ	exc_checkrv  Zexc_val_typeZtype_default_valuer€  rƒ  r„  rÑ   Úargr0   r‚  r1   r7  Å  s<  
þ

ÿ
€
ÿþýý




ÿÿ" þÿþýüÿÿÿÿ
ÿÿþÿÿù	
ÿ

€zCFuncDeclaratorNode.analysec           	      C   s¼   t ƒ }dtj }| |tj| j¡ |jt|jƒ| j	 d… D ]}|j|j
|j|jddd q| tj| jj
¡}|durAt ||¡}| ¡ j|d|d| j|d}d|_d|_t |j¡|_dS )	a  
        Declares the optional argument struct (the struct used to hold the
        values for optional arguments). For fused cdef functions, this is
        deferred as analyse_declarations is called only once (on the fused
        cdef function).
        z%snNT)Zallow_pyobjectZallow_memoryviewÚstructr   )ra   ÚkindÚscopeÚtypedef_flagr4   r‰  r   )r   r   Úpyrex_prefixÚdeclare_varr	   Ú
c_int_typer4   rJ   rA   ry  ra   r2  ÚmangleZopt_arg_prefixr:  Zget_fused_cnamerî   Údeclare_struct_or_unionÚdefined_in_pxdÚusedrB  Úop_arg_struct)	r~   r€  rŒ   r  r¨  Zarg_count_memberr¥  Zstruct_cnameZop_args_structr0   r0   r1   r  l  s&   
úz/CFuncDeclaratorNode.declare_optional_arg_struct)r   NNFrw   )r+   r,   r-   r™   rœ  ry  r~  rh  r  r  r7  r  r0   r0   r0   r1   re  ™  s    
 (re  c                   @   s   e Zd ZdgZddd„ZdS )ÚCConstDeclaratorNoder:  r   NFc                 C   r?  )Nz)Const base type cannot be a Python objectr@  )rA  r   r4   r	   Úc_const_typer:  r7  )r~   r3  rŒ   r4  r5  r6  Úconstr0   r0   r1   r7  ’  s   ÿ
zCConstDeclaratorNode.analyser8  rc  r0   r0   r0   r1   r²    ó    r²  c                   @   s¨   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d	„ Zed
d„ ƒZedd„ ƒZddd„Zdd„ Zdd„ Zdd„ Z		ddd„ZdS )ÚCArgDeclNode)r3  Ú
declaratorr"  Ú
annotationr"  r¸  r   r   FNc                 C   r;  rw   ©r·  r  r”   r0   r0   r1   r  Ã  r=  zCArgDeclNode.declared_namec                 C   r;  rw   )ra   Úas_c_string_literalr”   r0   r0   r1   Úname_cstringÆ  ó   
zCArgDeclNode.name_cstringc                 C   s*   | j rttj| jj ƒS ttj| jj ƒS rw   )Úneeds_conversionr   r   Z
arg_prefixrð   ra   Z
var_prefixr”   r0   r0   r1   Ú	hdr_cnameÊ  s   zCArgDeclNode.hdr_cnamec                 C   sf  |r	| | j _| _| jd ur| j| jfS t| jtƒrH| jjdkrH|rE| j jr3| j j	|dd}| 
¡ }n| j j}t|ƒ| j_d | j _d| j _d}nd}d| j _| j j	||d}t| j dd ƒ}|rc|| j_|jrŒt| j tƒrŒt| jtƒrŒ| j}	t|	jtƒr„|	j}	t|	jtƒs{| j j|	_|j }| jrª|rª|jd rªt| j dd ƒd u rª|  |¡}
|
d urª|
}| jj	|||dS )	NrÃ   T)Úcould_be_nameFÚarg_nameÚannotation_typingra   ©r4  )r3  rn  r2  r   rB   r·  r!  ra   Úis_basic_c_typer7  Úempty_declaration_coder   Úis_argrš   r+  ÚTemplatedTypeNoderK  r:  Úarray_declaratorr¸  rà   Úinject_type_from_annotations)r~   rŒ   r4  rn  r2  rÀ  r¿  r3  Zbase_arg_namer·  Úarg_typer0   r0   r1   r7  Ô  sJ   


ÿ
þÿ

zCArgDeclNode.analysec                 C   sÜ   | j }|sd S |j|| jd\}}|d urt|j|dd| _|rgd|v r3| ¡ }|r/| ¡ s/n8d| _n4|t	u r;d| _n,| jr]| jj
r]| ¡ sI|jr]| ¡ sP|j}| js\t| jdƒ d| _n
| jsg| ¡ rgd| _|rld| _|S )N)Zassigned_valueT)r2  rÅ  ztyping.OptionalzIPEP-484 recommends 'typing.Optional[...]' for arguments that can be None.)r¸  Úanalyse_type_annotationr"  ÚCAnalysedBaseTypeNoder4   r3  ÚresolveÚcan_be_optionalrŽ  r
   rÔ   Úequivalent_typer   r  Útype_from_annotation)r~   rŒ   r¸  Ú	modifiersrÉ  r0   r0   r1   rÈ    s8   ÿ€z)CArgDeclNode.inject_type_from_annotationsc                 C   sJ   | j d u r"| jr"| jjr| j |¡ | j | j ¡ ¡S | | j¡| _ | j S rw   )r™  r"  rÕ   Úgenerate_evaluation_coder2  Ú	cast_coder€   Zget_argument_default_constr¥   r0   r0   r1   Úcalculate_default_value_code+  s   
z)CArgDeclNode.calculate_default_value_codec                 C   ó   | j r| j  |¡ d S d S rw   )r"  r©   r¥   r0   r0   r1   r©   5  ó   ÿzCArgDeclNode.annotatec                 C   s–   | j }|d u s|jr|d u rd S |p|  |¡}| |¡ | |¡ |r'| ¡ n| | j¡}| d||f ¡ | 	| ¡ | j¡ | 
|¡ | |¡ d S ©Nú%s = %s;)r"  rÕ   rÓ  rÑ  Úmake_owned_referencer€   Ú	result_asr2  rH   Úput_giverefÚgenerate_post_assignment_codeÚ
free_temps)r~   rM   Úoverloaded_assignmentZcyfunc_struct_targetr"  Útargetr€   r0   r0   r1   Úgenerate_assignment_code9  s   


z%CArgDeclNode.generate_assignment_code)r   F©FN)r+   r,   r-   r™   rÛ   rn  Úis_type_argÚ
is_genericÚis_special_method_optionalÚkw_onlyÚpos_onlyr  rŽ  r2  r   r™  r¸  Ú
is_dynamicZdefaults_class_keyrÏ  r  Úpropertyr»  r¾  r7  rÈ  rÓ  r©   rß  r0   r0   r0   r1   r¶  š  s<    


	2%
ÿr¶  c                   @   ru   )ÚCBaseTypeNodec                 C   s
   |   |¡S rw   ©r7  r‹   r0   r0   r1   rO  R  r=  zCBaseTypeNode.analyse_as_typeN)r+   r,   r-   rO  r0   r0   r0   r1   rè  J  s    rè  c                   @   s   e Zd Zg Zddd„ZdS )rË  Fc                 C   r#  rw   ©r2  )r~   rŒ   r¿  r0   r0   r1   r7  [  r%  zCAnalysedBaseTypeNode.analyseN©Frc  r0   r0   r0   r1   rË  V  s    rË  c                   @   s.   e Zd Zg ZdZg ZdZdZdZddd„Z	dS )ÚCSimpleBaseTypeNodeNFc           	      C   s>  d }| j rt | j| j| j¡}|st| jdƒ nÅ| jdkr#| js#t	}nº| jd u r5| j
r2|jr2|j}n«t	}n¨|}| jr’| jD ]%}| |¡}|d urW|jsR|jrW|jjrW|jj}q=|r`|jr`|j}q=d } |d u r†t| jƒdkr†ddlm} | | jd ¡}|r†|jr†||jƒ}|d u r’| | j| j¡}|rÝ|jr›| ¡ }| | j¡}|d ur¦n7|r»| j
r²|jr²|j}nt	}t| jƒ| _n"| jrÔ| j| jvrÍt| jd| j ƒ t | j¡}n	t| jd| j ƒ |rë|jrë|jrë|  |j¡}| j!r|j"rõ|j#rût| jdƒ t $|¡}| %|¡ n|tj&u rtj'}| %|¡ d| _!|stj(}|S )	Nz&Unrecognised type modifier combinationÚobjectr   )Ú'get_known_standard_library_module_scoper   z'%s' is not a type identifierz#can only complexify c numeric typesT))rÃ  r	   Zsimple_c_typeÚsignedZlongnessra   r   r4   Úmodule_pathr
   rn  r‡  r‹  ÚlookuprQ  Úis_typer2  r¨  Z	as_modulerA   r   rî  Úknown_standard_library_importÚfind_imported_modulerî   Zlookup_typer   rÀ  rh  rj  r/  r0  r1  ÚcomplexÚ
is_numericÚ
is_complexZCComplexTypeÚcreate_declaration_utility_codeZcomplex_typeÚc_double_complex_typer   )	r~   rŒ   r¿  r2  r¨  r²   rð   rî  Zfound_entryr0   r0   r1   r7  p  s‚   €


ÿþþ





zCSimpleBaseTypeNode.analyserë  )
r+   r,   r-   r™   rÀ  rð  rÃ  rõ  rn  r7  r0   r0   r0   r1   rì  _  s    
rì  c                   @   s*   e Zd ZdZddgZd
dd„Zdd„ Zd	S )ÚMemoryViewSliceTypeNodeÚ
memoryviewÚbase_type_nodeÚaxesFc              
   C   s¾   | j  |¡}|jr|S ddlm} z	| || j¡}W n! ty; } zt|j	|j
ƒ t ¡ | _| jW  Y d }~S d }~ww | | j|¡sIt| _| jS t ||¡| _| j | j¡ |  |¡ | jS ©Nr   ©Ú
MemoryView)rü  r7  r’  rÃ   r   Zget_axes_specsrý  r   r   ÚpositionZmessage_onlyr	   Z	ErrorTyper2  Zvalidate_axesr4   r   ZMemoryViewSliceTypeZvalidate_memslice_dtypeÚuse_memview_utilities)r~   rŒ   r¿  r3  r   Z
axes_specsÚer0   r0   r1   r7  Ë  s$   

€ýü
zMemoryViewSliceTypeNode.analysec                 C   s$   ddl m} | | |jj¡¡ d S rþ  )rÃ   r   Úuse_utility_codeÚget_view_utility_codeÚcontextÚshared_utility_qualified_name)r~   rŒ   r   r0   r0   r1   r  â  s   ÿÿz-MemoryViewSliceTypeNode.use_memview_utilitiesNrë  )r+   r,   r-   ra   r™   r7  r  r0   r0   r0   r1   rú  Æ  s
    
rú  c                   @   s   e Zd ZdgZddd„ZdS )ÚCNestedBaseTypeNoder3  Nc                 C   sr   | j  |¡}|tju rtjS |jst| jd| ƒ tjS |j | j	¡}|r(|j
s6t| jd|| j	f ƒ tjS |jS )Nz'%s' is not a valid type scopez '%s.%s' is not a type identifier)r3  r7  r	   r   rQ  r   r4   r¨  Úlookup_herera   rò  r2  )r~   rŒ   r¿  r3  Ú
type_entryr0   r0   r1   r7  ó  s   

zCNestedBaseTypeNode.analyserw   rc  r0   r0   r0   r1   r  ë  s    r  c                   @   s:   e Zd Zg d¢ZdZdZdZdd„ Zddd„Zd	d
„ Z	dS )rÆ  )rü  Úpositional_argsÚkeyword_argsÚ
dtype_nodeTNc           
   	   C   s6  |j dk}|jo
| }g }| jD ]9}|jrq| |pt|tƒ¡ | |¡}W d   ƒ n1 s0w   Y  |d u rD|jrDt	|j
dƒ t}| |¡ q|j rb|j dkr]tdd„ | jD ƒƒ|_| ¡ }nd}t|ƒD ]0\}	}|d u rqqh|rv|jr||r˜| ¡ s˜|jr‰| ¡ s‰|j||	< qht	|j
d|j |f ƒ t||	< qh|S )Nzdataclasses.ClassVarz!unknown type in template argumentztyping.Unionc                 s   ó    | ]}|j V  qd S rw   )rÔ   r•   r0   r0   r1   r  &  ó   € z<TemplatedTypeNode._analyse_template_types.<locals>.<genexpr>Fz$%s[...] cannot be applied to type %s)rT  Úin_c_type_contextr  rÔ   Znew_c_type_contextrB   rè  rO  rQ  r   r4   r   ri  ÚanyZcontains_noneZallows_noner†  rA  rÍ  rÎ  Úas_cython_attribute)
r~   rŒ   r3  Zrequire_python_typesr  Útemplate_typesrk  ÚttypeZrequire_optional_typesrŸ  r0   r0   r1   Ú_analyse_template_types  s@   

ÿ

þ€z)TemplatedTypeNode._analyse_template_typesFc           
      C   sÊ  |d u r
| j  |¡}|jr|S |jr| ¡ s|jrF| jr6| jjr6|jr%dnd}t| j	d| ƒ t
j| _| jS |  ||¡}| | j	||¡| _nq|jr{ddlm} | | j	|| j| j|j¡}t
j|fi |¤Ž| _t|ƒrzt| jƒrzt
 t| jƒ| j¡| _n<t| j	dd d}t| jƒdksŽ| jjr™t| j	dƒ t
j| _n| jsŸd }	n| jd	 }	t| j	||	d
| _| j ||¡d | _| jrâ| jjrâ|jrâz| j  |j¡| _W | jS  t!yá   t| j	d| j" ƒ Y | jS w | jS )Nzc++ templateszindexed typesz %s cannot take keyword argumentsr   ©ÚBufferrÃ   ©ra   r‰  zinvalid array declarationr   )r:  rL  r)  )#rü  r7  r’  rQ  rR  rT  r  Úkey_value_pairsr   r4   r	   r   r2  r  rW  rA  rÃ   r  Úanalyse_buffer_optionsr  Úbuffer_defaultsZ
BufferTyper"   r$   ZPythranExprr#   r!  rA   rK  rÇ  r/  r0  r1  r   ra   )
r~   rŒ   r¿  r3  Útpr  r  ÚoptionsZempty_declaratorrL  r0   r0   r1   r7  ;  sh   
ÿû€

ýûÿÿûzTemplatedTypeNode.analysec                 C   sn   g }| }|j r5|jr5t|jƒdkr5| j |¡}|jr#|jr#| |j¡ |jd }|j r5|jr5t|jƒdks|S ©Nr   r   )rÙ   rü  rA   r  rO  rT  Zmodifier_nameri  )r~   rŒ   rÐ  Zmodifier_nodeZmodifier_typer0   r0   r1   Úanalyse_pytyping_modifiersx  s   
üz,TemplatedTypeNode.analyse_pytyping_modifiersrà  )
r+   r,   r-   r™   rÙ   r  ra   r  r7  r  r0   r0   r0   r1   rÆ    s    	
*=rÆ  c                   @   s   e Zd ZddgZddd„ZdS )ÚCComplexBaseTypeNoder3  r·  Fc                 C   s$   | j  ||¡}| j ||¡\}}|S rw   )r3  r7  r·  )r~   rŒ   r¿  r:  Ú_r2  r0   r0   r1   r7  Œ  s   zCComplexBaseTypeNode.analyseNrë  rc  r0   r0   r0   r1   r   †  rd  r   c                   @   ó   e Zd ZdgZddd„ZdS )ÚCTupleBaseTypeNodeÚ
componentsFc                 C   sX   g }| j D ]}| |¡}|jrt|jdƒ t  S | |¡ q| | j|¡}d|_|j	S )Nz/Tuple types can't (yet) contain Python objects.T)
r$  r7  rA  r   r4   r   ri  Zdeclare_tuple_typer°  r2  )r~   rŒ   r¿  Zcomponent_typesr¯   r2  rð   r0   r0   r1   r7  —  s   

zCTupleBaseTypeNode.analyseNrë  rc  r0   r0   r0   r1   r#  ’  rµ  r#  c                   @   s&   e Zd ZdZg Zdd„ Zddd„ZdS )	ÚFusedTypeNodea  
    Represents a fused type in a ctypedef statement:

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

    name            str                     name of this fused type
    types           [CSimpleBaseTypeNode]   is the list of types to be fused
    c                 C   s&   |   |¡}| | j|| j¡}d|_d S )NT)r7  Údeclare_typedefra   r4   r  )r~   rŒ   r2  rð   r0   r0   r1   r    °  s   

z"FusedTypeNode.analyse_declarationsFc                 C   s\   g }| j D ] }| |¡}|st|jdƒ q||v r t|jdƒ q| |¡ qtj|| jdS )Nro  zType specified multiple timesr$  )rZ   rO  r   r4   ri  r	   Ú	FusedTypera   )r~   rŒ   r¿  rZ   r¡  r2  r0   r0   r1   r7  ·  s   

zFusedTypeNode.analyseNrë  )r+   r,   r-   rs   r™   r    r7  r0   r0   r0   r1   r%  ¤  s
    	r%  c                   @   r"  )ÚCConstOrVolatileTypeNoder3  Fc                 C   s2   | j  ||¡}|jrt| jdƒ t || j| j¡S )Nz2Const/volatile base type cannot be a Python object)	r3  r7  rA  r   r4   r	   Zc_const_or_volatile_typerZ  Zis_volatile)r~   rŒ   r¿  r:  r0   r0   r1   r7  Ò  s   ÿz CConstOrVolatileTypeNode.analyseNrë  rc  r0   r0   r0   r1   r(  Ë  s    r(  c                   @   s&   e Zd ZddgZdZdZddd„ZdS )r  r3  ÚdeclaratorsNc                 C   s6  | j d u ri | _ |s|}|| _| jr| jd  ¡ }nd }|d urS| jdkr+t| jdƒ t| jƒdkr;t| jd jdƒ td|ƒ}|j	j
|_
|D ]}| |j|| j¡ qG| j |¡}d }| jjre| j |¡}|jry| jsy|jsq|jryt| jdƒ tS d | _| j}| jD ]}t| jƒdkrt|tƒs|j
d rt|jd	dƒ | jo§| jdko§|j}	|	r­d
|_t|tƒrÁ|j||| j || jd\}
}n|j|||| jd\}
}| ¡ sä| jdkrÙ|jsä|jsät|jd| ƒ | jdkrò|jròt|jdƒ |
j}|
j }|dkrt|jdƒ  d S |j!r| jdkrt|jdƒ |j"r&| jdkr&t|jdƒ |j#red|j
v r3d|_$|j%|||j|| j| j| j&| j'| jd	| _| jd urVt( (| j ¡| j_ |	rd| jj) *|¡ d| j_+q‚| jrot| jdƒ | j ryt| jdƒ |j,|||j||| j| j&d|d	| _t-j.r˜t/| j| j0ƒ| j_0q‚d S )Nr   rP  zOnly extern functions allowedr   z%Can't multiply declare template typesZfunc_templatezFused types not allowed herezwarn.multiple_declaratorsz‰Non-trivial type declarators in shared declaration (e.g. mix of pointers and values). Each pointer declaration should be on its own line.F)rž  r5  r6  r…  z Variable type '%s' is incompletez'Python object cannot be declared externrÃ   zMissing name in declaration.z8C++ references cannot be declared; use a pointer insteadz(C++ rvalue-references cannot be declaredr  T)r‰  r5  r6  ÚapirÐ  rœ  z>Variables cannot be declared with 'cpdef'. Use 'cdef' instead.z,Decorators can only be followed by functions)r‰  r5  r6  r*  Úis_cdefZpytyping_modifiers)1rž  Ú
dest_scoper)  r  r5  r   r4   rA   r   Úouter_scoperà   Zdeclare_typera   r3  r7  rÙ   r  r/  r6  r‡  Úis_module_scoper   rð   rB   r!  r   rœ  re  r_  r+  Úis_memoryviewslicerA  r‰  Zis_referencer  rS  Úis_static_methodÚdeclare_cfunctionr*  rÐ  r   r2  Úcreate_to_py_utility_codeÚcreate_wrapperr«  r    Ú
docstringsr<   r;   )r~   rŒ   r,  rh  Ztemplate_paramr3  rÐ  r5  r·  Zcreate_extern_wrapperr   r2  ra   r‰  r0   r0   r1   r    í  s¼   



ÿÿþýÿþ
ÿ

ÿ

ý€ý€Çz CVarDefNode.analyse_declarationsrw   )r+   r,   r-   r™   Ú
decoratorsrž  r    r0   r0   r0   r1   r  Ú  s
    r  c                   @   s4   e Zd ZdgZddd„Zdd„ Zdd„ Zd	d
„ ZdS )ÚCStructOrUnionDefNodeÚ
attributesNc                 C   s2   |j | j| j|| j| j| j| j| j| jd	| _	d S )N)r5  r*  Úpacked)
r®  ra   r§  r©  r4   r‰  r5  r*  r8  rð   ©r~   rŒ   r¨  r0   r0   r1   Údeclare[  s
   ýzCStructOrUnionDefNode.declarec                 C   s¬   d }| j d urt| jƒ}|  ||¡ | j d urP| jr!|js!d| j_| j D ]}| ||¡ q$| j	dkrR|j
D ]}|j}|jrC|j}|js=|| jjkrOt|jdƒ q5d S d S d S )Nr   rP  z)Struct cannot contain itself as a member.)r7  r   ra   r:  r6  r  rð   r¯  r    r5  Úvar_entriesr2  r+  r3  r   r4   )r~   rŒ   r¨  r­   r2  r0   r0   r1   r    a  s*   





ÿ€õz*CStructOrUnionDefNode.analyse_declarationsc                 C   ó   | S rw   r0   r‹   r0   r0   r1   ri   s  r¡   z)CStructOrUnionDefNode.analyse_expressionsc                 C   rŸ   rw   r0   r¥   r0   r0   r1   ré   v  r¡   z-CStructOrUnionDefNode.generate_execution_coderw   )r+   r,   r-   r™   r:  r    ri   ré   r0   r0   r0   r1   r6  M  s    
r6  c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚCppClassNodeNc              	   C   sˆ   | j d u rd }n)dd„ | j D ƒ}tdd„ | j D ƒƒ}|r1tdd„ | j d | … D ƒƒs1t| jdƒ |j| jd | j| jg | j|d| _	d S )Nc                 S   ó   g | ]\}}t  || ¡‘qS r0   ©r	   rj  ©r–   Útemplate_nameÚrequiredr0   r0   r1   r˜   Œ  ó    ÿz(CppClassNode.declare.<locals>.<listcomp>c                 s   s    | ]\}}| V  qd S rw   r0   ©r–   r!  rB  r0   r0   r1   r  Ž  r  z'CppClassNode.declare.<locals>.<genexpr>c                 s   s    | ]\}}|V  qd S rw   r0   rD  r0   r0   r1   r    s   € zGRequired template parameters must precede optional template parameters.)Úbase_classesr5  rh  )
rh  Úsumr  r   r4   Údeclare_cpp_classra   r‰  r5  rð   )r~   rŒ   r  Znum_optional_templatesr0   r0   r1   r:  ˆ  s   
ÿ"þzCppClassNode.declarec           
   	      sˆ  ˆ   ¡ stˆjddd ˆjd u rd  }}ndd„ ˆjD ƒ}dd„ ˆjD ƒ}d ‰ˆjd ur5tˆjˆ |d‰‡fdd	„}t|‡ ‡fd
d„ˆjD ƒƒ}ˆ j	ˆjˆˆjˆj
|ˆj|dˆ_ˆjd u rad S dˆj_ˆd urnˆjjˆ_g }‡fdd„‰ˆjd ur·ˆjr…ˆ js…dˆj_ˆjD ]}t|dd ƒ}|r—| ˆ¡ | ˆ¡ qˆˆˆjƒD ]}	| |	¡ ˆjd ur¶dd |¡ |	_q¢tˆj|dˆ_ˆˆ_d S )Nz0Using 'cppclass' while Cython is not in c++ moder   r½   c                 S   s   g | ]\}}|‘qS r0   r0   )r–   rA  r!  r0   r0   r1   r˜     ó    z5CppClassNode.analyse_declarations.<locals>.<listcomp>c                 S   r>  r0   r?  r@  r0   r0   r1   r˜   ž  rC  )rh  c                    s$   | j s| jrdS tˆ jd|  ƒ d S )NTz&Base class '%s' not a struct or class.)rQ  Ú	is_structr   r4   )Z
base_classr”   r0   r1   Úbase_ok£  s   z2CppClassNode.analyse_declarations.<locals>.base_okc                    s   g | ]	}|  ˆp	ˆ ¡‘qS r0   ré  )r–   Úb)rŒ   r¨  r0   r1   r˜   ¨  ó    )r5  rh  c                 3   sd    | D ],}t |tƒr|V  qt |tƒrˆ |jjƒE d H  qt |tƒr/|jd ur/ˆ |jƒE d H  qd S rw   )rB   ÚCFuncDefNoderÞ   r¨   rõ   r=  r7  )r7  r­   )Úfunc_attributesr0   r1   rN  ²  s   €

€úz:CppClassNode.analyse_declarations.<locals>.func_attributesr:  ztemplate <typename %s>z, typename rÿ   )r   r   r4   rh  r7  r   ra   ÚfilterrE  rG  r‰  r5  rð   rQ  r2  r6  r  r¯  rš   r:  r    ri  r·   Útemplate_declarationrô   r¨   r¨  )
r~   rŒ   r  Ztemplate_namesrJ  Zbase_class_typesZdefined_funcsr­   r:  rS   r0   )rŒ   rN  r¨  r~   r1   r    •  sT   þ

ÿ

þ






€
z!CppClassNode.analyse_declarationsc                 C   s   | j  | jjj¡| _ | S rw   )r¨   ri   rð   r2  r¨  r‹   r0   r0   r1   ri   É  s   z CppClassNode.analyse_expressionsc                 C   s   | j  | jjj|¡ d S rw   )r¨   rç   rð   r2  r¨  r	  r0   r0   r1   rç   Í  ó   z*CppClassNode.generate_function_definitionsc                 C   r  rw   ©r¨   ré   r¥   r0   r0   r1   ré   Ð  r  z$CppClassNode.generate_execution_codec                 C   r  rw   r  r¥   r0   r0   r1   r©   Ó  r  zCppClassNode.annotate)
r+   r,   r-   r5  r:  r    ri   rç   ré   r©   r0   r0   r0   r1   r=  z  s    4r=  c                   @   s8   e Zd ZddgZdZdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚCEnumDefNoder]   Úunderlying_typeNc                 C   sJ   d }t jrt| j| jƒ}|j| j| j| j| j| j	| j
| j| j|d	| _d S )N)r‰  Úscopedr©  r5  r*  r3  r;   )r    r4  r<   r4   r;   Zdeclare_enumra   r‰  rU  r©  r5  r*  r3  rð   )r~   rŒ   r;   r0   r0   r1   r:  è  s   úzCEnumDefNode.declarec                 C   sÚ   d }| j  |¡}|jst| j jdƒ || jj_ | jr/| jd ur/t	| j
|ƒ}| jj|_|j|_n|}| jd uri| jr@|js@d| j_| jdk}|rIdnd }| jD ]}| || j|¡ |rhd|jjd ure|jjn| }qNd S d S )Nz'underlying type is not an integral typer   rP  r   )rT  r7  rY  r   r4   rð   r2  rU  r]   r   ra   rà   r6  r  r¯  r5  Úanalyse_enum_declarationsÚenum_int_value)r~   rŒ   r¨  rT  Zis_declared_enumZnext_int_enum_valuer²   r0   r0   r1   r    õ  s0   





ÿ€ô	z!CEnumDefNode.analyse_declarationsc                 C   r<  rw   r0   r‹   r0   r0   r1   ri     r¡   z CEnumDefNode.analyse_expressionsc              
   C   sÈ   | j rd S | js| js| jdksd S | | j¡ |jjtj	dd}| j
jD ]6}| d||j| ||j¡f ¡ | |tj	¡ | d| tj¡|j ¡ || |j¡f ¡ | |tj	¡ q%|j |¡ d S )NÚpublicT©Z
manage_refz%s = PyLong_FromLong(%s); %sz,if (PyDict_SetItemString(%s, %s, %s) < 0) %s)rU  r*  ra   r5  r  r4   Ú	funcstateÚallocate_tempr	   r
   rð   Úenum_valuesrH   r‰  Úerror_goto_if_nullÚ
put_gotrefÚname_in_module_stater   Úmoddict_cnamerº  Ú
error_gotoÚput_decref_clearÚrelease_temp)r~   rM   Útempr²   r0   r0   r1   ré     s*   ý

üz$CEnumDefNode.generate_execution_code)	r+   r,   r-   r™   r;   r:  r    ri   ré   r0   r0   r0   r1   rS  ×  s    rS  c                   @   s   e Zd ZdgZdd„ ZdS )ÚCEnumDefItemNoder   c              
   C   s  | j r| j  |¡| _ | j jjs| j  tj|¡| _ | j  |¡| _ |jjr,d|j| j	f }n| j}|j
| j	|j| j | j||j|j|joE|j	d u d | _}|}| j ro| j jr[t| j j ƒ}n| j jsc| j jrm| j jrm| j jj}nd }|d urv||_|j |¡ |j	r‰|jj |j	¡ d S d S )Nz%s::%s)r‰  r5  r*  r3  )r   rX  r2  rY  r•  r	   r¬  Zis_cpp_enumr‰  ra   Zdeclare_constr4   r5  r*  r3  rð   rÕ   r'   rÓ   Úis_attributerW  r\  ri  r`  )r~   rŒ   Z
enum_entryZincremental_int_valuer‰  rð   Z
enum_valuer0   r0   r1   rV  9  s6   

üÿz*CEnumDefItemNode.analyse_enum_declarationsN)r+   r,   r-   r™   rV  r0   r0   r0   r1   re  2  s    re  c                   @   s,   e Zd ZddgZdd„ Zdd„ Zdd„ Zd	S )
ÚCTypeDefNoder3  r·  c                 C   sz   | j  |¡}| jj||| j| jd\}}|j}|j}|j||| j|| j| j	d}|j
r.d|_| jr9|js;d|_d S d S d S )Nr…  )r‰  r5  r*  Tr   )r3  r7  r·  r5  r6  ra   r‰  r&  r4   r*  r/  r  r¯  )r~   rŒ   r:  r   r2  ra   r‰  rð   r0   r0   r1   r    f  s   
ÿ
þ
ÿz!CTypeDefNode.analyse_declarationsc                 C   r<  rw   r0   r‹   r0   r0   r1   ri   w  r¡   z CTypeDefNode.analyse_expressionsc                 C   rŸ   rw   r0   r¥   r0   r0   r1   ré   z  r¡   z$CTypeDefNode.generate_execution_codeN©r+   r,   r-   r™   r    ri   ré   r0   r0   r0   r1   rg  ]  s
    rg  c                   @   sä   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZg ZdZdZdZdZdZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!dd„ Z"dd „ Z#d!d"„ Z$d#d$„ Z%d%d&„ Z&dS )'ÚFuncDefNodeNFc                 C   s˜   d}| j D ]D}|jr;d}|jr |j |¡|_|j |j|¡|_q|jr1|jjs0t|j	dƒ d |_qt|j	dƒ d |_q|j
rAd}q|rIt|j	dƒ qd S )Nr   r   z2This argument cannot have a non-None default valuez)This argument cannot have a default valuez/Non-default argument following default argument)rJ   r"  râ  rj   r•  r2  rã  rÔ   r   r4   rä  )r~   rŒ   Zdefault_seenr¥  r0   r0   r1   Úanalyse_default_values§  s(   
€€ðz"FuncDefNode.analyse_default_valuesc                 C   s<   | j D ]}|jr|j |¡|_q| jr| j |¡| _d S d S rw   )rJ   r¸  rj   Úreturn_type_annotation©r~   rŒ   r¥  r0   r0   r1   Úanalyse_annotations»  s   
€ÿzFuncDefNode.analyse_annotationsc                 C   sÎ   | j }|j}|j|v r||j }| |¡}nt|tƒr2|jr2|jd r2|j}| |¡}|d u r1|S n|S |d u r@t	|j
dƒ |S |turX| |¡sXt	|jj
dƒ t	|j
dƒ |S ||_|jjre|j |¡ |S )NrÁ  ro  rp  rq  )rž  r2  ra   rO  rB   r¶  r¸  rà   rÈ  r   r4   r
   rˆ  r3  r÷  rø  )r~   rŒ   r¥  rž  Ú	orig_typer¡  r¢  r0   r0   r1   Úalign_argument_typeÂ  s.   


ÿ	øüzFuncDefNode.align_argument_typec                 C   ó   dS ©Nr   r0   ©r~   Úlenvr0   r0   r1   Úneed_gil_acquisitionÜ  r¡   z FuncDefNode.need_gil_acquisitionc                 C   s¬   |}|j s|jr|j}|j s|js| jr1| jrtnt}|| jj||| jj	d}| j
s-| jr0d|_n	t| jj||d}| j|_| jj}|jrM|joK|j |_|| _|j|_|S )N)ra   r-  Úparent_scopeZ
scope_nameT)ra   r-  ru  )Úis_py_class_scoper‡  r-  Úneeds_closureÚis_generator_expressionr   r   rð   ra   r‰  Úis_generator_bodyÚis_generatorZis_generator_scoper   r“  r2  rS  r{  r|  Úlocal_scoperà   )r~   rŒ   Úgenvr`   rs  r2  r0   r0   r1   Úcreate_local_scopeß  s2   ÿý€þzFuncDefNode.create_local_scopec                 C   s   | j  |¡ d S rw   rR  r	  r0   r0   r1   Úgenerate_function_bodyù  r  z"FuncDefNode.generate_function_bodyc           '   
      sü  ddl m} ˆj}|jr|jsdtjtjf }ntj}| |¡ ˆj	 
||¡ ˆ ||¡ ˆjjdko7ˆjjj}ˆjjdkoBˆjjj}|pF|}|rUdˆjvrUˆjdg ˆ_ˆ ¡ }	ˆjr_d}
n| ¡ }
|
ry|j t dd	¡¡ |jjd
 ry| ¡  | |¡ | ¡ |_|j |j_|  ˆj!¡ ˆ "||¡ | #d¡ |	r¡| #|	¡ ˆ $||¡p©ˆj%}ˆj&r¶ˆj&j'||dd ˆj'||d |}|j(sÅ|jrÎ|j)}|j(sÅ|jsÅˆj*râ| +|j,j- .tj¡¡ | #d¡ n'ˆj/r	|jrù| +|j,j- .tj¡¡ | #d¡ | +|j,j- .tj¡¡ | #d¡ ˆ 0||¡ |j1D ]}|j2s!|j3s!| 4|¡ qd}ˆj5}|j6r3|j7r3|j8}|j9sW|j:r>d}n|j;rJd| <|j=¡ }| #d| .tj>¡|f ¡ | ?¡ }ˆ @|¡ ˆjA}dd„ |jBD ƒ}|jouˆj*puˆj/}d ‰d}|s€|r‹| C¡  d|j_d}n| ?¡ ‰|
r¬| D¡  d }ˆjEr§ˆjE F|¡ ˆjE G¡ }| H|¡ |r´ˆ I|¡ | ?¡ }| ?¡ }|jj }|rÉˆ J|¡ ˆj*r=tK Ldd¡}tK M|j,j-j|¡}|séd| N|j,j-jO¡ }| #dtj|j,j- P¡ || N|j,j-jO¡| NtjQ¡f ¡ | #dtj ¡ | #dtj|j,j- Rd¡f ¡ | SdtT¡ | #| Uˆj!¡¡ | #d¡ | Vtj|j,j-¡ | #d¡ ˆj/r‡ˆjWrU| #d||j,j- P¡ tjXf ¡ n| #d||j,j- P¡ tjXf ¡ |jrs| #dtj|f ¡ nˆj*r‡| S||j,j-¡ | Y||j,j-¡ |
r¯ˆjZr—t[ˆjjd  ƒ}nˆjj}|j\|ˆj!|jj ˆj&d ud! d|j_]ˆ ^||¡ |j_D ]+}|j-j;sÑ|sÆ|j`rÏ|j2sÏ| a|¡ q¸|j`râ|j2sâ|jb||jjd" q¸|j1D ]:}|j3r|j`r|j2s|j-j;r|jb||jjd" |jcr| d|¡ n| a|¡ |j- e|¡r |j- f||¡ qç|j1|j_ D ]}|j-jgr;|jhjijjr;| k||¡ q(ˆ l|¡ |j_D ]}|j-jgrT| m||ˆj!¡ qE|jjnr]d}|r{|jr{ˆd ursˆ C¡  d ‰d|j_| o¡  d|j_ˆ p||¡ |j ˆj!dd# | #d¡ | #d$¡ |jj|jjˆd u d%œ‰|f‡‡fd&d'„	‰ ˆj5}ˆj	jqsô|j:rÂtj>}ˆ d(ƒ | r||¡ n!|j;sã|j=}|r×| #dtj>|f ¡ n|j9sã| #d)tj> ¡ |
rô|jstj>ˆj!|ˆd(  d* | t|ju¡rWˆj	jqs| v|jw¡ | x|ju¡ |j y¡ D ]\}}ˆ d+ƒ |jz||ˆd+ d" qt{|ƒd,k} | r]|j t|¡ | #d-¡ | #d.¡ ˆ d+ƒ | #d/¡ | #d0¡ |D ]	}| }||¡ qN| #d1¡ |j;rrdd2l m~}! |! tj>|¡ tj>}"nˆ €¡ }"|
r¢ˆ d+ƒ | ¡  | #d3¡ | ‚ˆj!¡ | #d4¡ |jsd5ˆj!ˆd(  d6 | #d7¡ ˆ ƒ¡ }#|"d us®|#rÙˆ d+ƒ |jj„rÇ| #d8tj… ¡ | #d9tj… ¡ | †ˆjj‡¡ |jj„rØ| #d¡ ntˆˆjj!d:ˆjj‡ d,ƒ ˆ d+ƒ | ‰ˆjj‡¡ |j=}$|"d u rý|$rý|$}"|"d ur|"tj>kr| #dtj>|"f ¡ n|j9s| #d)tj> ¡ |r+ˆ d+ƒ ˆ Š|¡ | ?¡ f‡ ‡‡fd;d<„	}%| sA|sA|j;rSˆd+ sL|j;sLJ ‚| v|j¡ n|%ƒ  nd=d<„ }%| t|jw¡si| t|ju¡s»| x|jw¡ |D ]}ˆ d(ƒ | }||¡ qq|r‹ˆ d(ƒ ˆ ‹|¡ |j;r»| Œ| tj>¡¡}&| #d>|& ¡ ˆd( s¨| C¡  | #d?¡ ˆd( s¶| o¡  | #d¡ | t|j¡rË|%ƒ  | x|j¡ |j1D ]=}|jjrØ|j2rÚqÎ|j-jŽró|j3ré|j`séqÎ|j-jròˆ d(ƒ n|j- |¡r|j- ‘||¡ |j’|ˆd( d" qÎ|j_D ]0}|j2rq|j-j;r#|j`s"qn|s,|j`s,q|j-jŽr5ˆ d(ƒ |j’|ˆd( d" qˆj*rQˆ d(ƒ | “tj|j,j-¡ |jsm|j=}$ˆ €¡ }"|"d u rf|$rf|$}"| ”tj>|¡ ˆjj•rˆˆjjd@krˆˆ d(ƒ | #dAtj>tj>f ¡ |
r˜d|j_]|j–|jj d6 |jjnr³| —¡  |j˜ˆjj|dB |j™ˆd(  d6 |s¿|jrÇˆd( rÇ| o¡  d|j_|j9sÓ| #dCtj> ¡ | #d¡ |	râ| #dD|	 ¡ | š|j¡ | ›¡  ˆj&r÷ˆj& 
||¡ ˆ œ|¡ d S )ENr   r  z%s->%sÚ__getbuffer__Ú__releasebuffer__Zcython_unusedFZProfilez	Profile.cÚ	linetracerÃ   T©Úwith_pymethdefÚ
proto_only)rƒ  ú;z = NULLú = ú%s%s;c                 S   s   g | ]}|j r|‘qS r0   ©r°  )r–   rð   r0   r0   r1   r˜   a  rµ   z=FuncDefNode.generate_function_definitions.<locals>.<listcomp>Ztp_newr_   z
%s->tp_newz%s = (%s)%s(%s, %s, NULL);úif (unlikely(!%s)) {r×  ÚPy_Noneú} else {Ú}z*%s = (%s) __Pyx_CyFunction_GetClosure(%s);z%s = (%s) %s;z
 (wrapper))r{  Zis_cpdef_func©Úhave_gil©Útraceú/* function exit code */)Úsuccessr   Úgil_state_declaredc                    s<   ˆ |  sˆ d sˆ  ¡  dˆ d< |jdd dˆ | < d S d S )Nr“  TF©Údeclare_gilstate)r•  Úput_ensure_gil)Z	code_pathrM   )Ú	gil_ownedÚgilstate_declr0   r1   Ú
assure_gilü  s   ûz=FuncDefNode.generate_function_definitions.<locals>.assure_gilr’  z!__Pyx_pretend_to_initialize(&%s);©r“  r{  r   r   z0{ PyObject *__pyx_type, *__pyx_value, *__pyx_tb;Ú__Pyx_PyThreadState_declareÚ__Pyx_PyThreadState_assignz5__Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);z5__Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}rÿ  z#if CYTHON_USE_SYS_MONITORINGú#elseÚNULL)r{  ú#endifzint %s = 0; /* StopIteration */ú
if (!%s) {z&Unraisable exception in function '%s'.c                    s^   ˆd rˆ d| d nˆd r|   ¡  dˆd< ˆd ˆd ks-J dˆjˆd ˆd f ƒ‚d S )Nr’  r   ©rM   Fz$%s: error path %s != success path %s)Úput_release_ensured_gilr4   r¡  )r™  r—  r~   r0   r1   Ú$align_error_path_gil_to_success_patha	  s   ÿzWFuncDefNode.generate_function_definitions.<locals>.align_error_path_gil_to_success_pathc                   S   rŸ   rw   r0   r0   r0   r0   r1   r£  w	  s    ú	if (%s) {zOPyErr_SetString(PyExc_TypeError, "Memoryview return value is not initialized");Ú__hash__z5if (unlikely(%s == -1) && !PyErr_Occurred()) %s = -2;)Úacquire_gilú
return %s;ú#endif /*!(%s)*/)rÃ   r  r{  Úis_closure_scopeZis_passthroughr   Úcur_scope_cnameÚouter_scope_cnameZmangle_closure_cnamesr¨   rç   rò   rð   ra   r¨  r‡  rÐ  Úget_preprocessor_guardrz  Ú
is_tracingræ   r  r   Úload_cachedrà   Zuse_fast_gil_utility_codeÚenter_cfunc_scopeÚ	new_labelÚreturn_from_error_cleanup_labelr{  rZ  r—  r  r4   rñ   rH   Úneeds_assignment_synthesisÚpymethdef_requiredÚpy_funcÚgenerate_function_headerrv  r-  rw  ÚputÚscope_classr2  r.  Úneeds_outer_scopeÚgenerate_argument_declarationsr;  Ú
in_closurerÅ  Úput_var_declarationr“  Zis_cv_qualifiedrZ  Zcv_base_typer-  rA  r/  Zliteral_coder™  Úretval_cnamerD   Úgenerate_keyword_listr¦  Zbuffer_entriesr–  Úput_trace_declarationsÚcode_objectÚgenerate_result_codeÚ	py_resultZput_trace_frame_initÚgetbuffer_checkÚgetbuffer_initr   ZConstructorSlotZget_slot_functionr_  Útypeptr_cnamerÄ  Zempty_tuplerÒ  Ú
put_increfr
   ra  r^  Úis_cyfunctionÚ
self_cnamerÚ  r×   r   Úput_trace_startÚ	can_traceÚgenerate_argument_parsing_codeÚarg_entriesZcf_is_reassignedÚput_var_increfÚput_var_incref_memoryviewsliceÚxdecref_cleanupÚput_var_xincrefZneeds_explicit_constructionZgenerate_explicit_constructionr,  Z
buffer_auxZbuflocal_nd_varr°  Zput_init_varsÚgenerate_argument_type_testsZput_acquire_arg_bufferZneeds_refnannyr¢  r~  rÖ   Úput_init_to_py_noneÚput_trace_returnÚ
label_usedÚerror_labelÚput_gotoÚreturn_labelÚ	put_labelÚall_managed_tempsÚput_xdecrefrA   Úrestore_exception_utility_codeZput_release_buffer_coder   Zput_init_entryÚerror_valueÚput_trace_exception_propagatingÚput_trace_unwindÚcaller_will_check_exceptionsÚerror_without_exceptionÚerror_without_exception_cnameÚput_add_tracebackÚqualified_namer   Zput_unraisableÚgetbuffer_error_cleanupÚgetbuffer_normal_cleanupÚunlikelyZerror_conditionÚneeds_refcountingZrefcounting_needs_gilZneeds_explicit_destructionZgenerate_explicit_destructionÚput_var_xdecrefÚ
put_decrefÚput_xgiverefÚ
is_specialÚput_trace_exitÚput_declare_refcount_contextÚput_setup_refcount_contextÚput_finish_refcount_contextÚput_temp_declarationsÚexit_cfunc_scopeÚgenerate_wrapper_functions)'r~   rŒ   rM   r  rs  r«  Zis_getbuffer_slotZis_releasebuffer_slotZis_buffer_slotÚpreprocessor_guardÚtracingrƒ  Úcenvrð   Úinitr“  Útempvardecl_coder¦  Zused_buffer_entriesZvar_decls_definitely_need_gilZvar_decls_need_gilr¿  Zrefnanny_decl_codeZrefnanny_setup_codeZrefnanny_needs_gilZtp_slotZslot_func_cnameZ
trace_nameÚlhsÚvalr‰  r2  Zbuffers_presentr   Úerr_valr¤  Zdefault_retvalr£  Úcondr0   )r™  r—  r˜  r~   r1   rç   ü  sæ  ÿ
ÿÿ

ÿ



ÿÿÿ



€
þ





ÿ

ûþ



ý
ýÿ


€ÿ€

ÿ
€€


€



ý	
ÿ









ÿ

€ÿþ
€

ÿ
ÿ
ÿ


€

ÿ
ÿ

z)FuncDefNode.generate_function_definitionsc                 C   sh   |j jrt|jdƒ n|j  ¡ s!|j js!|j js!t|jd|j  ƒ | |j|j |j¡}|j	r2|j	|_	|S )NzInvalid use of 'void'z Argument type '%s' is incomplete)
r2  r-  r   r4   r_  r+  r/  Zdeclare_argra   r¸  )r~   rŒ   r¥  rð   r0   r0   r1   Údeclare_argumentë	  s   zFuncDefNode.declare_argumentc                 C   s’   |j  ¡ rA|j t dd¡¡ | |j ¡}d|jj }d}|j j	r,|j j
r,|jr*dnd}| d|||j|j|| |j¡f ¡ d S t|jdƒ d S )	NZArgTypeTestúFunctionArguments.cú((PyObject *)%s)r   r%   r   z8if (unlikely(!__Pyx_ArgTypeTest(%s, %s, %d, %s, %s))) %szICannot test type of extern C class without type object name specification)r2  Ztypeobj_is_availableræ   r  r   r®  Útypeptr_cname_in_module_staterð   r‰  Úis_builtin_typeZrequire_exactrÏ  rH   Úaccept_noner»  ra  r4   r   )r~   r¥  rM   rÄ  Úarg_codeÚexactr0   r0   r1   Úgenerate_arg_type_testõ	  s(   

ÿ
úÿ	z"FuncDefNode.generate_arg_type_testc                 C   sd   |j jrd|jj }n|jj}| d| ¡ | dtdt|jƒƒ|j| |j	¡f ¡ | d¡ d S )Nz
%s.memviewz,if (unlikely(((PyObject *)%s) == Py_None)) {zKPyErr_Format(PyExc_TypeError, "Argument '%%.%ds' must not be None", %s); %séÈ   rŒ  )
r2  r/  rð   r‰  rH   r«   rA   r»  ra  r4   )r~   r¥  rM   r‰  r0   r0   r1   Úgenerate_arg_none_check
  s   
þz#FuncDefNode.generate_arg_none_checkc                 C   rŸ   rw   r0   r¥   r0   r0   r1   rñ  
  r¡   z&FuncDefNode.generate_wrapper_functionsc                 C   s6   |  | j¡ | js| jD ]}|js| |¡ qd S d S rw   )r  r4   r×   rJ   ræ  rß  ©r~   rM   r¥  r0   r0   r1   ré   
  s   

€ýz#FuncDefNode.generate_execution_codec              	   C   sJ   | j jd }z|jjjjd j}W ||fS  ttfy$   d }Y ||fS w )Nr   Úobj)r{  rË  r2  r3  r¨  rï   rª   ÚKeyError)r~   Ú	py_bufferÚobj_typer0   r0   r1   Ú_get_py_buffer_info(
  s   ýýzFuncDefNode._get_py_buffer_infoc                 C   sB   |   ¡ \}}|j}| d| ¡ | d¡ | d¡ | d¡ d S )Nzif (unlikely(%s == NULL)) {zZPyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete");z
return -1;rŒ  )r  r‰  rH   )r~   rM   r	  r!  Úviewr0   r0   r1   rÂ  8
  s   

zFuncDefNode.getbuffer_checkc                 C   sR   |   ¡ \}}|j}|r |jr | d| |¡ | d| |¡ d S | d| ¡ d S )Nú%s->objz%s->obj = NULL;)r  r‰  rA  rÑ  rÚ  rH   ©r~   rM   r	  r
  r  r0   r0   r1   rÃ  A
  s   
zFuncDefNode.getbuffer_initc                 C   sj   |   ¡ \}}|j}|r,|jr,| d| ¡ | d| |¡ | d| |¡ | d¡ d S | d| ¡ d S )Nzif (%s->obj != NULL) {r  rŒ  zPy_CLEAR(%s->obj);©r  r‰  rA  rH   r^  rb  r  r0   r0   r1   rã  J
  s   
z#FuncDefNode.getbuffer_error_cleanupc                 C   s`   |   ¡ \}}|j}|r,|jr.| d| ¡ | d| |¡ | d| |¡ | d¡ d S d S d S )Nzif (%s->obj == Py_None) {r  rŒ  r  r  r0   r0   r1   rä  U
  s   
üz$FuncDefNode.getbuffer_normal_cleanupc                 C   sh   | j jsd S | j j}t | jj¡ |¡}|sd S |dkr%| j j 	d¡s%d S |dv r0| j jj
r0d S | ¡ S )NZ__long__Ú__int__©r  r€  )rð   rê  ra   r   Úget_slot_tabler{  rà   Úget_slot_by_method_namer¨  r	  r‡  Úpreprocessor_guard_code)r~   ra   Úslotr0   r0   r1   r¬  ^
  s   z"FuncDefNode.get_preprocessor_guard)'r+   r,   r-   r´  rw  r¸  r³  rz  rx  Úis_coroutineÚis_asyncgenry  Zis_async_defrÐ  Úhas_fused_argumentsÚstar_argÚstarstar_argrÆ  r¿  rk  rÛ   rj  rm  ro  rt  r}  r~  rç   rû  r  r  rñ  ré   r  rÂ  rÃ  rã  rä  r¬  r0   r0   r0   r1   ri  ~  sP       r
			ri  c                       s  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d„ Zdd	„ Zed
d„ ƒZejdd„ ƒZdd„ Zdd„ Zdd„ Zd7dd„Zdd„ Zdd„ Zdd„ Zdd„ Zd8dd„Zd9d!d"„Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Z d+d,„ Z!‡ fd-d.„Z"d/d0„ Z#d1d2„ Z$d3d4„ Z%‡ fd5d6„Z&‡  Z'S ):rM  )r3  r·  r¨   r5  Úpy_func_statr5  r  FNc                 C   ó   | j jS rw   )rð   ra   r”   r0   r0   r1   Úunqualified_name‘
  ó   zCFuncDefNode.unqualified_namec                 C   r;  rw   r¹  r”   r0   r0   r1   r  ”
  r=  zCFuncDefNode.declared_namec                 C   s   | j r| j jS | jS rw   )r´  r¿  Ú_code_objectr”   r0   r0   r1   r¿  —
  s   zCFuncDefNode.code_objectc                 C   s
   || _ d S rw   )r  )r~   r¿  r0   r0   r1   r¿  œ
  r¼  c                 C   s~  |j d | _|j| _| jd u ri | _| j |j  di ¡¡ | jd urB| j |¡}|d u rA| jj	r7| j
 |¡}nt| jjdƒ tj}n| j
 |¡}d|j v oR| d¡ | _t| jtƒro| jj||d| jd u | j| jd\}}n| jj||d| jd u | jd\}}|jsŠt| jdƒ || _| j|_| j}t|d	ƒs¡|j}t|d	ƒr™|| _|j| _| jj}| jd
ks´| j r½|r½t| jjdƒ |j!dkrÞ| jdkrÞ|j"d ur×|j"j#r×t| jdƒ nt$| jddƒ t%| j|jƒD ]\\}}|  &||¡ |j|_|j'|_'|j(|_(|  )|j|j|¡ |jj*rd| _+|jj,rd| j-v rt$|jddƒ |jj,s(|jj.rA| jj/r4t|jdƒ qåd| j-v rAt$|jddƒ qå|  )|j0| j|¡ |j'}	|j(}
| j1|_1| j|_|j2|	|| j|
| j| j | jd u| j-| j| j3d
| _4|j0| _0| j0j5r‡| jdkr‡t| jdƒ | j0j6r”| j0 7| jd¡ | jr³|j8s³| js³t9| jƒdk s°| jd jj:s³d| _|  ;|¡ |  <|¡ d S )NÚc_compile_guardÚlocalsro  r  r%   )r4  rž  r5  )r4  r5  z*Suite attached to non-function declarationrJ   rX  zBFunction with optional arguments may not be declared public or apirr  rP  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‰  r5  r*  ÚdefiningrÐ  rœ  r6  zFunction cannot return an arrayzused as a return valuer   F)=rà   r   r‡  Úis_c_class_methodrž  r†   rz   Údirective_returnsrO  Zis_annotationr3  r7  r   r4   r	   r   r	  r0  rB   r·  re  r¨   r5  rS  r2  rœ  r}  Úhasattrr:  Zcfunc_declaratorrJ   ry  r*  rz  rf  rÓ   r   Úzipro  ra   r‰  Ú_validate_type_visibilityr/  r  r,  rÐ  Úis_pythran_exprr{  r“  r~  r1  Úinline_in_pxdrð   r+  rQ  Zcheck_nullary_constructorr.  rA   rA  Údeclare_cpdef_wrapperr}  )r~   rŒ   r3  r   Útypr·  Zopt_arg_countÚ
formal_argÚtype_argra   r‰  r0   r0   r1   r     
  sª   

€þ
ÿ

ÿÿÿÿ

ÿ€
ü
 
z!CFuncDefNode.analyse_declarationsc                 C   sŽ  | j sd S | jrt| jdƒ | j|jd}tj||ddd}| jr?ddlm	} t
| j|| jtdƒdd	g}|d
 j |¡ ng }| jj}t| j| jj| jd d | jt| j|gd|dd	| _|j| j_| j |¡ d| jj_t| j| jgd| _tj| j_| jj| j_d | j_| jj_| j|j|< | jjsÃ|jrœtj rÅ| j!r¬| jj"s¥J ‚| j| j!_d S t#| j| jd| _!t| j| j!| j$gd| _$d S d S d S )Nz&static cpdef methods not yet supported)r.  F)Úprofiler  r   ©rg  r  r$  ©Ú	decoratorr   rÿ   )	r4   ra   rJ   r  r  r;   r¨   r5  r×   T)r´  )%rœ  r0  r   r4   Úcall_self_noder.  rÞ   râ   rU  rg  ÚDecoratorNoder   r2  rj   rð   ra   ÚDefNoderJ   r;   rô   r´  r    r}  r  r	   r
   r2  Úas_variabler°  rï   Úis_final_cmethodr    Úlookup_module_cpdefÚoverrideÚis_fused_specializedÚOverrideCheckNoder¨   )r~   rŒ   Zpy_func_bodyrg  r5  ra   r0   r0   r1   r+  
  sV   ÿø
	

ÿÿøz"CFuncDefNode.declare_cpdef_wrapperc                 C   sf   | j dkp| j}t|ddƒ}|r'|r)|jr+|j dv s-|js/|js1t|dƒ dS dS dS dS dS dS dS )zo
        Ensure that types used in cdef functions are public or api, or
        defined in a C header.
        rX  rð   N)rX  rP  z:Function declared public or api may not have private types)r5  r*  rš   r.  r  r   )r~   r2  r4   rŒ   Zpublic_or_apirð   r0   r0   r1   r(  9  s   
ÿÿýz&CFuncDefNode._validate_type_visibilityr   c                    s   ddl m‰  ˆjj}|r|d t|ƒˆjj … }dd„ |D ƒ}|r.ˆ jˆjˆjj	d}|}nAˆjj
rPˆjjjj}ˆ jˆj|j	d}||_ˆ jˆj|ˆjj	d}nˆjjd jj}	ˆ jˆj|	j	d}
|	|
_ˆ jˆj|
ˆjj	d}|ostj }ˆ jˆj|‡ ‡fdd„|D ƒ|d	}tˆjtj|d
S )Nr   ©rU  c                 S   ó   g | ]}|j ‘qS r0   r$  ©r–   r¥  r0   r0   r1   r˜   J  ó    z/CFuncDefNode.call_self_node.<locals>.<listcomp>r$  )r  Ú	attributer   c                    s   g | ]
}ˆ j ˆj|d ‘qS ©r$  )rg  r4   )r–   Ún©rU  r~   r0   r1   r˜   ]  ó    )ÚfunctionrJ   Zwrapper_call)r4   r“  r   )rÃ   rU  r2  rJ   rA   ry  rg  r4   rð   ra   r0  r¨  r‹  ZAttributeNoder    r8  ÚSimpleCallNodeÚReturnStatNoder	   r
   )r~   Zomit_optional_argsr.  rJ   Ú	arg_namesÚcfuncZcall_arg_namesZclass_entryZ
class_noder
  r.  Zskip_dispatchZc_callr0   rC  r1   r3  E  s2   üzCFuncDefNode.call_self_nodec                 C   s0   | j jD ]}|jst|jdƒ |  ||¡ qd S )Nr&  )r2  rJ   ra   r   r4   rû  rl  r0   r0   r1   Údeclare_argumentsa  s
   ýzCFuncDefNode.declare_argumentsc                 C   r  rw   )r2  r|  rr  r0   r0   r1   rt  g  r  z!CFuncDefNode.need_gil_acquisitionc                 C   s^   | j }|j}|jr)|s+|jjrt| jdƒ | jjD ]}|j jr(|j	s(t| jdƒ qd S d S d S )Nz9Function with Python return type cannot be declared nogilz8Function declared nogil has Python locals or temporaries)
r2  r|  r{  r“  rA  r   r4   r{  r;  Zin_with_gil_block)r~   rŒ   r2  r|  rð   r0   r0   r1   rÜ   j  s   
ÿ€úzCFuncDefNode.nogil_checkc                 C   sd   |j | j_ | jd ur| j |¡| _n| jd ur| j |¡| _n
|  |¡ |  |¡ |  | j¡| _| S rw   )	rà   r{  r  ri   r´  rj  rm  rt  r¦  r‹   r0   r0   r1   ri   u  s   




z CFuncDefNode.analyse_expressionsc                 C   rp  ©NFr0   r	  r0   r0   r1   r²  ƒ  r¡   z'CFuncDefNode.needs_assignment_synthesisr   c                 C   sà  | j }g }| j}|jd t|jƒ|j … D ]}	|	 ¡ }
| |	j¡}|js(d|
 }
| 	|
¡ q|rJ| j
rJtj tj¡}| jrC| 	|¡ n| 	d| ¡ |jrY|rY| 	|j tj¡¡ |jra| 	d¡ |sfdg}|d u rn| jj}| |d |¡¡}| jjdkr„d|vr„d}nd}d }| | jj¡}| jj||d	}| jp| jj}| jr³|r­|jjd
   | j¡ |  | j¡ |rÝ|  !¡ }|rÄ|jjd
   |¡ |jjd
   d|||f ¡ |rÝ|jjd
   d¡ |  d|||f ¡ |j "| j¡ d S )NzCYTHON_UNUSED %sz...Úvoidr±   Úprivatez::zstatic rÃ   )Údll_linkageZmodule_declarationsz%s%s%s; /* proto*/rŸ  z%s%s%s {)#r{  r2  rJ   rA   ry  r.  rñ  ra   Úcf_usedri  rœ  r	   r¬  r   Úskip_dispatch_cnamer9  r±  Úoptional_args_cnamer›  rð   Ú
func_cnameZfunction_header_coder·   r5  Zbuild_function_modifiersZfunc_modifiersr“  r$  rØ   rP  ræ   ÚpartsrH   r¬  Úuse_entry_utility_code)r~   rM   rƒ  Úwith_opt_argsÚwith_dispatchr‰  r¨  Z	arg_declsr2  r¥  Zarg_declrð   Zdispatch_argÚentityZstorage_classrN  rÐ  ÚheaderZneeds_protorò  r0   r0   r1   rµ  †  s^   
ÿ

ÿz%CFuncDefNode.generate_function_headerc                 C   sZ   | j }| jD ]$}|jr*| |j¡}| js|jr*| |¡}| d|j	 
|j¡|f ¡ qd S rÖ  )r{  rJ   r"  rñ  ra   r9  rO  rÓ  rH   r2  r.  r‰  )r~   rŒ   rM   r¨  r¥  rð   r€   r0   r0   r1   r¹  ¹  s   

ÿ€ûz+CFuncDefNode.generate_argument_declarationsc                 C   rŸ   rw   r0   r¥   r0   r0   r1   r½  Ã  r¡   z"CFuncDefNode.generate_keyword_listc           
   	      s
  d}d}| j }| jjrnˆ dtj ¡ | jD ]F‰ ˆ jr\| ˆ j	¡}| j
s'|jrXˆ dtjtj|f ¡ ˆ j}t|dƒsC|j}t|dƒr;ˆ dˆ jtj| j |j	¡f ¡ |d7 }|d7 }qt|ƒD ]}ˆ d¡ qaˆ d¡ ‡ ‡fdd	„}	| jD ]
‰ |	| ˆ j	¡ƒ qxd S )
Nr   r¤  zif (%s->%sn > %s) {ra   z%s = %s->%s;r   rŒ  c                    s`   | j r,ˆ js.ˆ d| j| jf ¡ | jjr | j ˆ| jd¡ d S ˆ | ¡ ˆ 	| ¡ d S d S d S )Nr×  T)
rº  r"  rH   r‰  Úoriginal_cnamer2  r/  Úgenerate_incref_memoryviewslicerÌ  Úput_var_giveref©rð   ©r¥  rM   r0   r1   Úput_into_closureà  s   
úzECFuncDefNode.generate_argument_parsing_code.<locals>.put_into_closure)r{  r2  ry  rH   r   rQ  rJ   r"  rñ  ra   r9  rO  rª  r·  r&  r:  r‰  Zopt_arg_cnameÚranger	  )
r~   rŒ   rM   rŸ  r°  r¨  rð   r·  r!  r^  r0   r]  r1   rÊ  Æ  sB   
ÿÿ

ÿÿÿ€

ÿz+CFuncDefNode.generate_argument_parsing_codec                 C   rŸ   rw   r0   r¥   r0   r0   r1   Ú!generate_argument_conversion_codeì  r¡   z.CFuncDefNode.generate_argument_conversion_codec                 C   s@   | j jD ]}|jr|  ||¡ q|j jr|js|  ||¡ qd S rw   )r2  rJ   Úneeds_type_testr  rA  r   r  r  r0   r0   r1   rÐ  ï  s   €üz)CFuncDefNode.generate_argument_type_testsc                    sH   |j jd r| | j¡ | d¡ tƒ  |¡ | jr"| j |¡ d S d S )Nr  rÃ   )ræ   rà   r  r4   rH   r^   ré   r  r¥   rf   r0   r1   ré   ø  s   
ÿz$CFuncDefNode.generate_execution_codec                 C   s   | j jrdS | jjjS )NÚ0)r“  rA  rð   r2  rf  r”   r0   r0   r1   rÛ     s   
zCFuncDefNode.error_valuec                 C   ó
   | j jjS rw   )rð   r2  rz  r”   r0   r0   r1   rÞ    r=  z)CFuncDefNode.caller_will_check_exceptionsc                 C   s$  d}| j }|j}|jd ur|d7 }|j}d| j jtj|f |_| ¡  | j|d|jj|jj	|jd | j
js;| d¡ | jj}dd„ |d t|ƒ| jj	 … D ƒ}|jjr[| tj¡ n|jrc| d¡ |jj	rn| tj¡ n|j	rv| d	¡ | d
| j jd |¡f ¡ | d¡ |jd usd S d S )Nr   r   z%s%swrap_%s)rV  rU  r‰  úreturn c                 S   r=  r0   )r‰  r>  r0   r0   r1   r˜     r?  z;CFuncDefNode.generate_wrapper_functions.<locals>.<listcomp>rb  rž  ú%s(%s);r±   rŒ  )rð   r2  Z
prev_entryrR  r   rª  rH   rµ  r}  ry  r“  r-  r¶  rJ   rA   ri  rP  rQ  r·   )r~   rM   r   rð   r€  rJ   Zarglistr0   r0   r1   rñ  	  s:   
ü
"


éz'CFuncDefNode.generate_wrapper_functionsc                    s(   t ƒ  ¡ }| jr|rJ ‚d| j› S |S )Nz#if )r^   r¬  r   )r~   Zsuper_guardrf   r0   r1   r¬  (  s
   
z#CFuncDefNode.get_preprocessor_guard)r   r   rw   )r   r   N)(r+   r,   r-   r™   rÛ   r*  r5  rž  r%  r9  rP  r~  r  r  r  r  rç  r¿  Úsetterr    r+  r(  r3  rJ  rt  rÜ   ri   r²  rµ  r¹  r½  rÊ  r`  rÐ  ré   rÛ  rÞ  rñ  r¬  rg   r0   r0   rf   r1   rM  l
  sL    

j/


3
&	rM  c                   @   s    e Zd Zg ZdZdZdd„ ZdS )ÚPyArgDeclNodeFc                 C   r  rw   )rð   rç   r	  r0   r0   r1   rç   ;  r  z+PyArgDeclNode.generate_function_definitionsN)r+   r,   r-   r™   rn  rá  rç   r0   r0   r0   r1   rg  0  s
    rg  c                   @   ó   e Zd ZdgZdS )r4  r2  N©r+   r,   r-   r™   r0   r0   r0   r1   r4  ?  s    
r4  c                   @   s"  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	d
„ Z		d3dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!dd„ Z"dd„ Z#dd„ Z$dd „ Z%d4d!d"„Z&d#d$„ Z'd%d&„ Z(d'd(„ Z)d5d)d*„Z*d+d,„ Z+d-d.„ Z,d/d0„ Z-d1d2„ Z.dS )6r5  )rJ   r  r  r¨   r5  rk  r5  rk  FNrb  r   Tc                 K   s„   t j| |fi |¤Ž d } } }}| jD ]}|jr|d7 }|jr,|d7 }|js,|d7 }|js3|d7 }q|| _|| _|| _|| _	d S r2   )
ri  rˆ   rJ   rå  rä  r"  Únum_posonly_argsÚnum_kwonly_argsÚnum_required_kw_argsÚnum_required_args)r~   r4   rK   Úpr   ZrkÚrr¥  r0   r0   r1   rˆ   x  s    
€
zDefNode.__init__c
                 C   s  | j r
t| j jdƒ | jrt| jjdƒ |pd\}
}|p|	}|d u rXg }| jD ]}|j|dd\}}| tj|j	d |j
t|jd¡ q'tjt|dd |||	|d}t| j|d	}nW|d u r_|j}|j}|jrgd
}t| jƒt|jƒkst|jr€t| jdƒ t|jdƒ tt| j|jƒƒD ]%\}\}}|j|d|dko™|jd\}}|d u s§|tju r®|j|_||_q‰|
d u rÎ|jd urÎddlm} |j| jt|jƒ|j|jjd}
t| jt| j| j	d d| jd|j|
||j |j!d	}t"| j|píg t#| j|jd	|| j$| j%|j&||j |j!ddt'|di ƒ|dS )Nz'cdef function cannot have star argumentz+cdef function cannot have starstar argumentrK  r   rÂ  )ra   r‰  r¸  r2  r4   F)r“  rJ   r›  rf  rz  r{  r|  r}  rê  Tzwrong number of argumentszprevious declaration herer   rm  ru  rw  r  )r:  rJ   r›  rz  rf  r  r|  r{  rM  rž  )rÐ  r3  r·  r¨   r;   rœ  r2  r|  r{  r5  r*  rž  r%  )(r  r   r4   r  rJ   r7  ri  r	   rŒ  ra   r¸  r
   rš  r  r¨  r2  rz  rA   r›  r†  r'  r‡  r   rf  rU  rv  r  r‘  r“  Zpython_valuere  r!  r|  r{  rM  rË  r¨   r;   r}  rš   )r~   rI  r¨  rœ  ÚreturnsZ
except_valr  rÐ  r{  r|  rf  rz  Z
cfunc_argsr-  r   r2  Z
cfunc_typerŸ  r.  rv  r·  r0   r0   r1   Úas_cfunctionŠ  s’   

üù
ÿ€þø	
ózDefNode.as_cfunctionc                 C   s   | j rdS | js| jrdS dS )z·Determines if the function's signature is compatible with a
        cdef function.  This can be used before calling
        .as_cfunction() to see if that will be successful.
        FT)rw  r  r  r”   r0   r0   r1   Úis_cdef_func_compatibleÕ  s
   zDefNode.is_cdef_func_compatiblec              	   C   sÌ  | j r#| j D ]}|j}|jr"|  j|jdkO  _|  j|jdkO  _q| jr.| d¡r.d| _| jr9| d¡r9d| _|js?|jr„| jdkrK|jrKd| _n9| jdkrZ|jrZt	| j
dƒ n*| jtv r„| js„d| _dd	lm} | j pog | _ | j  d
t| j
|| j
tdƒdd¡ |  |¡ | jdkr”|  |¡ n|  |¡ |  |¡ | jj ¡ | _| jtu rÆ| jrÆ|jd rÆ| jjsÆ| j |¡\}}|rÆ|jrÆ|| _|  |¡ t| j
| | jj| j | j!| j"| jd| _#| j# $|¡ d S )Nrì   r  Fr_   Tr(   z7'__init_subclass__' is not supported by extension classr   r0  r   r$  r1  ú<lambda>rÁ  )rÞ  ra   rJ   r  r  r“  )%r5  r2  rÓ   Úis_classmethodra   Úis_staticmethodr	  rv  r‡  r   r4   ÚIMPLICIT_CLASSMETHODSrU  rg  Úinsertr4  r   Úanalyse_argument_typesÚdeclare_lambda_functionÚdeclare_pyfunctionÚanalyse_signaturerð   Ú	signaturer“  r
   rk  rà   rê  rÊ  rA  r}  ÚDefNodeWrapperrJ   r  r  Ú
py_wrapperr    )r~   rŒ   r2  rS   rg  r!  r“  r0   r0   r1   r    à  sZ   
€
ÿ





ùzDefNode.analyse_declarationsc                 C   sÂ  |j  di ¡| _|j d }|j}d |_| jD ]±}t|dƒr d }n%|j |¡}t|ƒr5|j	r5t
 ||jg¡}|j ||¡\}}|j|_||_|  ||¡ |rV|jrVt| jdƒ |j ¡ |_d |_d|_d|_d|_|jjst|jjst|jjr§|jr{d|_nE|jr‚d|_n>|jjs’|jj s’|jjs’|jjr£|j!rŸ|j!j"d u rŸd|_n!||_nd|_n|jj#sÀd|_|jr·t|jd	ƒ |jrÀt|jd
ƒ |jj$rÇd| _%q||_t|ƒrÜdd„ t&| jƒD ƒ| _'d S g | _'d S )Nr!  Úallow_none_for_extension_argsra   z9Python function argument cannot have C name specificationr   r   TFz.Only Python type arguments can have 'not None'z-Only Python type arguments can have 'or None'c                 S   s   g | ]
\}}|j jr|‘qS r0   )r2  Zis_numpy_buffer)r–   rŸ  Úar0   r0   r1   r˜   S  rD  z2DefNode.analyse_argument_types.<locals>.<listcomp>)(rà   rz   rž  r0  rJ   r&  r3  r7  r"   r)  r	   r'  Z
org_bufferr·  ra   r2  ro  r‰  r   r4   Zas_argument_typeÚhdr_typer½  ra  râ  rA  r,  r/  rŽ  r   r  Úis_extension_typerÿ  r"  r[  r’  r/  r  r†  Únp_args_idx)r~   rŒ   r  Zf2sr¥  r   r3  r2  r0   r0   r1   rx    sh   


ýÿ
ÿÿ€
zDefNode.analyse_argument_typesc           	      C   s¢  | j jr| jrt| jdƒ t| jƒdko| jp| j | j _	nr| js| js|j
d r3tdd„ | jD ƒƒr| j jtju rbt| jƒdkrGtj| j _nIt| jƒdkra| jd jd u ra| jd jsatj| j _n.| j jtju rt| jƒdkrvtj| j _nt| jƒdkr| jd jd u r| jd jstj| j _| j j}| ¡ }| ¡ }|tju r½|dkr½t| jƒdkr½| jr½tj }| j _d| _d }}| jrÜ|jrÜd }}d| _t |¡ | j _}d	|_d|_d|_| jsâ| jrï| jrï|jrï| j j!d d …= t"t#|t| jƒƒƒD ]X}| j| }d|_$||krd|_%| &|¡r2| js2| jr$d|_'t(j) |_*|_+n
d|_&|j, |_*|_+d|_-qù| .|¡|_*|j+ /|j*¡sQ|j*j0rN|j+j0rNd|_1qùd|_-qù|t| jƒkr`|  2¡  d S |t| jƒk rˆ|jsp|  2¡  | jD ]}|j$r†|j+j3sƒ|j+j4r†d|_1qs| 5¡ }|rÉtj6|v rË| j jsÍ| jrºd}| jD ]}|j$r·|js·|j&s·|j's·d
}q£nd
}|sÏ| 7¡  }| j _d S d S d S d S d S )Nz8special functions of cdef classes cannot have decoratorsr   Zalways_allow_keywordsc                 S   r=  r0   ©rå  r>  r0   r0   r1   r˜   ^  r?  z-DefNode.analyse_signature.<locals>.<listcomp>r   r%   Trx  F)8rð   rê  r5  r   r4   rA   rJ   r  r  Ztrivial_signaturerà   r  r|  r   Zpyfunction_signatureZpyfunction_noargsr"  rä  Zpyfunction_oneargZpymethod_signatureZ	unaryfuncZibinaryfuncÚmax_num_fixed_argsÚmin_num_fixed_argsÚself_in_starargru  r‡  r   Zfixed_arg_formatÚhas_generic_argsrt  r  Zdecorator_indirectionrõ   r_  Úminrâ  rã  rn  rá  r   Ú	type_typer  r2  r‹  r½  Zfixed_arg_typerˆ  rA  ra  Úbad_signaturer‚  rÿ  Úmethod_flagsZmethod_varargsZwith_fastcall)	r~   rŒ   ÚsigZnfixedZ
min_nfixedrŸ  r¥  ÚmfZuses_args_tupler0   r0   r1   r{  W  s²   "ÿþ
€
ÿÿ

€
€
ÿÿ€üïzDefNode.analyse_signaturec                 C   sv   | j j}d| ¡  }|jr|d7 }n|jr|d| ¡  7 }| j}| j jr'd}nd}t| j	d|| jt
| jƒ|f ƒ d S )Nz%dz or morez to %dzSpecial methodZMethodz>%s %s has wrong number of arguments (%d declared, %s expected))rð   r|  r†  rˆ  Zoptional_object_arg_countr…  ra   rê  r   r4   rA   rJ   )r~   r  Zexpected_strra   Údescr0   r0   r1   r‹  ¾  s   
ÿzDefNode.bad_signaturec                 C   s  | j }| |¡}|r(|jr|jjst| jdƒ |jjr(|j	s(| j
s(t| jddƒ |j|| j| j
 d}|| _| |j¡}ttj| | ƒ| j_tjr…t| j| jƒ|_ttj| | ƒ|_|jrƒ|j tjv sr|jrr|j dv rw|jd rwd |_d S ttj| | ƒ|_d S d S d |_d S )Nz:Only final types can have final Python (def/cpdef) methodsz¥Overriding a c(p)def method with a def method. This can lead to different methods being called depending on the call context. Consider using a cpdef method for both.é   )Zallow_redefineÚ__getattr__Zfast_getattr) ra   r	  r7  r‹  Úis_final_typer   r4   r2  rS  Zis_builtin_cmethodr×   r   rz  rð   Únext_idÚscope_prefixr   r   Zpyfunc_prefixÚpyfunc_cnamer    r4  r<   r;   Zfuncdoc_prefixÚ	doc_cnamerê  r   Z	invisiblerà   Úwrapperbase_cnameZwrapperbase_prefix)r~   rŒ   ra   rð   Úprefixr0   r0   r1   rz  Í  s.   
þ
û
zDefNode.declare_pyfunctionc                 C   s*   |  | j| j¡}d |_|| _|j| j_d S rw   )ry  Úlambda_namer4   r;   rð   r‰  r•  )r~   rŒ   rð   r0   r0   r1   ry  è  s   zDefNode.declare_lambda_functionc                 C   s”   | j D ]6}|jst|jdƒ |jr%| |j|j|j¡|_|jjr$d|j_	n|  
||¡|_d|j_d|j_|j|j_q|  || j¡ |  || j¡ d S )Nr&  rb  r   )rJ   ra   r   r4   r½  r«  r2  rð   rA  rõ  rû  rÅ  r°  rn  Údeclare_python_argr  r  rl  r0   r0   r1   rJ  î  s   
€zDefNode.declare_argumentsc                 C   sV   |r)|j d dkrtj}nt}| |j||j¡}d|_d|_d|_	d|_
||_d S d S )NZinfer_typesFr   rb  )rà   r	   Zunspecified_typer
   r«  ra   r4   rÅ  r°  rõ  rÎ  rð   )r~   rŒ   r¥  r2  rð   r0   r0   r1   rš  þ  s   
özDefNode.declare_python_argc                 C   sb   |j | j_ |  |¡ |  |¡ |  |¡s)| jr)| jd d d… D ]	}|j |¡|_q| j 	|¡ | S )NrÇ   )
rà   r{  rj  rm  r²  r5  r2  ri   r~  Úprepare_argument_coercion)r~   rŒ   r2  r0   r0   r1   ri     s   


zDefNode.analyse_expressionsc                 C   sv   | j rdS | js| jjrdS | jrdS | jjrdS | jjrdS |js%|jr5|d u r/| j	j
d S |jj
d S |jp:|jS )NTFZbinding)ru  Úspecialized_cpdefsrð   r:  Úno_assignment_synthesisrê  Zis_anonymousr.  r‡  r{  rà   ræ   rv  r©  r	  r0   r0   r1   r²    s   z"DefNode.needs_assignment_synthesisc                 C   rc  rw   )rð   r|  rÛ  r”   r0   r0   r1   rÛ  )  r=  zDefNode.error_valuec                 C   rc  rw   )rð   r|  rz  r”   r0   r0   r1   rÞ  ,  r=  z$DefNode.caller_will_check_exceptionsc                 C   sZ   | j r| ¡ }t | j |¡}| ||¡ | jr$| jj| j_| j ||¡ t	 | ||¡ d S rw   )
Údefaults_getterrî   rÞ   rã   rç   Úpy_wrapper_requiredrð   rR  r~  ri  )r~   rŒ   rM   Úmodule_scopeZdirectives_noder0   r0   r1   rç   /  s   z%DefNode.generate_function_definitionsc                 C   s  |r| j r| j ||d¡ d S g }| jjjr'dtj }| js"d| }| 	|¡ dd„ }| j
D ]	}| 	||ƒ¡ q.| jrC| 	|| jƒ¡ | jrN| 	|| jƒ¡ |rVd |¡}nd}| j | jj¡}	|jd }
|  ¡ }|rp|
 |¡ |
 d	|	|f ¡ |r€|
 d
¡ | d|	|f ¡ d S )NTúPyObject *%súCYTHON_UNUSED c                 S   s8   | j }|jr
|j}n|j}|j |¡}|jsd| }|S )Nr¢  )rð   rº  rY  r‰  r2  r.  rO  )r¥  rð   r‰  Údeclr0   r0   r1   Úarg_decl_codeJ  s   z7DefNode.generate_function_header.<locals>.arg_decl_coder±   rL  Zdeclszstatic %s(%s); /* proto */rŸ  zstatic %s(%s) {)rŸ  r~  rµ  rð   r|  Úhas_dummy_argr   rÇ  r¸  ri  rJ   r  r  r·   r“  r.  r•  ræ   r¬  rH   )r~   rM   rƒ  r„  Úarg_code_listÚself_argr¤  r¥  r  ÚdcZ
decls_coderò  r0   r0   r1   rµ  =  sB   ÿ






ÿ
z DefNode.generate_function_headerc                 C   rŸ   rw   r0   r	  r0   r0   r1   r¹  k  r¡   z&DefNode.generate_argument_declarationsc                 C   rŸ   rw   r0   r¥   r0   r0   r1   r½  n  r¡   zDefNode.generate_keyword_listc                    sF   ‡ fdd„}| j D ]}||jƒ q	| j| jfD ]	}|r ||jƒ qd S )Nc                    s¸   | j rZ| jjr%| jjd usJ ‚ˆ j t dd¡¡ ˆ  d 	| j
| j¡¡ nˆ  d| j
| jf ¡ | jjr?| j ˆ | j
d¡ d S | jrNˆ  | ¡ ˆ  | ¡ d S ˆ  | ¡ ˆ  | ¡ d S d S )NZIncludeStringHzStringTools.czmemcpy({0}, {1}, sizeof({0}));r×  T)rº  r2  r+  rb  ræ   r  r   r®  rH   Úformatr‰  rY  r/  rZ  rÎ  rÏ  Zput_var_xgiverefrÌ  r[  r\  r¡  r0   r1   r^  s  s   

ëz@DefNode.generate_argument_parsing_code.<locals>.put_into_closure)rJ   rð   r  r  )r~   rŒ   rM   r^  r¥  r0   r¡  r1   rÊ  q  s   

€þz&DefNode.generate_argument_parsing_codec                 C   rŸ   rw   r0   r¥   r0   r0   r1   rÐ    r¡   z$DefNode.generate_argument_type_tests)	NNTNNFNFFrw   ©r   )/r+   r,   r-   r™   rÛ   ru  rt  r™  Zreqd_kw_flags_cnamer×   r  r5  rk  rð   r¦  r‡  Zpy_cfunc_nodeÚrequires_classobjÚdefaults_structr;   Úfused_py_funcrœ  r~  rŸ  rR  rž  rˆ   rq  rr  r    rx  r{  r‹  rz  ry  rJ  rš  ri   r²  rÛ  rÞ  rç   rµ  r¹  r½  rÊ  rÐ  r0   r0   r0   r1   r5  F  s^    
ÿK7@g

.r5  c                   @   sò   e Zd ZdZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Z	dd„ Z
dd„ Zdd„ Zd:dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Z dS );r}  NFc                 O   sT   t j| g|¢R i |¤Ž | jj| _| jj| _| jj| _| jj| _| jj| _d | _d S rw   )	ri  rˆ   rÞ  rj  rk  rl  rm  r‡  r|  )r~   rJ   rm   r0   r0   r1   rˆ   ›  s   





zDefNodeWrapper.__init__c                 C   sX   | j j}| j}| |j¡}ttj| | ƒ|_ttj	| | ƒ|_
|j| _| j j| _d S rw   )rÞ  rð   ra   r“  r”  r   r   Zpywrap_prefixrR  Zpymethdef_prefixÚpymethdef_cnamer|  rƒ  )r~   rŒ   Útarget_entryra   r˜  r0   r0   r1   r    ¤  s   z#DefNodeWrapper.analyse_declarationsc                 C   sŒ   | j D ]}|jjs|j |¡s	 q|jr|jjs|j |¡s	 q| jr@| jjjsB| jj}d|_	|j
D ]}|js?|jjr?d|j_q2d S d S d S )Nr   T)rJ   r2  rA  Úcreate_from_py_utility_coder  r2  r  rð   rO  rÎ  Zcf_assignmentsrÅ  r÷  rÓ   Zcf_maybe_null)r~   rŒ   r¥  rð   Zassr0   r0   r1   r›  ¯  s$   
€€
€ùz(DefNodeWrapper.prepare_argument_coercionc                 C   s:   t | jƒ}|dks|dkr| jd js| jd jrdS dS r2   )rA   rJ   rn  rá  )r~   Zargcountr0   r0   r1   Úsignature_has_nongeneric_argsÅ  s   

ÿz,DefNodeWrapper.signature_has_nongeneric_argsc                 C   r  rw   )r|  rˆ  r”   r0   r0   r1   Úsignature_has_generic_argsÍ  r  z)DefNodeWrapper.signature_has_generic_argsc                 C   s  g }| j jr| tj¡ | jD ]<}|jjr)|j 	t
 dd¡¡ | d|jj ¡ q|jrD|jjsD|jjsD|jjsD| |j |jj¡¡ q| |jj¡ q| jrW| | jjj¡ | jrb| | jjj¡ d |¡}| jjss| dtj ¡ | d| jjj|f ¡ d S )NZMoveIfSupportedúCppSupport.cppú__PYX_STD_MOVE_IF_SUPPORTED(%s)r±   z%s = re  )r|  r¥  ri  r   rÇ  rJ   r2  rQ  ræ   r  r   r®  rð   r‰  r  r/  rI  r÷  rÒ  r  r  r·   r“  r-  r¶  r¼  rH   rÞ  r•  )r~   rM   rJ   r¥  r0   r0   r1   r~  Ð  s4   

ÿÿþ

ÿz%DefNodeWrapper.generate_function_bodyc                 C   s¢  | j j}| | j¡ | d¡ | d¡ | j  ¡ }|r | |¡ | |¡ | ¡ |_| j  	||¡p4| j j
}|  ||¡ |  ||¡ | ¡ }| jjrLd}nd}| jjs`| d| j tj¡|f ¡ | ¡  | td| j ƒ¡ |  |||¡ |  |¡ |  |¡ | |j¡ | | j¡ | d¡ | d¡ | d¡}| |j¡rØ| |j ¡ | !|j¡ |j "¡ D ]
\}	}
| #|	|
¡ q±|  $¡ }|d urÎ| dtj|f ¡ |  %|¡ | |¡ | !|j ¡ |  %|¡ | !|¡ |j&D ]}|j'rþ|j(rù| )|¡ që| *|¡ qët+|j&ƒ}| j,D ]!}|j-js'|j.|vr'|j.j(r!| )|j.¡ q| *|j.¡ q| /¡  | jjs:| d	tj ¡ | d
¡ | 0¡  |rO| d| ¡ d S d S )NrÃ   z/* Python wrapper */z = 0r‡  z%s (wrapper)r‘  Z
cleaned_upr×  r§  rŒ  r¨  )1rÞ  r{  r  r4   rH   r¬  r¯  r°  r±  r²  r³  rµ  r¹  rD   r“  rA  r-  r.  r   r¼  rì  rí  r   ra   rÊ  rÐ  r~  rï  rZ  rÓ  rÔ  rÕ  rÖ  r×  rØ  rÙ  rÛ  Ú%generate_argument_values_cleanup_coder;  rÅ  rÎ  rç  Zput_var_decrefr¿   rJ   r2  rð   rî  rð  )r~   rŒ   rM   rs  rò  rƒ  rö  Zretval_initZvalues_cleaned_up_labelr‰  r2  rù  rð   Zvar_entries_setr¥  r0   r0   r1   rç   ë  s†   





ÿþ










€


€

ÿz,DefNodeWrapper.generate_function_definitionsr   c                 C   sx  g }| j }|js| jrdtj }|jsd| }| |¡ | jD ]}|js=|js*|j	r3| d|j
 ¡ q| |j |j
¡¡ q| jj}|jsR| ¡ tjgkrR| d¡ |jrydtjtjf }	|jrtdtjtjtjf }
| d|
|	f ¡ n| |	¡ |jrtt| jƒ| ¡ ƒD ]	}| d| ¡ q†d |¡}d	}|jd
v r¤|jjr¤d}d}| j |j ¡}d|||f }| !d| ¡ |rË| jj"rÉ| jj"j#||dd d S t$j%r|j&r| jj"s|jj's|jrä|j(r|j&}|j)rî| *¡ }|jr÷|jd
v s| !d|j+| ,¡ f ¡ |jr| !d¡ | !d|j( ¡ | !d¡ |s!| jj"r3| -d|j. ¡ |j/| jjddd | !d| ¡ d S )Nr¡  r¢  zCYTHON_UNUSED PyObject *unusedzPyObject *%s, PyObject *%sz0PyObject *const *%s, Py_ssize_t %s, PyObject *%sz-
#if CYTHON_METH_FASTCALL
%s
#else
%s
#endif
z%CYTHON_UNUSED PyObject *unused_arg_%sr±   rÃ   r  Fz%sstatic %s(%s)z%s; /*proto*/T)r„  zPyDoc_STRVAR(%s, %s);ú #if CYTHON_UPDATE_DESCRIPTOR_DOCzstruct wrapperbase %s;rŸ  zstatic PyMethodDef %s = r…  )Z
allow_skipz%s {)0r|  r¥  r‡  r   rÇ  ri  rJ   râ  rn  rá  r¾  r  r.  rÞ  rð   rê  rŒ  r   Zmethod_noargsrˆ  Ú
args_cnameÚ
kwds_cnameÚuse_fastcallÚnargs_cnamer_  rA   r…  r·   ra   r¨  r‡  r“  rR  rH   r­  rµ  r    r4  r;   Zis_property_scoper—  Z
is_unicodeZas_utf8_stringr–  rº  r¶  r®  Zput_pymethoddef)r~   rM   rƒ  r„  r¦  r  r  r¥  rð   Zvarargs_argsZfastcall_argsrB  rŽ  r¨  rX  Zdocstrr0   r0   r1   rµ  B  s    


ÿ€
ÿÿÿÿ


ÿÿÿþýýþ
ÿ
ÿz'DefNodeWrapper.generate_function_headerc                 C   sª   | j D ]}|jr|jr| d|j ¡ q| |j¡ q|jD ]
}|jr(| |¡ q|  	¡ rKdt
j }| jjrF| d¡ | |¡ | d¡ n| |¡ | dt
j ¡ d S )NzPyObject *%s = 0;zCYTHON_UNUSED Py_ssize_t %s;ú#if !CYTHON_METH_FASTCALLrŸ  z"CYTHON_UNUSED PyObject *const *%s;)rJ   râ  r½  rH   r¾  r»  rð   r;  rÅ  r²  r   rº  r|  r¹  Úkwvalues_cname)r~   rŒ   rM   r¥  rð   Z
nargs_coder0   r0   r1   r¹  •  s$   
€

€



z-DefNodeWrapper.generate_argument_declarationsc           
   	   C   s8  |  ¡ }|j}| d¡}| jdk}| jd up| jd up|}| jD ]}	|	jjs-|	j 	|¡s-	 q |  
¡ rs| jjr;| d¡ | d¡ | dtjtjf ¡ | d¡ | dtjtj| dtj ¡|  ¡ f ¡ | d	¡ | jjrs| d	¡ |j t d
d¡¡ | dtj| jjtjtjf ¡ |  
¡ sŸ|r™t| jdƒ |  |¡ n|  ¡ s©|  |¡ n|  | j||¡ d| _||_|  |¡r| !|¡ | "|¡ |  #|¡ |rì|  $| j|¡ | jrì| jj%j&rå| '| jj%¡ n| (| jj%¡ | jD ]}	|	jjsÿ|	jj)rÿ| *|	j%¡ qï| +| j,j%j-¡ | .¡  | d|  ¡  ¡ | "|¡ d S )NZargument_unpacking_doner   r»  z#if CYTHON_ASSUME_SAFE_SIZEz%s = PyTuple_GET_SIZE(%s);r  z)%s = PyTuple_Size(%s); if (%s) return %s;z%s < 0rŸ  Úfastcallrü  z%s = __Pyx_KwValues_%s(%s, %s);z.This method cannot have * or keyword argumentsTr§  )/Únew_error_labelrÔ  r°  rk  r  r  rJ   r2  rA  r°  r²  r|  r¹  rH   r   rº  r·  rå  rÛ  ræ   r  r   r®  r¼  Úfastvarr   r4   r`  r±  Úgenerate_stararg_copy_codeÚ'generate_tuple_and_keyword_parsing_codeÚneeds_values_cleanuprÓ  rÕ  r×  rµ  Úgenerate_arg_decrefrð   rÎ  Úput_var_xdecref_clearÚput_var_decref_clearræ  rç  rá  rÞ  râ  rî  )
r~   rŒ   rM   Ú	decl_codeÚold_error_labelÚour_error_labelÚ	end_labelZhas_kwonly_argsZhas_star_or_kw_argsr¥  r0   r0   r1   rÊ  ®  s€   


ÿÿ
€

ÿ
ü


ÿÿ




€z-DefNodeWrapper.generate_argument_parsing_codec                 C   ó   |r
|  |j¡ d S d S rw   )rÄ  rð   ©r~   r¥  rM   r0   r0   r1   Úgenerate_arg_xdecrefý  ó   ÿz#DefNodeWrapper.generate_arg_xdecrefc                 C   rÊ  rw   )rÅ  rð   rË  r0   r0   r1   rÃ    rÍ  z"DefNodeWrapper.generate_arg_decrefc                 C   s¾  d|   ¡ › d}| j ¡ }| js.|j t dd¡¡ | dt	j
› d|› dt	j
› d|› d		¡ | d
t	j› d| jr:dnd› dt	j› d| jj› dt	j› d¡ | dt	j› d|› ¡ | jrÚ| dt	j› d¡ |j t dd¡¡ | d|› dt	j› d|› ¡ | jjjrÔd| jj_| jjj}| |› d| jj› dt	j› dt	j› d¡ | d|› d|› ¡ | | jj¡ | d¡ | |› d¡ | d|› d|› ¡ | | jj¡ | d¡ n|j t d d¡¡ | dt	j› d!|› dt	j› d|› d	¡ | jr³| jjs³| jjrJ ‚| jjj}| |› d"t	j
› d#| || j¡› ¡ | | jj¡ | t	jt¡ | t	jt¡ | |  d$|› d%t	j› d&| j¡¡ |j!j"t#j$dd'}| d(|› d)|› d*t	j
› d+|› d,	¡ | d-t	j%› d|› d¡ | d.¡ | | d/| j¡¡ | d0¡ | d/t¡ | d/t¡ | |  d$|› d|› d1| j¡¡ | d¡ |j! &|¡ d2| jj_d S | jrÝ| jjr¾J ‚| jjj}| t	j%t¡ | |› dt	j%› d¡ d2| jj_d S d S )3Nrd  r…  ÚRaiseArgTupleInvalidrü  úif (unlikely(z$ > 0)) { __Pyx_RaiseArgtupleInvalid(z, 1, 0, 0, ú); ú }úconst Py_ssize_t r†  rÃ   rå  ú(ú) ? __Pyx_NumKwargs_ú) : 0;z < 0)) zif (z > 0) {ZKeywordStringCheckz'if (unlikely(__Pyx_CheckKeywordStrings(r±   z
) == -1)) Fz = __Pyx_KwargsAsDict_ú);úif (unlikely(!z)) r‹  z = PyDict_New();rŒ  ÚRejectKeywordsz > 0)) {__Pyx_RejectKeywords(z = PyTuple_New(z + 1); z__Pyx_PyTuple_SET_ITEM(z, 0, ú)rY  úfor (ú=0; ú < ú; ú++) {z(PyObject* item = __Pyx_PyTuple_GET_ITEM(z#if !CYTHON_ASSUME_SAFE_MACROSr²   rŸ  z	+1, item)r   )'rÛ  ra   rº  r  ræ   r  r   r®  rH   r   rº  Úkwds_len_cnamer  r¸  r|  r¿  rð   rO  rÎ  r‰  r¼  Úput_var_gotrefr‡  rÞ  ru  r¹  r]  r4   rÅ  rÇ  r
   rÚ  Úerror_goto_if_negrZ  r[  r	   Úc_py_ssize_t_typer·  rc  )r~   rM   Ú
goto_errorÚfunction_nameZstarstar_arg_cnameZstar_arg_cnamerd  r0   r0   r1   rÀ    sÒ   

ÿ
þþýÿ
ÿÿþþÿ
ÿÿ


ÿÿÿ

ÿ
þþýÿ

ÿÿÿÿÿ

ÿ

ÿúz)DefNodeWrapper.generate_stararg_copy_codec                    sÈ  ˆ j  t dd¡¡ | j ¡ }ˆ  d¡}ˆ  | j¡}g }g }g }	d }
}|D ].}|j	s,q&|j
s2|jr3q&|jrA|jr;|	n| |¡ q&| |¡ |jrT|
d7 }
|jsT|d7 }q&||	 }| j| j }t|ƒdkrs|d j
so|d jrs|d8 }t|ƒ}| j o~||k}t|ƒ}| js‰| jr|  |ˆ ¡ t|ƒt|ƒ }dd„ |D ƒ}|p¢| j}ˆ  d¡ |rÃd	 ‡ fd
d„|D ƒdg ¡}ˆ  dtj|f ¡ |  |ˆ |¡ ˆ  dtj› d|rÕdnd› dtj› d| jj › dtj› d¡ ˆ  dtj› d|› ¡ tj› d}| jdkrd| }ˆ  d| ¡ |s(ˆ j  t dd¡¡ ˆ  d|› dtj› d|› ¡ n†|  !||||||ˆ ¡ |  "||ˆ ¡ |  #|ˆ ¡ ||kryˆ j  t dd¡¡ ˆ  dtj$› d|› d ¡ ˆ  d!|› d|d"›d|d"›d|d"›d#|› d$¡ ˆ  d%¡ | jr®ˆ j  t d&d¡¡ ˆ  d|› d|| j › d ¡ ˆ  d'|› d(tj› d)|
› d*|› d$	¡ ˆ  d%¡ | jr·|dks¼||krÚ||krÈ| jsÈd+}nd,}ˆ  d-tj$||f ¡ ˆ  %|¡ | jr'||krö| jsöˆ  d.tj$|f ¡ ˆ  %|¡ ˆ  d/¡ |D ](}|js$ˆ j  t d&d¡¡ ˆ  &|j'j¡}ˆ  d0|› d|› d|› ¡  nqýnèˆ  d/¡ ||kr\t(|ƒD ]%\}}ˆ  d1|› d2| jj › dtj)› d|› d3	¡ ˆ  d4|› d5|› ¡ q5n­ˆ  d6tj$› d7¡ | jroˆ  d8¡ t*t(|ƒƒd d d9… }|D ]F\}}||d kr¡||d d kr•ˆ  d:¡ ˆ  d;|d d<›d=¡ ˆ  d1|› d2| jj › dtj)› d|› d3	¡ ˆ  d4|› d5|› ¡ q||dkrÒˆ  d:¡ ˆ  +d>¡ ˆ  d?¡ | jrú|rùt,|d d9d9ƒD ]}ˆ  d;|d<›d=¡ qæˆ  %|¡ n
ˆ  +d@¡ ˆ  %|¡ ˆ  d%¡ |  #|ˆ ¡ ˆ  d%¡ t(|ƒD ]\}}|  -|d1|› dAˆ ¡ qˆ  d%¡ ˆ  .|¡rbˆ  dB¡}ˆ  %|¡ ˆ  /|¡ ˆ j  t dd¡¡ ˆ  dC||||tj$|f ¡ ˆ  /|¡ d S d S )DNr½  rü  Zargtuple_errorr   r   c                 S   s   g | ]}|j s|‘qS r0   r„  r>  r0   r0   r1   r˜   –  rµ   zJDefNodeWrapper.generate_tuple_and_keyword_parsing_code.<locals>.<listcomp>Ú{ú,c                    s    g | ]}d ˆ   |jj¡› ‘qS )ú&)Úintern_identifierrð   ra   r>  r¡  r0   r1   r˜   ›  s    ÿÿrb  zPyObject ** const %s[] = {%s};rÒ  r†  rÃ   rå  rÓ  rÔ  rÕ  rÏ  z) < 0) z > 0z
likely(%s)r¤  rØ  z__Pyx_RejectKeywords(r±   rÐ  rÎ  zfor (Py_ssize_t i = z; i < z; i++) {z7if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid(rÉ   z, i); rÑ  rŒ  ZRaiseKeywordRequiredz7if (unlikely(!values[i])) { __Pyx_RaiseKeywordRequired(z, *(z[i - z])); z!=ú<z } else if (unlikely(%s %s %d)) {z} else if (unlikely(%s > %d)) {r‹  z__Pyx_RaiseKeywordRequired(úvalues[ú] = __Pyx_ArgRef_rÖ  ú3if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[ú])) úswitch (ú) {údefault:rÇ   úCYTHON_FALLTHROUGH;úcase Ú2drÊ   ú	case  0: úbreak;ú	default: ú]Úskipz2__Pyx_RaiseArgtupleInvalid(%s, %d, %d, %d, %s); %s)0ræ   r  r   r®  ra   rº  r°  ra  r4   râ  rn  rá  rä  r"  ri  rå  rm  rl  rA   r  Úboolr  Úgenerate_stararg_init_codeÚtuplerH   r·   r   Úpykwdlist_cnameÚ#generate_argument_values_setup_coderß  r¸  r|  r¿  Úgenerate_posargs_unpacking_codeÚgenerate_keyword_unpacking_codeÚ*generate_argument_defaults_assignment_coderº  rÕ  rè  rð   r†  r·  r›   r¶  r_  Úgenerate_arg_assignmentrÓ  r×  )r~   rJ   rM   rÆ  Úself_name_csafeÚargtuple_error_labelrã  r  Zrequired_kw_only_argsZoptional_kw_only_argsÚnum_pos_only_argsZnum_required_pos_only_argsr¥  Zkw_only_argsÚmin_positional_argsÚmax_positional_argsÚhas_fixed_positional_countÚhas_kw_only_argsÚall_argsZnon_posonly_argsZaccept_kwd_argsZnon_pos_args_idZkw_unpacking_conditionÚcompareZpystring_cnamerŸ  Zreversed_argsZskip_error_handlingr0   r¡  r1   rÁ  j  s‚  
ÿ


€ ÿ

þýþ

ÿÿþþÿ
ÿ 
þÿ

ÿþýüûùÿ

ÿþýýûÿ
	ÿ
ÿ


ÿú€


"ÿý

"ÿ




€








ÿüóz6DefNodeWrapper.generate_tuple_and_keyword_parsing_codec                 C   s  |j jr6|j jr|j jdv r|j  ||j||j|j¡ |jr't	 
|j t	j|¡}|j}| d|j|f ¡ d S |j jr~|jrD| d| ¡ | |j  ||jj|j|¡¡ |jr|| d¡ | d|jj| |¡f ¡ |j jru|j|jdd | d¡ d S d S t|jd|j  ƒ d S )	N)r\  r˜  r×  r¤  r‹  Tr  rŒ  ú2Cannot convert Python object argument to type '%s')r2  rA  rÿ  ra   Zconvert_to_basetyper4   r   r»  râ  r	   Ztypecastr
   rð   rH   r‰  Úfrom_py_functionr"  Úfrom_py_call_coderÓ  r/  rÍ  r   )r~   r¥  r²   rM   rð   r0   r0   r1   r  T  s0   
ÿ
þù	z&DefNodeWrapper.generate_arg_assignmentc                 C   sH  | j r&| j jjr&d| j j_| d| j jj| j jj|  ¡ f ¡ | | j j¡ | jr¢d| jj_|dkrN| j	j
r8J ‚| tjt¡ | d| jjjtjf ¡ d S | | jjj› d| j	j› dtj› d|› dtj› d
¡ | d| jjj | jjj¡› d	¡ | j r…| | j j¡ | ¡  | d
|  ¡ › d¡ | d¡ | | jj¡ d S d S )Nr   z0%s = PyDict_New(); if (unlikely(!%s)) return %s;r×  z = __Pyx_ArgsSlice_rÓ  r±   rÖ  r×  z)) {rd  r…  rŒ  )r  rð   rO  rÎ  rH   r‰  rÛ  rà  r  r|  r¹  rÅ  r   r·  r
   r¿  rº  r2  Znullcheck_stringrÅ  rî  )r~   r  rM   r0   r0   r1   rú  o  sB   
ý
ÿÿÿÿÿ
èz)DefNodeWrapper.generate_stararg_init_codec                 C   sV   t |ƒ}| d|d d| ¡f ¡ | jjr)| d| jjtj| jjtjf ¡ d S d S )NzPyObject* values[%d] = {%s};ræ  rb  z9struct %s *%s = __Pyx_CyFunction_Defaults(struct %s, %s);)rA   rH   r·   rÞ  r¬  r   Zdynamic_args_cnamerÇ  )r~   rJ   rM   rÆ  Zmax_argsr0   r0   r1   rý  ’  s   ÿ

þÿz2DefNodeWrapper.generate_argument_values_setup_codec                 C   sT   t |ƒD ]#\}}|jr'|jjr'| |¡}| d|› d|› d|j |¡› d¡ qd S )Nzif (!values[z
]) values[z] = __Pyx_NewRef(rÖ  )r†  r"  r2  rA  rÓ  rH   Zas_pyobject)r~   rJ   rM   rŸ  r¥  r™  r0   r0   r1   r   Ÿ  s   
&€ýz9DefNodeWrapper.generate_argument_defaults_assignment_codec              	   C   sN   | j sd S tj}| d|› d|› d|› d¡ | d|› d¡ | d¡ d S )Nzfor (Py_ssize_t rÛ  z5 < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++rï  zPy_XDECREF(values[z]);rŒ  )rÂ  r   Zquick_temp_cnamerH   )r~   rM   Zloop_varr0   r0   r1   rµ  ¦  s   z4DefNodeWrapper.generate_argument_values_cleanup_codec                 C   sÒ  d}|D ]}	|	j r|	js|d7 }q| dtj ¡ | jr!| d¡ t|d |d dƒD ]7}
| d|
d d›d¡ | d	|
› d
| jj› dtj	› d|
› d	¡ | d|
› d| 
| j¡› ¡ | d¡ q+|dkr¥| d|d›d¡ t|d ddƒD ]&}
| d	|
› d
| jj› dtj	› d|
› d	¡ | d|
› d| 
| j¡› ¡ qy| d¡ t|d ddƒD ]}
| d|
d d›d¡ | d¡ q­| d¡ |dkrÐ| d¡ n| |¡ | jsâ| d¡ | |¡ | d¡ d S )Nr   r   úswitch (%s) {rð  rÇ   rò  ró  rÊ   rê  rë  rÓ  r±   rÖ  rì  rí  rñ  z: rõ  r%   rô  rö  rŒ  )rå  r"  rH   r   rº  r  r_  r|  r¿  r·  ra  r4   r¶  rÕ  )r~   r  r  r  r  r	  r  rM   Znum_required_posonly_argsr¥  rŸ  r0   r0   r1   rþ  ¯  s<   €
** 




z.DefNodeWrapper.generate_posargs_unpacking_codec           
      C   sJ  d}|D ]	}|j r|d7 }q|dkr | dtj|tj|f ¡ n|dkr,| dtj ¡ |dkr3d}n| jrI|| }| d|› d|› d¡ d	}nd
}d|  k rWt|ƒk r_n nd|› }nd}| j ¡ }	|j 	t
 dd¡¡ | | jdtj› dtj› dtj› d| jr‰| jjjnd› d|› d|› dtj› d|	› d| jd ud›d¡ d S )Nr   r   zBconst Py_ssize_t kwd_pos_args = (unlikely(%s < %d)) ? 0 : %s - %d;z#const Py_ssize_t kwd_pos_args = %s;rb  z1const Py_ssize_t used_pos_args = (kwd_pos_args < z) ? kwd_pos_args : r…  Zused_pos_argsZkwd_pos_argsz	values + r`  ZParseKeywordsrü  z__Pyx_ParseKeywords(r±   rÉ   rÙ  )rå  rH   r   rº  r  rA   ra   rº  ræ   r  r   r®  Úput_error_if_negr4   r¸  r¼  rü  r  rð   r‰  rß  )
r~   r  r	  rM   r  r¥  Zpos_arg_countZ
max_kwargsZvalues_arrayr  r0   r0   r1   rÿ  ×  s`   €
þ

ÿÿÿÿþýüûú
ùþz.DefNodeWrapper.generate_keyword_unpacking_codec                 C   s"   | j D ]}|jr|  ||¡ qd S rw   )rJ   r½  Úgenerate_arg_conversionr  r0   r0   r1   r`    s
   
€þz0DefNodeWrapper.generate_argument_conversion_codec                 C   s¨   |j }|j}|jr*|jr| d|j ¡ n| d|j ¡ |  ||¡ | d¡ d S |jr5|  ||¡ d S | |¡rH| d|j	j
|jf ¡ d S t|jd||f ƒ d S )Nr¤  zassert(%s); {rŒ  r×  z+Cannot convert 1 argument from '%s' to '%s')r  r2  rA  r"  rH   r¾  Ú%generate_arg_conversion_from_pyobjectÚ#generate_arg_conversion_to_pyobjectr–  rð   r‰  r   r4   )r~   r¥  rM   Úold_typeÚnew_typer0   r0   r1   r    s   
z&DefNodeWrapper.generate_arg_conversionc                 C   sB   |j }|jr| | |j|jj|j|¡¡ d S t|jd| ƒ d S )Nr  )	r2  r  rH   r  r¾  rð   r‰  r4   r   )r~   r¥  rM   r  r0   r0   r1   r  /  s   
üz4DefNodeWrapper.generate_arg_conversion_from_pyobjectc              
   C   s^   |j }|j}|r%| d|jj||j| |jj|j¡f ¡ | |j¡ d S t	|jd| ƒ d S )Nz%s = %s(%s); %sz5Cannot convert argument of type '%s' to Python object)
r  Zto_py_functionrH   rð   r‰  r¾  r]  r4   rà  r   )r~   r¥  rM   r  rS   r0   r0   r1   r  <  s   üz2DefNodeWrapper.generate_arg_conversion_to_pyobjectc                 C   sÖ   | j D ]!}|jr|  ||¡ q|js$|jjs|jjs|jjr$|  ||¡ q| j	j
jrgttt| j ƒ| j ¡ ƒƒD ]1}| d|d›d¡ | d| j	j
j ¡ › d| j ¡ › d|d›d| | j¡› ¡ | d¡ q7d S d S )Nzif (unlikely(unused_arg_rÉ   ú != Py_None)) {z_PyErr_Format(PyExc_TypeError, "%.200s() takes %zd arguments but %zd were given", (const char*) z, (Py_ssize_t) rÐ  rŒ  )rJ   ra  r  r   r2  rA  r,  r/  r  rÞ  rð   rê  Úreversedr_  rA   r|  r…  rH   râ  rº  ra  r4   )r~   rM   r¥  rB  r0   r0   r1   rÐ  I  s6   
ÿþ€
ÿþý
üÿóz+DefNodeWrapper.generate_argument_type_testsc                 C   r  rw   )r|  rÛ  r”   r0   r0   r1   rÛ  d  r  zDefNodeWrapper.error_valuerª  )!r+   r,   r-   ZdefnoderÞ  rÂ  rˆ   r    r›  r±  r²  r~  rç   rµ  r¹  rÊ  rÌ  rÃ  rÀ  rÁ  r  rú  rý  r   rµ  rþ  rÿ  r`  r  r  r  rÐ  rÛ  r0   r0   r0   r1   r}  ”  s@    	
WSOe k#	(=r}  c                       sX   e Zd ZdZdZdZdZejdg Z‡ fdd„Z	‡ fdd„Z
d	d
„ Z‡ fdd„Z‡  ZS )ÚGeneratorDefNodeTFÚ	GeneratorÚgbodyc                    s*   t |g dd|d< tƒ j|fi |¤Ž d S )NT)rõ   rÖ   r¨   )rô   r^   rˆ   ©r~   r4   rm   rf   r0   r1   rˆ   u  s   zGeneratorDefNode.__init__c                    s&   t ƒ  |¡ | j| j_| j |¡ d S rw   )r^   r    r{  r  r‹   rf   r0   r1   r    z  s   
z%GeneratorDefNode.analyse_declarationsc                 C   sö   | j jj}| | j¡}| | j¡}| | j¡}| j |¡ | 	d¡ | 	d| j
› d|› d| j ¡ › dtj› d|› d|› d|› d| d| j¡› ¡ | tjt¡ | jrkd}| 	d	|tjf ¡ | |t¡ | |t¡ | ¡  | 	d
¡ | 	d¡ d S )Nrå  z#__pyx_CoroutineObject *gen = __Pyx_z_New((__pyx_coroutine_body_t) r±   z, (PyObject *) rÐ  Úgenzgen->classobjz&%s = __Pyx_CyFunction_GetClassObj(%s);zreturn (PyObject *) gen;rŒ  )r  rð   rR  rè  ra   ÚqualnameÚmodule_namer¿  rÀ  rH   Úgen_type_namerÁ  r   rª  r]  r4   rè  r
   r«  rÇ  rÅ  rÚ  rî  )r~   rŒ   rM   Z
body_cnamera   r  r  Zclassobj_cnamer0   r0   r1   r~    sD   


ÿþýüüüûÿ	ÿ
z'GeneratorDefNode.generate_function_bodyc                    sD   |  t | jd¡¡ | jj|dd tƒ  ||¡ | j ||¡ d S )NúCoroutine.cT)Úproto)r  r   r®  r  r  rµ  r^   rç   r	  rf   r0   r1   rç   œ  s   z.GeneratorDefNode.generate_function_definitions)r+   r,   r-   rz  Úis_iterable_coroutiner  rw  r5  r™   rˆ   r    r~  rç   rg   r0   r0   rf   r1   r  h  s    r  c                   @   ó   e Zd ZdZdZdS )ÚAsyncDefNodeÚ	CoroutineTN)r+   r,   r-   r  r  r0   r0   r0   r1   r#  £  ó    r#  c                   @   r"  )ÚIterableAsyncDefNodeZIterableCoroutineTN)r+   r,   r-   r  r!  r0   r0   r0   r1   r&  ¨  r%  r&  c                   @   r"  )ÚAsyncGenNodeZAsyncGenTN)r+   r,   r-   r  r  r0   r0   r0   r1   r'  ­  r%  r'  c                       sT   e Zd ZdZdZdZdZdZd‡ fdd„	Zdd„ Z	dd	„ Z
dd
d„Zdd„ Z‡  ZS )ÚGeneratorBodyDefNodeTFNc                    s"   t ƒ j|||||d g d d d	 d S )N)	r4   r¨   ra   Úis_coroutine_bodyÚis_async_gen_bodyr;   rJ   r  r  )r^   rˆ   )r~   r4   ra   r¨   r)  r*  rf   r0   r1   rˆ   ¼  s   
üzGeneratorBodyDefNode.__init__c                 C   s\   |  |j¡}|  d¡}tj| | }|jd t| j|dd}||_t| j	ƒ|_
d|_|| _d S )NÚ	generatorrM  )r‰  r5  T)r“  r”  r   Zgenbody_prefixr«  r
   r4   rR  r   ra   râ  r°  rð   )r~   rŒ   r˜  ra   r‰  rð   r0   r0   r1   Údeclare_generator_bodyÃ  s   
ÿ
z+GeneratorBodyDefNode.declare_generator_bodyc                 C   s   |   |¡ |  |¡ d S rw   )rx  r,  r‹   r0   r0   r1   r    Ñ  s   
z)GeneratorBodyDefNode.analyse_declarationsc                 C   sB   d| j jtjtjtjf }|r| d| ¡ d S | d| ¡ d S )Nz]static PyObject *%s(__pyx_CoroutineObject *%s, CYTHON_UNUSED PyThreadState *%s, PyObject *%s)z%s; /* proto */z%s /* generator body */
{)rð   rR  r   Úgenerator_cnameZlocal_tstate_cnameÚsent_value_cnamerH   )r~   rM   r   rX  r0   r0   r1   rµ  Õ  s   üz-GeneratorBodyDefNode.generate_function_headerc              	   C   s  | j }| j ||¡ | |¡ | ¡ |_| | j¡ |  ||¡ | 	d¡ |  
|¡ | ¡ }| 	dtj ¡ | ¡ }| ¡  | | jjpG| jj¡ | ¡ }|rY|jdd d|j_| j |¡ |j |jjj¡ | ¡ }| d¡}| |¡ | |¡ |rŽ|jjsƒJ ‚|j | jj| jdd | j!r| 	| "tj#| j¡¡ n3| 	dtj#› d¡ | j$r­d}	n| j%r³d	}	nd
}	| 	dtj#› d|	› d¡ | 	| &| j¡¡ | 	d¡ | j!r| j'd ur| j'}
|
t(j)u råd}n|
t(j*u ríd}n|
t(j+u rõd}nt,d|
 ƒ‚| 	dtj|| "tj| j¡f ¡ | -tjt.¡ |  /||¡ |jjjj0r?| 	d|jj 1tj2¡|jj 3dtj4 ¡f ¡ | 	dtj2 ¡ |rS| jj5sSd|j_|j6d| jd | | j¡ | 	d¡ | 	d¡ | j!ss| jj5ss| 7tjt.¡ | 8|j9¡rê| jj5s…| :|j;¡ | |j9¡ | j!rœ| j'd urœ| <tjt.¡ |j =¡ D ]\}}| >||¡ q¡| 	d¡ |r¹| ?¡  t@jA|jBjCv rÕ|jD EtF Gdd¡¡ | 	dtH| j$ƒ ¡ | I| jj¡ |rå| J| j¡ | 	d¡ | |j;¡ | Ktjt.¡ |rþ| L¡  | 	d¡ | 	dtj4 ¡ | 	d ¡ | 	d!tj4 ¡ | 	d"tj4 ¡ | M¡  | 	d#tj ¡ | 	d¡ | N|j¡ | 	d$tj4 ¡ | 	d%| ¡ |jOD ]\}}| 	d&||f ¡ qI| 	d'¡ |rs|j | jj| jdd |j6d| jd | M¡  | 	d(¡ | 	d¡ | P¡  d S ))NrÃ   zPyObject *%s = NULL;T)rz  Z	first_runrÏ  r  zasync generatorÚ	coroutiner+  zQ)) PyErr_SetString(PyExc_TypeError, "can't send non-None value to a just-started z");rŒ  zPyList_New(0)zPySet_New(NULL)zPyDict_New()z)invalid type of inlined comprehension: %sz%s = %s; %sr×  z%s->closurezCYTHON_MAYBE_UNUSED_VAR(%s);FrŠ  r3   r‘  zif (__Pyx_PyErr_Occurred()) {Zpep479r  z*__Pyx_Generator_Replace_StopIteration(%d);z#if !CYTHON_USE_EXC_INFO_STACKz+__Pyx_Coroutine_ResetAndClearException(%s);rŸ  z%s->resume_label = -1;z%__Pyx_Coroutine_clear((PyObject*)%s);r§  zswitch (%s->resume_label) {zcase 0: goto %s;zcase %d: goto %s;z2default: /* CPython raises the right error here */zreturn NULL;)Qr{  r¨   rç   r¯  r°  r±  r  r4   rñ   rH   rµ  rD   r   r¼  rì  rí  rð   ra   râ  r­  r¾  rZ  rÉ  r¿  rÀ  Zinit_closure_tempsr·  r2  r¨  Z	use_labelr×  r—  rÈ  Ú
is_inlinedr]  r.  r*  r)  ra  Úinlined_comprehension_typer   Z	list_typeÚset_typeÚ	dict_typer   r^  r
   r~  r;  r.  rª  rÒ  r-  rÖ   rÒ  rÑ  rÓ  rÔ  rÕ  rÖ  Úput_xdecref_clearrØ  rÙ  rÜ  r   Úgenerator_stopr  Zfuture_directivesræ   r  r   r®  rù  rá  rÝ  ré  rë  rî  rï  Zyield_labelsrð  )r~   rŒ   rM   rs  Zclosure_init_coderö  ró  Zresume_codeZfirst_run_labelZ	coro_typeÚtarget_typeZ	comp_initr‰  r2  rŸ  Úlabelr0   r0   r1   rç   à  sî   







ÿÿ



ÿþ
ÿþ







ÿ


z2GeneratorBodyDefNode.generate_function_definitions)NNNFFrë  )r+   r,   r-   ry  r0  r)  r*  r1  rˆ   r,  r    rµ  rç   rg   r0   r0   rf   r1   r(  ²  s    
r(  c                   @   s&   e Zd ZdgZdZdd„ Zdd„ ZdS )r;  r¨   Nc                    sÀ   |j ˆ_ˆjjrd}nd}ddlm‰  ˆ  ˆjt¡ˆ_	ˆ j
ˆjˆj	‡ ‡fdd„ˆj|d … D ƒd}|jjs:|jjrOtˆjtˆj|dtˆjd dgd	ˆ_ntˆj|dˆ_ˆj |¡ˆ_ˆS )
Nr   r   r<  c                    s   g | ]}ˆ j ˆj|jd ‘qS rA  )rg  r4   ra   r>  rC  r0   r1   r˜   š  s    ÿz9OverrideCheckNode.analyse_expressions.<locals>.<listcomp>©rE  rJ   )Úexpr©r   rÿ   )rË  rJ   r´  r.  rÃ   rU  ÚRawCNameExprNoder4   r
   Ú	func_noderF  r“  r-  Úis_returncoderô   ÚExprStatNoderG  r¨   ri   )r~   rŒ   Z	first_argZ	call_noder0   rC  r1   ri     s(   ÿþþz%OverrideCheckNode.analyse_expressionsc              
   C   sÂ  | j jr	| j jjn| j j}| |j¡}| j jrdtj }nd| jd j	 }| 
d¡ | 
dtj ¡ | 
d¡ | j jsC| j jj d¡rI| 
d¡ nD| 
d¡ | 
d	¡ | | j jjjj¡}| 
d
|› d|› d¡ | 
d|› d¡ | 
d¡ | 
d
|› d|› d¡ | 
d¡ | 
d¡ | 
d¡ |j t dd¡¡ | 
dtjtjf ¡ | 
d|tjtjf ¡ | 
dtj|f ¡ | 
d¡ |jjtdd}| j |¡ |j t dd¡¡ | 
d|||| || j¡f ¡ | |t¡ | 
d||j f ¡ | j! "|¡ | 
d¡ | 
d¡ | 
d tj|f ¡ | 
d!tj|f ¡ | 
d"tjtjf ¡ | 
d#tjtjf ¡ | 
d¡ | 
d¡ | #|t$j¡ |j %|¡ | 
d¡ | 
d¡ | 
d¡ | 
d¡ d S )$Nrý  r   z /* Check if called by wrapper */zif (unlikely(%s)) ;z#/* Check if overridden in Python */rx   zelse {z	else if (z#if !CYTHON_USE_TYPE_SLOTSzunlikely(Py_TYPE(z) != z &&z __Pyx_PyType_HasFeature(Py_TYPE(z), Py_TPFLAGS_HAVE_GC))r  z9)->tp_dictoffset != 0 || __Pyx_PyType_HasFeature(Py_TYPE(z3), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))rŸ  rï  zQ#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTSZPyDictVersioningúObjectHandling.czNstatic PY_UINT64_T %s = __PYX_DICT_VERSION_INIT, %s = __PYX_DICT_VERSION_INIT;z?if (unlikely(!__Pyx_object_dict_version_matches(%s, %s, %s))) {z/PY_UINT64_T %s = __Pyx_get_tp_dict_version(%s);TrY  ZPyObjectGetAttrStrz*%s = __Pyx_PyObject_GetAttrStr(%s, %s); %sz5if (!__Pyx_IsSameCFunction(%s, (void(*)(void)) %s)) {rŒ  z#%s = __Pyx_get_tp_dict_version(%s);z'%s = __Pyx_get_object_dict_version(%s);zif (unlikely(%s != %s)) {z"%s = %s = __PYX_DICT_VERSION_INIT;)&r´  r­  rð   rè  ra   r.  r   Úmodule_cnamerJ   r‰  rH   rP  r¨  r	  r_  r‹  rÄ  ræ   r  r   r®  Ztp_dict_version_tempZobj_dict_version_tempZtype_dict_guard_temprZ  r[  r
   r<  Ú	set_cnamer]  r4   r^  rR  r¨   ré   rb  r	   rc  )r~   rM   Zmethod_entryZinterned_attr_cnamer§  rÄ  Zfunc_node_tempr0   r0   r1   ré   ¥  sŽ   




ÿ

ÿ



ÿÿ
ÿÿ

ÿþ

ÿÿÿÿ




z)OverrideCheckNode.generate_execution_code)r+   r,   r-   r™   r¨   ri   ré   r0   r0   r0   r1   r;  ‚  s
    
r;  c                   @   ó   e Zd ZdS )ÚClassDefNodeN©r+   r,   r-   r0   r0   r0   r1   rC     ó    rC  c                   @   sŠ   e Zd Zg d¢ZdZdZdZdZdZdZ	dZ
		ddd„Zdd„ Zdd	„ Zd
d„ Ze eje dejd¡g¡Zdd„ Zdd„ Zdd„ ZdS )ÚPyClassDefNode)Údoc_noder¨   r\   Ú	metaclassÚmkwrb   Úclass_resultrÞ  Ú
class_cellr5  Ú
orig_basesNFc	              	   C   sî  t  | |¡ || _|| _|| _|| _|| _ddlm}	 | jr;t	j
r;t| j| jƒ}|	j||d}
|	jtdƒt|d| _nd }
| }|r‰d}d| _|jrƒ|jr{tt|jƒƒd d d… D ]\}}|jjd	krv| jd urnt|jd
ƒ |j| _|j|= qY|| _n| jd us‚J ‚n|	 |¡| _|s”| js”| js”| jrÔ| jd u rº|r¢|js¢| j}nd }|s¯| jjr¯| jjs¯n|	j|| d| _d}nd}|	j |||
| d| _!|	j"||| |
|||d| _#n|	j$|g d| _!|	j%||| |
d| _#|	j||d| _&|	 '| j¡| _(d S )Nr   r<  r:  rs   )ra   r2  r4   FTrÇ   rH  z2keyword argument 'metaclass' passed multiple times)Úclass_def_node)ra   r;   rM  )ra   rM  r;   Zcalculate_metaclassÚallow_py2_metaclassZ
force_type©r  )ra   rM  r;   r$  ))r  rˆ   ra   r;   r¨   r5  rb   rÃ   rU  r    r4  r<   r4   ZUnicodeNoderg  r   r
   rG  Úis_py3_style_classZis_dict_literalr  r›   r†  r¾   r   rH  r   rI  Ú	ProxyNodeÚis_sequence_constructorrJ   ZPyClassMetaclassNodeZPyClassNamespaceNoder\   ZPy3ClassNodeÚclassobjÚDictNodeZ	ClassNoderÞ  ZClassCellInjectorNoderK  )r~   r4   ra   rb   r;   r¨   r5  r  Zforce_py3_semanticsrU  rG  rN  rŸ  r²   ZmkdictZneeds_metaclass_calculationr0   r0   r1   rˆ   "  sv    
€

ÿþÿÿ
üÿzPyClassDefNode.__init__c                 C   sZ   | j rt| jjdƒ dS ddlm} t| jdd| j| jp#|j	| jg d| j
| jd| jd	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<  rM  ©rJ   F)r5  r  Ú
class_namerb   r5  r¨   r6  r;   )rP  r   rS  r4   rÃ   rU  ÚCClassDefNodera   rb   rN  r5  r¨   r;   ©r~   rU  r0   r0   r1   Ú	as_cclassk  s   øzPyClassDefNode.as_cclassc                 C   s:   |}|j s|jr|j}|j s|jst| j|d }| _|S )N)ra   r-  )rv  r‡  r-  r   ra   r¨  )r~   rŒ   r|  rô  r0   r0   r1   Úcreate_scope~  s   ÿzPyClassDefNode.create_scopec                 C   sØ   | j  }}| jr&ddlm} | jd d d… D ]}||j|j|gd}qd | _|| _| jr2| j |¡ | j	r;| j	 |¡ | j |¡ | j
 |¡ |  |¡}|j|_| j
jj|_| jr_| j |¡ | j |¡ | |¡ d S )Nr   )rF  rÇ   r8  )rS  r5  rU  rF  r4   r2  rJ  rb   r    rI  rÞ  Úanalyse_target_declarationrZ  rà   rð   r‰  Úclass_obj_cnamerG  r¨   rm  )r~   rŒ   Zunwrapped_class_resultrJ  rF  r2  rô  r0   r0   r1   r    …  s0   
ý
z#PyClassDefNode.analyse_declarationsrb   c                 C   sö   | j r3| j jrt| j jƒdks3ddlm}m} | j  |¡}||jd| j	t
 dd¡||ƒgd| _ || _| j r=| j  |¡| _ | jrG| j |¡| _| jrQ| j |¡| _| j |¡| _| j |¡| _| j}| j |¡| _| j || j¡| _| j |¡| _| S )Nr   r   )ÚPythonCapiCallNodeÚ	CloneNodeZ__Pyx_PEP560_update_basesZPy3UpdateBasesr?  )rä  r€  Zutility_coderJ   )rb   rR  rA   rJ   rU  r]  r^  ri   r4   Úupdate_bases_functyper   r®  rL  rI  rH  r\   rJ  r¨  r¨   rÞ  Úanalyse_target_expressionrS  rK  )r~   rŒ   r]  r^  rL  rô  r0   r0   r1   ri   £  s.   
üz"PyClassDefNode.analyse_expressionsc                 C   s"   |   | j|¡ | j | j|¡ d S rw   )rò   r¨  r¨   rç   r	  r0   r0   r1   rç   ¼  s   z,PyClassDefNode.generate_function_definitionsc                 C   s  |  | j¡ |j | ¡ | j}| jr| j |¡ | jr!| j |¡ | jr*| j |¡ | j	r3| j	 |¡ | j
 |¡ | jrp| d| j ¡ | j ¡ f ¡ | | d| j
 ¡ | j ¡ f | j¡¡ | d¡ | j |¡ | j |¡ | j
 ¡  |_|_| j}|d ur…|js…d }|d urŽ| |¡ | j |¡ | j |¡ |d ur§| || j ¡ ¡ |d urµ| |¡ | |¡ | j ¡  |_|_| j | j|¡ | j
 |¡ | j
 |¡ | j	rá| j	 |¡ | j	 |¡ | jrð| j |¡ | j |¡ | jrÿ| j |¡ | j |¡ |j ¡  d S )Nzif (%s != %s) {z.PyDict_SetItemString(%s, "__orig_bases__", %s)rŒ  )r  r4   Zpyclass_stackri  r¨  rL  rÑ  rb   rI  rH  r\   rH   r€   rá  Úgenerate_disposal_coderÜ  Únamespace_cnamer\  rK  Z	is_activer¨   ré   rJ  Zgenerate_injection_coderS  rÞ  rß  Úpop)r~   rM   rô  rK  r0   r0   r1   ré   À  sj   ÿþÿ


ÿ

z&PyClassDefNode.generate_execution_code)NNF)r+   r,   r-   r™   r5  rJ  rP  rH  rI  rG  rL  rˆ   rY  rZ  r    r	   rš  r
   rŒ  r_  ri   rç   ré   r0   r0   r0   r1   rF    s.    
ÿIÿÿrF  c                   @   s   e Zd ZdgZdZdZdZdZdZdZ	dZ
dZdZedd„ ƒZdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zeddd„ƒZdd„ ZdS )rW  r¨   NFc                 C   s
   t | jƒS rw   )r   rV  r”   r0   r0   r1   Úpunycode_class_name  r¼  z!CClassDefNode.punycode_class_namec                 C   sH   t | dƒs!ddlm} | jr|j| j|g | jdd| _| jS d | _| jS )NÚ_buffer_defaultsr   r  F)Zneed_complete)r&  rÃ   r  Úbuffer_defaults_noder  Úbuffer_defaults_posre  )r~   rŒ   r  r0   r0   r1   r    s   
ýÿzCClassDefNode.buffer_defaultsc                 C   s¦   | j r| jdkr| j  d¡}| || j¡}|sd S n|}|j| j| jdd| j d | j| j| j| j	| j
| j|  |¡| jd| _| jrOt| jjƒdkrQd| jj_d S d S d S )NrP  Ú.r   )ra   r4   r#  Úimplementingr  r3  Úobjstruct_cnameÚtypeobj_cnamer5  r©  Ú
check_sizer*  r  Úshadowr   T)r  r5  Úsplitrô  r4   Údeclare_c_classrV  Úobjstruct_nameÚtypeobj_namer©  rl  r*  r  rm  rð   rb   rA   rJ   r2  Úmultiple_bases)r~   rŒ   rð  Ú
home_scoper0   r0   r1   r:  *  s4   ÿòÿzCClassDefNode.declarec                 C   sð   i }| j s|S ddlm} g }| j D ]V}|j}d }t||jƒr$|}|j}t ||¡}|dkr;|r6t	|j
dƒ d|d< q|dkrcd }	i }
|r\t||jƒrO|j}	n|jj}	|j}|r\| ¡ }
|	|
f||< q| |¡ q|rst	|d j
d	ƒ || _ |S )
Nr   r<  zfunctools.total_orderingz total_ordering cannot be called.TÚtotal_orderingúdataclasses.dataclassr   z8Cdef functions/classes cannot take arbitrary decorators.)r5  rÃ   rU  r2  rB   ÚCallNoderE  r   Z'exprnode_to_known_standard_library_namer   r4   rF  rJ   r  r  Zas_python_dictri  )r~   rŒ   Úextra_directivesrU  Zremaining_decoratorsZoriginal_decoratorr2  Zdecorator_callZ
known_namerJ   rK   Zkwds_r0   r0   r1   Ú_handle_cclass_decoratorsE  sD   
z'CClassDefNode._handle_cclass_decoratorsc                    s˜  ˆ j rˆjstˆjdƒ ˆ ˆ ¡}d ˆ_ˆjrAd ˆ_ˆ jD ]}|j	ˆjkr(|ˆ_qˆjd u rAt
ˆjd ˆ jƒˆ_dˆj_ˆ  ˆj¡ ˆjjrëˆjjd }| ˆ ¡}|tju r\ˆ  d¡j}n|tju rhˆ  d¡j}n|tju rsˆ  d¡j}|d u rt|jdˆj ƒ nU|tu rˆd }nN|jsš|jr‘|jsšt|jd| ƒ n<| ¡ s«t|jd	|j	ˆjf ƒ n+|jrÁ|jjrÁ|jrÁt|jd
|ˆjf ƒ n|jrÓ|j	dv rÓt|jd|j	 ƒ n|ˆ_ˆ j  dd¡dkrë|tjkrët!ˆjddƒ ˆj"d u}|r
ˆjr
ˆjjs
ˆjj# $‡ ‡fdd„¡ d S ˆjr'ˆj%dkr'ˆj &d¡}ˆ  '|ˆj¡}	|	s&d S nˆ }	ˆj%dkrPˆjdkrPˆjt(j)v rPˆ j*d d… dkrPt!ˆjdˆj dƒ |	j+ˆjˆj|o[ˆj,|oaˆj, ˆjˆjˆjˆj-ˆj.ˆj%ˆj/ˆj0ˆ 1ˆ ¡ˆj2dˆ_3ˆjrt4ˆjjƒdkrdˆj3j_5ˆj2r™ˆj3|	 ˆj¡_6|	ˆ ur®ˆj%dkr®ˆ  7ˆjˆj3ˆj¡ ˆj3jj ˆ_}
|
d urú|rËˆ j 8¡ |
_|
j 9|¡ nˆ j|
_d|
jv rúd}|
jd }|rò|d }|  d¡}|oñ|j:oñ|j;}|r÷dnd|
_<ˆj=r
t>j?r
t@ˆjˆj=ƒ|
_=|rDˆj" A|
¡ ˆj Bd¡}|r9|jCr9|
jDs9|
jEs9ˆj Fd¡|_Gˆj Hd|j=|j¡ ˆj,rAd|
_Dnd|
_Et4ˆjjƒdkrœ|rTˆj,r^tˆjjd jdƒ ˆjjdd … D ]}| ˆ ¡rtt|jdƒ qfdˆj3j_Idd lJmK} |jLˆj|jMˆjˆjd!ˆj|jNˆjg d"gd#ˆ_Onˆjr°ˆjjPp¨ˆjjIˆj3j_Id ˆ_Ondˆj3j_Id ˆ_Oˆ  Qˆj3¡ ˆj3jj#D ]}|ƒ  qÃd S )$NzTObject struct name specification required for C class defined in 'extern from' blockr   r   r\  r˜  rõ  z+First base of '%s' is not an extension typez'%s' is not an extension typez*Base class '%s' of type '%s' is incompletez%Base class '%s' of type '%s' is final)rû  ÚbyteszGinheritance from PyVarObject types like '%s' is not currently supportedZfreelistzIfreelists cannot be used on subtypes, only the base class can manage themc                      s
   ˆ  ˆ ¡S rw   )r    r0   r‚  r0   r1   Ú<lambda>®  s   
 z4CClassDefNode.analyse_declarations.<locals>.<lambda>rP  rh  Ú__builtin__é   zcpython.z %s already a builtin Cython type)ra   r4   r#  ri  r  r3  rj  rk  rl  r5  r©  r*  r  rm  Tru  FÚfrozenrx   Z__dict__getterz'Only declare first base in declaration.z+Only one extension type base class allowed.r<  r:  rO  rU  )Rr  rp  r   r4   rx  r3  r  ÚmoduleÚcimported_modulesra   r   r  Zhas_extern_classÚadd_imported_modulerb   rJ   rO  r	   r¬  rñ  r2  Zc_float_typerù  rV  r
   r‚  rÿ  rj  r_  r¨  rà   r’  rz   r   r¨   Zdefered_declarationsri  r5  rn  rô  r   Úbuiltin_typesrâ  ro  r6  rq  rl  r©  r*  r  rm  rð   rA   rr  r6  Úadd_imported_entryr   r†   rÕ   r   Zis_c_dataclass_scoper;   r    r4  r<   r    r	  Zis_variableZdefinedZimplementedZmangle_internalÚgetter_cnameÚdeclare_propertyÚ
early_initrÃ   rU  rN  ZIdentifierStringNoderT  Útype_init_argsÚis_externalZallocate_vtable_names)r~   rŒ   rw  r~  r:  r3  Zbase_class_scopeZhas_bodyrð  rs  r¨  Ú	is_frozenZdataclass_configZdecorator_kwargsZfrozen_flagZ
dict_entryZ
other_baserU  Zthunkr0   r‚  r1   r    p  s  

€




ÿÿ
ÿÿ
ÿ
ÿ
ÿ
ò



€
þ
þ

ÿz"CClassDefNode.analyse_declarationsc                 C   s4   | j r| jjj}| j  |¡| _ | jr| j |¡ | S rw   )r¨   rð   r2  r¨  ri   r†  r9  r0   r0   r1   ri     s   
z!CClassDefNode.analyse_expressionsc                 C   s,   | j r|  | j|¡ | j  | j|¡ d S d S rw   )r¨   rò   r¨  rç   r	  r0   r0   r1   rç     s   þz+CClassDefNode.generate_function_definitionsc           
      C   sp  |  | j¡ | jjjsªd }| jrŽ|jjtj	dd}| j 
|¡ | d|| j ¡ f ¡ | | d|› | j¡¡ | |tj	¡ |jjtjdd}| |› d|› d¡ | | d|› | j¡¡ |jjtj	dd}| d¡ | d	¡ |jjtj	dd}| |› d
¡ | | || j¡¡ | |t	¡ |jjtj	dd}| |› d¡ | | || j¡¡ | |t	¡ |jjtj	dd}| |› d|› d| j ¡ › d¡ | | || j¡¡ | |t	¡ | |› d|› d|› d¡ |||fD ]}| |tj	¡ |j |¡ qô| d¡ | d¡ | d|| j ¡ f ¡ | | || j¡¡ | |t	¡ | d||f ¡ d| }	| d|	 ¡ | d| ¡ | d¡ | d¡ | d¡ | d¡ | | | j¡¡ | d¡ | |› d¡ |j |¡ | |tj	¡ |j |¡ | j |¡ | j |¡ | j| j||dd |d urª| |tj	¡ |j |¡ | jr¶| j |¡ d S d S )NTrY  z#%s = __Pyx_PyTuple_GET_ITEM(%s, 1);z!CYTHON_ASSUME_SAFE_MACROS && !Fz* = ((PyTypeObject*)__Pyx_PyTuple_GET_ITEM(z, 0));zM#if CYTHON_COMPILING_IN_LIMITED_API && __PYX_LIMITED_VERSION_HEX < 0x030A0000z/if (__Pyx_get_runtime_version() < 0x030A0000) {z> = PyObject_GetAttrString((PyObject*)&PyType_Type, "__new__");z, = PyTuple_Pack(1, (PyObject*)&PyType_Type);z = PyNumber_Add(r±   rÖ  z = PyObject_Call(z, NULL);z} elserŸ  zQ%s = __Pyx_PyType_GetSlot(&PyType_Type, tp_new, newfunc)(&PyType_Type, %s, NULL);zMif (__Pyx_PyType_GetSlot((PyTypeObject*) %s, tp_base, PyTypeObject*) != %s) {z@__Pyx_PyType_GetSlot((PyTypeObject*) %s, tp_base, PyTypeObject*)zB__Pyx_TypeName base_name = __Pyx_PyType_GetFullyQualifiedName(%s);zB__Pyx_TypeName type_name = __Pyx_PyType_GetFullyQualifiedName(%s);zxPyErr_Format(PyExc_TypeError, "best base '" __Pyx_FMT_TYPENAME "' must be equal to first base '" __Pyx_FMT_TYPENAME "'",z#             base_name, type_name);z!__Pyx_DECREF_TypeName(base_name);z!__Pyx_DECREF_TypeName(type_name);rŒ  z = NULL;)Úbases_tuple_cnameÚcheck_heap_type_bases)r  r4   rð   r2  r…  r†  rZ  r[  r	   r
   rÑ  rH   r€   Úerror_goto_ifrÅ  r   rŠ  r]  r^  rb  rc  ra  ra  rÜ  Úgenerate_type_ready_coder¨   ré   )
r~   rM   rb   Z
first_baseZ
trial_typeZtype_newZ
type_tupleZ
args_tuplerd  Ztrial_type_baser0   r0   r1   ré     s~   

"


ÿÿ





ÿz%CClassDefNode.generate_execution_codec              
   C   s  | j }tj› d|j› }|j}|sd S | jdkr-|jr+|jr J ‚| d|j|jf ¡ d S |s1J ‚|js6J ‚d|j }| d¡ d }|sj|jj	rj|j
jtdd}| d|| |jj	¡| || j¡f ¡ | |t¡ |sn|r¸|r|j t d	d
¡¡ | | jd|t d|j¡ |¡|pŒ|f ¡ | d|tj||pš|f ¡ |r­|j|td |j
 |¡ | | || j¡¡ n| d|tj|| || j¡f ¡ t d|jj¡}	|	 |¡sK| d¡ | d||	j|	 |¡f ¡ dD ];}
t |jj¡  |
¡}	|	 |¡dkr't !||	¡s'| d||	j|||	jf ¡ | d||	j||	jf ¡ | d¡ qì| d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d¡ |j t dd
¡¡ | | jd ||f ¡ | d¡ |r~| "|t¡ | #|t¡ | d!|j|f ¡ | d||jf ¡ | d¡ |j	}|rÛ|j$rÕ|j%d"krÕ| d#|j&r¦d$nd%|j%|j&r¯d$nd%|j%f ¡ |j t d&d
¡¡ | |j	¡}| | jd'| ¡ | d¡ n|j	}|s“| d¡ t |jj¡D ]	}| '||¡ qç| d¡ | d(¡ |j t d)d
¡¡ | | jd*| ¡ | d¡ | (d+|› ¡ t )|d,¡}t )|d¡}|dkrP|dkrP| d¡ | d-||f ¡ | d.| ¡ | d¡ | d¡ | j jj*D ]…}|j+dv }|j,rÙt-j.rÙ|j/rÙ|sÙt | j jj¡  |j+¡}|r~| 0¡ nd }|rˆ| |¡ | d/¡ | d0¡ | d1||j+| d2| j¡f ¡ | d3¡ | d4|j/ ¡ | d5|j/|j1f ¡ | d6|j/ ¡ | d¡ | d¡ | d¡ |rÙ| d¡ qU|j2r|j t d7d8¡¡ | | jd9||j3f ¡ |j t d:d8¡¡ | | jd;| ¡ |jj4s&|jj 5d<¡s&| | jd=tj| 6|j7¡|f ¡ |j8s/| 9d>¡nd }|rh|j tu rbd?| }|j&rF|j%}nd@|j% }| dA¡ | dB||||j:f ¡ | d¡ nt;|jdCƒ |j8ss| 9dD¡rŠnd S |j t dEd
¡¡ | | jdF| ¡ d S d S )GNr@   rP  z	%s = &%s;z%s_specz#if CYTHON_USE_TYPE_SPECSTrY  z(%s = PyTuple_Pack(1, (PyObject *)%s); %sZValidateBasesTuplezExtensionTypes.cz+__Pyx_validate_bases_tuple(%s.name, %s, %s)Ztp_dictoffsetzB%s = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(%s, &%s, %s);rê  zG%s = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(%s, &%s, NULL); %sZtp_as_bufferz$#if !CYTHON_COMPILING_IN_LIMITED_APIz%s->%s = %s;r  rb  zZif (!%s->tp_as_buffer->%s && %s->tp_base->tp_as_buffer && %s->tp_base->tp_as_buffer->%s) {z5%s->tp_as_buffer->%s = %s->tp_base->tp_as_buffer->%s;rŒ  z>#elif defined(Py_bf_getbuffer) && defined(Py_bf_releasebuffer)zB/* PY_VERSION_HEX >= 0x03090000 || Py_LIMITED_API >= 0x030B0000 */z#elif defined(_MSC_VER)zU#pragma message ("The buffer protocol is not supported in the Limited C-API < 3.11.")r  zL#warning "The buffer protocol is not supported in the Limited C-API < 3.11."rŸ  ZFixUpExtensionTypez.__Pyx_fix_up_extension_type_from_spec(&%s, %s)z%s.tp_bases = %s;ZPyTypeObjectz#if (sizeof(%s%s) != sizeof(%s%s)) {rÃ   zstruct ZValidateExternBasez__Pyx_validate_extern_base(%s)z#if !CYTHON_USE_TYPE_SPECSZPyType_Readyz__Pyx_PyType_Ready(%s)ú(PyObject*)Ztp_getattroz†if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!%s->tp_dictoffset && %s->tp_getattro == PyObject_GenericGetAttr)) {z*%s->tp_getattro = PyObject_GenericGetAttr;r¶  rå  zDPyObject *wrapper = PyObject_GetAttrString((PyObject *)%s, "%s"); %sÚwrapperz3if (__Pyx_IS_TYPE(wrapper, &PyWrapperDescr_Type)) {z0%s = *((PyWrapperDescrObject *)wrapper)->d_base;z%s.doc = %s;z0((PyWrapperDescrObject *)wrapper)->d_base = &%s;Z	SetVTableúImportExport.cz__Pyx_SetVtable(%s, %s)ZMergeVTablesz__Pyx_MergeVtables(%s)Zinternalz)PyObject_SetAttr(%s, %s, (PyObject *) %s)Ú__weakref__z%s->tp_weaklistoffsetz	struct %sz#if CYTHON_USE_TYPE_SLOTSz#if (%s == 0) %s = offsetof(%s, %s);z)__weakref__ slot must be of type 'object'Z__reduce_cython__ZSetupReducez#__Pyx_setup_reduce((PyObject *) %s))<r2  r   Zmodulestatevalue_cnamerÄ  r¨  r5  rk  rH   r‹  r3  rZ  r[  r
   rþ  r]  r4   r^  ræ   r  r   r®  r  r   Zget_slot_by_namerà   Z	slot_coder@  r4  rc  Zis_emptyZ	slot_namer  r  Zget_base_slot_functionrÅ  rÚ  r‡  rj  r©  Zgenerate_dynamic_init_codeZput_make_object_deferredZget_slot_code_by_nameZpyfunc_entriesra   rê  r    r4  r—  r  r–  Zvtable_cnameZvtabptr_cnameZis_internalrz   rè  rV  Zis_closure_class_scoper	  r‰  r   )rð   rM   r‰  rŠ  r2  rÄ  r¨  Ztypespec_cnameZ
tuple_tempZbuffer_slotZbuffer_method_namer3  Zbase_typeptr_cnamer  Zgetattr_slot_funcZdictoffset_slot_funcrS   r,  rò  Zweakref_entryZtp_weaklistoffsetZ	objstructr0   r0   r1   rŒ  j  sÐ  

þ


ý
ÿ
ýüüÿ	
ýÿÿýþþ
€







ÿ
ÿ
þ
þ
ÿ
ÿ
ò



ÿ

ÿÿÿ


ÿÿÿÿ


ýÿÿÿÿÿÿÿ



€
ÿ
þ
ÿ

ý

ü
ÿúz&CClassDefNode.generate_type_ready_codec                 C   s,   | j r	| j  |¡ | jr| j |¡ d S d S rw   )r†  r©   r¨   r¥   r0   r0   r1   r©   Z  s
   ÿzCClassDefNode.annotaterK  )r+   r,   r-   r™   rf  rg  r©  r*  rp  rq  rl  r5  rm  rç  rd  r  r:  rx  r    ri   rç   ré   r  rŒ  r©   r0   r0   r0   r1   rW  ù  s2    
+  N prW  c                   @   r
  )ÚPropertyNoder¨   c                 C   s*   |  | j| j| j¡| _| j | jj¡ d S rw   )r„  ra   r;   r4   rð   r¨   r    r¨  r‹   r0   r0   r1   r    k  s   z!PropertyNode.analyse_declarationsc                 C   r  rw   r  r‹   r0   r0   r1   ri   o  ó   z PropertyNode.analyse_expressionsc                 C   r  rw   r  r	  r0   r0   r1   rç   s  r  z*PropertyNode.generate_function_definitionsc                 C   rŸ   rw   r0   r¥   r0   r0   r1   ré   v  r¡   z$PropertyNode.generate_execution_codec                 C   r  rw   r  r¥   r0   r0   r1   r©   y  r  zPropertyNode.annotateNr  r0   r0   r0   r1   r‘  a  s    r‘  c                   @   sN   e Zd ZdZdgZdZedd„ ƒZdd„ Zdd	„ Z	d
d„ Z
dd„ Zdd„ ZdS )ÚCPropertyNodezADefinition of a C property, backed by a CFuncDefNode getter.
    r¨   Tc                 C   s*   | j j}|rt|d tƒsJ |ƒ‚|d S rq  )r¨   rõ   rB   rM  ©r~   rõ   r0   r0   r1   rI  ˆ  s   zCPropertyNode.cfuncc                 C   sN   t | j|d}| j |¡ |j| j| j| j| jj|d }| _	| jj	j
|_d S )N)Zclass_scope)ÚctypeZproperty_scope)r   ra   r¨   r    r„  r;   r4   rI  r“  rð   r‰  rƒ  )r~   rŒ   r¨  rð   r0   r0   r1   r    Ž  s   ÿz"CPropertyNode.analyse_declarationsc                 C   r  rw   r  r‹   r0   r0   r1   ri   •  r’  z!CPropertyNode.analyse_expressionsc                 C   r  rw   r  r	  r0   r0   r1   rç   ™  r  z+CPropertyNode.generate_function_definitionsc                 C   rŸ   rw   r0   r¥   r0   r0   r1   ré   œ  r¡   z%CPropertyNode.generate_execution_codec                 C   r  rw   r  r¥   r0   r0   r1   r©   Ÿ  r  zCPropertyNode.annotateN)r+   r,   r-   rs   r™   rØ   rç  rI  r    ri   rç   ré   r©   r0   r0   r0   r1   r“  }  s    
r“  c                   @   ó(   e Zd Zg Zdd„ Zdd„ Zdd„ ZdS )Ú
GlobalNodec                 C   ó   | j D ]	}| || j¡ qd S rw   )ÚnamesZdeclare_globalr4   ©r~   rŒ   ra   r0   r0   r1   r    ª  ó   
ÿzGlobalNode.analyse_declarationsc                 C   r<  rw   r0   r‹   r0   r0   r1   ri   ®  r¡   zGlobalNode.analyse_expressionsc                 C   rŸ   rw   r0   r¥   r0   r0   r1   ré   ±  r¡   z"GlobalNode.generate_execution_codeNrh  r0   r0   r0   r1   r—  £  ó
    r—  c                   @   r–  )ÚNonlocalNodec                 C   r˜  rw   )r™  Zdeclare_nonlocalr4   rš  r0   r0   r1   r    ¼  r›  z!NonlocalNode.analyse_declarationsc                 C   r<  rw   r0   r‹   r0   r0   r1   ri   À  r¡   z NonlocalNode.analyse_expressionsc                 C   rŸ   rw   r0   r¥   r0   r0   r1   ré   Ã  r¡   z$NonlocalNode.generate_execution_codeNrh  r0   r0   r0   r1   r  µ  rœ  r  c                   @   sF   e Zd ZdgZdd„ Zdd„ Zdd„ ZdZd	d
„ Zdd„ Z	dd„ Z
dS )r>  r9  c           
      C   sì   ddl m} | j}t||jƒrR|j ¡ }|dkrP| ¡ \}}t|ƒr(t	|j
dƒ |jD ]\}}| |¡}	|	d u r?t	|j
dƒ q+|j|j|	|j
dd q+t| _d S d S t|dd ƒd urr|jrg| |¡ t| _d S |jsm|jrtt| _d S d S d S )	Nr   r<  r:  z!Variable names must be specified.úUnknown typeT)r+  r¸  )rÃ   rU  r9  rB   ZGeneralCallNoderE  r  Úexplicit_args_kwdsrA   r   r4   r  rO  r«  r   ÚPassStatNoderC   rš   rÓ   Zdeclare_from_annotationrf  Úis_subscript)
r~   rŒ   rU  r9  rS   rJ   rK   Úvarr¡  r2  r0   r0   r1   r    Î  s.   


ö


ùz!ExprStatNode.analyse_declarationsc                 C   s"   d| j _| j  |¡| _ d| j _| S rK  )r9  Úresult_is_usedri   r‹   r0   r0   r1   ri   ç  s   z ExprStatNode.analyse_expressionsc                 C   s(   | j jjr| j  ¡ r|  ¡  d S d S d S rw   )r9  r2  rA  Úresult_in_tempr   r‹   r0   r0   r1   rÜ   î  s   ÿzExprStatNode.nogil_checkzDiscarding owned Python objectc                 C   sz   |  | j¡ d| j_| j |¡ | j ¡ s/| j ¡ r/| j ¡ }| jjjs(d| }| 	d| ¡ | j 
|¡ | j |¡ d S )NFz
(void)(%s)ú%s;)r  r4   r9  r£  rÑ  r¤  r€   r2  r-  rH   ra  rÜ  )r~   rM   r€   r0   r0   r1   ré   ô  s   

z$ExprStatNode.generate_execution_codec                 C   r  rw   )r9  rç   r	  r0   r0   r1   rç      r  z*ExprStatNode.generate_function_definitionsc                 C   r  rw   )r9  r©   r¥   r0   r0   r1   r©     r  zExprStatNode.annotateN)r+   r,   r-   r™   r    ri   rÜ   rŠ   ré   rç   r©   r0   r0   r0   r1   r>  Ç  s    r>  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚAssignmentNodec                 C   sT   |j }|j }|jr"|jjr$|jr&|jjs(t| jd ||¡dd d S d S d S d S d S )Nz4Assigning to '{}' from '{}' discards const qualifierr   r½   )r2  r*  r3  rZ  r   r4   r©  )r~   r÷  ÚrhsZrhs_tZlhs_tr0   r0   r1   Ú_warn_on_const_assignment  s
   ÿz(AssignmentNode._warn_on_const_assignmentc                 C   s"   t |tƒr|  |j|j¡ d S d S rw   )rB   r¦  r¨  r÷  r§  )r~   rL   r0   r0   r1   Ú_check_const_assignment  s   
ÿz&AssignmentNode._check_const_assignmentc                 C   sL   |   |¡}|  |¡ t|tƒr$t|tƒs$|jjjr$|j ¡ r$t	| j
dƒ |S )Nz9Storing unsafe C derivative of temporary Python reference)rj   r©  rB   r¦  ÚParallelAssignmentNoder§  r2  Zis_unowned_viewZis_ephemeralr   r4   )r~   rŒ   rL   r0   r0   r1   ri     s   

z"AssignmentNode.analyse_expressionsc                 C   s$   |  | j¡ |  |¡ |  |¡ d S rw   )r  r4   Úgenerate_rhs_evaluation_coderß  r¥   r0   r0   r1   ré   &  s   
z&AssignmentNode.generate_execution_codeN)r+   r,   r-   r¨  r©  ri   ré   r0   r0   r0   r1   r¦    s
    	r¦  c                   @   s|   e Zd ZddgZdZdZdZdZdZdd„ Z	ddd„Z
d	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zddd„Zdd„ Zdd„ ZdS )ÚSingleAssignmentNoder÷  r§  Fc                 C   sj  ddl m} t| j|jƒrq| jj ¡ }|rq| j ¡ \}}|dv rÏt|ƒdkr2t	|d j
dƒ d S |d urP| d ¡}|dksCd|vrKt	|j
dƒ d S |d }nd	}|d
  |¡}|d u rgt	|d
 j
dƒ d S | j}	|dkr´t|	|jƒr||	j|	j
fg}
nt|	|jƒr‹dd„ |	jD ƒ}
nt	|	j
dƒ d S |
D ]\}}|j|||d|d q•t|ƒdkr°|d | _nÁd| _n½d| _t|	|jƒsÃt	|	j
dƒ |j|	j|| j
d	d n¢|dv rNd| _t|ƒd
ksá|d u rêt	| jj
dƒ d S g }|jD ]\}}| |¡}|d u rt	|j
dƒ qï| |j||j
f¡ qït|ƒt|jƒk rd S t| j|jƒs*t	| jj
dƒ | jj}t|ƒ}| |||d| jj
¡ |D ]\}}}| |||¡ q?n#|dkrqd| _|rat	| jjj
dƒ t| jj
| jj|d}| |¡ | jrwd S | jrƒ| j |¡ d S | j |¡ | jjs“| jj r¯| jj!r­| jj!j"s±| j #¡ }|r³|| jj!_"d S d S d S d S d S )Nr   r<  )r:  Útypedefr%   zInvalid positional argument.r­  r5  zInvalid keyword argument.rM  r   rž  r:  c                 S   s   g | ]}|j |jf‘qS r0   )ra   r4   ©r–   r¢  r0   r0   r1   r˜   ^  s    z=SingleAssignmentNode.analyse_declarations.<locals>.<listcomp>zInvalid declarationT)r+  r5  zInvalid declaration.)r5  )r¦  Úunionz.Struct or union members must be given by name.FZ
fused_typez*fused_type does not take keyword arguments)ra   rZ   )$rÃ   rU  rB   r§  rv  rE  r  rŸ  rA   r   r4   Úcompile_time_valuerO  r÷  rg  ra   rN  rJ   r«  Údeclaration_onlyr&  r  ri  r   r   r®  r%  r    Úis_assignment_expressionZ0analyse_assignment_expression_target_declarationr[  rf  rÓ   rð   ró  Ú!get_known_standard_library_import)r~   rŒ   rU  Ú	func_namerJ   rK   Zkwdictr5  r2  r÷  Úvarsr¢  r4   ÚmembersÚmemberr¡  ra   r¨  Z	fusednodeZstdlib_import_namer0   r0   r1   r    A  sž   




ÿ

ÿÿ
*
ýz)SingleAssignmentNode.analyse_declarationsr   c                 C   s  ddl m} | j |¡| _| jjr:| jjjjr:|j	r.| jjj
d u r.| j ¡ r.| jj| jj_
nt| jd| jj› dƒ |  |¡}|rC|S | j |¡| _| j |¡ |  |¡}|rY|S t| j|jƒrp| j | j¡ | j | j¡| _n| jjjrŽt| j|jƒsŽ|j| jj| jd d d}| |¡| _| jjjrÑ| | jd| jj| jjg¡}|rÇ| j}d| _|jj| _|jj| _| jdkrÆ| jd u rÆ| t  !d	d
¡¡ n| j "| jj|¡}n	| j "| jj|¡}|sé|j#sé|jsï|j$sï|jj%rï| &|¡}n	|jj%rø| '|¡}|| _| j(r| jjjst)| jddƒ | S )Nr   r<  zAssignment to const 'ú')r:  rO   Ústopú=Trr  ZCppExceptionConversionr³  zHAssignment in pxd file will not be executed. Suggest declaring as const.r%   )*rÃ   rU  r§  rj   r÷  rÓ   rð   r2  rZ  r.  rõ  r—  r[  r   r4   ra   Ú
unroll_rhsrk   Úgil_assignment_checkÚ
unroll_lhsrB   ZMemoryViewIndexNodeZanalyse_broadcast_operationZ$analyse_as_memview_scalar_assignmentr+  ÚSliceIndexNoderQ  Zlookup_operator_for_typesÚis_overloaded_assignmentrz  rf  r  r   r®  r•  rf  rÕ   rA  Úcoerce_to_tempÚcoerce_to_simpleÚfrom_pxd_cvardefr   )r~   rŒ   Úuse_temprU  Zunrolled_assignmentr÷  Úopr§  r0   r0   r1   rj   Ÿ  sf   





€
ÿÿþ
ýz"SingleAssignmentNode.analyse_typesc              	   C   s  ddl m}m} |}d  } } }	}
|jjr|jj}n´|jjs#|jjrÍt||j	ƒr@|j
s@|js@|j }}t||j	ƒr@|j
s@|jr/t||j	ƒr»|j}|j
}|rU| tj|¡}|j}|rb| tj|¡}n*|jjr„|jjr„|j| jt|jjƒt|jjtƒr~|jjn|jd}nt| jdƒ d S |	r•|	 tj|¡}	dd„ }z||d ƒ||dƒ ||	dƒ }W n$ tyº   t| jdƒ Y d S w |jjrË|jj}t|tƒsÊd S nd S d S ||krßt| jd	||f ƒ d S g }| |¡}|g}|rø|jsø| |¡}| |¡ |r	|js	| |¡}| |¡ |	r|	js| |	¡}	| |	¡ t|ƒD ]i}|j | j|¡}|	d urMt|	jtƒrC|j|	j }|j | j|¡}n
|j| jd
|	|d}|d urwt|jtƒrm| ¡ rm|j|j }|j | j|¡}n
|j| jd||d}| |j | j|| !|¡d¡ q|
||fS )Nr   )rU  Ú	UtilNodes)r   r[  z*C array iteration requires known end indexc                 S   s"   | d u r|S |   ¡ r| jS tdƒ‚)NzNot a constant.)r—  r[  r^  )rL   Z
none_valuer0   r0   r1   Ú	get_constþ  s
   z.SingleAssignmentNode.unroll.<locals>.get_constr   z5C array assignment currently requires known endpointsz=Assignment to/from slice of wrong length, expected %s, got %srx  )ÚoperatorZoperand1Zoperand2rr  )r:  rV  )"rÃ   rU  rÅ  r2  Ú	is_ctuplerb  r*  r+  rB   r¾  rO   r¹  r:  r•  r	   râ  ZIntNoder4   r‘  r\  Zconstant_value_not_setr   r^  Z
LetRefNoderÕ   ri  r_  Zfor_sizer[  ZMulNoder—  ZAddNodeZ	IndexNoderj   )r~   rL   Ztarget_sizerŒ   rU  rÅ  r:  Z
start_nodeZ	stop_nodeZ	step_nodeÚ
check_nodeZ
slice_sizerÆ  r]   Úrefsra  Zix_nodeZ
step_valueZindex_valuer0   r0   r1   ÚunrollÝ  s”   

ÿý"þ
ÿÿ










ÿ"
zSingleAssignmentNode.unrollc              	   C   sŒ   ddl m} g }t||ƒD ]\}}	| t| j||	| jd¡ qt| j|d |¡}
|r4t	| j||
gd}
|d d d… D ]}| 
||
¡}
q;|
S )Nr   )rÅ  )r÷  r§  Úfirst)r4   rõ   rÇ   )rÃ   rÅ  r'  ri  r¬  r4   rÌ  rª  ri   rô   ZLetNode)r~   rÊ  rÉ  Úlhs_listZrhs_listrŒ   rÅ  Úassignmentsr÷  r§  rL   Úrefr0   r0   r1   Úunroll_assignments:  s   z'SingleAssignmentNode.unroll_assignmentsc                 C   sx   ddl m} t| j|jƒsd S tdd„ | jjD ƒƒrd S |  | jt	| jjƒ|¡}|s,d S |\}}}|  
||| jj||¡S )Nr   r<  c                 s   r  rw   )Z
is_starredr>  r0   r0   r1   r  J  r  z2SingleAssignmentNode.unroll_rhs.<locals>.<genexpr>)rÃ   rU  rB   r÷  rN  r  rJ   rË  r§  rA   rÐ  )r~   rŒ   rU  ÚunrolledrÉ  rÊ  r§  r0   r0   r1   r»  F  s   
zSingleAssignmentNode.unroll_rhsc                 C   sl   | j jjrd S ddlm} t| j|jƒsd S |  | j t	| jj
ƒ|¡}|s&d S |\}}}|  |||| jj
|¡S ©Nr   r<  )r÷  r2  rÈ  rÃ   rU  rB   r§  rN  rË  rA   rJ   rÐ  )r~   rŒ   rU  rÑ  rÉ  rÊ  r÷  r0   r0   r1   r½  S  s   

zSingleAssignmentNode.unroll_lhsc                 C   r  rw   ©r§  rÑ  r¥   r0   r0   r1   r«  a  r  z1SingleAssignmentNode.generate_rhs_evaluation_codec                 C   s<   | j r| jj| j|| j | j| jd d S | j | j|¡ d S )N)rÝ  rz  rf  )r¿  r÷  rß  r§  rz  rf  )r~   rM   rÝ  r0   r0   r1   rß  d  s   
ûz-SingleAssignmentNode.generate_assignment_codec                 C   r  rw   ©r§  rç   r	  r0   r0   r1   rç   o  r  z2SingleAssignmentNode.generate_function_definitionsc                 C   ó   | j  |¡ | j |¡ d S rw   ©r÷  r©   r§  r¥   r0   r0   r1   r©   r  ó   zSingleAssignmentNode.annotateNrª  rë  )r+   r,   r-   r™   rÌ  r¿  r²  r±  rÂ  r    rj   rË  rÐ  r»  r½  r«  rß  rç   r©   r0   r0   r0   r1   r¬  ,  s"    
^>]
r¬  c                   @   s\   e Zd Zg d¢ZdZdZdZdd„ Zdd„ Zddd	„Z	d
d„ Z
ddd„Zdd„ Zdd„ ZdS )ÚCascadedAssignmentNode)rÍ  r§  Úcoerced_valuesÚcloned_valuesNc                 C   s,   t |tƒr|jD ]}|  ||j¡ qd S d S rw   )rB   rØ  rÍ  r¨  r§  )r~   rL   r÷  r0   r0   r1   r©  Š  s
   

þz.CascadedAssignmentNode._check_const_assignmentc                 C   r÷   rw   )rÍ  r[  )r~   rŒ   r÷  r0   r0   r1   r      r  z+CascadedAssignmentNode.analyse_declarationsr   c                 C   s¼  ddl m}m} tƒ }t| jƒD ]\}}| |¡ }| j|< | |¡ | |j	¡ q| j
 |¡}t|ƒdkrYtt|ƒƒjrQ| d|| j
g¡}	|	sP| | ¡ |¡}n| | ¡ |¡}|jsn|jsn|sh|jsh|j	jrn| |¡}n| |¡}| ¡ r{||ƒn|| _
g | _i }
g | _| jD ]9}|j	jo—| d|| j
g¡}| j |¡ |j	|
vrÂ|j	|j	krÂ|| j
ƒ}|s·| |j	|¡}| j |¡ ||
|j	< q‰g | _| jD ]}|
 |j	| j
¡}| j ||ƒ¡ qÉ| S )Nr   )r^  rQ  rº  )rU  r^  rQ  r¿   r†  rÍ  rk   r¼  rÀ   r2  r§  rj   rA   ÚnextÚiterrQ  Zlookup_operatorr•  rc  rÓ   rÕ   rf  rA  rÀ  rÁ  r¤  rÙ  Úassignment_overloadsri  rÚ  rz   )r~   rŒ   rÃ  r^  rQ  Z	lhs_typesrŸ  r÷  r§  rÄ  rÙ  Z
overloadedr0   r0   r1   rj   “  sT   
€ÿÿÿ



€
z$CascadedAssignmentNode.analyse_typesc                 C   r  rw   rÓ  r¥   r0   r0   r1   r«  Ä  r  z3CascadedAssignmentNode.generate_rhs_evaluation_codeFc                 C   sŠ   | j D ]}| |¡ qt| j| j| jƒD ]\}}}| |¡ |j|||d q| j D ]}| |¡ | |¡ q*| j	 |¡ | j	 |¡ d S )N)rÝ  )
rÙ  rÑ  r'  rÍ  rÚ  rÝ  rß  ra  rÜ  r§  )r~   rM   rÝ  r§  r÷  ÚoverloadÚ	rhs_valuer0   r0   r1   rß  Ç  s   



z/CascadedAssignmentNode.generate_assignment_codec                 C   r  rw   rÔ  r	  r0   r0   r1   rç   Ö  r  z4CascadedAssignmentNode.generate_function_definitionsc                 C   sR   | j D ]}| |¡ qt| j| jƒD ]\}}| |¡ | |¡ q| j |¡ d S rw   )rÙ  r©   r'  rÍ  rÚ  r§  )r~   rM   r§  r÷  r0   r0   r1   r©   Ù  s   

zCascadedAssignmentNode.annotaterª  rë  )r+   r,   r-   r™   rÚ  rÙ  rÝ  r©  r    rj   r«  rß  rç   r©   r0   r0   r0   r1   rØ  w  s    
1
rØ  c                   @   r
  )rª  rõ   c                 C   r÷   rw   rø   rù   r0   r0   r1   r    ò  r  z+ParallelAssignmentNode.analyse_declarationsc                    s0   ‡ fdd„| j D ƒ| _ | j D ]}| |¡ q| S )Nc                    s   g | ]	}|j ˆ d d‘qS )r   )rÃ  )rj   rý   rþ   r0   r1   r˜   ÷  ó    ÿz>ParallelAssignmentNode.analyse_expressions.<locals>.<listcomp>)rõ   r©  rù   r0   rþ   r1   ri   ö  s   
ÿ
z*ParallelAssignmentNode.analyse_expressionsc                 C   s<   |  | j¡ | jD ]}| |¡ q	| jD ]}| |¡ qd S rw   )r  r4   rõ   r«  rß  r  r0   r0   r1   ré     s   

ÿz.ParallelAssignmentNode.generate_execution_codec                 C   r   rw   r  r  r0   r0   r1   rç     ró   z4ParallelAssignmentNode.generate_function_definitionsc                 C   r÷   rw   r  r  r0   r0   r1   r©     r  zParallelAssignmentNode.annotateN©	r+   r,   r-   r™   r    ri   ré   rç   r©   r0   r0   r0   r1   rª  â  s    rª  c                   @   ó<   e Zd ZddgZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚInPlaceAssignmentNoder÷  r§  c                 C   r  rw   ©r÷  r[  r‹   r0   r0   r1   r    (  r  z*InPlaceAssignmentNode.analyse_declarationsc                 C   sn   | j  |¡| _ | j |¡| _| jjs| jjr"| j  | jj|¡| _ | S | jjjr5| j	dv r5| j  t
j|¡| _ | S )Nz+-)r§  rj   r÷  rk   Úis_memview_indexÚis_buffer_accessr•  r2  Z	is_stringrÇ  r	   râ  r‹   r0   r0   r1   rj   +  s   ýz#InPlaceAssignmentNode.analyse_typesc                 C   s
  |  | j¡ | j| j}}| |¡ | |¡ | j}|dkr!d}n
|dkr+t| jdƒ |js1|j	rW|j
jr;t| jdƒ |dv rO|j
jrO|jjd sOt| jdƒ | |||¡ n|jrat| jd	ƒ n| d
| ¡ || ¡ f ¡ | |¡ | |¡ | |¡ | |¡ d S )Nz//ú/z**zNo C inplace power operatorzAIn-place operators not allowed on object buffers in this release.)rç  ú%Z	cdivisionz;In-place non-c divide operators not allowed on int buffers.z4Inplace operators not supported on memoryview slicesz
%s %s= %s;)r  r4   r÷  r§  rÑ  Z generate_subexpr_evaluation_coderÇ  r   ræ  rå  r2  rA  rY  ræ   rà   Zgenerate_buffer_setitem_codeZis_memview_slicerH   r€   Zgenerate_subexpr_disposal_codeZfree_subexpr_tempsra  rÜ  )r~   rM   r÷  r§  Zc_opr0   r0   r1   ré   7  s,   




z-InPlaceAssignmentNode.generate_execution_codec                 C   rÕ  rw   rÖ  r¥   r0   r0   r1   r©   R  r×  zInPlaceAssignmentNode.annotatec                 C   s$   ddl m} | | j| j| j| j¡S rÒ  )rÃ   rU  Z
binop_noder4   rÇ  r÷  r§  rX  r0   r0   r1   Úcreate_binop_nodeV  s   z'InPlaceAssignmentNode.create_binop_nodeN)	r+   r,   r-   r™   r    rj   ré   r©   ré  r0   r0   r0   r1   rã    s    rã  c                   @   s>   e Zd ZddgZdd„ ZejZdZdd„ Z	dd	„ Z
d
d„ ZdS )ÚPrintStatNodeÚ	arg_tuplerF   c                 C   sd   | j r| j  |¡}| |¡| _ | j |¡}| |¡| _| t¡ t| jjƒdkr0| jr0| t	¡ | S )Nr   )
rF   ri   Úcoerce_to_pyobjectrë  r  Úprinting_utility_coderA   rJ   Úappend_newlineÚprinting_one_utility_code)r~   rŒ   rF   rë  r0   r0   r1   ri   d  s   

z!PrintStatNode.analyse_expressionszPython print statementc              	   C   s   |  | j¡ | jr| j |¡ | j ¡ }nd}t| jjƒdkrH| jrH| jjd }| |¡ | 	d|| ¡ | 
| j¡f ¡ | |¡ | |¡ n%| j |¡ | 	d|| j ¡ | j| 
| j¡f ¡ | j |¡ | j |¡ | jr~| j |¡ | j |¡ d S d S )Nrb  r   r   z"if (__Pyx_PrintOne(%s, %s) < 0) %sz#if (__Pyx_Print(%s, %s, %d) < 0) %s)r  r4   rF   rÑ  rÁ  rA   rë  rJ   rî  rH   ra  ra  rÜ  )r~   rM   Zstream_resultr¥  r0   r0   r1   ré   r  s@   

ýÿ

üÿþz%PrintStatNode.generate_execution_codec                 C   s&   | j r
| j  ||¡ | j ||¡ d S rw   )rF   rç   rë  r	  r0   r0   r1   rç   “  s   z+PrintStatNode.generate_function_definitionsc                 C   s"   | j r	| j  |¡ | j |¡ d S rw   )rF   r©   rë  r¥   r0   r0   r1   r©   ˜  s   zPrintStatNode.annotateN)r+   r,   r-   r™   ri   r…   r   rÜ   rŠ   ré   rç   r©   r0   r0   r0   r1   rê  [  s    !rê  c                   @   s4   e Zd ZdgZdd„ ZejZdZdd„ Z	dd„ Z
d	S )
ÚExecStatNoderJ   c                 C   sB   t | jƒD ]\}}| |¡}| |¡}|| j|< q| tj¡ | S rw   )r†  rJ   ri   rì  r  r   Zpyexec_utility_code©r~   rŒ   rŸ  r¥  r0   r0   r1   ri   ¥  s   

z ExecStatNode.analyse_expressionszPython exec statementc                 C   sÖ   |  | j¡ g }| jD ]}| |¡ | | ¡ ¡ qt|ddgd dt|ƒ …  ƒ}|jj	t
jdd}| d|f|  ¡ | jD ]}| |¡ | |¡ q@| | || j¡¡ | |t¡ | |t¡ |j |¡ d S )Nrb  rÆ   TrY  z%s = __Pyx_PyExec3(%s, %s, %s);)r  r4   rJ   rÑ  ri  rÁ  rû  rA   rZ  r[  r	   r
   rH   ra  rÜ  r]  r^  rb  rc  )r~   rM   rJ   r¥  Ztemp_resultr0   r0   r1   ré   °  s"   

 

ÿz$ExecStatNode.generate_execution_codec                 C   r÷   rw   ©rJ   r©   r  r0   r0   r1   r©   Â  r  zExecStatNode.annotateN)r+   r,   r-   r™   ri   r…   r   rÜ   rŠ   ré   r©   r0   r0   r0   r1   rð  ž  s    rð  c                   @   sB   e Zd ZdgZdZdd„ Zdd„ Zdd„ Zd	Zd
d„ Z	dd„ Z
dS )ÚDelStatNoderJ   Fc                 C   r÷   rw   )rJ   r[  rl  r0   r0   r1   r    Ï  r  z DelStatNode.analyse_declarationsc                 C   s¶   t | jƒD ]S\}}| |d ¡ }| j|< |jjs|jr-|jjr-|jr,|jjr,t	|j
dƒ q|jjr<|jjjr<|  |¡ q|jjrGt	|j
dƒ q|jrR|jjtju rRqt	|j
dƒ q| S )NzDeletion of global C variablezDeletion of non-heap C++ objectz&Deletion of non-Python, non-C++ object)r†  rJ   r`  r2  rA  rÓ   r/  rð   Z
is_cglobalr   r4   r*  r3  rQ  r‘   r¡  r:  r   Úbytearray_typerñ  r0   r0   r1   ri   Ó  s   €zDelStatNode.analyse_expressionsc                 C   s    | j D ]
}|jjr|  ¡  qd S rw   )rJ   r2  rA  r   rl  r0   r0   r1   rÜ   ä  s
   
€þzDelStatNode.nogil_checkzDeleting Python objectc                 C   s”   |  | j¡ | jD ]>}|jjs|jjs|jr&|jjtj	u r&|j
|| jd q	|jjrG|jjjrG| |¡ | d| ¡  ¡ | |¡ | |¡ q	d S )N)Úignore_nonexistingz
delete %s;)r  r4   rJ   r2  rA  r/  r¡  r:  r   rô  Zgenerate_deletion_coderõ  r*  r3  rQ  rÑ  rH   r€   ra  rÜ  r  r0   r0   r1   ré   ë  s$   
ÿþÿ


€öz#DelStatNode.generate_execution_codec                 C   r÷   rw   rò  r  r0   r0   r1   r©   ú  r  zDelStatNode.annotateN)r+   r,   r-   r™   rõ  r    ri   rÜ   rŠ   ré   r©   r0   r0   r0   r1   ró  Ç  s    ró  c                   @   s    e Zd Zg Zdd„ Zdd„ ZdS )r   c                 C   r<  rw   r0   r‹   r0   r0   r1   ri     r¡   z PassStatNode.analyse_expressionsc                 C   s    |j jd r| | j¡ d S d S )Nr  )ræ   rà   r  r4   r¥   r0   r0   r1   ré     s   ÿz$PassStatNode.generate_execution_codeN)r+   r,   r-   r™   ri   ré   r0   r0   r0   r1   r   ÿ  s    r   c                       s    e Zd ZdZ‡ fdd„Z‡  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                    s   t ƒ j|d j|d d S )Nr   rÿ   )r^   rˆ   r4   r”  rf   r0   r1   rˆ     s   zIndirectionNode.__init__)r+   r,   r-   rs   rˆ   rg   r0   r0   rf   r1   rö    s    rö  c                   @   r  )ÚBreakStatNodeTc                 C   r<  rw   r0   r‹   r0   r0   r1   ri     r¡   z!BreakStatNode.analyse_expressionsc                 C   s2   |  | j¡ |jst| jdƒ d S | |j¡ d S )Nzbreak statement not inside loop)r  r4   Úbreak_labelr   rÕ  r¥   r0   r0   r1   ré     s   z%BreakStatNode.generate_execution_codeN©r+   r,   r-   r™   rÖ   ri   ré   r0   r0   r0   r1   r÷    ó
    r÷  c                   @   r  )ÚContinueStatNodeTc                 C   r<  rw   r0   r‹   r0   r0   r1   ri   +  r¡   z$ContinueStatNode.analyse_expressionsc                 C   s2   |j st| jdƒ d S | | j¡ | |j ¡ d S )Nz"continue statement not inside loop)Úcontinue_labelr   r4   r  rÕ  r¥   r0   r0   r1   ré   .  s
   z(ContinueStatNode.generate_execution_codeNrù  r0   r0   r0   r1   rû  &  rú  rû  c                   @   sV   e Zd ZdgZdZdZdZdZdd„ Zdd„ Z	dZ
d	d
„ Zdd„ Zdd„ Zdd„ ZdS )rG  r   TFc                 C   sÊ   |j }|| _ |st| jdƒ | S | jrT| jrt| jdƒ | j |¡| _|js)|jr2t| jjdƒ | S | j |j |¡| _|j	d sE|j	d rR|j
sR| |¡rR| |¡ | S |jsc|j
sc|jsct| jdƒ | S )Nz!Return not inside a function bodyz$Return with value in async generatorz"Return with value in void functionr/  r  zReturn value required)r“  r   r4   r   Úin_async_genrj   r-  r=  r•  rà   rA  Zcan_coerce_to_pyobjectr2  )r~   rŒ   r“  r0   r0   r1   ri   F  s0   ÷
üÿþz"ReturnStatNode.analyse_expressionsc                 C   s   | j jr
|  ¡  d S d S rw   )r“  rA  r   r‹   r0   r0   r1   rÜ   ^  r’   zReturnStatNode.nogil_checkzReturning Python objectc                 C   sb  |  | j¡ | jsd S | j}| jjr!| tj| j¡ |r!|jr!d }|re| 	|¡ | jj
rGddlm} |jtj| j|j||| jd | |¡ n| |¡ | dtj| | j¡f ¡ | |¡ | |¡ n| jjrr| tj| j¡ n| jjr~|  || jj¡ |jjd sŠ|jjd r™|jtj| j| j|jj d |j ¡ D ]
\}}| ||¡ qž| |j ¡ d S )Nr   rÿ  )Z	lhs_cnameZlhs_typeZlhs_posr§  rM   rŽ  r×  r/  r  rš  )!r  r4   r“  r   rA  rÙ  r   r¼  rÔ   rÑ  r/  rÃ   r   Zput_acquire_memoryviewslicerÝ   rÛ  rØ  rH   rÙ  rÜ  rÑ  r=  Ú
put_returnr™  ræ   rà   rÒ  rZ  r—  Ztemps_holding_referencerb  rÕ  rÖ  )r~   rM   r   r   r‰  r2  r0   r0   r1   ré   d  sT   

ú

þ
üz&ReturnStatNode.generate_execution_codec                 C   s(   | j r| d¡ | dtj|f ¡ d S )Nz%#pragma omp critical(__pyx_returning)r×  )Úin_parallelÚputln_openmprH   r   r¼  )r~   rM   r   r0   r0   r1   rþ  —  s   
zReturnStatNode.put_returnc                 C   s    | j d ur| j  ||¡ d S d S rw   )r   rç   r	  r0   r0   r1   rç   œ  s   
ÿz,ReturnStatNode.generate_function_definitionsc                 C   rÔ  rw   )r   r©   r¥   r0   r0   r1   r©      rÕ  zReturnStatNode.annotateN)r+   r,   r-   r™   rÖ   Úin_generatorrý  rÿ  ri   rÜ   rŠ   ré   rþ  rç   r©   r0   r0   r0   r1   rG  6  s    3rG  c                   @   sN   e Zd Zg d¢ZdZdZdZdZdd„ Ze	j
ZdZdd	„ Zd
d„ Zdd„ ZdS )ÚRaiseStatNode)Úexc_typeÚ	exc_valueÚexc_tbÚcauseTNFc           
      C   s€  | j r| j  |¡}| |¡| _ | jrD| j |¡}| jr>|jtju s%|jjs>ddl	m
} ||j| |¡gdd}|j|dd}| |¡| _| jrS| j |¡}| |¡| _| jrb| j |¡}| |¡| _| j r¾| js¾| js¾| j }ddlm	} t||jƒr‰|js‰|jd ur†|jjs‰|j}|jr¾|jjr¾ddlm}	 |j| _| jdkr¤d | _ | S | jd	kr¾|jr¾|jd
kr¾|jr¾|jjr¾| js¾d | _ | S )Nr   rM  T)rJ   Zslow)Zskip_childrenr<  )ÚSymtabÚMemoryErrorÚStopIterationÚ__next__)r  rj   rì  r  Úwrap_tuple_valuer2  r   Z
tuple_typerÿ  rU  rN  r4   r  r  rÃ   rB   rF  rJ   rë  rE  rÓ   rð   Ú
is_builtinr  ra   Úbuiltin_exc_nameZis_local_scoperu  r‡  Úin_try_block)
r~   rŒ   r  r  rN  r  r  ÚexcrU  r  r0   r0   r1   ri   ¶  sV   ÿ


÷ÿ
ÿÿþz!RaiseStatNode.analyse_expressionsúRaising exceptionc                 C   sz  |  | j¡ | jdkr| d| | j¡ ¡ d S | jdkr8| js8| dtj ¡ | d| d ¡ ¡ d|j_	d S | jrS| j 
|¡ | j ¡ }| jjrR|j | jj¡ nd}| jrd| j 
|¡ | j ¡ }nd}| jru| j 
|¡ | j ¡ }nd}| jr†| j 
|¡ | j ¡ }nd}|j t¡ | d||||f ¡ | j| j| j| jfD ]}|r±| |¡ | |¡ q£| | | j¡¡ d S )	Nr  zPyErr_NoMemory(); %sr	  z%s = 1;r¥  Trb  z__Pyx_Raise(%s, %s, %s, %s);)r  r4   r  rH   ra  r  r   rà  rZ  rß  rÑ  rÁ  rÓ   ræ   rT  rð   r  r  r  r  Úraise_utility_codera  rÜ  )r~   rM   Z	type_codeZ
value_codeZtb_codeZ
cause_coder  r0   r0   r1   ré   ã  sZ   

€üÿ

€
ÿz%RaiseStatNode.generate_execution_codec                 C   sh   | j d ur| j  ||¡ | jd ur| j ||¡ | jd ur$| j ||¡ | jd ur2| j ||¡ d S d S rw   )r  rç   r  r  r  r	  r0   r0   r1   rç     s   



ÿz+RaiseStatNode.generate_function_definitionsc                 C   sP   | j r	| j  |¡ | jr| j |¡ | jr| j |¡ | jr&| j |¡ d S d S rw   )r  r©   r  r  r  r¥   r0   r0   r1   r©     s   ÿzRaiseStatNode.annotate)r+   r,   r-   r™   rÖ   r  r  r  ri   r…   r   rÜ   rŠ   ré   rç   r©   r0   r0   r0   r1   r  ¥  s    *0
r  c                   @   s.   e Zd Zg ZdZdd„ ZejZdZ	dd„ Z
dS )ÚReraiseStatNodeTc                 C   r<  rw   r0   r‹   r0   r0   r1   ri   -  r¡   z#ReraiseStatNode.analyse_expressionsr  c                 C   sÎ   |  | j¡ |jj}|rA|j t¡ | |d t¡ | |d t¡ | 	|d t¡ | 
dt|ƒ ¡ | 
d dd„ |D ƒ¡¡ n|j t dd	¡¡ | 
d
¡ | ¡ r\|j| jdd | 
| | j¡¡ d S )Nr   r   r%   ú&__Pyx_ErrRestoreWithState(%s, %s, %s);r>   c                 S   s   g | ]}|› d ‘qS )z = 0; r0   )r–   Úvarnamer0   r0   r1   r˜   =  rµ   z;ReraiseStatNode.generate_execution_code.<locals>.<listcomp>ZReRaiseExceptionúExceptions.cz__Pyx_ReraiseException();T©Úreraise)r  r4   rZ  Úexc_varsræ   r  rÚ  rÚ  r
   ré  rH   rû  r·   r   r®  r­  Úput_trace_exceptionra  )r~   rM   rµ  r0   r0   r1   ré   3  s    
ÿ
z'ReraiseStatNode.generate_execution_codeN)r+   r,   r-   r™   rÖ   ri   r…   r   rÜ   rŠ   ré   r0   r0   r0   r1   r  (  s    r  c                   @   s@   e Zd Zg d¢ZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )ÚAssertStatNode)Ú	conditionr   Ú	exceptionNc                 C   s4   | j d u s	J dƒ‚| jd usJ dƒ‚| j |¡ d S )Nz0Message should have been replaced in PostParse())r   r  r    r‹   r0   r0   r1   r    Q  s   z#AssertStatNode.analyse_declarationsc                 C   ó    | j  |¡| _ | j |¡| _| S rw   )r  Úanalyse_temp_boolean_expressionr  ri   r‹   r0   r0   r1   ri   V  ó   z"AssertStatNode.analyse_expressionsc                 C   s¾   |j  t dd¡¡ | d¡ | d¡ | | j¡ | j |¡ | d| j 	¡  ¡ | j
 |¡ | d¡ | j |¡ | j |¡ | d¡ | d¡ | d|j| jd	d
 ¡ | d¡ d S )NZAssertionsEnabledr  z!#ifndef CYTHON_WITHOUT_ASSERTIONSz+if (unlikely(__pyx_assertions_enabled())) {r‰  rŒ  r  zif ((1)); else %sFrˆ  rŸ  )ræ   r  r   r®  rH   r  r4   r  rÑ  r€   r  ré   ra  rÜ  ra  r¥   r0   r0   r1   ré   [  s,   
ÿ

ÿÿÿ
z&AssertStatNode.generate_execution_codec                 C   ó    | j  ||¡ | j ||¡ d S rw   )r  rç   r  r	  r0   r0   r1   rç   p  ó   z,AssertStatNode.generate_function_definitionsc                 C   rÕ  rw   )r  r©   r  r¥   r0   r0   r1   r©   t  r×  zAssertStatNode.annotate)
r+   r,   r-   r™   r  r    ri   ré   rç   r©   r0   r0   r0   r1   r  G  s    r  c                   @   râ  )Ú
IfStatNodeÚ
if_clausesÚelse_clausec                 C   ó0   | j D ]}| |¡ q| jr| j |¡ d S d S rw   )r#  r    r$  )r~   rŒ   Ú	if_clauser0   r0   r1   r      ó
   
ÿzIfStatNode.analyse_declarationsc                    s.   ‡ fdd„| j D ƒ| _ | jr| j ˆ ¡| _| S )Nc                    rû   r0   rü   )r–   r&  rþ   r0   r1   r˜   ˆ  rµ   z2IfStatNode.analyse_expressions.<locals>.<listcomp>)r#  r$  ri   r‹   r0   rþ   r1   ri   ‡  s   zIfStatNode.analyse_expressionsc                 C   s–   |  | j¡ | ¡ }t| jƒ}| js|d8 }t| jƒD ]\}}|j||||kd q| jrD|  | jj¡ | d¡ | j |¡ | d¡ | 	|¡ d S )Nr   )Úis_lastú
/*else*/ {rŒ  )
r  r4   r°  rA   r#  r$  r†  ré   rH   r×  )r~   rM   rÉ  ÚlastrŸ  r&  r0   r0   r1   ré     s   


z"IfStatNode.generate_execution_codec                 C   s8   | j D ]}| ||¡ q| jd ur| j ||¡ d S d S rw   )r#  rç   r$  )r~   rŒ   rM   Zclauser0   r0   r1   rç   œ  s
   

ÿz(IfStatNode.generate_function_definitionsc                 C   r%  rw   )r#  r©   r$  )r~   rM   r&  r0   r0   r1   r©   ¢  r'  zIfStatNode.annotateNrá  r0   r0   r0   r1   r"  y  s    r"  c                   @   s@   e Zd ZddgZdZdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚIfClauseNoder  r¨   Nc                 C   r  rw   )r¨   r    r‹   r0   r0   r1   r    ²  r  z!IfClauseNode.analyse_declarationsc                 C   r  rw   )r  r  r¨   ri   r‹   r0   r0   r1   ri   µ  r  z IfClauseNode.analyse_expressionsc                 C   sœ   | j  |¡ | | j¡ | j  ¡ }| jrd| j|f }| d| ¡ | j  |¡ | j  |¡ | j	 
|¡ |j| jdd |sG| j	jsG| |¡ | d¡ d S )Nz%s(%s)r¤  Fr  rŒ  )r  rÑ  r  r4   r€   Úbranch_hintrH   ra  rÜ  r¨   ré   rÖ   rÕ  )r~   rM   rÉ  r(  r  r0   r0   r1   ré   º  s   

z$IfClauseNode.generate_execution_codec                 C   r   rw   )r  rç   r¨   r	  r0   r0   r1   rç   É  r!  z*IfClauseNode.generate_function_definitionsc                 C   rÕ  rw   )r  r©   r¨   r¥   r0   r0   r1   r©   Í  r×  zIfClauseNode.annotate)
r+   r,   r-   r™   r,  r    ri   ré   rç   r©   r0   r0   r0   r1   r+  ©  s    r+  c                   @   s4   e Zd ZddgZdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚSwitchCaseNodeÚ
conditionsr¨   c                 C   r÷   rw   )r.  rÑ  ©r~   rM   rú  r0   r0   r1   Ú"generate_condition_evaluation_codeÚ  r  z1SwitchCaseNode.generate_condition_evaluation_codec                 C   sŠ   t | jƒ}|jjd }t| jdƒD ]\}}| d| ¡  ¡ | |j¡ |r/||k r/| d¡ q| j	 
|¡ |j| jdd | d¡ d S )Nr  r   zcase %s:rñ  Fr  rõ  )rA   r.  ræ   rà   r†  rH   r€   r  r4   r¨   ré   )r~   rM   Znum_conditionsZline_tracing_enabledrŸ  rú  r0   r0   r1   ré   Þ  s   

€z&SwitchCaseNode.generate_execution_codec                 C   s*   | j D ]}| ||¡ q| j ||¡ d S rw   )r.  rç   r¨   )r~   rŒ   rM   rú  r0   r0   r1   rç   ë  ó   
z,SwitchCaseNode.generate_function_definitionsc                 C   s&   | j D ]}| |¡ q| j |¡ d S rw   )r.  r©   r¨   r/  r0   r0   r1   r©   ð  s   
zSwitchCaseNode.annotateN)r+   r,   r-   r™   r0  ré   rç   r©   r0   r0   r0   r1   r-  Ò  s    r-  c                   @   s,   e Zd Zg d¢Zdd„ Zdd„ Zdd„ ZdS )	ÚSwitchStatNode)ÚtestÚcasesr$  c                 C   s´   | j  |¡ | jD ]}| |¡ q	| | j¡ | d| j  ¡  ¡ | jD ]}| |¡ q$| j	d urB| d¡ | j	 |¡ | d¡ n| d¡ | d¡ | j  
|¡ | j  |¡ d S )Nr  rð  rõ  zdefault: break;rŒ  )r3  rÑ  r4  r0  r  r4   rH   r€   ré   r$  ra  rÜ  ©r~   rM   Úcaser0   r0   r1   ré   ÿ  s   





z&SwitchStatNode.generate_execution_codec                 C   óF   | j  ||¡ | jD ]}| ||¡ q
| jd ur!| j ||¡ d S d S rw   )r3  rç   r4  r$  )r~   rŒ   rM   r6  r0   r0   r1   rç     ó   

ÿz,SwitchStatNode.generate_function_definitionsc                 C   s@   | j  |¡ | jD ]}| |¡ q	| jd ur| j |¡ d S d S rw   )r3  r©   r4  r$  r5  r0   r0   r1   r©     s   

ÿzSwitchStatNode.annotateN)r+   r,   r-   r™   ré   rç   r©   r0   r0   r0   r1   r2  ö  s
    r2  c                   @   rB  )ÚLoopNodeNrD  r0   r0   r0   r1   r9  %  rE  r9  c                   @   s<   e Zd Zg d¢Zdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚWhileStatNode)r  r¨   r$  c                 C   s&   | j  |¡ | jr| j |¡ d S d S rw   )r¨   r    r$  r‹   r0   r0   r1   r    2  ó   ÿz"WhileStatNode.analyse_declarationsc                 C   s:   | j r
| j  |¡| _ | j |¡| _| jr| j |¡| _| S rw   )r  r  r¨   ri   r$  r‹   r0   r0   r1   ri   7  s   z!WhileStatNode.analyse_expressionsc                 C   sÐ   |  | j¡ | ¡ }| d¡ | jr.| j |¡ | j |¡ | d| j ¡  ¡ | j |¡ | j	 
|¡ | |j¡ | d¡ |j}| |¡ | jra|  | jj¡ | d¡ | j 
|¡ | d¡ | |¡ d S )Nzwhile (1) {zif (!%s) break;rŒ  r)  )r  r4   Únew_loop_labelsrH   r  rÑ  ra  r€   rÜ  r¨   ré   r×  rü  rø  Úset_loop_labelsr$  )r~   rM   Úold_loop_labelsrø  r0   r0   r1   ré   ?  s.   ÿÿ



z%WhileStatNode.generate_execution_codec                 C   sB   | j r
| j  ||¡ | j ||¡ | jd ur| j ||¡ d S d S rw   )r  rç   r¨   r$  r	  r0   r0   r1   rç   V  s   
ÿz+WhileStatNode.generate_function_definitionsc                 C   s8   | j r	| j  |¡ | j |¡ | jr| j |¡ d S d S rw   )r  r©   r¨   r$  r¥   r0   r0   r1   r©   ]  s   ÿzWhileStatNode.annotateNrá  r0   r0   r0   r1   r:  )  s    r:  c                   @   sL   e Zd Zg d¢Zd ZZd ZZd ZZ	dd„ Z
dd„ Zdd„ Zd	d
„ ZdS )ÚDictIterationNextNode)
Údict_objÚexpected_sizeÚpos_index_varÚcoerced_key_varÚcoerced_value_varÚcoerced_tuple_varÚ
key_targetÚvalue_targetÚtuple_targetÚis_dict_flagNc                 C   s(   t j| |j|||||||dtjd d S )NT)	r@  rA  rB  rF  rG  rH  rI  Úis_tempr2  ©r…   rˆ   r4   r	   Zc_bint_type)r~   r@  rA  rB  rF  rG  rH  rI  r0   r0   r1   rˆ   q  s   
özDictIterationNextNode.__init__c                 C   s  ddl m} | j |¡| _| j |¡| _| jr| j |¡| _| jr<| j |¡| _| | jj	t
j¡| _| j | jj|¡| _| jr[| j |¡| _|j| jj	t
jd| _| j | jj|¡| _| jry| j |¡| _| | jj	t
j¡| _| j | jj|¡| _| j |¡| _| S ©Nr   r<  rê  )rÃ   rU  r@  rj   rA  rB  rF  rk   ÚTempNoder4   r	   r
   Úkey_refr•  r2  rC  rG  Ú	value_refrD  rH  Ú	tuple_refrE  rI  ©r~   rŒ   rU  r0   r0   r1   ri     s&   z)DictIterationNextNode.analyse_expressionsc                 C   r  rw   )r@  rç   r	  r0   r0   r1   rç   ”  r  z3DictIterationNextNode.generate_function_definitionsc           	      C   s‚  |j  t dd¡¡ | j |¡ g }g }| j| j| jf| j	| j
| jf| j| j| jffD ]$\}}}|d u r7d}n| |||f¡ | |¡ d| ¡  }| |¡ q+|j tjd¡}| d|| j ¡ | j ¡ | j ¡ |d |d |d	 | j ¡ f ¡ | d
| ¡ | | d| | j¡¡ |j |¡ |D ]
\}}}| |¡ q”|D ]
\}}}| |¡ q¡|D ]\}}}| ||¡ |  |¡ q®d S )NZ	dict_iterú
Optimize.crž  ú&%sFz7%s = __Pyx_dict_iter_next(%s, %s, &%s, %s, %s, %s, %s);r   r   r%   úif (unlikely(%s == 0)) break;ú%s == -1)!ræ   r  r   r®  r@  rÑ  rN  rC  rF  rO  rD  rG  rP  rE  rH  ri  Úallocater€   rZ  r[  r	   r¬  rH   rÁ  rA  rB  rI  r‹  r4   rc  Úgenerate_gotrefrß  Úrelease)	r~   rM   rÎ  Ztemp_addressesr¢  r€   rÞ  ÚaddrÚresult_tempr0   r0   r1   ré   —  sH   þ
ø
þz-DictIterationNextNode.generate_execution_code)r+   r,   r-   r™   rC  rN  rD  rO  rE  rP  rˆ   ri   rç   ré   r0   r0   r0   r1   r?  e  s    r?  c                   @   s<   e Zd Zg d¢Zd ZZdd„ Zdd„ Zdd„ Zd	d
„ Z	dS )ÚSetIterationNextNode)Úset_objrA  rB  rD  rG  Úis_set_flagNc                 C   s$   t j| |j|||||dtjd	 d S )NT)r\  rA  rB  rG  r]  rJ  r2  rK  )r~   r\  rA  rB  rG  r]  r0   r0   r1   rˆ   É  s   
øzSetIterationNextNode.__init__c                 C   s€   ddl m} | j |¡| _| j |¡| _| j |¡| _| j |¡| _|j| jj	t
jd| _| j | jj|¡| _| j |¡| _| S rL  )rÃ   rU  r\  rj   rA  rB  rG  rk   rM  r4   r	   r
   rO  r•  r2  rD  r]  rQ  r0   r0   r1   ri   Ô  s   z(SetIterationNextNode.analyse_expressionsc                 C   r  rw   )r\  rç   r	  r0   r0   r1   rç   ß  r  z2SetIterationNextNode.generate_function_definitionsc              
   C   sÜ   |j  t dd¡¡ | j |¡ | j}| |¡ |j 	t
jd¡}| d|| j ¡ | j ¡ | j ¡ | ¡ | j ¡ f ¡ | d| ¡ | | d| | j¡¡ |j |¡ | |¡ | j |¡ | j | j|¡ | |¡ d S )NZset_iterrR  Fz/%s = __Pyx_set_iter_next(%s, %s, &%s, &%s, %s);rT  rU  )ræ   r  r   r®  r\  rÑ  rO  rV  rZ  r[  r	   r¬  rH   rÁ  rA  r€   rB  r]  r‹  r4   rc  rW  rD  rG  rß  rX  )r~   rM   rO  rZ  r0   r0   r1   ré   â  s(   
ú
z,SetIterationNextNode.generate_execution_code)
r+   r,   r-   r™   rD  rO  rˆ   ri   rç   ré   r0   r0   r0   r1   r[  Á  s    r[  c                 K   sB   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)r4   r‡   r0   r0   r1   ÚForStatNodeý  s
   
rc  c                   @   sL   e Zd Zg d¢ZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ ZdS )Ú_ForInStatNode)rÞ  r²   r^  r¨   r$  NFc                 C   s   t dƒ‚)Nz!must be implemented by subclasses)ÚNotImplementedErrorr”   r0   r0   r1   Ú_create_item_node  r  z _ForInStatNode._create_item_nodec                 C   s6   | j  |¡ | j |¡ | jr| j |¡ |  ¡  d S rw   )rÞ  r[  r¨   r    r$  rf  r‹   r0   r0   r1   r      s
   z#_ForInStatNode.analyse_declarationsc                 C   sš   | j  |¡| _ | j |¡| _|  ¡  | j |¡| _| js0| jjjs&| jjj	r0| j j 
| jj¡r0n
| j | j j|¡| _| j |¡| _| jrK| j |¡| _| S rw   )rÞ  rk   r^  ri   rf  r²   r_  r2  r*  r+  r–  r•  r¨   r$  r‹   r0   r0   r1   ri     s"   ÿÿþz"_ForInStatNode.analyse_expressionsc                 C   sT  |  | j¡ | ¡ }| j |¡ | d¡ | j |¡ | d¡ | j |¡ | j	 
| j|¡ | | j¡ | j |¡ |  | j¡ | |j¡ | d¡ | j |¡ | jrY| d¡nd }| d¡}|j|jg|g|pj|| jd}|  | j¡ |D ]}| j |¡ qw| |¡ | j |¡ | jr£| d¡ | |¡ | j |¡ | d¡ | |¡ d S )NrÚ  rï  rŒ  Zfor_elseZfor_end)Úskip_to_labelr4   r)  )r  r4   r<  r^  rÑ  r¶  Zgenerate_for_loop_headerrH   r²   rÞ  rß  Úwrite_trace_liner¨   ré   r×  rü  ra  r$  r°  Úlabel_interceptorrø  r=  rÜ  )r~   rM   r>  Z
else_labelrÉ  Úlabel_interceptsr!  r0   r0   r1   ré   0  sB   



ü



z&_ForInStatNode.generate_execution_codec                 C   sJ   | j  ||¡ | j ||¡ | j ||¡ | jd ur#| j ||¡ d S d S rw   )rÞ  rç   r^  r¨   r$  r	  r0   r0   r1   rç   Z  s   
ÿz,_ForInStatNode.generate_function_definitionsc                 C   sF   | j  |¡ | j |¡ | j |¡ | jr| j |¡ | j |¡ d S rw   )rÞ  r©   r^  r¨   r$  r²   r¥   r0   r0   r1   r©   a  s   z_ForInStatNode.annotate)r+   r,   r-   r™   r²   r_  rf  r    ri   ré   rç   r©   r0   r0   r0   r1   rd    s    
*rd  c                   @   ó   e Zd ZdZdd„ ZdS )ra  Fc                 C   s   ddl m} || jƒ| _d S )Nr   )ÚNextNode)rU  rl  r^  r²   )r~   rl  r0   r0   r1   rf  o  r×  zForInStatNode._create_item_nodeN)r+   r,   r-   r_  rf  r0   r0   r0   r1   ra  j  s    ra  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )r`  Tc                 K   sH   d|vsJ ‚ddl m} |j|d jd d|d< tj| |fi |¤Ž d S )Nr²   r   r<  r^  )r¥  )rÃ   rU  ZAwaitIterNextExprNoder4   rd  rˆ   )r~   r4   r‡   rU  r0   r0   r1   rˆ   |  s   zAsyncForStatNode.__init__c                 C   s    ddl m} | | j¡| j_d S rÒ  )rÃ   rU  ZAsyncNextNoder^  r²   r¥  rX  r0   r0   r1   rf  ƒ  s   z"AsyncForStatNode._create_item_nodeN)r+   r,   r-   r_  rˆ   rf  r0   r0   r0   r1   r`  t  s    r`  c                   @   sn   e Zd Zg d¢ZdZdZdZdZdZdd„ Z	dd„ Z
d	d
„ Zdd„ Zdd„ ZdddddœZdd„ Zdd„ ZdS )rb  )rÞ  Úbound1Úbound2Ústepr¨   r$  FNz&For-loop using object bounds or targetc                 C   s*   | j | j| jfD ]
}|jjr|  ¡  qd S rw   )rÞ  rm  rn  r2  rA  r   )r~   rŒ   r—   r0   r0   r1   rÜ   £  s
   €þzForFromStatNode.nogil_checkc                 C   s2   | j  |¡ | j |¡ | jr| j |¡ d S d S rw   )rÞ  r[  r¨   r    r$  r‹   r0   r0   r1   r    ¨  s
   ÿz$ForFromStatNode.analyse_declarationsc                 C   s¾   ddl m} | j |¡| _| j |¡| _| j |¡| _| jd ur6t| j|j	ƒr/t
| jjddƒ | j |¡| _|  |¡ | jj}|jsL|jsLt| jjdƒ | j |¡| _| jr]| 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Ã   rU  rÞ  rk   rm  rj   rn  ro  rB   ZUnaryMinusNoder   r4   Úset_up_loopr2  rA  rö  r   r¨   ri   r$  )r~   rŒ   rU  r6  r0   r0   r1   ri   ®  s$   

ÿ
z#ForFromStatNode.analyse_expressionsc                 C   st  ddl m} | jj}|jr|}n?|jrt| jjdƒ |jr t	j
nt	j}| jjjs0t	 || jj¡}| jjjs=t	 || jj¡}| jd urO| jjjsOt	 || jj¡}| j ||¡| _| j ||¡| _| jjsj| j |¡| _| jd ur‚| j ||¡| _| jjs‚| j |¡| _|jsˆ|jr¡d| _t| j|jƒr˜t| jdƒ‚| j| _d | _d S d| _| | j||¡}|| _| |¡ |¡| _d S )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Ã   rU  rÞ  r2  rö  Úis_enumr   r4   rA  r	   Úc_long_typer¬  rm  Úwidest_numeric_typern  ro  r•  rÕ   rÀ  Úis_py_targetrB   ZBufferIndexNoder   Úloopvar_nodeÚpy_loopvar_noderM  r^  rì  )r~   rŒ   rU  r6  Z	loop_typeZc_loopvar_noder0   r0   r1   rp  Ã  sB   ÿ



zForFromStatNode.set_up_loopc                 C   s  |  | j¡ | ¡ }| j}| j |¡ | j |¡ | j| j \}}| j	d ur:| j	 |¡ | j	 
¡ }d|d |f }nd}ddlm} t| j|jƒrO| j |¡ t| j|jƒr\| j |¡ | jjjrdtjn| jj}|ru| jsu|j |d¡}	n| j 
¡ }	|jr |js | jd dkr | d|	| j 
¡ |||	| j| j 
¡ ||	|f
 ¡ n| d	|	| j 
¡ ||	| j| j 
¡ |	|f ¡ | j}
|
d u rÈ|rÈ| | jj||	¡}
|
d urØ|
 |¡ | j |
|¡ |  | j¡ | j! "|¡ | #|j$¡ |sx| jrx| jj%j&rM| '| jjd ¡}| |¡ | (| jj%j)¡}| jj%j*j+r |j, -t. /d
d¡¡ d}n|j, -t. /dd¡¡ d 0| jj%j*j1¡}| || 
¡ || 2| 
¡ | jj¡f ¡ | 3|¡ n| j}| 4| jj|| jj%j*¡}|	|_5| 6|¡ | jj%j&rx| 7| 
¡ |j¡ | 8|¡ | d¡ |s’| jr’| j |¡ | j | j|¡ |rŸ| jsŸ|j 9|	¡ |j:}| ;|¡ | j<r»| d¡ | j< "|¡ | d¡ | #|¡ | j =|¡ | j >|¡ | j =|¡ | j >|¡ t| j|jƒræ| j 8|¡ t| j|jƒrô| j 8|¡ | j	d ur| j	 =|¡ | j	 >|¡ d S d S )Nz%s=%sr   Ú1r   r<  Fú>z-for (%s = %s%s + %s; %s %s %s + %s; ) { %s%s;z!for (%s = %s%s; %s %s %s; %s%s) {ZGetModuleGlobalNamer?  z%__Pyx_GetModuleGlobalName(%s, %s); %sZGetNameInClassz$__Pyx_GetNameInClass(%s, {}, %s); %srŒ  r)  )?r  r4   r<  Ú
from_rangerm  rÑ  rn  Úrelation_tableZ	relation1ro  r€   rÃ   rU  rB   ru  rM  rV  rv  rÞ  r2  rq  r	   rr  rt  rZ  r[  rY  rï  Z	relation2rH   r;  rß  rh  r¨   ré   r×  rü  rð   Úis_pyglobalZ
PyTempNoderè  ra   r¨  r.  ræ   r  r   r®  r©  rb  r]  rW  ZCoerceFromPyTypeNodeZ	temp_coderÀ  rè  rX  rc  rø  r=  r$  ra  rÜ  )r~   rM   r>  ry  ÚoffsetZincopro  rU  Zloopvar_typeZloopvar_nameZcoerced_loopvar_nodeZtarget_nodeZinterned_cnameZlookup_funcZfrom_py_noderø  r0   r0   r1   ré   é  sÄ   




ü
ü


ÿ
ÿ
ÿýÿ






þz'ForFromStatNode.generate_execution_code)rÃ   ú++)z+1r}  )rÃ   ú--)z-1r~  )z<=ré  z>=rx  c                 C   sp   | j  ||¡ | j ||¡ | j ||¡ | jd ur!| j ||¡ | j ||¡ | jd ur6| j ||¡ d S d S rw   )rÞ  rç   rm  rn  ro  r¨   r$  r	  r0   r0   r1   rç   c  s   

ÿz-ForFromStatNode.generate_function_definitionsc                 C   s\   | j  |¡ | j |¡ | j |¡ | jr| j |¡ | j |¡ | jr,| j |¡ d S d S rw   )rÞ  r©   rm  rn  ro  r¨   r$  r¥   r0   r0   r1   r©   m  s   ÿzForFromStatNode.annotate)r+   r,   r-   r™   rt  ru  rv  ry  rŠ   rÜ   r    ri   rp  ré   rz  rç   r©   r0   r0   r0   r1   rb  ˆ  s&    &tû
rb  c                   @   s@   e Zd ZdZg d¢ZdZdZdd„ Zdd„ Zdd	„ Z	d
d„ Z
dS )ÚWithStatNodea  
    Represents a Python with statement.

    Implemented by the WithTransform as follows:

        MGR = EXPR
        EXIT = MGR.__exit__
        VALUE = MGR.__enter__()
        EXC = True
        try:
            try:
                TARGET = VALUE  # optional
                BODY
            except:
                EXC = False
                if not EXIT(*EXCINFO):
                    raise
        finally:
            if EXC:
                EXIT(None, None, None)
            MGR = EXIT = VALUE = None
    )ÚmanagerÚ
enter_callrÞ  r¨   Nc                 C   s(   | j  |¡ | j |¡ | j |¡ d S rw   )r€  r    r  r¨   r‹   r0   r0   r1   r    š  s   z!WithStatNode.analyse_declarationsc                 C   sn   | j  |¡| _ | j jjrt | ¡ |¡S | j |¡| _| jr.ddl	m
} || jj| jjƒ| _| j |¡| _| S )Nr   )rM  )r€  rj   r2  Zis_cython_lock_typeÚCythonLockStatNodeÚfrom_withstatri   r  rÞ  rU  rM  r4   Útarget_tempr¨   )r~   rŒ   rM  r0   r0   r1   ri   Ÿ  s   
z WithStatNode.analyse_expressionsc                 C   s.   | j  ||¡ | j ||¡ | j ||¡ d S rw   )r€  rç   r  r¨   r	  r0   r0   r1   rç   «  s   z*WithStatNode.generate_function_definitionsc              
   C   sž  |  | j¡ | d¡ | j |¡ |jjtdd| _|j	 
t dd¡¡ | d| j| j ¡ | t| jr5dndƒ¡| | j| j¡f ¡ | | jt¡ | ¡ }|j}| j |¡ | jr|| j |¡ | j |¡ | d	| j ¡ | j ¡ f ¡ | j |¡ n| j |¡ | j |¡ | j |¡ | j |¡ ||_| j |¡ |  |¡rÁ| !¡ }| "|¡ | #|¡ | $| jt¡ | "|¡ | #|¡ |j %| j¡ | d
¡ d S )Nz/*with:*/ {FrY  ZPyObjectLookupSpecialr?  z-%s = __Pyx_PyObject_LookupSpecial(%s, %s); %sÚ	__aexit__Ú__exit__r×  rŒ  )&r  r4   rH   r€  rÑ  rZ  r[  r
   Zexit_varræ   r  r   r®  rÁ  rè  r   r_  r]  r^  r¾  rÔ  r  rÞ  r„  rV  rØ  r€   rÛ  ra  rÜ  r¨   ré   rÓ  r°  rÕ  r×  rb  rc  )r~   rM   rÇ  Zintermediate_error_labelZstep_over_labelr0   r0   r1   ré   °  sJ   

ÿü




z$WithStatNode.generate_execution_code)r+   r,   r-   rs   r™   r  r„  r    ri   rç   ré   r0   r0   r0   r1   r  x  s    r  c                   @   s<   e Zd ZddgZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dS )ÚWithTargetAssignmentStatNoder§  r÷  Nc                 C   r  rw   rä  r‹   r0   r0   r1   r    ï  r  z1WithTargetAssignmentStatNode.analyse_declarationsc                 C   s4   | j  |¡| _ | j  |¡ | jj | j j|¡| _| S rw   )r÷  rk   r¼  Ú	with_noder„  r•  r2  r§  r‹   r0   r0   r1   ri   ò  s   z0WithTargetAssignmentStatNode.analyse_expressionsc                 C   s.   | j  |¡ | j | j |¡ | jj |¡ d S rw   )r§  rÑ  r÷  rß  rˆ  r„  rX  r¥   r0   r0   r1   ré   ø  s   z4WithTargetAssignmentStatNode.generate_execution_codec                 C   rÕ  rw   rÖ  r¥   r0   r0   r1   r©   ý  r×  z%WithTargetAssignmentStatNode.annotate)
r+   r,   r-   r™   rˆ  r§  r    ri   ré   r©   r0   r0   r0   r1   r‡  á  s    
r‡  c                   @   sJ   e Zd Zg d¢ZdZdd„ Zdd„ ZejZ	dZ
dd	„ Zd
d„ Zdd„ ZdS )ÚTryExceptStatNode)r¨   Úexcept_clausesr$  Fc                 C   ó<   | j  |¡ | jD ]}| |¡ q	| jr| j |¡ d S d S rw   )r¨   r    rŠ  r$  )r~   rŒ   Úexcept_clauser0   r0   r1   r       ó   
ÿz&TryExceptStatNode.analyse_declarationsc                 C   sr   | j  |¡| _ d}t| jƒD ]\}}| |¡ }| j|< |r$t|jdƒ |js)d}q|| _| jr7| j |¡| _| S )Nr   zdefault 'except:' must be lastr   )	r¨   ri   r†  rŠ  r   r4   ÚpatternÚhas_default_clauser$  )r~   rŒ   Zdefault_clause_seenrŸ  rŒ  r0   r0   r1   ri      s   €z%TryExceptStatNode.analyse_expressionszTry-except statementc                    s~  ˆ   | j¡ ˆ  d¡ ˆ j}ˆ j}ˆ j}ˆ  ¡ }ˆ j}ˆ  d¡}ˆ  d¡}ˆ  d¡}	ˆ  d¡}
|r6ˆ  d¡nd }|r?ˆ  d¡nd }ˆ  d¡}‡ fd	d
„t	dƒD ƒ‰ˆ  
¡ }ˆ  d¡ |
ˆ _|ˆ _|ˆ _| j ˆ ¡ ˆ j | jdd ˆ  d¡ ˆ j ¡ }ˆ  |¡}|r·ˆ j t¡ | js•| d¡ | d¡ | dd dd
„ ˆD ƒ¡ ¡ ˆD ]}| |t¡ q¦‡ ‡fdd„}ndd
„ ˆD ƒ}| dd |¡ ¡ dd„ }|ˆ _|	ˆ _| jj}| jröˆ   | jj¡ ˆ  d¡ | j ˆ ¡ ˆ  d¡ |sö| jj}|rJ|sˆD ]}ˆ  |t¡ qþˆ  |¡ ˆ  |¡ |D ]\}}ˆ  ||¡ qˆ  ¡ r(ˆ  ¡  ˆ jj}| ˆ j_| jD ]	}|  ˆ |¡ q3|ˆ j_| j!sJˆ  |¡ ˆ j"||||
|	g|||||g|scˆ  |¡sc|nd | jdd}|D ]	}|rt|ƒ  qlˆ  |¡r•|sŠˆ  |¡sŠˆ  |¡ ˆ  |¡ |r•|ƒ  ˆ  |¡r ˆ  |¡ ˆ  d¡ ˆD ]	}ˆ j #|¡ q§|ˆ _|ˆ _|ˆ _|ˆ _d S )Nrå  Zexception_handledZexcept_errorZexcept_returnZ
try_returnZ	try_breakZtry_continueZtry_endc                    s   g | ]	}ˆ j  td ¡‘qS rë  ©rZ  r[  r
   ©r–   r!  r¡  r0   r1   r˜   5   rà  z=TryExceptStatNode.generate_execution_code.<locals>.<listcomp>rÆ   ú
/*try:*/ {Fr  rŒ  r›  rœ  z__Pyx_ExceptionSave(%s);r±   c                 S   ó   g | ]}d | ‘qS )rS  r0   r®  r0   r0   r1   r˜   K   rH  c                     s.   ˆD ]} ˆ   | t¡ qˆ  dd ˆ¡ ¡ d S )Nz__Pyx_ExceptionReset(%s);r±   )ré  r
   rH   r·   r$  ©rM   Zexc_save_varsr0   r1   Úrestore_saved_exceptionO   s
   
ÿzJTryExceptStatNode.generate_execution_code.<locals>.restore_saved_exceptionc                 S   r“  )z	(void)%s;r0   r®  r0   r0   r1   r˜   W   rH  z%s /* mark used */r>   c                   S   rŸ   rw   r0   r0   r0   r0   r1   r•  Z   r¡   z/*else:*/ {)rg  r4   r  )$r  r4   rH   rÖ  rø  rü  r¾  rÔ  r°  r_  rD   r¨   ré   rZ  Úall_free_managed_tempsrÓ  ræ   r  Úreset_exception_utility_coder  r·   Úput_xgotrefr
   rÖ   r$  r4  rÕ  r×  r­  rÜ  Zcurrent_exceptrŠ  Úgenerate_handling_coder  ri  rc  )r~   rM   Úold_return_labelZold_break_labelZold_continue_labelrÇ  rÈ  Zexcept_end_labelZexcept_error_labelZexcept_return_labelZtry_return_labelZtry_break_labelZtry_continue_labelZtry_end_labelZsave_excÚtemps_to_clean_upZ	can_raiser¢  r•  Zmark_vars_usedZnormal_case_terminatesÚ	temp_nameÚ	temp_typeZouter_exceptrŒ  rj  r!  r‰  r0   r”  r1   ré   $   sÌ   






ÿÿÿ



ÿÿÿ




û€




z)TryExceptStatNode.generate_execution_codec                 C   r7  rw   )r¨   rç   rŠ  r$  )r~   rŒ   rM   rŒ  r0   r0   r1   rç   ž   r8  z/TryExceptStatNode.generate_function_definitionsc                 C   r‹  rw   )r¨   r©   rŠ  r$  )r~   rM   Zexcept_noder0   r0   r1   r©   ¥   r  zTryExceptStatNode.annotateN)r+   r,   r-   r™   r  r    ri   r…   r   rÜ   rŠ   ré   rç   r©   r0   r0   r0   r1   r‰     s    zr‰  c                   @   sX   e Zd Zg d¢ZdZdZdZdd„ Zdd„ Zdd	„ Z	d
d„ Z
dd„ Zdd„ Zdd„ ZdS )ÚExceptClauseNode)rŽ  rÞ  r¨   r  NFc                 C   sB   | j r| j  |¡ ddlm} || j|  |¡ƒ| _| j |¡ d S )Nr   )ÚExcValueNode)	rÞ  r[  rU  rŸ  r4   Úinfer_exception_typer  r¨   r    )r~   rŒ   rŸ  r0   r0   r1   r    Ä   s
   z%ExceptClauseNode.analyse_declarationsc                 C   sf   |j | _| jrt| jƒD ]\}}| |¡}| |¡| j|< q| jr*| j || j¡| _| j	 |¡| _	| S rw   )
râ  rä  rŽ  r†  ri   rì  rÞ  r`  r  r¨   )r~   rŒ   rŸ  rŽ  r0   r0   r1   ri   Ë   s   
z$ExceptClauseNode.analyse_expressionsc                 C   sR   | j r$t| j ƒdkr$| j d }|jr$| |j¡}|r$|jr$|jjr$|jS t	j
d S )Nr   r   ÚBaseException)rŽ  rA   rÓ   rñ  ra   rò  r¨  Zis_builtin_scoper2  r   r  )r~   rŒ   rŽ  rð   r0   r0   r1   r   Ù   s   

z%ExceptClauseNode.infer_exception_typec                 C   s   ddl m} |ƒ }|| jƒ S )Nr   )ÚHasNoExceptionHandlingVisitor)ÚParseTreeTransformsr¢  r¨   )r~   r¢  Ztree_has_no_exceptionsr0   r0   r1   Úbody_may_need_exceptionã   s   z(ExceptClauseNode.body_may_need_exceptionc                    sR  ˆ   | j¡ | jr	tdd„ | jD ƒƒ }|r:‡ fdd„tdƒD ƒ}ˆ j t dd¡¡ ˆ  	dt
|ƒ ¡ |d	 ‰nd  }‰| jD ]}| ˆ ¡ qAd
d„ | jD ƒ}g }ˆrˆ j t dd¡¡ t|ƒdkrt| dˆ|d	 |d f ¡ n?| ‡fdd„|D ƒ¡ n2t|ƒdkrŸˆ j t dd¡¡ | d|d	 |d f ¡ nˆ j t dd¡¡ | dd„ |D ƒ¡ ˆ jjtjdd}ˆ  	d|d |¡f ¡ | jD ]}| ˆ ¡ | ˆ ¡ qË|rûˆ  	dt
|ƒ ¡ ˆ  	d dd„ |D ƒ¡¡ |D ]}	ˆ j |	¡ qòˆ  	d| ¡ ˆ j |¡ nˆ  	d¡ ˆ  ¡ }
| jd up!| jd up!|  ¡ }|s(|
r.ˆ  | j¡ |
r7ˆ  | j¡ |rkˆ j t¡ ‡ fdd„tdƒD ƒ}dt
|ƒ }ˆ  	d|ˆ  | j¡f ¡ |D ]	}ˆ   |t!¡ q`nˆ j t dd¡¡ ˆ  	d ¡ |
r‚ˆ  	d!¡ | jrœ| j" #|d ¡ | j" ˆ ¡ | j $| j"ˆ ¡ | jd ur´t%|| jj&ƒD ]
\}}| #|¡ q©ˆ  'd"¡}|rÄˆ jj(}|ˆ j_(| j) *ˆ ¡ |rÑ|ˆ j_(| j)j+sê|rå|D ]	}ˆ  ,|t!¡ qÛˆ  -|¡ |rˆ  .ˆ  /¡ |¡D ]}ˆ  0|d	 t!¡ ˆ  0|d t!¡ ˆ  ,|d t!¡ qõ|D ]	}	ˆ j |	¡ qˆ  1|¡ ˆ  	d#¡ d S )$Nc                 s   s(    | ]}|j p| ¡ o| ¡  V  qd S rw   )rÕ   Ú	is_simpler¤  ©r–   rŽ  r0   r0   r1   r  ì   s
   € ÿ
ÿz:ExceptClauseNode.generate_handling_code.<locals>.<genexpr>c                    ó   g | ]
}ˆ j jtd d‘qS ©TrY  r  r‘  r¡  r0   r1   r˜   ò   ó    ÿz;ExceptClauseNode.generate_handling_code.<locals>.<listcomp>rÆ   ÚPyErrFetchRestorer  z__Pyx_ErrFetch(&%s, &%s, &%s);r   c                 S   s   g | ]}|  ¡ ‘qS r0   )rÁ  r¦  r0   r0   r1   r˜   ü   rH  ZFastTypeChecksúModuleSetupCode.cr%   z.__Pyx_PyErr_GivenExceptionMatches2(%s, %s, %s)r   c                 3   s    | ]	}d ˆ |f V  qdS )z)__Pyx_PyErr_GivenExceptionMatches(%s, %s)Nr0   r¦  )r  r0   r1   r  !  s
   € 
ÿ
ÿz%__Pyx_PyErr_ExceptionMatches2(%s, %s)ZPyErrExceptionMatchesc                 s   s    | ]}d | V  qdS )z __Pyx_PyErr_ExceptionMatches(%s)Nr0   r¦  r0   r0   r1   r  !  s
   € ÿ
ÿFrY  r×  z || ú__Pyx_ErrRestore(%s, %s, %s);r>   c                 S   r“  ©ú%s = 0;r0   r®  r0   r0   r1   r˜   !!  rH  r¤  z/*except:*/ {c                    r§  r¨  r  r‘  r¡  r0   r1   r˜   >!  r©  z&%s, &%s, &%sz"if (__Pyx_GetException(%s) < 0) %sz__Pyx_ErrRestore(0,0,0);z__Pyx_TraceExceptionDone();Zexcept_rŒ  )2r  r4   rŽ  r  r_  ræ   r  r   r®  rH   rû  rÑ  rA   ri  ÚextendrZ  r[  r	   r¬  r·   ra  rÜ  rc  r­  rÞ  Úexcinfo_targetr¤  rá  rä  Úput_trace_exception_handledÚget_exception_utility_codera  r˜  r
   r  Zset_varrß  r'  rJ   r<  r  r¨   ré   rÖ   r4  rÕ  ri  Zget_loop_labelsrb  r=  )r~   rM   rÉ  Zhas_non_literalsr  rŽ  ÚpatternsZ	exc_testsZ
match_flagrd  ró  Zneeds_exceptionZexc_argsr¢  ZtempvarrL   r>  Úold_exc_varsr!  r0   )rM   r  r1   r™  è   sä   
þ
ÿ


ÿ
ÿ
þ
ÿ
ÿ
ÿ
þ

ÿÿ
ÿý
ÿÿÿ





ÿz'ExceptClauseNode.generate_handling_codec                 C   s*   | j d ur| j  ||¡ | j ||¡ d S rw   )rÞ  rç   r¨   r	  r0   r0   r1   rç   w!  r1  z.ExceptClauseNode.generate_function_definitionsc                 C   s>   | j r| j D ]}| |¡ q| jr| j |¡ | j |¡ d S rw   )rŽ  r©   rÞ  r¨   )r~   rM   rŽ  r0   r0   r1   r©   |!  s   
zExceptClauseNode.annotate)r+   r,   r-   r™   r  r°  Zis_except_asr    ri   r   r¤  r™  rç   r©   r0   r0   r0   r1   rž  ­   s    
 rž  c                   @   sˆ   e Zd Zg d¢ZdZdZdZdZdZdZ	e
dd„ ƒZdd	„ Zd
d„ ZejZdZdd„ Zdd„ Z	ddd„Zddd„Zdd„ Zdd„ ZdS )ÚTryFinallyStatNode)r¨   Úfinally_clauseÚfinally_except_clauser   TNFc                 C   s   t | ||d}|S )N©r¨   r¶  )rµ  )r4   rŒ   r¨   r¶  rL   r0   r0   r1   rö   Ÿ!  r  z"TryFinallyStatNode.create_analysedc                 C   s6   | j  |¡ t | j¡| _| j |¡ | j |¡ d S rw   )r¨   r    r   r|   r¶  r·  r‹   r0   r0   r1   r    ¤!  s   z'TryFinallyStatNode.analyse_declarationsc                 C   sD   | j  |¡| _ | j |¡| _| j |¡| _|jr |jjs |j| _| S rw   )r¨   ri   r¶  r·  r“  r-  Úfunc_return_typer‹   r0   r0   r1   ri   ª!  s   z&TryFinallyStatNode.analyse_expressionszTry-finally statementc                    s  ˆ   ˆj¡ ˆ  d¡ ˆ j}ˆ  ¡ }ˆ  ¡ }ˆ j}ˆjs|ˆ _ˆ  ¡ }ˆj 	ˆ ¡ ˆ  d¡ ˆ j
 ¡ }ˆ   ˆjj¡ ˆ  d¡ ˆ  |¡ ˆjgf‡fdd„	}ˆjoUˆ  |¡}	ˆjj }
ˆjjsxˆ  d¡ |ƒ  	ˆ ¡ ˆjjssˆ  |¡ ˆ  d¡ |	rWˆ  |¡ ˆ  d¡ ˆjsˆ  d¡ ˆjr”ˆ  ¡  |
r³t‡ fd	d
„tdƒD ƒƒ}ˆ j
jt t tj¡¡dd}nd  }}t‡ fdd
„tdƒD ƒƒ}ˆ  ¡ rÒˆ  ¡  ˆ  ˆj¡ ˆ  ˆ ||||¡ ˆ  ¡ }ˆ  d¡ ˆ j
j!}|d d… ˆ j
_!ˆj" 	ˆ ¡ |ˆ j
_!ˆ  d¡ |
r4ˆ #ˆ |||¡ |r|D ]	}ˆ j
 $|¡ q|r"ˆ j
 $|¡ ˆ  ¡ r/ˆ j%ˆjdd ˆ  |¡ ˆ  &ˆ  ¡ |¡D ]	}ˆ 'ˆ |¡ q<|D ]	}ˆ j
 $|¡ qHˆ  d¡ ˆ  |¡ ˆ j(}d}t)t*||ƒƒD ]”\}\}}ˆ  |¡svqh||kr€|	r€qhˆ  d| ¡ d }||krÂˆjjsÂˆj+rÂˆjsÂt,ˆjt-ƒsÂˆ j
jˆj+dd}ˆ  d|t.j/f ¡ ˆj+j0rÂˆ  dt.j/ ¡ |ƒ  	ˆ ¡ ||krì|rìˆ  dt.j/|f ¡ ˆj+j0ræˆ  d| ¡ ˆ j
 $|¡ ˆjjsöˆ  |¡ ˆ  d¡ qhˆ  |¡ ˆ  d¡ d S )Nr’  rŒ  z/*finally:*/ {c                    s0   | d }t  |¡}|ˆ ju r|| d< |S |}|S rq  )r   r|   r¶  )Ú_nextrL   Z	node_copyr”   r0   r1   Úfresh_finally_clauseÌ!  s   

ÿzHTryFinallyStatNode.generate_execution_code.<locals>.fresh_finally_clausez/*normal exit:*/{z/*exception exit:*/{r›  c                    s   g | ]}ˆ j jtjd d‘qS ©FrY  )rZ  r[  r	   r¬  r‘  r¡  r0   r1   r˜   è!  s    ÿÿz>TryFinallyStatNode.generate_execution_code.<locals>.<listcomp>r%   FrY  c                    r§  r¼  r  r‘  r¡  r0   r1   r˜   ð!  s    ÿÿé   rå  rÆ   Tr  r0   z%s: {r×  r®  )1r  r4   rH   rÔ  Zall_new_labelsÚget_all_labelsÚhandle_error_caser°  r¨   ré   rZ  r–  r¶  Úset_all_labelsÚpreserve_exceptionrÓ  rÖ   rÕ  r×  r  Úis_try_finally_in_nogilr•  rû  r_  r[  r	   ÚCPtrTyper³  r”  r­  rÜ  r±  Úput_error_catcherr  r·  Úput_error_uncatcherrc  r  ri  Úput_error_cleanerrÖ  r†  r'  r¹  rB   ÚGILExitNoder   r¼  rA  )r~   rM   rÇ  Z
old_labelsZ
new_labelsr¾  Zcatch_labelr›  r»  Zpreserve_errorZneeds_success_cleanupÚexc_lineno_cnamesÚexc_filename_cnamer  Zfinally_old_labelsr´  r‰  r!  rÖ  rŸ  r°  Z	old_labelZret_tempr0   )rM   r~   r1   ré   µ!  sØ   












þþþ
ÿ







ÿ
þÿ





ÿz*TryFinallyStatNode.generate_execution_codec                 C   s8   | j  ||¡ | j ||¡ | jr| j ||¡ d S d S rw   )r¨   rç   r¶  r·  r	  r0   r0   r1   rç   ?"  s
   ÿz0TryFinallyStatNode.generate_function_definitionsc           	   	   C   sü   |j  t¡ |j  t¡ |j  t¡ | jr|jdd | d¡ | d dd„ |D ƒ¡¡ |D ]
\}}| 	||¡ q/| d|dd …  ¡ | d	|d d… d
  ¡ |D ]}| 
|t¡ qT|rs| d|d tj|d tj|tjf ¡ | jr|| ¡  d S d S )NFr”  rœ  r>   c                 S   r“  r­  r0   r®  r0   r0   r1   r˜   O"  rH  z8TryFinallyStatNode.put_error_catcher.<locals>.<listcomp>z$ __Pyx_ExceptionSwap(&%s, &%s, &%s);rÆ   zTif ( unlikely(__Pyx_GetException(&%s, &%s, &%s) < 0)) __Pyx_ErrFetch(&%s, &%s, &%s);r%   ú%s = %s; %s = %s; %s = %s;r   r   )ræ   r  rÚ  r²  Úswap_exception_utility_coderÂ  r–  rH   r·   r4  r˜  r
   r   Úlineno_cnameÚclineno_cnameÚfilename_cnamer¢  )	r~   rM   r›  r  rÈ  rÉ  rœ  r2  r¢  r0   r0   r1   rÄ  E"  s0   
ü

ýÿz$TryFinallyStatNode.put_error_catcherc              	   C   sø   |j  t¡ |j  t¡ | jr|jdd | d¡ |dd … D ]}| |t¡ q | d|dd …  ¡ |d d… D ]}| |t¡ q:| d|d d…  ¡ | jrU| 	¡  | d 
dd	„ |D ƒ¡¡ |rz| d
tj|d tj|d tj|f ¡ d S d S )NFr”  rœ  rÆ   ú!__Pyx_ExceptionReset(%s, %s, %s);r¬  r>   c                 S   r“  r­  r0   r®  r0   r0   r1   r˜   {"  rH  z:TryFinallyStatNode.put_error_uncatcher.<locals>.<listcomp>rÊ  r   r   )ræ   r  rÚ  r—  rÂ  r–  rH   ré  r
   r¢  r·   r   rÌ  rÍ  rÎ  )r~   rM   r  rÈ  rÉ  r¢  r0   r0   r1   rÅ  f"  s*   


ýÿz&TryFinallyStatNode.put_error_uncatcherc                 C   s®   |j  t¡ | jr|jdd | d¡ |dd … D ]}| |t¡ q| d|dd …  ¡ |d d… D ]}| |t¡ q4| jrD| 	¡  | d 
dgd ¡|dd …  ¡ d S )NFr”  rœ  rÆ   rÏ  r>   r®  )ræ   r  r—  rÂ  r–  rH   ré  r
   r4  r¢  r·   )r~   rM   r  r¢  r0   r0   r1   rÆ  ‚"  s   
&z$TryFinallyStatNode.put_error_cleanerc                 C   rÕ  rw   )r¨   r©   r¶  r¥   r0   r0   r1   r©   ”"  r×  zTryFinallyStatNode.annotate)NN)r+   r,   r-   r™   rÁ  r¿  r¹  r·  rÂ  r  r  rö   r    ri   r…   r   rÜ   rŠ   ré   rç   rÄ  rÅ  rÆ  r©   r0   r0   r0   r1   rµ  …!  s,    
 
ÿ
!rµ  c                   @   s   e Zd ZdZdZdZdS )ÚNogilTryFinallyStatNodezJ
    A try/finally statement that may be used in nogil code sections.
    FN)r+   r,   r-   rs   rÁ  rÜ   r0   r0   r0   r1   rÐ  ™"  s    rÐ  c                       sR   e Zd Zdgej ZdZdZddd„Zdd„ Z‡ fdd	„Z	d
d„ Z
dd„ Z‡  ZS )ÚGILStatNoder  NTc              	   C   s<   || _ || _|  |||¡ tj| ||t||| jdd d S )N)ÚstateÚ
state_tempr¸  )rÒ  r  Úcreate_state_temp_if_neededrµ  rˆ   rÇ  rÓ  )r~   r4   rÒ  r¨   r  r0   r0   r1   rˆ   ­"  s   ÿ
ýzGILStatNode.__init__c                 C   sZ   ddl m} |ƒ }| |¡ |jsd S |dkrtj}ntj}ddlm} | 	||¡| _
d S )Nr   ©ÚYieldNodeCollectorÚgilr<  )r£  rÖ  ÚvisitchildrenÚyieldsr	   Zc_gilstate_typeZc_threadstate_ptr_typerÃ   rU  rM  rÓ  )r~   r4   rÒ  r¨   rÖ  Ú	collectorr  rU  r0   r0   r1   rÔ  ·"  s   
z'GILStatNode.create_state_temp_if_neededc                    s>   | j dk|_| j dkrd|_| jd ur| j |¡ tƒ  |¡S )Nr×  T)rÒ  Z_in_with_gil_blockZhas_with_gil_blockr  r    r^   r‹   rf   r0   r1   r    Å"  s   

z GILStatNode.analyse_declarationsc                 C   sR   |  t dd¡¡ | jd ur| j |¡| _|j}| jdk|_t | |¡}||_|S )NZForceInitThreadsr«  r{  )r  r   r®  r  ri   r{  rÒ  rµ  )r~   rŒ   Ú	was_nogilrL   r0   r0   r1   ri   Ï"  s   
ÿ
zGILStatNode.analyse_expressionsc                 C   s´   |  | j¡ | ¡  | jr| jsJ ‚| j |¡ | j ¡ }nd }|jj}| j	dkr4|j
|d d|j_n|j|| j d d|j_t | |¡ | jrP| j |¡ ||j_| ¡  d S )Nr×  )ÚvariableT)rÜ  Úunknown_gil_stateF)r  r4   Úbegin_blockrÓ  Úscope_gil_state_knownrV  r€   rZ  r—  rÒ  r–  Zput_release_gilrµ  ré   rX  Ú	end_block)r~   rM   rÜ  Zold_gil_configr0   r0   r1   ré   Ü"  s$   


z#GILStatNode.generate_execution_coderw   )r+   r,   r-   rÐ  r™   rÓ  rß  rˆ   rÔ  r    ri   ré   rg   r0   r0   rf   r1   rÑ  ¢"  s    


rÑ  c                   @   s,   e Zd ZdZg ZdZdZdd„ Zdd„ ZdS )rÇ  a  
    Used as the 'finally' block in a GILStatNode

    state   string   'gil' or 'nogil'
    #   scope_gil_state_known  bool  For nogil functions this can be False, since they can also be run with gil
    #                           set to False by GilCheck transform
    NTc                 C   r<  rw   r0   r‹   r0   r0   r1   ri   #  r¡   zGILExitNode.analyse_expressionsc                 C   sD   | j r	| j  ¡ }nd }| jdkr| |¡ d S |j|| j d d S )Nr×  )rÝ  )rÓ  r€   rÒ  r¢  Zput_acquire_gilrß  )r~   rM   rÜ  r0   r0   r1   ré   
#  s   
z#GILExitNode.generate_execution_code)	r+   r,   r-   rs   r™   rÓ  rß  ri   ré   r0   r0   r0   r1   rÇ  ú"  s    rÇ  c                   @   rk  )ÚEnsureGILNodezI
    Ensure the GIL in nogil functions for cleanup before returning.
    c                 C   s   |j dd d S )NFr”  )r–  r¥   r0   r0   r1   ré   #  r  z%EnsureGILNode.generate_execution_codeN)r+   r,   r-   rs   ré   r0   r0   r0   r1   rá  #  s    rá  c                       sh   e Zd ZdZdgej ZdZdZdZ‡ fdd„Z	dd„ Z
‡ fd	d
„Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚCriticalSectionStatNodezÅ
    Represents a freethreading Python critical section.
    In non-freethreading Python, this is a no-op.

    args    list of ExprNode    1 or 2 elements, must be object, pymutex or pymutex*
    rJ   NFc                   sf   t |ƒdkrtj| _ntj| _t |ƒdkrtt |ƒƒnd| _tƒ j|f||t	|| jddœ|¤Ž d S )Nr   rÃ   )Ú
length_tag)rJ   r¨   r¶  )
rA   r	   Zc_py_critical_section2_typeÚvar_typeZc_py_critical_section_typer‘  rã  r^   rˆ   ÚCriticalSectionExitNode)r~   r4   rJ   r¨   rK   rf   r0   r1   rˆ   -#  s   
ÿÿü
úz CriticalSectionStatNode.__init__c                 C   s8   ddl m} |ƒ }| | j¡ |jrt| jdƒ d S d S )Nr   rÕ  z0Cannot yield while in a cython.critical_section.)r£  rÖ  rØ  r¨   rÙ  r   r4   )r~   rÖ  rÚ  r0   r0   r1   Úcheck_for_yields>#  s   ÿz(CriticalSectionStatNode.check_for_yieldsc                    s"   | j D ]}| |¡ qtƒ  |¡S rw   )rJ   r    r^   rl  rf   r0   r1   r    E#  s   
z,CriticalSectionStatNode.analyse_declarationsc                    s¸   |   ¡  t ¡ }d}t| jƒD ]5\}}| |¡}|j|ks'|jjr/|jj|kr/|d7 }d| _	n|jj
r9| |¡}nt|jdƒ || j|< q|dkrV|t| jƒkrVt| jdƒ tƒ  |¡S )Nr   r   TzRArguments to cython.critical_section must be Python objects, pymutex, or pymutex*.zHArguments to cython.critical_section must not mix objects and pymutexes.)ræ  r	   Zget_cy_pymutex_typer†  rJ   ri   r2  r*  r3  Úis_pymutex_critical_sectionrA  rÀ  r   r4   rA   r^   )r~   rŒ   Zcy_pymutex_typeZmutex_countrŸ  r¥  rf   r0   r1   ri   J#  s0   

ÿþþz+CriticalSectionStatNode.analyse_expressionsc                 C   s  | j r|j t dd¡¡ d}n|j t dd¡¡ d}| | j¡ | ¡  tj	}| 
| j |¡› d¡ | jD ]}| |¡ q8| j rLdd„ | jD ƒ}nd	d„ | jD ƒ}| 
d
| j› d|› d|› dd |¡› d	¡ t | |¡ | jD ]}| |¡ | |¡ qs| ¡  d S )NZCriticalSectionsMutexúSynchronization.cZMutexZCriticalSectionsrÃ   r…  c                 S   s(   g | ]}|j jr
d nd› | ¡ › ‘qS )rÃ   rç  )r2  r*  r€   r>  r0   r0   r1   r˜   }#  s   ( zCCriticalSectionStatNode.generate_execution_code.<locals>.<listcomp>c                 S   s   g | ]	}d |  ¡ › ‘qS )r  )r€   r>  r0   r0   r1   r˜   #  rL  Ú__Pyx_PyCriticalSectionZ_Beginz(&r±   rÖ  )rç  ræ   r  r   r®  r  r4   rÞ  r   Úcritical_section_variablerH   rä  r.  rJ   rÑ  rã  r·   rµ  ré   ra  rÜ  rà  )r~   rM   ÚmutexrÜ  r¥  rJ   r0   r0   r1   ré   k#  s4   
ÿ
ÿ
$ÿ

z/CriticalSectionStatNode.generate_execution_codec                 C   s   t | jdƒ d S )Nz!Critical sections require the GIL)r   r4   r‹   r0   r0   r1   rÜ   Œ#  r  z#CriticalSectionStatNode.nogil_check)r+   r,   r-   rs   rµ  r™   rä  rÁ  rç  rˆ   ræ  r    ri   ré   rÜ   rg   r0   r0   rf   r1   râ  #  s    !!râ  c                   @   ó*   e Zd ZdZg ZdgZdd„ Zdd„ ZdS )rå  zG
    critical_section - the CriticalSectionStatNode that owns this
    Zcritical_sectionc                 C   r<  rw   r0   r‹   r0   r0   r1   ri   —#  r¡   z+CriticalSectionExitNode.analyse_expressionsc                 C   s    |  d| j› dtj› d¡ d S )Nré  z_End(&rÖ  )rH   rã  r   rê  r¥   r0   r0   r1   ré   š#  s   ÿz/CriticalSectionExitNode.generate_execution_codeN©r+   r,   r-   rs   r™   ry   ri   ré   r0   r0   r0   r1   rå  #  ó    rå  c                       sX   e Zd ZdZdgej ZdZdZdZe	dd„ ƒZ
‡ fdd„Z‡ fd	d
„Zdd„ Z‡  ZS )r‚  z‡
    Represents
        with l:
            ...
    where l in a cython.pymutex or cython.pythread_type_lock.

    arg    ExprNode
    r¥  NFc                 C   sx   ddl m} t|jtƒsJ ‚t|jjtƒsJ ‚| |j|j|jjjt|jƒ| 	|jt
 |jj¡¡d}||j_|j|_|S )Nr   r<  )r¥  r¨   r¶  Ú	lock_temp)rÃ   rU  rB   r¨   rµ  r‰  r4   r€  ÚCythonLockExitNoderM  r	   rÃ  r2  r¶  Úlock_stat_noder·  )r`   rL   rU  r€   r0   r0   r1   rƒ  °#  s   ÿù	z CythonLockStatNode.from_withstatc                    s   | j  |¡ tƒ  |¡S rw   )r¥  r    r^   r‹   rf   r0   r1   r    Ã#  ó   z'CythonLockStatNode.analyse_declarationsc                    sB   | j  |¡| _ | j}t|tƒrt|jƒdkr|jd }tƒ  |¡S r  )r¥  ri   r¨   rB   rô   rA   rõ   r^   )r~   rŒ   r¨   rf   r0   r1   ri   Ç#  s
   
z&CythonLockStatNode.analyse_expressionsc              	   C   sî   |j  | jj ¡ ¡ | | j¡ | ¡  | j 	|¡ | j 
¡ }| j |¡ | |› d| j 
¡ › d¡ | jtjkr<d}n| jtjkrEd}nd}| d| jjj› d|› d|› d	¡ t | |¡ | j |¡ | j |¡ | j |¡ | ¡  d S )
Nz = &r…  ZNogilrÃ   ZGilÚ__Pyx_Locks_Z_Lockz(*rÖ  )ræ   r  r¥  r2  Zget_usage_utility_coder  r4   rÞ  rï  rV  r€   rÑ  rH   rÝ   r*   r.   r/   Ú
cname_partrµ  ré   ra  rÜ  rX  rà  )r~   rM   rœ  Zgil_strr0   r0   r1   ré   Î#  s$   
$z*CythonLockStatNode.generate_execution_code)r+   r,   r-   rs   rµ  r™   rï  rÁ  rÜ   rì   rƒ  r    ri   ré   rg   r0   r0   rf   r1   r‚  Ÿ#  s    	
r‚  c                   @   rì  )rð  zI
    lock_stat_node   CythonLockStatNode   the associated with block
    rñ  c                 C   r<  rw   r0   r‹   r0   r0   r1   ri   ò#  r¡   z&CythonLockExitNode.analyse_expressionsc                 C   s0   | j jjj}| d|› d| j j ¡ › d¡ d S )Nró  z	_Unlock(*rÖ  )rñ  r¥  r2  rô  rH   rï  r€   )r~   rM   rô  r0   r0   r1   ré   õ#  s   $z*CythonLockExitNode.generate_execution_codeNrí  r0   r0   r0   r1   rð  ë#  rî  rð  c                 C   s   ddl m} | | j¡S rþ  )rÃ   r   r  r  )r  r   r0   r0   r1   Úcython_view_utility_codeú#  rò  rõ  c                 C   ó   t  dd¡S ©NZArrayAPIzarrayarray.h©r   r®  ©r  r0   r0   r1   rz  $  ó    rs  c                 C   rö  r÷  rø  rù  r0   r0   r1   rz  $  rú  )zcpython.arrayzcpython.array.arrayzcython.viewc                 C   sŒ   |j jjjD ]=}|j| jkrq| d¡}| d¡}|r|jp"|o"|j}|s'|rC|sC|rC|jj	rCt
| jddƒ |j  t dd¡¡  d S qd S )NÚimport_arrayÚ_import_arrayzx'numpy.import_array()' has been added automatically since 'numpy' was cimported but 'numpy.import_array' was not called.r   ZNumpyImportArrayzNumpyImportArray.c)ræ   Zmodule_noder¨  r  ra   r  r	  r°  r2  rS  r   r4   r  r   r®  )rL   rM   Úmodrû  rü  r°  r0   r0   r1   Úcimport_numpy_check$  s&   

ÿÿ
ÿ€írþ  c                   @   s,   e Zd Zg ZdZdd„ Zdd„ Zdd„ ZdS )	ÚCImportStatNodeFc           	      C   s   |j st| jdƒ d S |j| j| j| jrdndd}d| jv ridd„ | j d¡D ƒ}|d }|j |¡}|}|dd … D ]}| |¡}| 	||| j¡ |}q<| j
r[| 	| j
|| j¡ n | |¡ | 	||| j¡ n| j
pn| j}| 	||| j¡}| j|_| jtv rŽ| t| j |jjƒ¡ d S d S )	Nú$cimport only allowed at module levelr   rÇ   ©Úrelative_levelrh  c                 S   s   g | ]}t |ƒ‘qS r0   r   )r–   ra   r0   r0   r1   r˜   1$  rH  z8CImportStatNode.analyse_declarations.<locals>.<listcomp>r   )r.  r   r4   Úfind_moduler  Úis_absolutern  r  Zfind_submoduleÚdeclare_moduleÚas_namer€  ró  Úutility_code_for_cimportsr  r  )	r~   rŒ   r   r™  Ztop_nameZtop_module_scopera   Úsubmodule_scoperð   r0   r0   r1   r    *$  s2   ÿ



ÿz$CImportStatNode.analyse_declarationsc                 C   r<  rw   r0   r‹   r0   r0   r1   ri   E$  r¡   z#CImportStatNode.analyse_expressionsc                 C   ó   | j dkrt| |ƒ d S d S ©NÚnumpy©r  rþ  r¥   r0   r0   r1   ré   H$  ró   z'CImportStatNode.generate_execution_codeN)r+   r,   r-   r™   r  r    ri   ré   r0   r0   r0   r1   rÿ   $  s    rÿ  c                   @   s<   e Zd Zg ZdZdZdZdd„ Zdd„ Zdd„ Z	dd	„ Z
dS )
ÚFromCImportStatNodeNc                 C   sà  |j st| jdƒ d S |j d¡d }| jr3| j|kr#t| jdƒ d S | j|kr3|js3t| jdƒ d S |j| j| j| jd}|sBd S |j}| 	|¡ | j
D ]g\}}}|dkrjt|j ¡ ƒD ]\}}	| ||	|¡ q]qM| |¡}	|	rud|	_n2| jd uo~| jdk}
|jj||| jd	|
d
}|sŽqM|j|u rž| |p˜||| j¡ n	t|d||f ƒ |	r´|p¬|}| ||	|¡ qM| d¡s¿| d¡rì|tv rÎ| t| |jjƒ¡ | j
D ]\}}}d||f }|tv rë| t| |jjƒ¡ qÑd S d S )Nr   rh  r   z3relative cimport beyond main package is not allowedz:relative cimport from non-package directory is not allowedr  rx  r   F)Zfrom_moduler4   Zabsolute_fallbackZrelative_importz%Name '%s' not declared in module '%s'ÚcpythonÚcythonú%s.%s)r.  r   r4   râ  Úcountr  Ú
is_packager  r  r€  Úimported_namesr›   rï   r]   r‚  rñ  r°  r  Úparent_moduler  Ú
startswithr  r  r  )r~   rŒ   Zqualified_name_componentsr   r  r4   ra   r  Z
local_namerð   Zis_relative_importr  r!  Zfqnamer0   r0   r1   r    Y$  s^   

ÿ
ÿ
€€úz(FromCImportStatNode.analyse_declarationsc                 C   sB   |j sdS |j}|dkr|jsdS dS |jsdS ||jkrdS dS )Nr   Úclassr   )rò  r2  r‚  Zis_struct_or_unionr§  )r~   rð   r§  r2  r0   r0   r1   Údeclaration_matches‹$  s   ü
z'FromCImportStatNode.declaration_matchesc                 C   r<  rw   r0   r‹   r0   r0   r1   ri   ™$  r¡   z'FromCImportStatNode.analyse_expressionsc                 C   r	  r
  r  r¥   r0   r0   r1   ré   œ$  ró   z+FromCImportStatNode.generate_execution_code)r+   r,   r-   r™   r  r  r  r    r  ri   ré   r0   r0   r0   r1   r  M$  s    2r  c                   @   s.   e Zd ZdgZdZdd„ Zdd„ Zdd„ Zd	S )
ÚFromImportStatNoder~  r   c                 C   s‚   | j D ];\}}|dkr|jst| jdƒ  d S d|_d| _q| |¡ |jr:| ¡ d u r9t	d| j
jj|f ƒ|j_qd|j_qd S )Nrx  z%import * only allowed at module levelr   r  rÃ   )r]   r.  r   r4   Zhas_import_starÚimport_starr[  rð   r³  r   r~  r  r   ró  )r~   rŒ   ra   rÞ  r0   r0   r1   r    ­$  s    
ÿ€
ñz'FromImportStatNode.analyse_declarationsc           	   	   C   sH  ddl m} | j |¡| _| | jt¡| _g | _| j	D ]†\}}|dkr@|j
 	¡ D ]\}}|js>|jjr>| t dd¡¡  nq(q| |j¡}|jr‚|jj|kr‚t|jdƒr‚|jj| jjjkr_qz|j| jjj| j| jjd}|jj|jkrwW qW n	 ty   Y nw | |d ¡}|jtu rd }n| j |j|¡}| j |||f¡ q| S )Nr   r<  rx  ZExtTypeTestr?  r  )r4   r  )rÃ   rU  r~  ri   r;  r4   r
   r²   Úinterned_itemsr]   rï   rò  r2  r‚  r  r   r®  rñ  ra   r&  r  r   r  r´   râ  rª   r`  r•  ri  )	r~   rŒ   rU  ra   rÞ  r!  rð   r~  Úcoerced_itemr0   r0   r1   ri   À$  sB   €
ÿÿÿÿ
z&FromImportStatNode.analyse_expressionsc                    s  ˆ   | j¡ | j ˆ ¡ | jr!ˆ  dtj| j ¡ ˆ  | j¡f ¡ | j	rzˆ  d¡ ˆ j
 t dd¡¡ ˆ jjtjdd}ˆ jjtdd}| j |¡ ‡ fdd	„| j	D ƒ}ˆ  d
d |¡› d¡ g }g }g }t| j	ƒD ]7\}\}	}
}|d ur| ||	|
|f¡ ql|
jr›|
j|	kr›|
jr›|
jjr›|
jjjr›| |¡ ql| ||	|
f¡ qlt|p¨|ƒ}t|ƒdkrÅˆ  d|› d|› dt|ƒ› d|› d	¡ nˆ  |› d¡ ˆ  |› d| j ¡ › d|› dˆ   || j¡› ¡ ˆ  !|t¡ |r<ˆ  d|› d¡ |D ]\}}	}
ˆ  d|› d¡ |
 "| jˆ ¡ ˆ  d¡ qù|D ] \}}	}
}ˆ  d|› d¡ | ˆ ¡ |
 "|ˆ ¡ ˆ  d¡ qˆ  d¡ |rVˆ  #tj$¡}ˆ  %| jd|› d|› d|› d¡ |r^ˆ  d ¡ ˆ  &|t¡ ˆ  d ¡ ˆ j '|¡ ˆ j '|¡ ˆ  d ¡ | j (ˆ ¡ | j )ˆ ¡ d S )!Nzif (%s(%s) < 0) %s;rå  Ú
ImportFromr  FrY  Tc                    s   g | ]
\}}}ˆ   |¡‘qS r0   )rè  )r–   ra   r!  r¡  r0   r1   r˜   ö$  s    ÿÿz>FromImportStatNode.generate_execution_code.<locals>.<listcomp>z*PyObject* const __pyx_imported_names[] = {ræ  z};r   rÚ  rÛ  rÜ  rÝ  rÞ  z = 0; {z = __Pyx_ImportFrom(z, __pyx_imported_names[z]); rî  rï  rò  rÊ   rõ  z	default:;zPyDict_SetItem(z], rÙ  rŒ  )*r  r4   r~  rÑ  r  rH   r   rÁ  ra  r  ræ   r  r   r®  rZ  r[  r	   râ  r
   r²   rA  r·   r†  ri  rÓ   ra   rð   r{  r¨  r.  rù  rA   r]  r^  rß  r_  r`  r  rb  rc  ra  rÜ  )r~   rM   Zcounter_varZ	item_tempr  Zsimple_pyglobalsZdirect_assignmentsZcoerced_assignmentsrŸ  ra   rÞ  r  Zneeds_specific_assignmentsÚmodule_dictr0   r¡  r1   ré   ã$  sŽ   
ýÿ

ÿ
þ
*ÿÿ

þ


z*FromImportStatNode.generate_execution_codeN)r+   r,   r-   r™   r  r    ri   ré   r0   r0   r0   r1   r  ¡$  s    	#r  c                   @   s   e Zd ZdZdZdS )ÚParallelNodez4
    Base class for cython.parallel constructs.
    N)r+   r,   r-   rs   rÜ   r0   r0   r0   r1   r  >%  s    r  c                       sD  e Zd ZdZg d¢ZdZdZdZdZdZ	dZ
dZejejejfZejejejfZejejejfZdZ‡ fdd„Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!dd„ Z"dd„ Z#d8dd„Z$dd„ Z%dd „ Z&d!d"„ Z'd#d$„ Z(d9d%d&„Z)d'd(„ Z*d)d*„ Z+d+d,„ Z,	d:d-d.„Z-d/Z.d0Z/d1e.e/f Z0d2d3„ Z1d4d5„ Z2d6d7„ Z3‡  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_threadsÚthreading_conditionNFr   c                    s<   t ƒ j|fi |¤Ž | d¡pi | _tƒ | _i | _g | _d S )NrÎ  )r^   rˆ   rz   rÎ  r¿   Úseen_closure_varsÚprivatesÚassigned_nodesr  rf   r0   r1   rˆ   ˆ%  s
   
zParallelStatNode.__init__c              
   C   sb  | j  |¡ d | _d | _| jrŽg }tƒ }| jjD ]N}|jj|v r*t	| j
d|jj ƒ | |jj¡ |jjdkr@|jjs?|j| _q|jjdkrO|jjsN|j| _q| jra|jjdkra|jjs`|j| _q| |¡ q|| j_z	| j |¡| _W n ty } zt	| jj
dƒ W Y d }~nd }~ww i | _| j ¡ D ]\}}|| jvr¨t	| j
d| ƒ q–t| ||ƒ q–d S )Nz$Duplicate keyword argument found: %sr   Úuse_threads_ifÚ	chunksizez=Only compile-time values may be supplied as keyword argumentszInvalid keyword argument: %s)r¨   r    r   r!  rm   r¿   r  r¾   r   r   r4   rÀ   rÔ   Ú	is_pranger&  ri  r°  Ú	Exceptionr]   Úvalid_keyword_argumentsr}   )r~   rŒ   ÚpairsÚseenZdictitemr  r‡   rø  r0   r0   r1   r    ™%  sH   €€€€ÿ
üz%ParallelStatNode.analyse_declarationsc                 C   s  | j r
| j  |¡| _ | jr| jr| j |¡| _nt| jdƒ | jr(| j |¡| _| j |¡| _|  |¡ | j d urˆ| j	rM| j	j d urM| j	j
sMt| jdƒ n%| j	r[| j	j
s[t| jdƒ n| j jjrr| j jrr| j  |¡dkrrt| jdƒ | j  ¡ r|| j jjrˆ| j  tj|¡ |¡| _ | S )Nz@'use_threads_if' must de declared in the parent parallel sectionz-num_threads already declared in outer sectionz;num_threads must be declared in the parent parallel sectionr   z.argument to num_threads must be greater than 0)r   ri   r!  Úis_parallelr   r4   r&  r¨   Úanalyse_sharing_attributesÚparentr'  r2  rY  rÕ   r°  r¥  rA  r•  r	   r¬  rÀ  r‹   r0   r0   r1   ri   Ã%  s6   


ÿÿÿz$ParallelStatNode.analyse_expressionsc                 C   sd   | j  ¡ D ]*\}\}}| jr| js|| jj v rt|dƒ q| js(|r(t|dƒ q|  |||¡ qdS )z·
        Analyse the privates for this block and set them in self.privates.
        This should be called in a post-order fashion during the
        analyse_expressions phase
        z0Cannot assign to private of outer parallel blockz*Reductions not allowed for parallel blocksN)rÎ  r]   r'  r,  r.  r   Úpropagate_var_privatization)r~   rŒ   rð   r4   rÄ  r0   r0   r1   r-  â%  s   


ïz+ParallelStatNode.analyse_sharing_attributesc                 C   sf   || j |< |jjrt|dƒ dS | jr/| js!|| jjvr!| jj}n| j}|r1| |||¡ dS dS dS )a
  
        Propagate the sharing attributes of a variable. If the privatization is
        determined by a parent scope, done propagate further.

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

        So the following cases propagate:

            sum is a reduction for all loops:

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

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

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

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

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

                sum = 0

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

                    #pragma omp parallel
                    with parallel:

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

                    # sum and j are well-defined here

                # sum and j are undefined here

            # sum and j are undefined here
        z9Memoryview slices can only be shared in parallel sectionsN)	r#  r2  r/  r   r'  r,  r.  rÎ  r/  )r~   rð   r4   rÄ  r.  r0   r0   r1   r/  û%  s   
5

øz,ParallelStatNode.propagate_var_privatizationc                 C   s€   | j r
| j  ||¡S |j| jv r|jS |j |jd¡}| j |j¡ | j |¡ | j 	||jf¡ | 
d||jf ¡ ||_dS )zo
        Helper function that allocate a temporary for a closure variable that
        is assigned to.
        Tr×  N)r.  Ú_allocate_closure_tempr‰  r"  rZ  r[  r2  rÀ   Úmodified_entriesri  rH   )r~   rM   rð   r‰  r0   r0   r1   r0  @&  s   
z'ParallelStatNode._allocate_closure_tempc                 C   s0   | j }|jj}||j_| |¡ ||j_| ¡ S rw   )Ú1begin_of_parallel_control_block_point_after_declsrZ  ÚownerrÑ  r€   )r~   rM   r9  r¯   r3  r0   r0   r1   Úevaluate_before_blockV&  s   
z&ParallelStatNode.evaluate_before_blockc                 C   s*   | j dur| d|  || j ¡ ¡ dS dS )zS
        Write self.num_threads if set as the num_threads OpenMP directive
        Nz num_threads(%s))r   r¶  r4  r¥   r0   r0   r1   Úput_num_threadsb&  s   
ÿz ParallelStatNode.put_num_threadsc                 C   s2   g | _ t| jƒD ]}|js|jr|  ||¡ qdS )a  
        If a variable is in a scope object, we need to allocate a temp and
        assign the value from the temp to the variable in the scope object
        after the parallel section. This kind of copying should be done only
        in the outermost parallel section.
        N)r1  ÚsortedrÎ  Zfrom_closurerº  r0  )r~   rM   rð   r0   r0   r1   Údeclare_closure_privatesj&  s   €þz)ParallelStatNode.declare_closure_privatesc                 C   s<   | j D ]\}}| d||jf ¡ |j |j¡ ||_qdS )zÁ
        Release any temps used for variables in scope objects. As this is the
        outermost parallel block, we don't need to delete the cnames from
        self.seen_closure_vars.
        r×  N)r1  rH   r‰  rZ  rc  )r~   rM   rð   rY  r0   r0   r1   Úrelease_closure_privatesw&  s
   ýz)ParallelStatNode.release_closure_privatesr0   c           
      C   s  | j }d| _ | jr€|j ¡  | _}g g }}t|ƒD ]\}}|js$|jr*| |¡ q| |¡ q|r<| 	dd 
|¡ ¡ |rH| 	dd 
|¡ ¡ | jr‚tjg}	| jrt|	 | j¡ |j t dd¡¡ | 	dtj› d¡ | 	d	| j ¡ | 	d
d 
|	¡ ¡ dS dS dS )z’
        Make any used temporaries private. Before the relevant code block
        code.start_collecting_temps() should have been called.
        Nz private(%s)r±   ú firstprivate(%s)ZSharedInFreeThreadingrè  z' __Pyx_shared_in_cpython_freethreading(rÙ  z private(%s, %s, %s)z shared(%s))Úprivatization_insertion_pointr,  rZ  Zstop_collecting_tempsrÚ   r6  rA  r/  ri  r¶  r·   Úbreaking_label_usedr   Úparallel_whyÚerror_label_usedr¯  Úparallel_excræ   r  r   r®  Úparallel_freethreading_mutexÚpos_info)
r~   rM   Zexclude_tempsr¯   rÚ   r#  Zfirstprivatesrd  r2  Zshared_varsr0   r0   r1   Úprivatize_temps‚&  s8   
þÿçz ParallelStatNode.privatize_tempsc                 C   sF   | j r| js| d¡ t| jƒD ]\}}|j||dd qd S d S d S )Nz/* Clean up any temporaries */Tr  )r,  Úis_nested_prangerH   r6  rÚ   r4  )r~   rM   rd  r2  r0   r0   r1   Úcleanup_temps¥&  s   
ýzParallelStatNode.cleanup_tempsc                 C   sT   |  ¡ | _| ¡ | _|j| _|jdd|_| ¡  | ¡ | _	| ¡ | _
|  |¡ dS )a¥  
        Sets up a block that surrounds the parallel block to determine
        how the parallel section was exited. Any kind of return is
        trapped (break, continue, return, exceptions). This is the idea:

        {
            int why = 0;

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

            new_return_label:
                why = 3;
                goto end_parallel;

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

            if (why == 3)
                goto old_return_label;
        }
        Úreturnr$  N)r<  r>  r¾  rÇ  rÖ  rš  r°  rÞ  rD   Ú%begin_of_parallel_control_block_pointr2  Ú"undef_builtin_expect_apple_gcc_bugr¥   r0   r0   r1   Ú!setup_parallel_control_flow_block¬&  s   



z2ParallelStatNode.setup_parallel_control_flow_blockc                 C   s   |  ¡ | _dS )aœ  
        Each OpenMP thread in a parallel section that contains a with gil block
        must have the thread-state initialized. The call to
        PyGILState_Release() then deallocates our threadstate. If we wouldn't
        do this, each with gil block would allocate and deallocate one, thereby
        losing exception information before it can be saved before leaving the
        parallel section.
        N)rD   Úbegin_of_parallel_blockr¥   r0   r0   r1   Úbegin_parallel_blockÑ&  s   	z%ParallelStatNode.begin_parallel_blockc                 C   s²   | j }d| _ | jrW|}| d¡ |jdd | d¡ | d¡ | d¡ | d¡ | d¡ | d	¡ | ¡  | d¡ |  |¡ | ¡  | d
¡ | d¡ | d¡ dS dS )a–  
        To ensure all OpenMP threads have thread states, we ensure the GIL
        in each thread (which creates a thread state if it doesn't exist),
        after which we release the GIL.
        On exit, reacquire the GIL and release the thread state.

        If compiled without OpenMP support (at the C level), then we still have
        to acquire the GIL to decref any object temporaries.
        Nú#ifdef _OPENMPTr”  ZPy_BEGIN_ALLOW_THREADSú#endif /* _OPENMP */ZPy_END_ALLOW_THREADSr  z{
z#ifndef _OPENMPz}
)rH  r=  rH   r–  Zput_saferC  r¢  )r~   rM   Z
begin_codeZend_coder0   r0   r1   Úend_parallel_blockÜ&  s(   











îz#ParallelStatNode.end_parallel_blockc           	      C   s  |  ¡ }|  ¡ }d| _d| _d| _g | _| ¡ }|D ]}| |¡r-| jp(||jk| _d| _q| jr6| |¡ t	|ƒD ]6\}}| |¡sDq:||jk}| 
|¡ |rR|sk||jkr_d| _|  |¡ | dtj|d f ¡ | |¡ q:| jrˆ| 
|¡ |rŠ| jrŒ| dtj ¡ dS dS dS dS )að  
        Trap any kind of return inside a parallel construct. 'should_flush'
        indicates whether the variable should be flushed, which is needed by
        prange to skip the loop. It also indicates whether we need to register
        a continue (we need this for parallel blocks, but not for prange
        loops, as it is a direct jump there).

        It uses the same mechanism as try/finally:
            1 continue
            2 break
            3 return
            4 error
        FTz%s = %d;r   ú#pragma omp flush(%s)N)r°  Úany_label_usedr;  r=  Úparallel_private_tempsr¾  rÓ  rü  rÕ  r†  r×  rÔ  Úfetch_parallel_exceptionrH   r   r<  r   )	r~   rM   Úshould_flushZsave_lastprivates_labelZdont_return_labelZ
all_labelsr7  rŸ  Zis_continue_labelr0   r0   r1   Útrap_parallel_exitý&  sB   
ÿ€







üz#ParallelStatNode.trap_parallel_exitc                 C   s¬   |  ¡  |jdd | ¡  | dtj ¡ | dtj ¡ | d| j ¡ tt	| j
| jƒŽ }d|j_| dt|ƒ ¡ | tjt¡ | d¡ | ¡  | ¡  | ¡  dS )	a^  
        As each OpenMP thread may raise an exception, we need to fetch that
        exception from the threadstate and save it for after the parallel
        section where it can be re-raised in the master thread.

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

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

                deallocate threadstate  deallocate threadstate
        Tr”  rM  r   z'__Pyx_ErrFetchWithState(&%s, &%s, &%s);rÊ  rŒ  N)rÞ  r–  Úput_acquire_freethreading_lockr   r   Úparallel_exc_typerH   r>  r   r'  Úparallel_pos_infor@  rZ  Zuses_error_indicatorrû  r^  r
   Úput_release_freethreading_lockr¢  rà  ©r~   rM   r@  r0   r0   r1   rP  6'  s$   ÿÿz)ParallelStatNode.fetch_parallel_exceptionc                 C   sz   |  ¡  |jdd | ¡  | tjt¡ | d| j ¡ t	t
| j| jƒŽ }| dt|ƒ ¡ | ¡  | ¡  | ¡  dS )zRe-raise a parallel exceptionTr”  r  rÊ  N)rÞ  r–  rS  rÚ  r   rT  r
   rH   r>  r   r'  r@  rU  rû  rV  r¢  rà  rW  r0   r0   r1   Úrestore_parallel_exceptionf'  s   z+ParallelStatNode.restore_parallel_exceptionc                 C   s   |  | j| j| jf ¡ dS )z›
        Restore all old labels. Call this before the 'else' clause to for
        loops and always before ending the parallel control flow block.
        N)rÀ  r>  rš  rÇ  r¥   r0   r0   r1   Úrestore_labelsu'  s   ÿzParallelStatNode.restore_labelsc           
      C   sú  | j }d| _ d| _| jdur| j |¡ | j |¡ | ¡ r#| d¡ | jrd| d| j ¡ | d| j	 ¡ | d¡ | dt
j› d¡ | d¡ | d	t
j ¡ | d
¡ | dt
j ¡ | d¡ |rj| j}n| j}|rò| dt
j ¡ | dt
j ¡ | d	t
j ¡ | jD ]\}}}	|	jr–d| }| d||f ¡ qŠ| dt
j ¡ |rµ| d¡ | |j¡ |rÂ| d¡ | |j¡ |rÏ| d¡ | |j¡ | jrè|j t¡ | d¡ |  |¡ | |j¡ | d¡ | d¡ | ¡  |  |¡ dS )aÕ  
        This ends the parallel control flow block and based on how the parallel
        section was exited, takes the corresponding action. The break_ and
        continue_ parameters indicate whether these should be propagated
        outwards:

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

        Here break should be trapped in the parallel block, and propagated to
        the for loop.
        NZ$__Pyx_TurnOffSysMonitoringInParallelz*const char *%s = NULL; int %s = 0, %s = 0;z,PyObject *%s = NULL, *%s = NULL, *%s = NULL;z-#if CYTHON_COMPILING_IN_CPYTHON_FREETHREADINGzPyMutex z = {0};rŸ  r¤  zg/* This may have been overridden by a continue, break or return in another thread. Prefer the error. */z%s = 4;rŒ  zint %s;r®  r´  r×  r  z    case 1: z    case 2: z    case 3: z    case 4:)rE  r2  r   ra  rÜ  r­  rH   r=  rU  r>  r   r?  rT  r<  rN  r;  rO  rQ  r¶  rÕ  rü  rø  rÖ  ræ   r  rÚ  rX  rÔ  rà  Ú"redef_builtin_expect_apple_gcc_bug)
r~   rM   Úbreak_Ú	continue_Úreturn_r¯   rN  Z
temp_cnameZprivate_cnamer  r0   r0   r1   Úend_parallel_control_flow_block}'  sp   



ÿ
ÿÿ





ÿz0ParallelStatNode.end_parallel_control_flow_blockz((defined(__APPLE__) || defined(__OSX__))zQ(defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))))z
(%s && %s)c                 C   s   | j s| | j¡ dS dS )z]
        A bug on OS X Lion disallows __builtin_expect macros. This code avoids them
        N)r.  Zundef_builtin_expectÚredef_conditionr¥   r0   r0   r1   rF  Ý'  s   ÿz3ParallelStatNode.undef_builtin_expect_apple_gcc_bugc                 C   s   | j s| | j¡ d S d S rw   )r.  Zredef_builtin_expectr_  r¥   r0   r0   r1   rZ  ä'  rÕ  z3ParallelStatNode.redef_builtin_expect_apple_gcc_bugc                 C   s8   t ||ƒD ]\}}|d ur|jjrt|jd| ƒ qd S )Nz6%s may not be a Python object as we don't have the GIL)r'  r2  rA  r   r4   )r~   rŒ   r™  Únodesra   rL   r0   r0   r1   Ú_parameters_nogil_checkè'  s   ÿ€þz(ParallelStatNode._parameters_nogil_check)r0   rë  )FFF)5r+   r,   r-   rs   r™   r¨   r'  rB  r=  r   r&  r!  r   rT  Zparallel_exc_valueZparallel_exc_tbr>  Zparallel_filenameZparallel_linenoZparallel_clinenorU  rÎ  rÌ  rÍ  r@  Zcritical_section_counterrˆ   r    ri   r-  r/  r0  r4  r5  r7  r8  rA  rC  rG  rI  rL  rR  rP  rX  rY  r^  Zbuggy_platform_macro_conditionZhave_expect_conditionr_  rF  rZ  ra  rg   r0   r0   rf   r1   r  F%  sd    ýýý*E
#%
!90	
ÿ[r  c                       s@   e Zd ZdZddgZdZdZ‡ fdd„Zdd„ Zd	d
„ Z	‡  Z
S )ÚParallelWithBlockNodezI
    This node represents a 'with cython.parallel.parallel():' block
    r   r%  Nc                    s&   t ƒ  |¡ | jrt| jdƒ d S d S )Nz=cython.parallel.parallel() does not take positional arguments)r^   r    rJ   r   r4   r‹   rf   r0   r1   r    ú'  r;  z*ParallelWithBlockNode.analyse_declarationsc                 C   s|  | j d ur| j  |¡ |  |¡ |  |¡ | d¡ | d¡ | j d ur.| d| j  ¡  ¡ | jrKdd„ | jD ƒ}|rKd t	|ƒ¡}| d|› d¡ | 
¡ | _|  |¡ | d	¡ | d
¡ | ¡  |  |¡ |j ¡  | j |¡ |  |¡ |  |¡ |  |¡ | ¡  | |j¡}| |j¡}| |j¡}|  |¡ | j||||d | j d ur·| j  |¡ | j  |¡ |  |¡ d S )NrJ  z#pragma omp parallel zif(%s) c                 S   s   g | ]	}|j js|j‘qS r0   )r2  rA  r‰  )r–   r  r0   r0   r1   r˜   (  s    ÿzAParallelWithBlockNode.generate_execution_code.<locals>.<listcomp>r±   zfirstprivate(rÙ  rÃ   rK  )r[  r\  r]  ) r!  rÑ  r7  rG  rH   r¶  r€   r#  r·   r6  rD   r:  r5  rÞ  rI  rZ  Ústart_collecting_tempsr¨   ré   rR  rA  rL  rà  rÓ  rü  rø  rÖ  rY  r^  ra  rÜ  r8  )r~   rM   r#  Zjoined_privatesr\  r[  r]  r0   r0   r1   ré    (  sJ   















þ
z-ParallelWithBlockNode.generate_execution_codec                 C   s   |   |dg| jg¡ d S )Nr%  )ra  r!  r‹   r0   r0   r1   rÜ   6(  rQ  z!ParallelWithBlockNode.nogil_check)r+   r,   r-   rs   r)  r   r!  r    ré   rÜ   rg   r0   r0   rf   r1   rb  ð'  s    6rb  c                       s˜   e Zd ZdZg d¢Zd Z Z ZZd Z	 Z
ZdZdZdZg d¢ZG dd„ deƒZ‡ fdd	„Z‡ fd
d„Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  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$  rJ   r   r&  r!  NT)Úscheduler{  r   r&  r%  c                   @   rh  )z#ParallelRangeNode.DummyIteratorNoderJ   Nri  r0   r0   r0   r1   ÚDummyIteratorNodeP(  s    
rf  c                    s*   t ƒ j|fi |¤Ž | j|| jd| _d S )NrU  )r^   rˆ   rf  rJ   r^  )r~   r4   rK   rf   r0   r1   rˆ   S(  s   zParallelRangeNode.__init__c                    sÂ   t ƒ  |¡ | j |¡ | jd ur| j |¡ | jr!t| jƒdkr)t| jdƒ d S t| jƒdkr6| j\| _	nt| jƒdkrE| j\| _
| _	n	| j\| _
| _	| _| jdvr_t| jd| jf ƒ d S d S )NrÆ   z0Invalid number of positional arguments to pranger   r%   )NZstaticZdynamicZguidedÚruntimez'Invalid schedule argument to prange: %s)r^   r    rÞ  r[  r$  rJ   rA   r   r4   r¹  rO   ro  re  r‹   rf   r0   r1   r    Y(  s   

ÿz&ParallelRangeNode.analyse_declarationsc                    sH  |j }| j r	d|_ | jd u rt| jdƒ | S | j |¡| _| jjjs7| jjjs2t| jjd| jj ƒ tj	| _
n| jj| _
d| _| j| j| jf}t|| jƒD ]1\}}|d ur~| |¡ |jjsgt|jd| ƒ qM|jsu| |¡}t| ||ƒ t | j
|j¡| _
qM| jd ur‹| j |¡| _t| jdd ƒ}|rŸ| jjd f| j| jj< tƒ  |¡}|jrä|js³t|jjdƒ n%|jdkrÀt|jjd	ƒ n|jjjrØ|jjrØ|j |¡d
krØt|jjdƒ |j tj |¡ |¡|_|j rê||_ |j!oð|j!j"|_#|j#r"|}|j!r|j!j"r|j!}|j!r|j!j"s|j $|j¡ |j% $|j%¡ |j& '|j&¡ |S )NTz/prange() can only be used as part of a for loopzMust be of numeric type, not %s)rO   r¹  ro  z%s argument must be numericrð   z$Must provide schedule with chunksizerg  z,Chunksize not valid for the schedule runtimer   zChunksize must not be negative)(r{  rÞ  r   r4   rk   r2  rö  rA  r	   râ  Ú
index_typer™  rO   r¹  ro  r'  rj   rÕ   rÀ  r}   rs  r$  ri   rš   rÎ  rð   r^   r&  re  rY  r°  r•  r¬  r.  r'  rB  r†   r#  r$  r¯  )r~   rŒ   rÛ  Ústart_stop_steprL   ra   r¯  r.  rf   r0   r1   ri   m(  s„   



ÿ



ÿ€
ÿ
ÿ
ÿÿÿÿz%ParallelRangeNode.analyse_expressionsc                 C   s.   d}| j | j| j| j| jf}|  |||¡ d S )N)rO   r¹  ro  rÞ  r%  )rO   r¹  ro  rÞ  r!  ra  )r~   rŒ   r™  r`  r0   r0   r1   rÜ   Ã(  s   zParallelRangeNode.nogil_checkc                 C   s.  |   |¡ | jjj}|| jj ¡ dœ}| j| j| jf}d}t	|| j
|ƒD ]!\}}}|du r0|}	n|jr8| ¡ }	n	| |¡ | ¡ }	|	||< q$| jdurQ| j |¡ |j | jd¡|d< |j | jd¡|d< | jdur|| j ¡ r|| jjdkr|t|jdƒ n|d	  ¡ rŠt|d	 ƒdkr‘| d
| ¡ |  |¡ |j t dd¡¡ | d| ¡ | d| ¡ | ¡  |   ||¡ | !¡  |  "|¡ | j#râ| j$rÏ| %dt&j' ¡ | ¡  | d¡ | j# (|¡ | !¡  |  )|¡ || j*| jf D ]}
|
durÿ|
 +|¡ |
 ,|¡ qï|j -|d ¡ |j -|d ¡ |  .|¡ dS )a,  
        Generate code in the following steps

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

            2)  allocate temps for start, stop and step

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

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

                becomes

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

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

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

                Also, you can't do this

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

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

            4) release our temps and write back any private closure variables
        )rÞ  r6  )rb  rb  rw  NFrŸ  Znstepsr   z!Iteration with step 0 is invalid.ro  zif (((%(step)s) == 0)) abort();ZIncludeStdlibHr«  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 */)/r7  rÞ  rð   r‰  r2  rÄ  rO   r¹  ro  r'  r™  rÕ   r]  rÑ  r€   r!  rZ  r[  rh  r—  r[  r   r4   Úisdigitr\  rH   rG  ræ   r  r   r®  rÞ  Úgenerate_looprà  rY  r$  r;  r¶  r   r<  ré   r^  r&  ra  rÜ  rc  r8  )r~   rM   Ztarget_index_cnameÚfmt_dictri  ÚdefaultsrL   ra   r"  r€   rd  r0   r0   r1   ré   È(  s^   
(

þ



 





€z)ParallelRangeNode.generate_execution_codec                 C   sf  | j r	| d¡ n| d¡ | js | d¡ | ¡ | _| jj}nB| d¡ | jd ur4| d| j ¡  ¡ | ¡ | _| j}| d¡ | d¡ | 	¡  |  
|¡ | j rX| d¡ n| d¡ | d¡ t| j ¡ ƒD ]:\}}|r|dv r|| jjkr|jjr„t| jd	ƒ qi| d
||jf ¡ qi|jjs£| d|j ¡ | d|j ¡ qi| jrÀ| jr´d|  || j¡ }nd}| d| j|f ¡ |  |¡ | d¡ | d¡ | d| ¡ | 	¡  | ¡ }| 	¡  | d| ¡ | jrô| j sô|j ¡  | j |¡ | j|dd | jr| j s|  |¡ | jr| dt j! ¡ | "¡  | "¡  | jr1|  #|¡ | "¡  d S d S )Nz#if 0rJ  z#pragma omp forz#pragma omp parallelz if(%s)rÃ   rK  z+*-&^|z#Python objects cannot be reductionsz reduction(%s:%s)r9  z lastprivate(%s)z, %sz schedule(%s%s)z,for (%(i)s = 0; %(i)s < %(nsteps)s; %(i)s++)z=%(target)s = (%(target_type)s)(%(start)s + %(step)s * %(i)s);T)rQ  rj  )$rB  rH   r,  r¶  rD   r:  r.  r!  r€   rÞ  rI  r6  r#  r]   rÞ  rð   r2  rA  r   r4   r‰  re  r&  r4  r5  rZ  rc  r¨   ré   rR  rA  r;  r   r<  rà  rL  )r~   rM   rm  Zreduction_codepointrð   rÄ  r&  Zguard_around_body_codepointr0   r0   r1   rl  B)  st   











ÿ€





ýzParallelRangeNode.generate_loop)r+   r,   r-   rs   r™   r¨   rÞ  r$  rJ   rO   r¹  ro  r'  r{  re  r)  r…   rf  rˆ   r    ri   rÜ   ré   rl  rg   r0   r0   rf   r1   rd  :(  s     Vzrd  c                   @   s>   e Zd ZdZdgZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )ÚCnameDecoratorNodea?  
    This node is for the cname decorator in CythonUtilityCode:

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

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

    node        the node to which the cname decorator is applied
    cname       the cname the node should get
    rL   c                 C   sJ  | j  |¡ | j }t|tƒr|jjd }t|ttfƒ| _t|t	t
fƒ}|j}| jrI| j|_| j|_d|_|jrEd|jv rG|  |j¡|_d S d S d S |rU| j |_|j_d S |j}| j|_| jd |j_tj| j |j_| jd |j_|jj|jj_|jj|j_| jd |_|j ¡ D ]\}}|jr˜|  |j¡|_|jr¢|  |j¡|_qŠd S )Nr   Trh  Ú_objÚ_typer!  )rL   r    rB   rÞ   r¨   rõ   ri  r  Úis_functionr6  rS  rð   r‰  rR  r°  r•  r­  r2  r¨  rj  r   Ztypeobj_prefixrk  rÄ  rb  r6  r”  rï   r]   )r~   rŒ   rL   Zis_struct_or_enumr  r¨  ra   rð   r0   r0   r1   r    ±)  s>   
ÿ€üz'CnameDecoratorNode.analyse_declarationsc                 C   s$   d|v r|  d¡d }d| j|f S )Nrh  rÇ   z%s_%s)rn  r‰  )r~   r‰  r0   r0   r1   r­  ×)  s   zCnameDecoratorNode.manglec                 C   r  rw   )rL   ri   r‹   r0   r0   r1   ri   Ý)  r’  z&CnameDecoratorNode.analyse_expressionsc                 C   s†   | j r:|jr:|jd }t| jtƒr| jj|ddd nddlm} | jj	}|j
}|j|_
|j|| ¡ |dd ||_
| j ||¡ dS )	z=Ensure a prototype for every @cname method in the right placeZutility_code_protoFTr‚  r   )Ú
ModuleNode)Z
definitionN)rr  r‡  ræ   rB   rL   r5  rµ  rÃ   rs  rð   r‰  rR  Zgenerate_cfunction_declarationrî   rç   )r~   rŒ   rM   Zh_coders  rð   r‰  r0   r0   r1   rç   á)  s$   
ÿüz0CnameDecoratorNode.generate_function_definitionsc                 C   r  rw   )rL   ré   r¥   r0   r0   r1   ré   ú)  r  z*CnameDecoratorNode.generate_execution_codeN)
r+   r,   r-   rs   r™   r    r­  ri   rç   ré   r0   r0   r0   r1   ro  ¡)  s    &ro  c                   @   s   e Zd ZdZg ZdS )Ú	ErrorNodezÜ
    Node type for things that we want to get through the parser
    (especially for things that are being scanned in "tentative_scan"
    blocks), but should immediately raise and error afterwards.

    what    str
    N)r+   r,   r-   rs   r™   r0   r0   r0   r1   rt  þ)  s    rt  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)
ZPrintz
Printing.cZPrintOnerª  r  ZRaiseExceptionZGetExceptionZSwapExceptionZSaveResetExceptionZAddTracebackr0   )®r  r:  rí  r   Ú	itertoolsr   ÚenumrÃ   r   ZErrorsr   r   r   r   r   r   r	   r   r
   r   r  r   r   r   r   r   r   r   r   r   r   r   r[   r   ZStringEncodingr   r   r    r!   ZPythranr"   r#   r$   ZUtilsr&   r'   rv  ÚIntEnumr*   r5   r<   rU   r2  rV   rh   rv   r„   r…   rÞ   r§   rô   r  r  r  r!  r9  rD  rF  rJ  rK  re  r²  r¶  rè  rË  rì  rú  r  rÆ  r   r#  r%  r(  r  r6  r=  rS  re  rg  ri  rM  rg  r4  r5  r}  r  r#  r&  r'  r(  r;  rC  rF  rW  r‘  r“  r—  r  r>  r¦  r¬  rØ  rª  rã  rê  rð  ró  r   rö  r÷  rû  rG  r  r  r  r"  r+  r-  r2  r9  r:  r?  r[  rc  rd  ra  r`  rb  r  r‡  r‰  rž  rµ  rÐ  rÑ  rÇ  rá  râ  rå  r‚  rð  rõ  r  rþ  rÿ  r  r  r  r  rb  rd  ro  rt  Zgcc_branch_hintsZbranch_prediction_macrosr®  rí  rï  rÚ  r  r²  rË  r—  Ztraceback_utility_coder0   r0   r0   r1   Ú<module>   sÀ  ÿÿÿÿÿþþþþýýüüüû4 05%(#
2 u 1	g% 's-][+!     s   G    R       [; Q~ v    l&@%  Mk2GC)8
o 20)$/<\<
c
 qi! , Y  	X	qLû-T      /J  i]