U
    {±Ëh¬ó ã                   @   sÀ  d dl Z e jeeeeeeeeeeeeeeeeeed 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d„ de4ƒZ5G d d!„ d!e4ƒZ6d"d#„ Z7e7G d$d%„ d%ƒƒZ8G d&d'„ d'e8ƒZ9G d(d)„ d)ƒZ:G d*d+„ d+e8ƒZ;G d,d-„ d-e8ƒZ<G d.d/„ d/e<ƒZ=G d0d1„ d1e8ƒZ>G d2d3„ d3e>ƒZ?G d4d5„ d5e>ƒZ@G d6d7„ d7e>ƒZAG d8d9„ d9eAƒZBG d:d;„ d;eAƒZCG d<d=„ d=e>ƒZDG d>d?„ d?e>ƒZEG d@dA„ dAe>ƒZFG dBdC„ dCe8ƒZGG dDdE„ dEe8ƒZHG dFdG„ dGe8ƒZIG dHdI„ dIeHƒZJG dJdK„ dKeHƒZKG dLdM„ dMeHƒZLG dNdO„ dOeHƒZMG dPdQ„ dQeHƒZNG dRdS„ dSeHƒZOG dTdU„ dUeHƒZPG dVdW„ dWeHƒZQG dXdY„ dYe<ƒZRG dZd[„ d[e<ƒZSG d\d]„ d]eSe:ƒZTG d^d_„ d_e<ƒZUG d`da„ dae<ƒZVG dbdc„ dce<ƒZWG ddde„ dee<e:ƒZXG dfdg„ dgeXƒZYG dhdi„ die8ƒZZG djdk„ dke8ƒZ[G dldm„ dmeXƒZ\G dndo„ doeXƒZ]G dpdq„ dqe\ƒZ^G drds„ dse^ƒZ_G dtdu„ due_ƒZ`G dvdw„ dwe_ƒZaG dxdy„ dye\ƒZbG dzd{„ d{e<ƒZcG d|d}„ d}e<e:ƒZdG d~d„ dedƒZeG d€d„ dedƒZfG d‚dƒ„ dƒe<ƒZgG d„d…„ d…e<ƒZhG d†d‡„ d‡e<ƒZiG dˆd‰„ d‰e<ƒZjG dŠd‹„ d‹e<ƒZkG dŒd„ de<ƒZlG dŽd„ delƒZmG dd‘„ d‘elƒZnG d’d“„ d“elƒZoG d”d•„ d•elƒZpG d–d—„ d—e<ƒZqG d˜d™„ d™e<ƒZrG dšd›„ d›e<ƒZsG dœd„ de<ƒ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¯e8ƒZ}G d°d±„ d±e<ƒZ~G d²d³„ d³e<ƒZG d´dµ„ dµƒZ€G d¶d·„ d·e€e<ƒZG d¸d¹„ d¹e8ƒZ‚G dºd»„ d»e8ƒZƒd¼d½„ Z„G d¾d¿„ d¿e€e<ƒZ…G dÀdÁ„ dÁe…ƒZ†G dÂdÃ„ dÃe…ƒZ‡G dÄdÅ„ dÅe€e<ƒZˆG dÆdÇ„ dÇe<ƒZ‰G dÈdÉ„ dÉelƒZŠG dÊdË„ dËe<ƒZ‹G dÌdÍ„ dÍe8ƒZŒG dÎdÏ„ dÏe<ƒ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•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ïe8ƒZœG dðdñ„ dñe<eœƒZG dòdó„ dóeƒZžG dôdõ„ dõeƒZŸG död÷„ d÷e<ƒZ G dødù„ dùe8ƒZ¡e%j¢rBdú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   ú9/tmp/pip-unpacked-wheel-fhl22ezh/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 kr&t|ƒS |j}|d k	r\z| |¡ W n tk
rZ   d }Y nX |sjt|ƒ}nt|d | ƒ}||_|S )NzFile: %s (starting at line %s)Ú
)r    Zembed_pos_in_docstringr5   r   ÚencodingÚencodeÚUnicodeEncodeError)r4   Z	docstringZpos_liner7   Údocr0   r0   r1   Úembed_position4   s     

r;   c                    s   ‡ ‡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  _ˆ| |Ž}| jd8  _||jj 	¡ kr¸| 
| ddd¡¡ | 
|¡ |S ˆ| |ŽS d 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ÚmarkerrB   ÚstartÚres©Úcodewriter_classÚfuncr0   r1   ÚfO   s$    ü

zwrite_func_call.<locals>.fr0   )rQ   rP   rR   r0   rO   r1   Úwrite_func_callN   s    rS   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)
ÚtypesrV   ÚCoderW   ÚdictÚitemsr@   rS   ÚsuperÚ__new__)ÚclsÚnameÚbasesÚattrsrV   rW   ÚmnameÚm©rA   r0   r1   r]   k   s    
zVerboseCodeWriter.__new__)r+   r,   r-   r]   Ú__classcell__r0   r0   rd   r1   rT   h   s   rT   c                       s.   e Zd ZdZedddhƒZ‡ fdd„Z‡  ZS )ÚCheckAnalyserszCMetaclass to check that type analysis functions return a node.
    Úanalyse_typesÚanalyse_expressionsÚanalyse_target_typesc                    sb   ddl m} dd„ }t|ƒ}| ¡ D ]*\}}t||ƒr$|| jkr$|||ƒ||< q$tƒ  | |||¡S )Nr   rU   c                    s   ‡ ‡fdd„}|S )Nc                     s(   ˆ | |Ž}|d kr$t dˆ| |f ƒ |S )Nz%s %s %s)Úprint)rH   ÚkwargsÚretval©rQ   r_   r0   r1   Úcall   s    
z3CheckAnalysers.__new__.<locals>.check.<locals>.callr0   )r_   rQ   rn   r0   rm   r1   Úcheck€   s    z%CheckAnalysers.__new__.<locals>.check)rX   rV   rZ   r[   r@   Úmethodsr\   r]   )r^   r_   r`   ra   rV   ro   rb   rc   rd   r0   r1   r]   ~   s    zCheckAnalysers.__new__)r+   r,   r-   Ú__doc__Ú	frozensetrp   r]   re   r0   r0   rd   r1   rf   u   s   ýrf   c                 C   s   t jrttƒ| ƒS | S ©N)r!   Zdebug_trace_code_generationr&   rT   )r^   r0   r0   r1   Ú_with_metaclass   s    rt   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 rs   )r4   Ú__dict__Úupdate)Úselfr4   Úkwr0   r0   r1   Ú__init__¶   s    zNode.__init__Z	Operationc                 C   s   t | jd| j ƒ d S )Nz%s not allowed without gil)r   r4   Úgil_message©rx   Úenvr0   r0   r1   Ú	gil_error¿   s    zNode.gil_errorc                 C   s   |  ¡ s|  ¡  d S rs   )Úis_cppÚ	cpp_errorr|   r0   r0   r1   Ú	cpp_checkÄ   s    zNode.cpp_checkc                 C   s   t | jd| j ƒ d S )Nz%s only allowed in c++)r   r4   Úcpp_message©rx   r0   r0   r1   r€   È   s    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Úgetattrr@   ÚlistÚsetattr)rx   ÚresultÚattrnameÚvaluer0   r0   r1   Ú
clone_nodeË   s    



zNode.clone_nodec                 C   s   d S rs   r0   r|   r0   r0   r1   Úanalyse_declarationsð   s    zNode.analyse_declarationsc                 C   s   t d| jj ƒ‚d S )Nz*analyse_expressions not implemented for %s©r   rA   r+   r|   r0   r0   r1   rh   ó   s    ÿzNode.analyse_expressionsc                 C   s   t d| jj ƒ‚d S )Nz$generate_code not implemented for %sr‘   ©rx   rK   r0   r0   r1   Úgenerate_code÷   s    ÿzNode.generate_codec                 C   s   t | tƒr| j |¡ d S rs   )r@   Ú	BlockNodeÚbodyÚannotater’   r0   r0   r1   r–   û   s    
zNode.annotatec              	   C   s˜   z| j W S  tk
r’   | j}| js2|| _ | Y S | jD ]J}t| |ƒ}|d krPq8t|tƒrt|D ]}t|| ¡ ƒ}q^q8t|| ¡ ƒ}q8|| _ | Y S X d S rs   )	Z_end_posÚAttributeErrorr4   rˆ   r‰   r@   rŠ   ÚmaxÚend_pos)rx   r4   ÚattrÚchildÚcr0   r0   r1   r™      s"    


zNode.end_posr3   éd   c           
   	      sì   ˆ dkrdS ˆdkrt ƒ ‰t| ƒˆkr:d| jjt| ƒf S ˆ t| ƒ¡ ‡ ‡‡‡fdd„‰‡fdd„| j ¡ D ƒ}t|ƒdkr’d	| jjt| ƒf S d
| }d| jjt| ƒf }|D ]$\}}	|d||ˆ|	|d ƒf 7 }q²|d| 7 }|S d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                    sR   t | tƒr|  ˆ ˆˆd ˆ¡S t | tƒrFdd ‡‡ fdd„| D ƒ¡ S t| ƒS d S )Nr   z[%s]ú, c                    s   g | ]}ˆ |ˆƒ‘qS r0   r0   )r…   Úitem)Ú
dump_childÚlevelr0   r1   r‡   $  s     z1Node.dump.<locals>.dump_child.<locals>.<listcomp>)r@   ru   ÚdumprŠ   ÚjoinÚrepr)r†   r¡   ©Úcutoffr    ÚencounteredÚ
filter_out©r¡   r1   r       s
    

zNode.dump.<locals>.dump_childc                    s    g | ]\}}|ˆ k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>)ÚsetÚidrA   r+   Úaddrv   r[   r?   )
rx   r¡   r¨   r¦   r§   ra   ÚindentrN   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 }|rb|d|… | ||d…  }| ¡ d	 |d< ||||d
 … 7 }d| ¡ ||d |¡f 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%   z"%s":%d:%d
%s
)r4   Ú	get_linesr˜   ÚrstripZget_escaped_descriptionr£   )	rx   Zmark_columnrL   Zsource_descÚlineÚcolÚcontentsÚlinesÚcurrentr0   r0   r1   Údump_pos3  s        ÿzNode.dump_pos)N)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_typerz   r{   Únogil_checkÚin_nogil_contextr~   r‚   r   r€   r   r   rh   r“   r–   r™   r¢   r¼   r0   r0   r0   r1   ru   –   s:   
%
ru   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|Ž}| |j|||jdS ©N)r•   Ú
directivesrÀ   )r    Zcopy_inherited_directivesrÊ   r4   rÀ   )r^   r•   r}   rÊ   Únew_directivesr0   r0   r1   Úfor_directivesN  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_internalS  s    z#CompilerDirectivesNode.for_internalc                 C   s$   |j }| j |_ | j |¡ ||_ d S rs   )rÊ   r•   r   ©rx   r}   Úoldr0   r0   r1   r   X  s    z+CompilerDirectivesNode.analyse_declarationsc                 C   s&   |j }| j |_ | j |¡| _||_ | S rs   )rÊ   r•   rh   rÎ   r0   r0   r1   rh   ^  s
    z*CompilerDirectivesNode.analyse_expressionsc                 C   s8   |j }|jj }| j |j_ | j ||¡ ||_ ||j_ d S rs   )rÊ   Úglobalstater•   Úgenerate_function_definitions)rx   r}   rK   Zenv_oldZcode_oldr0   r0   r1   rÑ   e  s    
z4CompilerDirectivesNode.generate_function_definitionsc                 C   s*   |j j}| j|j _| j |¡ ||j _d S rs   )rÐ   rÊ   r•   Úgenerate_execution_code©rx   rK   rÏ   r0   r0   r1   rÒ   m  s    
z.CompilerDirectivesNode.generate_execution_codec                 C   s*   |j j}| j|j _| j |¡ ||j _d S rs   )rÐ   rÊ   r•   r–   rÓ   r0   r0   r1   r–   s  s    
zCompilerDirectivesNode.annotateN)r+   r,   r-   rq   rˆ   ÚclassmethodrÌ   rÍ   r   rh   rÑ   rÒ   r–   r0   r0   r0   r1   rÈ   E  s   

rÈ   c                   @   s   e Zd Zdd„ Zdd„ ZdS )r”   c                 C   s.   |  ¡ j}|D ]}|j |¡ q|d d …= d S rs   )Úglobal_scopeZundeclared_cached_builtinsrÐ   Zadd_cached_builtin_decl)rx   r}   rK   ÚentriesÚentryr0   r0   r1   Úgenerate_cached_builtins_decls}  s    
z(BlockNode.generate_cached_builtins_declsc                 C   s   |j D ]}| ||¡ qd S rs   )Zlambda_defsrÑ   )rx   r}   rK   rJ   r0   r0   r1   Úgenerate_lambda_definitionsƒ  s    
z%BlockNode.generate_lambda_definitionsN)r+   r,   r-   rØ   rÙ   r0   r0   r0   r1   r”   z  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|Ž}|S rs   )rÚ   )r4   r}   ry   rJ   r0   r0   r1   Úcreate_analysed  s    zStatListNode.create_analysedc                 C   s   | j D ]}| |¡ qd S rs   ©rÛ   r   ©rx   r}   Ústatr0   r0   r1   r   ’  s    
z!StatListNode.analyse_declarationsc                    s   ‡ fdd„| j D ƒ| _ | S )Nc                    s   g | ]}|  ˆ ¡‘qS r0   ©rh   ©r…   rß   ©r}   r0   r1   r‡   ™  s   ÿz4StatListNode.analyse_expressions.<locals>.<listcomp>©rÛ   r|   r0   râ   r1   rh   —  s    
ÿz StatListNode.analyse_expressionsc                 C   s   | j D ]}| ||¡ qd S rs   ©rÛ   rÑ   ©rx   r}   rK   rß   r0   r0   r1   rÑ     s    
z*StatListNode.generate_function_definitionsc                 C   s&   | j D ]}| |j¡ | |¡ qd S rs   )rÛ   Úmark_posr4   rÒ   ©rx   rK   rß   r0   r0   r1   rÒ   ¢  s    
z$StatListNode.generate_execution_codec                 C   s   | j D ]}| |¡ qd S rs   ©rÛ   r–   rç   r0   r0   r1   r–   ¨  s    
zStatListNode.annotateN)r+   r,   r-   rˆ   ÚstaticmethodrÜ   r   rh   rÑ   rÒ   r–   r0   r0   r0   r1   rÚ   ˆ  s   
rÚ   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚStatNodec                 C   s   d S rs   r0   ©rx   r}   rK   r0   r0   r1   rÑ   º  s    z&StatNode.generate_function_definitionsc                 C   s   t d| jj ƒ‚d S )Nz.generate_execution_code not implemented for %sr‘   r’   r0   r0   r1   rÒ   ½  s    ÿz StatNode.generate_execution_codeN)r+   r,   r-   rÑ   rÒ   r0   r0   r0   r1   rê   ­  s   rê   c                   @   s:   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   st   |j }d|_ | j |¡ ||_ | js*| jrp| jj}|jd sBd}n|sLd}ntdd„ |D ƒƒ}| | j| j|¡ d S )Nr   Zpreliminary_late_includes_cy28Fc                 s   s   | ]}t |tƒV  qd S rs   )r@   ÚCVarDefNode)r…   rJ   r0   r0   r1   Ú	<genexpr>Ø  s     z6CDefExternNode.analyse_declarations.<locals>.<genexpr>)	Úin_cincluder•   r   Zinclude_fileZverbatim_includerÛ   rÊ   ÚallÚadd_include_file)rx   r}   Zold_cinclude_flagrÛ   Zlater0   r0   r1   r   É  s    
z#CDefExternNode.analyse_declarationsc                 C   s   | j  |¡| _ | S rs   ©r•   rh   r|   r0   r0   r1   rh   Û  s    z"CDefExternNode.analyse_expressionsc                 C   s   | j  ||¡ d S rs   ©r•   rÑ   rë   r0   r0   r1   rÑ   à  s    z,CDefExternNode.generate_function_definitionsc                 C   s   d S rs   r0   r’   r0   r0   r1   rÒ   ã  s    z&CDefExternNode.generate_execution_codec                 C   s   | j  |¡ d S rs   ©r•   r–   r’   r0   r0   r1   r–   æ  s    zCDefExternNode.annotateN©	r+   r,   r-   rˆ   r   rh   rÑ   rÒ   r–   r0   r0   r0   r1   rì   Â  s   rì   c                   @   s$   e Zd Zg ZdZdd„ Zdd„ ZdS )ÚCDeclaratorNoder°   c                 C   s   d S rs   r0   rƒ   r0   r0   r1   Údeclared_nameû  s    zCDeclaratorNode.declared_namec                 C   s   d S rs   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   s   | j S rs   ©r_   rƒ   r0   r0   r1   r÷     s    z!CNameDeclaratorNode.declared_namer   Fc                 C   sª   |rX| j dkrX|js |js |jr.t| jdƒ n*|jrBt| jdƒ n|jdddd| _ t}|j	rœ|j
rœz| |j
¡}W n& tk
rš   t| jd| j  ƒ Y nX || _| |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)r_   Úis_ptrÚis_arrayÚ	is_bufferr   r4   Úis_voidÚdeclaration_coder
   Úis_fusedÚfused_to_specificÚ
specializer   Útype)rx   Ú	base_typer}   ÚnonemptyÚ
visibilityÚin_pxdr0   r0   r1   Úanalyse  s$    ÿÿ
zCNameDeclaratorNode.analyse)r   NF)r+   r,   r-   rˆ   rû   r÷   r  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   s
   | j  ¡ S rs   ©r  r÷   rƒ   r0   r0   r1   r÷   +  s    z CPtrDeclaratorNode.declared_namec                 C   s
   | j  ¡ S rs   ©r  rø   rƒ   r0   r0   r1   rø   .  s    z$CPtrDeclaratorNode.analyse_templatesr   NFc                 C   s2   |j rt| jdƒ t |¡}| jj|||||dS )Nz+Pointer base type cannot be a Python object©r  r  r  )Úis_pyobjectr   r4   r	   Ú
c_ptr_typer  r  )rx   r
  r}   r  r  r  Zptr_typer0   r0   r1   r  1  s    
zCPtrDeclaratorNode.analyse)r   NF)r+   r,   r-   rˆ   r÷   rø   r  r0   r0   r0   r1   r  &  s   r  c                   @   s"   e Zd ZdgZdd„ Zdd„ ZdS )Ú_CReferenceDeclaratorBaseNoder  c                 C   s
   | j  ¡ S rs   r  rƒ   r0   r0   r1   r÷   ;  s    z+_CReferenceDeclaratorBaseNode.declared_namec                 C   s
   | j  ¡ S rs   r  rƒ   r0   r0   r1   rø   >  s    z/_CReferenceDeclaratorBaseNode.analyse_templatesN)r+   r,   r-   rˆ   r÷   rø   r0   r0   r0   r1   r  8  s   r  c                   @   s   e Zd Zddd„ZdS )ÚCReferenceDeclaratorNoder   NFc                 C   s2   |j rt| jdƒ t |¡}| jj|||||dS )Nz-Reference base type cannot be a Python objectr  )r  r   r4   r	   Z
c_ref_typer  r  ©rx   r
  r}   r  r  r  Zref_typer0   r0   r1   r  C  s    
z CReferenceDeclaratorNode.analyse)r   NF©r+   r,   r-   r  r0   r0   r0   r1   r  B  s   r  c                   @   s   e Zd Zddd„ZdS )Ú CppRvalueReferenceDeclaratorNoder   NFc                 C   s2   |j rt| jdƒ t |¡}| jj|||||dS )Nz4Rvalue-reference base type cannot be a Python objectr  )r  r   r4   r	   Zcpp_rvalue_ref_typer  r  r  r0   r0   r1   r  K  s    
z(CppRvalueReferenceDeclaratorNode.analyse)r   NFr  r0   r0   r0   r1   r  J  s   r  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r¤ddlm} t| j|ƒr<| jj}n| jf}‡ fdd„|D ƒ}d |kr~| 	d ¡}	t
||	 jdƒ t}n| | jˆ |¡}| jj|ˆ |||dS | jr2| j ˆ ¡| _| jjjsÒt
| jjdƒ | jjjrø| jjjdkrøt
| jjd	ƒ | j ¡ }
|
d k	r6zt|
ƒ}
W n tk
r.   Y nX nd }
| ¡ sPt
| jd
| ƒ |jrdt
| jdƒ |jrxt
| jdƒ t ||
¡}| jj|ˆ |||dS )Nr   ©Ú	TupleNodec                    s   g | ]}|  ˆ ¡‘qS r0   )Úanalyse_as_type)r…   Úvrâ   r0   r1   r‡   a  s     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Ú	ExprNodesr  r@   r  rH   Úindexr   r4   r   Úspecialize_herer  r  Úanalyse_const_expressionr	  Úis_intÚis_constr×   r  Úget_constant_c_result_codeÚintÚ
ValueErrorÚis_completer  r	   Zc_array_type)rx   r
  r}   r  r  r  r  rH   ÚvaluesÚixÚsizeZ
array_typer0   râ   r1   r  X  sJ    ÿþ





zCArrayDeclaratorNode.analyse)r   NF©r+   r,   r-   rˆ   r  r0   r0   r0   r1   r  R  s   r  c                   @   sJ   e Zd Zdddg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 )ÚCFuncDeclaratorNoder  rH   Úexception_valuer   Nc                 C   s
   | j  ¡ S rs   r  rƒ   r0   r0   r1   r÷   –  s    z!CFuncDeclaratorNode.declared_namec                 C   s¬   t | jtƒr¤ddlm}m} | jj}t ||ƒr6|j}n"t ||ƒrH|g}nt|j	dƒ d S g | _
|D ]0}t ||ƒr†| j
 t |j¡¡ qbt|j	dƒ qb| jj| _| j
S d S d S )Nr   )r  ÚNameNodez*Template arguments must be a list of names)r@   r  r  r&  r  r6  r  rH   r   r4   Ú	templatesÚappendr	   ÚTemplatePlaceholderTyper_   )rx   r  r6  Útemplate_nodeZtemplate_nodesÚtemplater0   r0   r1   rø   ™  s"    



z%CFuncDeclaratorNode.analyse_templatesFc                    sL  |d kri }|r|d8 }g }t ˆjƒD ]N\}}	|	jˆ ||dkoNˆ joNdˆ jkd\}
}|
j}||krÂ|| }| ˆ ¡}|d krŽt|jdƒ n4|t	j
k	r¾| |¡s¾tˆjjdƒ t|jdƒ n|}|
jrÔtˆjdƒ |dkrîˆ jrî|jrîˆ j}|jrt	 |j¡}|jrt|	jd	ƒ t	 |||	j¡}|	jr4d
|_|	jrBd
|_| |¡ |	jrdˆ 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rDˆjs(ˆjrDˆjdkrDtˆjdƒ nò|jrxˆjsx|dkrxˆjrxtˆjddƒ n¾ˆjd krôˆjrôˆjdkrô|jd k	rô|dkrô|sôˆ jsôt ˆjt!ƒsôddl"m#} |j$ˆjt%|jƒ||jdˆ_ˆjd k	r0ˆjdkr|ˆj &ˆ ¡ˆ_ˆjj'}|j(st|jst|j)rL|j*jsL|jrt|t	j+krfˆjj,dksttˆjjdƒ ˆj}n´ˆj -ˆ ¡ .|ˆ ¡ &ˆ ¡ˆ_ˆj /ˆ ¡}| 0ˆjj'¡sÂtˆjjdƒ |dkr0|j1sÜ|j2r0ˆj 3¡ r0zt4|j5ƒ}W n t6k
r   Y n$X ˆjj7|kr0tˆjdˆjj7 ƒ ˆj}|j)rJtˆjdƒ t	j8||ˆj9ˆj||ˆjj:ˆj;ˆj<ˆj=ˆj>ˆj?d }ˆjr°|j@r¤‡ ‡fd!d"„}||_Anˆ B|ˆ ¡ ˆ jd# }|rð|j:}|rê||krêtˆjd$||f ƒ ||_:|j*jCrtˆjd%dƒ |jD ](}|j'jCr| D¡ stˆjd&dƒ qˆjj|ˆ ||d'S )(Nr   r   ré   ©r  Ú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_noexceptr!  FzdImplicit noexcept declaration is deprecated. Function declaration should contain 'noexcept' keyword.r%   r©   ú+ZiosÚnewZ	stdexceptZtypeinfozAException clause not allowed for function returning Python objectz?noexcept clause is ignored for function returning Python object©Ú	ConstNode©rŽ   r	  Úconstant_resultÚ*zTException value must be a Python exception, or C++ function with no arguments, or *.z6Exception value incompatible with function return typez;Ambiguous exception value, same as default return value: %rz!Function cannot return a function)	Úoptional_arg_countr5  Úexception_checkrù   ÚnogilÚwith_gilÚis_overridableÚis_const_methodr7  c                    s   ˆ  | ˆ |¡ d S rs   )Údeclare_optional_arg_struct)Ú	func_typeÚfused_cname©r}   rx   r0   r1   Údeclare_opt_arg_struct>  s    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©r  r  )EÚ	enumeraterH   r  Úis_c_class_scoperÊ   r_   r  r   r4   r	   r
   Úsame_asr  ÚcnameÚis_unspecifiedÚparent_typer  r  r
  r  ÚCFuncTypeArgÚnot_noneÚor_noner8  rû   rH  r  Úhas_explicit_exc_clauserI  r   rñ   r5  r@   r  r&  rD  Úfor_typeÚstrr)  r	  Úis_errorr$  Úreturn_typeÚc_char_typerŽ   rg   Ú	coerce_toZas_exception_valueÚassignable_fromr*  Zis_floatÚhas_constant_resultÚfloatÚdefault_valuer.  rF  Ú	CFuncTypeÚhas_varargsrù   rJ  rK  ÚoverridablerM  r7  r  rR  rN  Úis_rvalue_referenceZis_forwarding_reference)rx   rb  r}   r  Údirective_localsr  r  Zfunc_type_argsÚiZarg_nodeÚname_declaratorr	  r_   Ú	type_nodeÚ
other_typeZfunc_argÚexc_valÚ	exc_checkrD  Zexc_val_typeZtype_default_valuerO  rR  rS  r»   Úargr0   rQ  r1   r  ¯  sN    þ


ÿ
ÿþýüý


ÿÿþ"   þÿþýüû
úÿ ÿÿÿ
ÿÿþÿ     ù	
ÿ

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k	r‚t ||¡}| ¡ 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   )r_   ÚkindÚscopeÚtypedef_flagr4   rX  r   )r   r   Úpyrex_prefixÚdeclare_varr	   Ú
c_int_typer4   rH   r?   rH  r_   r	  ÚmangleZopt_arg_prefixr  Zget_fused_cnamerÕ   Údeclare_struct_or_unionÚdefined_in_pxdÚusedr  Úop_arg_struct)	rx   rO  r}   rP  rw  Zarg_count_memberrt  Zstruct_cnameZop_args_structr0   r0   r1   rN  U  s&    
úz/CFuncDeclaratorNode.declare_optional_arg_struct)r   NNF)N)r+   r,   r-   rˆ   rk  rH  rM  r7  r÷   rø   r  rN  r0   r0   r0   r1   r4  ƒ  s   

 'r4  c                   @   s   e Zd ZdgZddd„ZdS )ÚCConstDeclaratorNoder  r   NFc                 C   s2   |j rt| jdƒ t |¡}| jj|||||dS )Nz)Const base type cannot be a Python objectr  )r  r   r4   r	   Úc_const_typer  r  )rx   r
  r}   r  r  r  Úconstr0   r0   r1   r  {  s    ÿ
zCConstDeclaratorNode.analyse)r   NFr3  r0   r0   r0   r1   r  v  s   r  c                   @   s¨   e Zd Zddddg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 )ÚCArgDeclNoder
  Ú
declaratorrû   Ú
annotationr   r   FNc                 C   s
   | j  ¡ S rs   ©r…  r÷   rƒ   r0   r0   r1   r÷   ¬  s    zCArgDeclNode.declared_namec                 C   s
   | j  ¡ S rs   )r_   Úas_c_string_literalrƒ   r0   r0   r1   Úname_cstring¯  s    zCArgDeclNode.name_cstringc                 C   s.   | j rttj| jj ƒS ttj| jj ƒS d S rs   )Úneeds_conversionr   r   Z
arg_prefixr×   r_   Z
var_prefixrƒ   r0   r0   r1   Ú	hdr_cname³  s    zCArgDeclNode.hdr_cnamec                 C   sn  |r| | j _| _| jd k	r(| j| jfS t| jtƒr| jjdkr|rŠ| j jrf| 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 ƒ}|rÆ|| j_|jrt| j tƒrt| jtƒr| j}	t|	jtƒr|	j}	qð| j j|	_|j }| jr\|r\|jd r\t| j dd ƒd kr\|  |¡}
|
d k	r\|
}| jj	|||dS )	Nr°   T)Úcould_be_nameFÚarg_nameÚannotation_typingr_   ©r  )r
  r=  r	  ro  r@   r…  rú   r_   Úis_basic_c_typer  Úempty_declaration_coder   Úis_argr‰   r  ÚTemplatedTypeNoder  r  Úarray_declaratorr†  rÊ   Úinject_type_from_annotations)rx   r}   r  r=  r	  r  rŒ  r
  Zbase_arg_namer…  Úarg_typer0   r0   r1   r  ½  sJ    


ÿ
þ
ý

zCArgDeclNode.analysec                 C   sÜ   | j }|sd S |j|| jd\}}|d k	r<t|j|dd| _|rÎd|krf| ¡ }|r^| ¡ s^qÎd| _nh|t	krvd| _nX| jrº| jj
rº| ¡ s’|jrº| ¡ s |j}| jsÎt| jdƒ d| _n| jsÎ| ¡ rÎd| _|rØd| _|S )N)Zassigned_valueT)r	  r’  ztyping.OptionalzIPEP-484 recommends 'typing.Optional[...]' for arguments that can be None.)r†  Úanalyse_type_annotationrû   ÚCAnalysedBaseTypeNoder4   r
  ÚresolveÚcan_be_optionalr]  r
   r¾   Úequivalent_typer   r\  Útype_from_annotation)rx   r}   r†  Ú	modifiersr–  r0   r0   r1   r•  ï  s:      ÿz)CArgDeclNode.inject_type_from_annotationsc                 C   sJ   | j d krD| jrD| jjr6| j |¡ | j | j ¡ ¡S | | j¡| _ | j S rs   )rh  rû   r¿   Úgenerate_evaluation_coder	  Ú	cast_coderŒ   Zget_argument_default_constr’   r0   r0   r1   Úcalculate_default_value_code  s    
z)CArgDeclNode.calculate_default_value_codec                 C   s   | j r| j  |¡ d S rs   )rû   r–   r’   r0   r0   r1   r–     s    zCArgDeclNode.annotatec                 C   s’   | j }|d ks|jrd S |d kr*|  |¡}| |¡ | |¡ |rJ| ¡ n
| | j¡}| d||f ¡ | 	| ¡ | j¡ | 
|¡ | |¡ d S ©Nú%s = %s;)rû   r¿   r   rž  Úmake_owned_referencerŒ   Ú	result_asr	  rF   Úput_giverefÚgenerate_post_assignment_codeÚ
free_temps)rx   rK   ÚtargetÚoverloaded_assignmentrû   rŒ   r0   r0   r1   Úgenerate_assignment_code"  s    



z%CArgDeclNode.generate_assignment_code)r   F)NF)r+   r,   r-   rˆ   rÅ   r=  Úis_type_argÚ
is_genericÚis_special_method_optionalÚkw_onlyÚpos_onlyr\  r]  r	  ro  rh  r†  Ú
is_dynamicZdefaults_class_keyrœ  r÷   Úpropertyr‰  r‹  r  r•  r   r–   rª  r0   r0   r0   r1   r„  ƒ  s6   

	
2%
r„  c                   @   s   e Zd Zdd„ ZdS )ÚCBaseTypeNodec                 C   s
   |   |¡S rs   ©r  r|   r0   r0   r1   r  9  s    zCBaseTypeNode.analyse_as_typeN)r+   r,   r-   r  r0   r0   r0   r1   r²  1  s   r²  c                   @   s   e Zd Zg Zddd„ZdS )r˜  Fc                 C   s   | j S rs   ©r	  )rx   r}   rŒ  r0   r0   r1   r  B  s    zCAnalysedBaseTypeNode.analyseN)Fr3  r0   r0   r0   r1   r˜  =  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   sn  d }| j r2t | j| j| j¡}|s.t| jdƒ n®| jdkrJ| jsJt	}n–| jd krp| j
rh|jrh|j}nt	}np|}| jr:| jD ]N}| |¡}|d k	r¶|js¬|jr¶|jjr¶|jj}q‚|rÈ|jrÈ|j}q‚d } qÒq‚|d kr t| jƒdkr ddlm} | | jd ¡}|r |jr ||jƒ}|d kr:| | j| j¡}|rà|jrP| ¡ }| | j¡}|d k	rhnx|r˜| j
r†|jr†|j}nt	}t| jƒ| _nH| jrÎ| j| jk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&kr^tj'}| %|¡ d| _!|sjt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longnessr_   r   r4   Úmodule_pathr
   r=  rV  rZ  Úlookupr"  Úis_typer	  rw  Z	as_moduler?   r   r·  Úknown_standard_library_importÚfind_imported_modulerÕ   Zlookup_typer   r  r7  r9  r  r  r  ÚcomplexÚ
is_numericÚ
is_complexZCComplexTypeÚcreate_declaration_utility_codeZcomplex_typeÚc_double_complex_typer   )	rx   r}   rŒ  r	  rw  rŸ   r×   r·  Zfound_entryr0   r0   r1   r  W  s€    


ÿþþ






zCSimpleBaseTypeNode.analyse)F)
r+   r,   r-   rˆ   r  r¹  r  r¾  r=  r  r0   r0   r0   r1   rµ  F  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 nD tk
rx } z&t|j	|j
ƒ t ¡ | _| j W Y ¢S d }~X Y nX | | j|¡st| _n&t ||¡| _| j | j¡ |  |¡ | jS ©Nr   ©Ú
MemoryView)rÅ  r  ra  r°   rÉ  Zget_axes_specsrÆ  r   r   ÚpositionZmessage_onlyr	   Z	ErrorTyper	  Zvalidate_axesr4   r   ZMemoryViewSliceTypeZvalidate_memslice_dtypeÚuse_memview_utilities)rx   r}   rŒ  r
  rÉ  Z
axes_specsÚer0   r0   r1   r  ²  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)rx   r}   rÉ  r0   r0   r1   rË  É  s    ÿÿz-MemoryViewSliceTypeNode.use_memview_utilitiesN)F)r+   r,   r-   r_   rˆ   r  rË  r0   r0   r0   r1   rÃ  ­  s   
rÃ  c                   @   s   e Zd ZdgZddd„ZdS )ÚCNestedBaseTypeNoder
  Nc                 C   sr   | j  |¡}|tjkrtjS |js8t| jd| ƒ tjS |j | j	¡}|rP|j
slt| jd|| j	f ƒ tjS |jS )Nz'%s' is not a valid type scopez '%s.%s' is not a type identifier)r
  r  r	   r   r"  r   r4   rw  Úlookup_herer_   r»  r	  )rx   r}   rŒ  r
  Ú
type_entryr0   r0   r1   r  Ú  s    

zCNestedBaseTypeNode.analyse)Nr3  r0   r0   r0   r1   rÑ  Ò  s   rÑ  c                   @   s>   e Zd Zddddg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   s&  |j dk}|jo| }g }| jD ]^}|jr,q | |p<t|tƒ¡ | |¡}W 5 Q R X |d krt|jrtt	|j
dƒ t}| |¡ q |j r°|j dkr¦tdd„ | jD ƒƒ|_| ¡ }nd}t|ƒD ]d\}	}|d krÎq¼|rØ|jrä|r¼| ¡ s¼|jr| ¡ s|j||	< q¼t	|j
d|j |f ƒ t||	< q¼|S )Nzdataclasses.ClassVarz!unknown type in template argumentztyping.Unionc                 s   s   | ]}|j V  qd S rs   )r¾   r„   r0   r0   r1   rî     s     z<TemplatedTypeNode._analyse_template_types.<locals>.<genexpr>Fz$%s[...] cannot be applied to type %s)r%  Úin_c_type_contextrÔ  r¾   Znew_c_type_contextr@   r²  r  r"  r   r4   r   r8  ÚanyZcontains_noneZallows_nonerU  r  rš  r›  Úas_cython_attribute)
rx   r}   r
  Zrequire_python_typesr×  Útemplate_typesr:  ÚttypeZrequire_optional_typesrn  r0   r0   r1   Ú_analyse_template_typesø  s<    



þ
z)TemplatedTypeNode._analyse_template_typesFc           
      C   sÎ  |d kr| j  |¡}|jr|S |jr,| ¡ s2|jrŒ| jrl| jjrl|jrJdnd}t| j	d| ƒ t
j| _| jS |  ||¡}| | j	||¡| _nä|jròddlm} | | j	|| j| j|j¡}t
j|f|Ž| _t|ƒrðt| jƒrðt
 t| jƒ| j¡| _n~t| j	dd d}t| jƒdks| jjr2t| 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 n( t!k
rÆ   t| j	d| j" ƒ Y nX | jS )Nzc++ templateszindexed typesz %s cannot take keyword argumentsr   ©ÚBufferr°   ©r_   rX  zinvalid array declarationr   )r  r  r   )#rÅ  r  ra  r"  r#  r%  rÕ  Úkey_value_pairsr   r4   r	   r   r	  rÜ  r(  r  r°   rÞ  Úanalyse_buffer_optionsrÔ  Úbuffer_defaultsZ
BufferTyper"   r$   ZPythranExprr#   rú   r?   r  r”  r  r  r  r   r_   )
rx   r}   rŒ  r
  ÚtprÚ  rÞ  ÚoptionsZempty_declaratorr  r0   r0   r1   r  "  sb     ÿû

ýÿÿ
zTemplatedTypeNode.analysec                 C   sV   g }| }|j rR|jrRt|jƒdkrR| j |¡}|jrF|jrF| |j¡ |jd }q|S ©Nr   r   )rÃ   rÅ  r?   rÔ  r  r%  Zmodifier_namer8  )rx   r}   r  Zmodifier_nodeZmodifier_typer0   r0   r1   Úanalyse_pytyping_modifiers_  s    z,TemplatedTypeNode.analyse_pytyping_modifiers)FN)
r+   r,   r-   rˆ   rÃ   rÖ  r_   rÜ  r  ræ  r0   r0   r0   r1   r“  è  s   	 ÿ*
=r“  c                   @   s   e Zd ZddgZddd„ZdS )ÚCComplexBaseTypeNoder
  r…  Fc                 C   s$   | j  ||¡}| j ||¡\}}|S rs   )r
  r  r…  )rx   r}   rŒ  r  Ú_r	  r0   r0   r1   r  s  s    zCComplexBaseTypeNode.analyseN)Fr3  r0   r0   r0   r1   rç  m  s   rç  c                   @   s   e Zd ZdgZddd„ZdS )ÚCTupleBaseTypeNodeÚ
componentsFc                 C   sX   g }| j D ]2}| |¡}|jr2t|jdƒ t  S | |¡ q
| | j|¡}d|_|j	S )Nz/Tuple types can't (yet) contain Python objects.T)
rê  r  r  r   r4   r   r8  Zdeclare_tuple_typer  r	  )rx   r}   rŒ  Zcomponent_typesrœ   r	  r×   r0   r0   r1   r  ~  s    

zCTupleBaseTypeNode.analyseN)Fr3  r0   r0   r0   r1   ré  y  s   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)r  Údeclare_typedefr_   r4   rï   )rx   r}   r	  r×   r0   r0   r1   r   —  s    
z"FusedTypeNode.analyse_declarationsFc                 C   s\   g }| j D ]@}| |¡}|s*t|jdƒ q
||kr@t|jdƒ q
| |¡ q
tj|| jdS )Nr>  zType specified multiple timesrü   )rX   r  r   r4   r8  r	   Ú	FusedTyper_   )rx   r}   rŒ  rX   rp  r	  r0   r0   r1   r  ž  s    

zFusedTypeNode.analyseN)F)r+   r,   r-   rq   rˆ   r   r  r0   r0   r0   r1   rë  ‹  s   	rë  c                   @   s   e Zd ZdgZddd„ZdS )ÚCConstOrVolatileTypeNoder
  Fc                 C   s2   | j  ||¡}|jr t| jdƒ t || j| j¡S )Nz2Const/volatile base type cannot be a Python object)	r
  r  r  r   r4   r	   Zc_const_or_volatile_typer+  Zis_volatile)rx   r}   rŒ  r  r0   r0   r1   r  ¹  s    ÿz CConstOrVolatileTypeNode.analyseN)Fr3  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í   r
  ÚdeclaratorsNc                 C   sR  | j d kri | _ |s|}|| _| jr4| jd  ¡ }nd }|d k	r¦| jdkrVt| jdƒ t| jƒdkrvt| jd jdƒ td|ƒ}|j	j
|_
|D ]}| |j|| j¡ qŽ| j |¡}d }| jjrÊ| j |¡}|jrò| jsò|jsâ|jròt| jdƒ tS d | _| j}| jD ]F}t| jƒdkr@t|tƒs@|j
d r@t|jd	dƒ | joX| jdkoX|j}	|	rfd
|_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!rF| jdkrFt|jdƒ |j"rf| jdkrft|jdƒ |j#räd|j
kr€d|_$|j%|||j|| j| j| j&| j'| jd	| _| jd k	rÆt( (| j ¡| j_ |	rJ| jj) *|¡ d| j_+nf| jrøt| jdƒ | j rt| jdƒ |j,|||j||| j| j&d|d	| _t-j.rt/| j| j0ƒ| j_0qd S )Nr   r!  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)rm  r  r  rT  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)rX  r  r  Úapir  rk  z>Variables cannot be declared with 'cpdef'. Use 'cdef' instead.z,Decorators can only be followed by functions)rX  r  r  rð  Úis_cdefZpytyping_modifiers)1rm  Ú
dest_scoperï  rø   r  r   r4   r?   r   Úouter_scoperÊ   Zdeclare_typer_   r
  r  rÃ   ræ  r  r  rV  Úis_module_scoper   r×   r@   rú   r   rk  r4  r/  r  Úis_memoryviewslicer  rX  Zis_referencerl  r$  Úis_static_methodÚdeclare_cfunctionrð  r  r   r	  Úcreate_to_py_utility_codeÚcreate_wrapperrz  r    Ú
docstringsr;   r:   )rx   r}   rò  r7  Ztemplate_paramr
  r  r  r…  Zcreate_extern_wrapperro  r	  r_   rX  r0   r0   r1   r   Ô  sÜ    



ÿÿþýÿþ    ÿ   ÿ


      ý
      ýz CVarDefNode.analyse_declarations)N)r+   r,   r-   rˆ   Ú
decoratorsrm  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)r  rð  Úpacked)
r}  r_   rv  rx  r4   rX  r  rð  rþ  r×   ©rx   r}   rw  r0   r0   r1   ÚdeclareB  s          ýzCStructOrUnionDefNode.declarec                 C   s    d }| j d k	rt| jƒ}|  ||¡ | j d k	rœ| jrB|jsBd| j_| j D ]}| ||¡ qH| j	dkrœ|j
D ]0}|j}|jr‚|j}qt|| jjkrjt|jdƒ qjd S )Nr   r!  z)Struct cannot contain itself as a member.)rý  r   r_   r   r  rï   r×   r~  r   r  Úvar_entriesr	  r  r
  r   r4   )rx   r}   rw  rš   r	  r0   r0   r1   r   H  s     





z*CStructOrUnionDefNode.analyse_declarationsc                 C   s   | S rs   r0   r|   r0   r0   r1   rh   Z  s    z)CStructOrUnionDefNode.analyse_expressionsc                 C   s   d S rs   r0   r’   r0   r0   r1   rÒ   ]  s    z-CStructOrUnionDefNode.generate_execution_code)N)r+   r,   r-   rˆ   r   r   rh   rÒ   r0   r0   r0   r1   rü  4  s
   
rü  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 krd }nRdd„ | j D ƒ}tdd„ | j D ƒƒ}|rbtdd„ | j d | … D ƒƒsbt| jdƒ |j| jd | j| jg | j|d| _	d S )Nc                 S   s   g | ]\}}t  || ¡‘qS r0   ©r	   r9  ©r…   Útemplate_nameÚrequiredr0   r0   r1   r‡   s  s   ÿz(CppClassNode.declare.<locals>.<listcomp>c                 s   s   | ]\}}| V  qd S rs   r0   ©r…   rè  r  r0   r0   r1   rî   u  s     z'CppClassNode.declare.<locals>.<genexpr>c                 s   s   | ]\}}|V  qd S rs   r0   r  r0   r0   r1   rî   v  s     zGRequired template parameters must precede optional template parameters.)Úbase_classesr  r7  )
r7  Úsumrð   r   r4   Údeclare_cpp_classr_   rX  r  r×   )rx   r}   rÚ  Znum_optional_templatesr0   r0   r1   r   o  s"    
ÿ"     þzCppClassNode.declarec           
   	      s–  ˆ   ¡ stˆjddd ˆjd kr,d  }}n dd„ ˆjD ƒ}dd„ ˆjD ƒ}d ‰ˆjd k	rjtˆjˆ |d‰‡fdd	„}t|‡ ‡fd
d„ˆjD ƒƒ}ˆ j	ˆjˆˆjˆj
|ˆj|dˆ_ˆjd krÂd S dˆj_ˆd k	rÜˆjjˆ_g }‡fdd„‰ˆjd k	r|ˆjrˆ jsdˆj_ˆjD ],}t|dd ƒ}|r6| ˆ¡ | ˆ¡ qˆˆjƒD ],}	| |	¡ ˆjd k	rNdd |¡ |	_qNtˆj|dˆ_ˆˆ_d S )Nz0Using 'cppclass' while Cython is not in c++ moder   r©   c                 S   s   g | ]\}}|‘qS r0   r0   )r…   r  rè  r0   r0   r1   r‡   „  s     z5CppClassNode.analyse_declarations.<locals>.<listcomp>c                 S   s   g | ]\}}t  || ¡‘qS r0   r  r  r0   r0   r1   r‡   …  s   ÿ)r7  c                    s$   | j s| jrdS tˆ jd|  ƒ d S )NTz&Base class '%s' not a struct or class.)r"  Ú	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}   rw  r0   r1   r‡     s     )r  r7  c                 3   sb   | D ]X}t |tƒr|V  qt |tƒr8ˆ |jjƒE d H  qt |tƒr|jd k	rˆ |jƒE d H  qd S rs   )r@   ÚCFuncDefNoderÈ   r•   rÛ   r  rý  )rý  rš   )Úfunc_attributesr0   r1   r  ™  s    

z:CppClassNode.analyse_declarations.<locals>.func_attributesr   ztemplate <typename %s>z, typename rã   )r   r   r4   r7  rý  r   r_   Úfilterr  r
  rX  r  r×   r"  r	  r  rï   r~  r‰   r   r   r8  r£   Útemplate_declarationrÚ   r•   rw  )
rx   r}   rÚ  Ztemplate_namesr  Zbase_class_typesZdefined_funcsrš   r   rQ   r0   )r}   r  rw  rx   r1   r   |  s\    þ

ÿ
     þ




z!CppClassNode.analyse_declarationsc                 C   s   | j  | jjj¡| _ | S rs   )r•   rh   r×   r	  rw  r|   r0   r0   r1   rh   °  s    z CppClassNode.analyse_expressionsc                 C   s   | j  | jjj|¡ d S rs   )r•   rÑ   r×   r	  rw  rë   r0   r0   r1   rÑ   ´  s    z*CppClassNode.generate_function_definitionsc                 C   s   | j  |¡ d S rs   ©r•   rÒ   r’   r0   r0   r1   rÒ   ·  s    z$CppClassNode.generate_execution_codec                 C   s   | j  |¡ d S rs   rô   r’   r0   r0   r1   r–   º  s    zCppClassNode.annotate)
r+   r,   r-   rû  r   r   rh   rÑ   rÒ   r–   r0   r0   r0   r1   r  a  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)rX  Úscopedrx  r  rð  rù  r:   )r    rú  r;   r4   r:   Zdeclare_enumr_   rX  r  rx  r  rð  rù  r×   )rx   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 k	r^t	| j
|ƒ}| jj|_|j|_n|}| jd k	rÒ| jr€|js€d| j_| jdk}|r’dnd }| jD ]4}| || j|¡ |rœd|jjd k	rÊ|jjn| }qœd S )Nz'underlying type is not an integral typer   r!  r   )r  r  r*  r   r4   r×   r	  r  r[   r   r_   rÊ   r  rï   r~  r  Úanalyse_enum_declarationsÚenum_int_value)rx   r}   rw  r  Zis_declared_enumZnext_int_enum_valuerŸ   r0   r0   r1   r   Ü  s*    





ÿz!CEnumDefNode.analyse_declarationsc                 C   s   | S rs   r0   r|   r0   r0   r1   rh   û  s    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 ]l}| d||j| ||j¡f ¡ | |tj	¡ | d| tj¡|j ¡ || |j¡f ¡ | |tj	¡ qJ|j |¡ d S )NÚpublicT©Z
manage_refz%s = PyLong_FromLong(%s); %sz,if (PyDict_SetItemString(%s, %s, %s) < 0) %s)r  rð  r_   r  ræ   r4   Ú	funcstateÚallocate_tempr	   r
   r×   Úenum_valuesrF   rX  Úerror_goto_if_nullÚ
put_gotrefÚname_in_module_stater   Zmoddict_cnamerˆ  Ú
error_gotoÚput_decref_clearÚrelease_temp)rx   rK   ÚtemprŸ   r0   r0   r1   rÒ   þ  s*    ý

üz$CEnumDefNode.generate_execution_code)	r+   r,   r-   rˆ   r:   r   r   rh   rÒ   r0   r0   r0   r1   r  ¾  s   r  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rXd|j| j	f }n| j}|j
| j	|j| j | j||j|j|joŠ|j	d kd | _}|}| j rÞ| j jr¶t| j j ƒ}n(| j jsÆ| j jrÚ| j jrÚ| j jj}nd }|d k	rì||_|j |¡ |j	r|jj |j	¡ d S )Nz%s::%s)rX  r  rð  rù  )rŽ   r)  r	  r*  rd  r	   r{  Zis_cpp_enumrX  r_   Zdeclare_constr4   r  rð  rù  r×   r¿   r'   r½   Úis_attributer  r  r8  r0  )rx   r}   Z
enum_entryZincremental_int_valuerX  r×   Z
enum_valuer0   r0   r1   r     s<    
    üz*CEnumDefItemNode.analyse_enum_declarationsN)r+   r,   r-   rˆ   r  r0   r0   r0   r1   r$    s   r$  c                   @   s,   e Zd ZddgZdd„ Zdd„ Zdd„ Zd	S )
ÚCTypeDefNoder
  r…  c                 C   sr   | j  |¡}| jj||| j| jd\}}|j}|j}|j||| j|| j| j	d}|j
r\d|_| jrn|jsnd|_d S )NrT  )rX  r  rð  Tr   )r
  r  r…  r  r  r_   rX  rì  r4   rð  r  rï   r~  )rx   r}   r  ro  r	  r_   rX  r×   r0   r0   r1   r   M  s*       ÿ
    þz!CTypeDefNode.analyse_declarationsc                 C   s   | S rs   r0   r|   r0   r0   r1   rh   ^  s    z CTypeDefNode.analyse_expressionsc                 C   s   d S rs   r0   r’   r0   r0   r1   rÒ   a  s    z$CTypeDefNode.generate_execution_codeN©r+   r,   r-   rˆ   r   rh   rÒ   r0   r0   r0   r1   r&  D  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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 ]ˆ}|jrvd}|jr@|j |¡|_|j |j|¡|_q’|jrb|jjstt|j	dƒ d |_q’t|j	dƒ d |_q
|j
r‚d}q
|r
t|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)rH   rû   r¬  rg   rd  r	  r­  r¾   r   r4   r®  )rx   r}   Zdefault_seenrt  r0   r0   r1   Úanalyse_default_valuesŽ  s"    
z"FuncDefNode.analyse_default_valuesc                 C   s8   | j D ]}|jr|j |¡|_q| jr4| j |¡| _d S rs   )rH   r†  rg   Úreturn_type_annotation©rx   r}   rt  r0   r0   r1   Úanalyse_annotations¢  s
    
zFuncDefNode.analyse_annotationsc                 C   sÊ   | j }|j}|j|kr,||j }| |¡}n<t|tƒrd|jrd|jd rd|j}| |¡}|d krh|S n|S |d kr~t	|j
dƒ nH|tk	r¬| |¡s¬t	|jj
dƒ t	|j
dƒ n||_|jjrÆ|j |¡ |S )NrŽ  r>  r?  r@  )rm  r	  r_   r  r@   r„  r†  rÊ   r•  r   r4   r
   rW  r
  rÀ  rÁ  )rx   r}   rt  rm  Ú	orig_typerp  rq  r0   r0   r1   Úalign_argument_type©  s(    


zFuncDefNode.align_argument_typec                 C   s   dS ©Nr   r0   ©rx   Úlenvr0   r0   r1   Úneed_gil_acquisitionÃ  s    z FuncDefNode.need_gil_acquisitionc                 C   s   |}|j s|jr|j}q| jrF| jr(tnt}|| jj||| jj	d}nt
| jj||d}| j|_| jj}|jr~|joz|j |_|| _|j|_|S )N)r_   ró  Úparent_scopeZ
scope_name)r_   ró  r3  )Úis_py_class_scoperV  ró  Úneeds_closureÚis_generator_expressionr   r   r×   r_   rX  r   rb  r	  r$  rJ  rK  Úlocal_scoperÊ   )rx   r}   Úgenvr^   r1  r	  r0   r0   r1   Úcreate_local_scopeÆ  s*    ýþzFuncDefNode.create_local_scopec                 C   s   | j  |¡ d S rs   r  rë   r0   r0   r1   Úgenerate_function_bodyÜ  s    z"FuncDefNode.generate_function_bodyc           '   
      s   ddl m} ˆj}|jr0|js0dtjtjf }ntj}| |¡ ˆj	 
||¡ ˆ ||¡ ˆjjdkonˆjjj}ˆjjdko„ˆjjj}|pŒ|}|rªdˆjkrªˆjdg ˆ_ˆ ¡ }	ˆjr¾d}
n4| ¡ }
|
rò|j t dd	¡¡ |jjd
 rò| ¡  | |¡ | ¡ |_|j |j_|  ˆj!¡ ˆ "||¡ | #d¡ |	rD| #|	¡ ˆ $||¡pVˆj%}ˆj&rrˆj&j'||dd ˆj'||d |}|j(s”|jrž|j)}q„ˆj*rÈ| +|j,j- .tj¡¡ | #d¡ nPˆ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rl|j7rl|j8}|j9s´|j:r‚d}n|j;ršd| <|j=¡ }| #d| .tj>¡|f ¡ | ?¡ }ˆ @|¡ ˆjA}dd„ |jBD ƒ}|joðˆj*pðˆj/}d ‰d}|s|r| C¡  d|j_d}n| ?¡ ‰|
r^| D¡  d }ˆjErTˆjE F|¡ ˆjE G¡ }| H|¡ |rnˆ 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r°| #d||j,j- P¡ tjXf ¡ n| #d||j,j- P¡ tjXf ¡ |jrì| #dtj|f ¡ n(ˆj*r| S||j,j-¡ | Y||j,j-¡ |
rdˆjZr4t[ˆjjd  ƒ}nˆjj}|j\|ˆj!|jj ˆj&d k	d! d|j_]ˆ ^||¡ |j_D ]T}|j-j;s¦|s’|j`rÈ|j2sÈ| a|¡ n"|j`rv|j2sv|jb||jjd" qv|j1D ]t}|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rT|jhjijjrT| k||¡ qTˆ l|¡ |j_D ] }|j-jgrŽ| m||ˆj!¡ qŽ|jjnr¾d}|rú|jrúˆd k	rêˆ C¡  d ‰d|j_| o¡  d|j_ˆ p||¡ |j ˆj!dd# | #d¡ | #d$¡ |jj|jjˆd kd%œ‰|f‡‡fd&d'„	‰ ˆj5}ˆj	jqsì|j:rˆtj>}ˆ d(ƒ | r||¡ nB|j;sÊ|j=}|r²| #dtj>|f ¡ n|j9sÊ| #d)tj> ¡ |
rì|jstj>ˆj!|ˆd(  d* | t|ju¡
r²ˆ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 ]}| }||¡ q | #d1¡ |j;rèdd2l m~}! |! tj>|¡ tj>}"nˆ €¡ }"|
	rHˆ d+ƒ | ¡  | #d3¡ | ‚ˆj!¡ | #d4¡ |jsd5ˆj!ˆd(  d6 | #d7¡ ˆ ƒ¡ }#|"d k		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 k	rþ|$	rþ|$}"|"d k	
r*|"tj>k
rB| #dtj>|"f ¡ n|j9
sB| #d)tj> ¡ |
rZˆ d+ƒ ˆ Š|¡ | ?¡ f‡ ‡‡fd;d<„	}%| 
s†|
s†|j;
rªˆd+ 
sœ|j;
sœt‹‚| v|j¡ n|%ƒ  nd=d<„ }%| t|jw¡
sÖ| t|ju¡sz| x|jw¡ |D ]}ˆ d(ƒ | }||¡ 
qæ|rˆ d(ƒ ˆ Œ|¡ |j;rz| | Žtj>¡¡}&| #d>|& ¡ ˆd( sT| C¡  | #d?¡ ˆd( sp| o¡  | #d¡ | t|j¡rš|%ƒ  | x|j¡ |j1D ]z}|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 ]`}|j2r2q"|j-j;rJ|j`snq"n$|s\|j`s\q"|j-jrnˆ d(ƒ |j“|ˆd( d" q"ˆj*r¦ˆ d(ƒ | ”tj|j,j-¡ |jsÞ|j=}$ˆ €¡ }"|"d krÐ|$rÐ|$}"| •tj>|¡ ˆjj–rˆjjd@krˆ d(ƒ | #dAtj>tj>f ¡ |
r4d|j_]|j—|jj d6 |jjnrj| ˜¡  |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‡   D  s      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))rJ  Zis_cpdef_func©Úhave_gil©Útraceú/* function exit code */)Úsuccessr   Úgil_state_declaredc                    s8   ˆ |  s4ˆ d s ˆ  ¡  dˆ d< |jdd dˆ | < d S )NrO  TF©Údeclare_gilstate)rQ  Úput_ensure_gil)Z	code_pathrK   )Ú	gil_ownedÚgilstate_declr0   r1   Ú
assure_gilß  s    z=FuncDefNode.generate_function_definitions.<locals>.assure_gilrN  z!__Pyx_pretend_to_initialize(&%s);©rb  rJ  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)rJ  ú#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sZtdˆjˆd ˆd f ƒ‚d S )NrN  r   ©rK   Fz$%s: error path %s != success path %s)Úput_release_ensured_gilÚAssertionErrorr4   r]  )rU  rS  rx   r0   r1   Ú$align_error_path_gil_to_success_pathD	  s      ÿzWFuncDefNode.generate_function_definitions.<locals>.align_error_path_gil_to_success_pathc                   S   s   d S rs   r0   r0   r0   r0   r1   r`  Z	  ó    ú	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Þ  r7  Úis_closure_scopeZis_passthroughr   Úcur_scope_cnameÚouter_scope_cnameZmangle_closure_cnamesr•   rÑ   rÙ   r×   r_   rw  rV  r  Úget_preprocessor_guardÚis_generatorÚ
is_tracingrÐ   rÍ  r   Úload_cachedrÊ   Zuse_fast_gil_utility_codeÚenter_cfunc_scopeÚ	new_labelÚreturn_from_error_cleanup_labelrJ  r  rS  ræ   r4   rØ   rF   Úneeds_assignment_synthesisÚpymethdef_requiredÚpy_funcÚgenerate_function_headerr4  ró  r5  ÚputÚscope_classr	  r  Úneeds_outer_scopeÚgenerate_argument_declarationsr  Ú
in_closurer’  Úput_var_declarationrb  Zis_cv_qualifiedr+  Zcv_base_typer  r  rõ  Zliteral_coderh  Úretval_cnamerB   Úgenerate_keyword_listrd  Zbuffer_entriesrR  Ú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
   r   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_xdecrefr?   Ú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_cleanupr_  Ú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)'rx   r}   rK   rÞ  r1  ri  Zis_getbuffer_slotZis_releasebuffer_slotZis_buffer_slotÚpreprocessor_guardÚtracingr?  Úcenvr×   Úinitrb  Útempvardecl_coderd  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ÚvalrX  r	  Zbuffers_presentrÉ  Úerr_valrs  Zdefault_retvalr`  Úcondr0   )rU  rS  rT  rx   r1   rÑ   ß  sâ   ÿ
ÿÿ

ÿ



ÿ  ÿ




þ





ÿ

ûþ


ý

ý   ÿ

ÿ


ÿ







ý	
   ÿ









ÿ
ÿþ


ÿ
ÿ
ÿ






 ÿ

z)FuncDefNode.generate_function_definitionsc                 C   sh   |j jrt|jdƒ n,|j  ¡ sB|j jsB|j jsBt|jd|j  ƒ | |j|j |j¡}|j	rd|j	|_	|S )NzInvalid use of 'void'z Argument type '%s' is incomplete)
r	  r  r   r4   r/  r  rõ  Zdeclare_argr_   r†  )rx   r}   rt  r×   r0   r0   r1   Údeclare_argumentÎ	  s    zFuncDefNode.declare_argumentc                 C   s   |j  ¡ r€|j t dd¡¡ | |j ¡}d|jj }d}|j j	rX|j j
rX|jrTdnd}| d|||j|j|| |j¡f ¡ n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)r	  Ztypeobj_is_availablerÐ   rÍ  r   rm  Útypeptr_cname_in_module_stater×   rX  Úis_builtin_typeZrequire_exactrœ  rF   Úaccept_noner‰  r   r4   r   )rx   rt  rK   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éÈ   rH  )
r	  rõ  r×   rX  rF   r˜   r?   r‰  r   r4   )rx   rt  rK   rX  r0   r0   r1   Úgenerate_arg_none_checkï	  s     
þz#FuncDefNode.generate_arg_none_checkc                 C   s   d S rs   r0   r’   r0   r0   r1   r°  ü	  s    z&FuncDefNode.generate_wrapper_functionsc                 C   s2   |  | j¡ | js.| jD ]}|js| |¡ qd S rs   )ræ   r4   rÁ   rH   r°  rª  ©rx   rK   rt  r0   r0   r1   rÒ   ÿ	  s
    
z#FuncDefNode.generate_execution_codec              	   C   sH   | j jd }z|jjjjd j}W n ttfk
r>   d }Y nX ||fS )Nr   Úobj)r7  rŠ  r	  r
  rw  rÖ   r—   ÚKeyError)rx   Ú	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;rH  )rÊ  rX  rF   )rx   rK   rÈ  rè  Úviewr0   r0   r1   r  
  s    

zFuncDefNode.getbuffer_checkc                 C   sP   |   ¡ \}}|j}|r>|jr>| d| |¡ | d| |¡ n| d| ¡ d S )Nú%s->objz%s->obj = NULL;)rÊ  rX  r  r  r¥  rF   ©rx   rK   rÈ  rÉ  rË  r0   r0   r1   r‚  $
  s    
zFuncDefNode.getbuffer_initc                 C   sh   |   ¡ \}}|j}|rV|jrV| d| ¡ | d| |¡ | d| |¡ | d¡ n| d| ¡ d S )Nzif (%s->obj != NULL) {rÌ  rH  zPy_CLEAR(%s->obj);©rÊ  rX  r  rF   r  r!  rÍ  r0   r0   r1   r¢  -
  s    
z#FuncDefNode.getbuffer_error_cleanupc                 C   sX   |   ¡ \}}|j}|rT|jrT| d| ¡ | d| |¡ | d| |¡ | d¡ d S )Nzif (%s->obj == Py_None) {rÌ  rH  rÎ  rÍ  r0   r0   r1   r£  8
  s    
z$FuncDefNode.getbuffer_normal_cleanupc                 C   sh   | j jsd S | j j}t | jj¡ |¡}|s0d S |dkrJ| j j 	d¡sJd S |dkr`| j jj
r`d S | ¡ S )NZ__long__Ú__int__©r;  r<  )r×   r©  r_   r   Úget_slot_tabler7  rÊ   Úget_slot_by_method_namerw  rÒ  rV  Úpreprocessor_guard_code)rx   r_   Úslotr0   r0   r1   rj  A
  s    z"FuncDefNode.get_preprocessor_guard)'r+   r,   r-   rs  r5  rw  rr  rk  r6  Úis_coroutineÚis_asyncgenÚis_generator_bodyZis_async_defr  Úhas_fused_argumentsÚstar_argÚstarstar_argr…  r~  r*  rÅ   r)  r,  r.  r2  r9  r:  rÑ   rº  rÂ  rÄ  r°  rÒ   rÊ  r  r‚  r¢  r£  rj  r0   r0   r0   r1   r(  e  sN      r
			r(  c                       s"  e Zd Zdddddg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d9dd„Zdd„ Zdd„ Zdd„ Zdd„ Zd:d d!„Zd;d#d$„Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Z d-d.„ Z!‡ fd/d0„Z"d1d2„ Z#d3d4„ Z$d5d6„ Z%‡ fd7d8„Z&‡  Z'S )<r  r
  r…  r•   rû  Úpy_func_statFNc                 C   s   | j jS rs   )r×   r_   rƒ   r0   r0   r1   Úunqualified_namet
  s    zCFuncDefNode.unqualified_namec                 C   s
   | j  ¡ S rs   r‡  rƒ   r0   r0   r1   r÷   w
  s    zCFuncDefNode.declared_namec                 C   s   | j r| j jS | jS rs   )rs  r~  Ú_code_objectrƒ   r0   r0   r1   r~  z
  s    zCFuncDefNode.code_objectc                 C   s
   || _ d S rs   )rÝ  )rx   r~  r0   r0   r1   r~  
  s    c                 C   st  |j d | _|j| _| jd kr$i | _| j |j  di ¡¡ | jd k	rn| j |¡}|d krzt	| jj
dƒ tj}n| j |¡}d|j koŽ| d¡ | _t| jtƒrÈ| jj||d| jd k	 | j| jd\}}n$| jj||d| jd k	 | jd\}}|jsþt	| j
dƒ || _| j|_| j}t|d	ƒs(|j}q|| _|j| _| jj}| jd
ksR| jrf|rft	| jj
dƒ |j dkr°| jdkr°|j!d k	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+r0d| j,kr0t#|j
ddƒ |jj+sD|jj-r¾| jj.r\t	|j
dƒ nd| j,kr¾t#|j
ddƒ q¾|  (|j/| j
|¡ |j&}	|j'}
| j0|_0| j|_|j1|	|| j
|
| j| j| jd k	| j,| j| j2d
| _3|j/| _/| j/j4r| jdkrt	| j
dƒ | j/j5r| j/ 6| j
d¡ | jr\|j7s\| js\t8| jƒdk sV| jd jj9s\d| _|  :|¡ |  ;|¡ d S )NÚc_compile_guardÚlocalsr>  ré   r%   )r  rm  r  )r  r  z*Suite attached to non-function declarationrH   r  zBFunction with optional arguments may not be declared public or apirA  r!  z/Only extern functions can throw C++ exceptions.TÚinlinez$Buffer unpacking not optimized away.r   zUBuffer may not be acquired without the GIL. Consider using memoryview slices instead.)rX  r  rð  Údefiningr  rk  r  zFunction cannot return an arrayzused as a return valuer   F)<rÊ   rÞ  rV  Úis_c_class_methodrm  rw   ÚgetÚdirective_returnsr  r   r4   r	   r   r
  r  rÒ  rö  r@   r…  r4  r•   r  r$  r	  rk  rL  Úhasattrr  Zcfunc_declaratorrH   rH  rð  rI  r5  r½   r   Úzipr.  r_   rX  Ú_validate_type_visibilityr  rØ  r  r  Úis_pythran_exprrJ  rb  rM  r÷  Úinline_in_pxdr×   r  r"  Zcheck_nullary_constructorrô  r?   r  Údeclare_cpdef_wrapperr9  )rx   r}   r
  ro  Útypr…  Zopt_arg_countÚ
formal_argÚtype_argr_   rX  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"sTt#‚| j| j!_n*t$| j| jd| _!t| j| j!| j%gd| _%d S )Nz&static cpdef methods not yet supported)rô  F)Úprofiler=  r   ©r6  ré   rü   ©Ú	decoratorr   rã   )	r4   r_   rH   rÙ  rÚ  r:   r•   rû  rÁ   T)rs  )&rk  rö  r   r4   Úcall_self_noderô  rÈ   rÌ   r&  r6  ÚDecoratorNoder   rñ  rg   r×   r_   ÚDefNoderH   r:   rÚ   rs  r   rL  rÛ  r	   r
   r	  Úas_variabler  rÖ   Úis_final_cmethodr    Úlookup_module_cpdefÚoverrideÚis_fused_specializedr_  ÚOverrideCheckNoder•   )rx   r}   Zpy_func_bodyr6  rû  r_   r0   r0   r1   rê  é
  sZ       ÿø	



ÿÿz"CFuncDefNode.declare_cpdef_wrapperc                 C   sN   | j dkp| j}t|ddƒ}|rJ|rJ|jrJ|j dksJ|jsJ|jsJt|dƒ dS )zo
        Ensure that types used in cdef functions are public or api, or
        defined in a C header.
        r  r×   N)r  r!  z:Function declared public or api may not have private types)r  rð  r‰   rô  rï   r   )rx   r	  r4   r}   Zpublic_or_apir×   r0   r0   r1   rç    s    
ÿÿz&CFuncDefNode._validate_type_visibilityr   c                    s   ddl m‰  ˆjj}|r0|d t|ƒˆjj … }dd„ |D ƒ}|r\ˆ jˆjˆjj	d}|}n‚ˆjj
r ˆ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}|oætj }ˆ jˆj|‡ ‡fdd„|D ƒ|d	}tˆjtj|d
S )Nr   ©r&  c                 S   s   g | ]
}|j ‘qS r0   rü   ©r…   rt  r0   r0   r1   r‡   )  s     z/CFuncDefNode.call_self_node.<locals>.<listcomp>rü   )rÆ  Ú	attributer   c                    s   g | ]}ˆ j ˆj|d ‘qS ©rü   )r6  r4   )r…   Ún©r&  rx   r0   r1   r‡   <  s     )ÚfunctionrH   Zwrapper_call)r4   rb  rŽ   )r°   r&  r	  rH   r?   rH  r6  r4   r×   r_   rö  rw  rZ  ZAttributeNoder    r÷  ÚSimpleCallNodeÚReturnStatNoder	   r
   )rx   Zomit_optional_argsrô  rH   Ú	arg_namesÚcfuncZcall_arg_namesZclass_entryZ
class_noderÓ  rí  Zskip_dispatchZc_callr0   r   r1   rò  $  s2    üzCFuncDefNode.call_self_nodec                 C   s0   | j jD ]"}|jst|jdƒ |  ||¡ qd S )Nrý   )r	  rH   r_   r   r4   rº  r+  r0   r0   r1   Údeclare_arguments@  s    zCFuncDefNode.declare_argumentsc                 C   s   | j jS rs   )r	  rK  r0  r0   r0   r1   r2  F  s    z!CFuncDefNode.need_gil_acquisitionc                 C   sV   | j }|j}|jrR|sR|jjr*t| jdƒ | jjD ]}|j jr2|j	s2t| jdƒ q2d S )Nz9Function with Python return type cannot be declared nogilz8Function declared nogil has Python locals or temporaries)
r	  rK  rJ  rb  r  r   r4   r7  r  Zin_with_gil_block)rx   r}   r	  rK  r×   r0   r0   r1   rÆ   I  s    
ÿzCFuncDefNode.nogil_checkc                 C   sd   |j | j_ | jd k	r$| j |¡| _n.| jd k	r>| j |¡| _n|  |¡ |  |¡ |  | j¡| _| S rs   )	rÊ   r7  rÛ  rh   rs  r)  r,  r2  rd  r|   r0   r0   r1   rh   T  s    




z CFuncDefNode.analyse_expressionsc                 C   s   dS ©NFr0   rë   r0   r0   r1   rq  b  s    z'CFuncDefNode.needs_assignment_synthesisr   c                 C   sâ  | j }g }| j}|jd t|jƒ|j … D ]0}	|	 ¡ }
| |	j¡}|jsPd|
 }
| 	|
¡ q*|r”| j
r”tj tj¡}| jr†| 	|¡ n| 	d| ¡ |jr²|r²| 	|j tj¡¡ |jrÂ| 	d¡ |sÌdg}|d krÜ| jj}| |d |¡¡}| jjdkrd|krd}nd}d }| | jj¡}| jj||d	}| jp@| jj}| jrp|rd|jjd
   | j¡ |  | j¡ |rÊ|  !¡ }|r–|jjd
   |¡ |jjd
   d|||f ¡ |rÊ|jjd
   d¡ |  d|||f ¡ d S )NzCYTHON_UNUSED %sz...Úvoidrž   Úprivatez::zstatic r°   )Údll_linkageZmodule_declarationsz%s%s%s; /* proto*/r[  z%s%s%s {)"r7  r	  rH   r?   rH  r  rº  r_   Úcf_usedr8  rk  r	   r{  r   Úskip_dispatch_cnamerø  r€  Úoptional_args_cnamerj  r×   Ú
func_cnameZfunction_header_coder£   r  Zbuild_function_modifiersZfunc_modifiersrb  râ  rÂ   r  rÐ   ÚpartsrF   rj  )rx   rK   r?  Úwith_opt_argsÚwith_dispatchrX  rw  Z	arg_declsr	  rt  Zarg_declr×   Zdispatch_argÚentityZstorage_classr
  r  ÚheaderZneeds_protor±  r0   r0   r1   rt  e  s\    
ÿ

ÿz%CFuncDefNode.generate_function_headerc                 C   sZ   | j }| jD ]H}|jr| |j¡}| js.|jr| |¡}| d|j	 
|j¡|f ¡ qd S r¡  )r7  rH   rû   rº  r_   rø  r  r   rF   r	  r  rX  )rx   r}   rK   rw  rt  r×   rŒ   r0   r0   r1   rx  —  s    

 ÿz+CFuncDefNode.generate_argument_declarationsc                 C   s   d S rs   r0   r’   r0   r0   r1   r|  ¡  s    z"CFuncDefNode.generate_keyword_listc           
   	      s  d}d}| j }| jjrÔˆ dtj ¡ | jD ]„‰ ˆ jr,| ˆ j	¡}| j
sN|jr¨ˆ dtjtj|f ¡ ˆ j}t|dƒs~|j}qlˆ dˆ jtj| j |j	¡f ¡ |d7 }|d7 }q,t|ƒD ]}ˆ d¡ qºˆ d¡ ‡ ‡fdd	„}	| jD ]‰ |	| ˆ j	¡ƒ qèd S )
Nr   rb  zif (%s->%sn > %s) {r_   z%s = %s->%s;r   rH  c                    sV   | j rRˆ jsRˆ d| j| jf ¡ | jjr>| j ˆ| jd¡ nˆ | ¡ ˆ 	| ¡ d S )Nr¢  T)
ry  rû   rF   rX  Úoriginal_cnamer	  rõ  Úgenerate_incref_memoryviewslicer‹  Úput_var_giveref©r×   ©rt  rK   r0   r1   Úput_into_closure¾  s    
zECFuncDefNode.generate_argument_parsing_code.<locals>.put_into_closure)r7  r	  rH  rF   r   r  rH   rû   rº  r_   rø  r  ry  r…  rå  r  rX  Zopt_arg_cnameÚrangerÒ  )
rx   r}   rK   rn  r  rw  r×   r…  rè  r  r0   r  r1   r‰  ¤  s>    
 ÿÿ
ÿÿ


z+CFuncDefNode.generate_argument_parsing_codec                 C   s   d S rs   r0   r’   r0   r0   r1   Ú!generate_argument_conversion_codeÊ  s    z.CFuncDefNode.generate_argument_conversion_codec                 C   s@   | j jD ]2}|jr |  ||¡ q|j jr|js|  ||¡ qd S rs   )r	  rH   Úneeds_type_testrÂ  r  r¿  rÄ  rÅ  r0   r0   r1   r  Í  s
    z)CFuncDefNode.generate_argument_type_testsc                    sD   |j jd r"| | j¡ | d¡ tƒ  |¡ | jr@| j |¡ d S )Nr=  r°   )rÐ   rÊ   ræ   r4   rF   r\   rÒ   rÛ  r’   rd   r0   r1   rÒ   Ö  s    
z$CFuncDefNode.generate_execution_codec                 C   s   | j jrdS | jjjS d S )NÚ0)rb  r  r×   r	  r5  rƒ   r0   r0   r1   rš  Þ  s    zCFuncDefNode.error_valuec                 C   s
   | j jjS rs   )r×   r	  rI  rƒ   r0   r0   r1   r  ä  s    z)CFuncDefNode.caller_will_check_exceptionsc                 C   s  d}| j }|j}|jd k	r|d7 }|j}d| j jtj|f |_| ¡  | j|d|jj|jj	|jd | j
jsx| d¡ | jj}dd„ |d t|ƒ| jj	 … D ƒ}|jjr¸| tj¡ n|jrÈ| d¡ |jj	rÞ| tj¡ n|j	rî| d	¡ | d
| j jd |¡f ¡ | d¡ qd S )Nr   r   z%s%swrap_%s)r  r  rX  úreturn c                 S   s   g | ]
}|j ‘qS r0   )rX  rü  r0   r0   r1   r‡   ú  s     z;CFuncDefNode.generate_wrapper_functions.<locals>.<listcomp>r  rZ  ú%s(%s);rž   rH  )r×   r	  Z
prev_entryr  r   ry  rF   rt  rL  rH  rb  r  ru  rH   r?   r8  r  r  r£   )rx   rK   Úkr×   rO  rH   Zarglistr0   r0   r1   r°  ç  s:     ü
"

z'CFuncDefNode.generate_wrapper_functionsc                    s(   t ƒ  ¡ }| jr$|rt‚d| j› S |S )Nz#if )r\   rj  rÞ  r_  )rx   Zsuper_guardrd   r0   r1   rj    s
    
z#CFuncDefNode.get_preprocessor_guard)r   r   )N)r   r   N)(r+   r,   r-   rˆ   rÅ   ré  rû  rm  rä  rø  r  rM  rÛ  rÝ  rÜ  r÷   r±  r~  Úsetterr   rê  rç  rò  r  r2  rÆ   rh   rq  rt  rx  r|  r‰  r  r  rÒ   rš  r  r°  rj  re   r0   r0   rd   r1   r  O
  sJ   

f/


2
&	r  c                   @   s    e Zd Zg ZdZdZdd„ ZdS )ÚPyArgDeclNodeFc                 C   s   | j  ||¡ d S rs   )r×   rÑ   rë   r0   r0   r1   rÑ     s    z+PyArgDeclNode.generate_function_definitionsN)r+   r,   r-   rˆ   r=  r«  rÑ   r0   r0   r0   r1   r"    s   r"  c                   @   s   e Zd ZdgZdS )ró  rñ  N)r+   r,   r-   rˆ   r0   r0   r0   r1   ró    s   ró  c                	   @   s&  e Zd Zddddddg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d6d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%d7d$d%„Z&d&d'„ Z'd(d)„ Z(d*d+„ Z)d8d,d-„Z*d.d/„ Z+d0d1„ Z,d2d3„ Z-d4d5„ Z.dS )9rô  rH   rÙ  rÚ  r•   rû  r*  FNr  r   Tc                 K   s€   t j| |f|Ž d } } }}| jD ]<}|jr8|d7 }|jrT|d7 }|jsT|d7 }|js&|d7 }q&|| _|| _|| _|| _	d S r2   )
r(  rz   rH   r¯  r®  rû   Únum_posonly_argsÚnum_kwonly_argsÚnum_required_kw_argsÚnum_required_args)rx   r4   rI   Úpr   ZrkÚrrt  r0   r0   r1   rz   V  s    

zDefNode.__init__c
                 C   s$  | j rt| j jdƒ | jr(t| jjdƒ |p.d\}
}|p:|	}|d kr°g }| jD ]6}|j|dd\}}| tj|j	d |j
t|jd¡ qNtjt|dd |||	|d}t| j|d	}n¸|d kr¾|j}|j}|jrÎd
}t| jƒt|jƒksê|jrt| jdƒ t|jdƒ tt| j|jƒƒD ]R\}\}}|j|d|dko6|jd\}}|d ksV|tjkr|j|_||_q|
d kr¨|jd k	r¨ddlm} |j| jt|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 argumentr  r   r  )r_   rX  r†  r	  r4   F)rb  rH   rj  r5  rI  rJ  rK  rL  r´  Tzwrong number of argumentszprevious declaration herer   r<  rC  rE  rß  )r  rH   rj  rI  r5  r^  rK  rJ  r	  rm  )r  r
  r…  r•   r:   rk  r	  rK  rJ  r  rð  rm  rä  )'rÙ  r   r4   rÚ  rH   r  r8  r	   r[  r_   r†  r
   ri  rí   rw  r	  rI  r?   rj  rU  ræ  rV  ro  r5  r&  rD  r_  r`  rb  r4  rú   rK  rJ  r  r˜  r•   r:   rL  r‰   )rx   r  rw  rk  ZreturnsZ
except_valr^  r  rJ  rK  r5  rI  Z
cfunc_argsrì  ro  r	  Z
cfunc_typern  rí  rD  r…  r0   r0   r1   Úas_cfunctionh  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)r5  rÙ  rÚ  rƒ   r0   r0   r1   Úis_cdef_func_compatible³  s
    zDefNode.is_cdef_func_compatiblec              	   C   sà  | j rF| j D ]8}|j}|jr|  j|jdkO  _|  j|jdkO  _q| jr\| d¡r\d| _| jrr| d¡rrd| _|js€|jr| jdkr˜|jr˜d| _nv| jdkr¶|jr¶t	| j
dƒ nX| jtkr| jsd| _dd	lm} | j päg | _ | j  d
t| j
|| j
tdƒdd¡ |  |¡ | jdkr0|  |¡ n
|  |¡ |  |¡ | jj ¡ | _| jtk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   rï  r   rü   rð  ú<lambda>rŽ  )r¨  r_   rH   rÙ  rÚ  rb  )%rû  rñ  r½   Úis_classmethodr_   Úis_staticmethodrÒ  r4  rV  r   r4   ÚIMPLICIT_CLASSMETHODSr&  r6  Úinsertró  r   Úanalyse_argument_typesÚdeclare_lambda_functionÚdeclare_pyfunctionÚanalyse_signaturer×   Ú	signaturerb  r
   r*  rÊ   r©  r—  r  r9  ÚDefNodeWrapperrH   rÙ  rÚ  Ú
py_wrapperr   )rx   r}   rñ  rQ   r6  rè  rb  r0   r0   r1   r   ¾  sZ    

 ÿ



ùzDefNode.analyse_declarationsc                 C   sÚ  |j  di ¡| _|j d }|j}d |_| jD ]x}t|dƒrBd }nJ|j |¡}t|ƒrl|j	rlt
 ||jg¡}|j ||¡\}}|j|_||_|  ||¡ |r®|jr®t| jdƒ |j ¡ |_d |_d|_d|_d|_|jjsì|jjsì|jjr`|jrúd|_nd|jr
d|_nT|jjs2|jj s2|jjs2|jjrX|j!rP|j!j"d krPd|_n||_nd|_n8|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 ƒ| _'ng | _'d S )Nrß  Úallow_none_for_extension_argsr_   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   )r	  Zis_numpy_buffer)r…   rn  Úar0   r0   r1   r‡   1  s      z2DefNode.analyse_argument_types.<locals>.<listcomp>)(rÊ   rã  rm  r  rH   rå  r
  r  r"   rè  r	   rí  Z
org_bufferr…  r_   r	  r.  rX  r   r4   Zas_argument_typeÚhdr_typerŠ  r  r¬  r  r  rõ  r]  r¿  r\  Úis_extension_typer¾  rû   rF  ra  r  rØ  rU  Únp_args_idx)rx   r}   r7  Zf2srt  ro  r
  r	  r0   r0   r1   r0  õ  sf    

ýÿ
ÿÿ

zDefNode.analyse_argument_typesc           	      C   s¶  | j jr<| jrt| jdƒ t| jƒdko4| jp2| j | j _	nò| js.| js.|j
d rltdd„ | jD ƒƒr.| j jtjkrÊt| jƒdkr”tj| j _n4t| jƒdkrÈ| jd jd krÈ| jd jsÈtj| j _nd| j jtjkr.t| jƒdkrôtj| j _n:t| jƒdkr.| jd jd kr.| jd js.tj| j _| j j}| ¡ }| ¡ }|tjkr|dkrt| jƒdkr| jrt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 ]²}| j| }d|_$||kr8d|_%| &|¡r†| js†| jrjd|_'t(j) |_*|_+nd|_&|j, |_*|_+d|_-n>| .|¡|_*|j+ /|j*¡s|j*j0r¾|j+j0r¾d|_1nd|_-q|t| jƒkrä|  2¡  d S |t| jƒk r4|js|  2¡  | jD ](}|j$r
|j+j3s*|j+j4r
d|_1q
| 5¡ }|r²tj6|kr²| j js²| jr˜d}| jD ]*}|j$rj|jsj|j&sj|j'sjd
}qjnd
}|s²| 7¡  }| j _d S )Nz8special functions of cdef classes cannot have decoratorsr   Zalways_allow_keywordsc                 S   s   g | ]
}|j ‘qS r0   ©r¯  rü  r0   r0   r1   r‡   <  s     z-DefNode.analyse_signature.<locals>.<listcomp>r   r%   TrG  F)8r×   r©  rû  r   r4   r?   rH   rÙ  rÚ  Ztrivial_signaturerÊ   rð   r4  r   Zpyfunction_signatureZpyfunction_noargsrû   r®  Zpyfunction_oneargZpymethod_signatureZ	unaryfuncZibinaryfuncÚmax_num_fixed_argsÚmin_num_fixed_argsÚself_in_starargr-  rV  r   Zfixed_arg_formatÚhas_generic_argsr,  rØ  Zdecorator_indirectionrÛ   r  Úminr¬  r­  r=  r«  r   Ú	type_typer9  r	  rZ  rŠ  Zfixed_arg_typerW  r  r  Úbad_signaturer:  r¾  Úmethod_flagsZmethod_varargsZwith_fastcall)	rx   r}   ÚsigZnfixedZ
min_nfixedrn  rt  ÚmfZuses_args_tupler0   r0   r1   r3  5  sª    "ÿþ 
ÿÿÿÿ





ÿÿ
zDefNode.analyse_signaturec                 C   sv   | j j}d| ¡  }|jr$|d7 }n|jr:|d| ¡  7 }| j}| j jrNd}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×   r4  r>  r@  Zoptional_object_arg_countr=  r_   r©  r   r4   r?   rH   )rx   rE  Zexpected_strr_   Údescr0   r0   r1   rC  œ  s     
   ÿzDefNode.bad_signaturec                 C   s  | j }| |¡}|rP|jr.|jjs.t| jdƒ |jjrP|j	sP| j
sPt| 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ksè|jrè|j dkrð|jd rðd |_nttj| | ƒ|_n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) r_   rÒ  rö  rZ  Úis_final_typer   r4   r	  r$  Zis_builtin_cmethodrÁ   r   r2  r×   Únext_idÚscope_prefixr   r   Zpyfunc_prefixÚpyfunc_cnamer    rú  r;   r:   Zfuncdoc_prefixÚ	doc_cnamer©  r   Z	invisiblerÊ   Úwrapperbase_cnameZwrapperbase_prefix)rx   r}   r_   r×   Úprefixr0   r0   r1   r2  «  s2    
þÿÿzDefNode.declare_pyfunctionc                 C   s*   |  | j| j¡}d |_|| _|j| j_d S rs   )r1  Úlambda_namer4   r:   r×   rX  rM  )rx   r}   r×   r0   r0   r1   r1  Æ  s    zDefNode.declare_lambda_functionc                 C   s”   | j D ]l}|jst|jdƒ |jrJ| |j|j|j¡|_|jjrXd|j_	n|  
||¡|_d|j_d|j_|j|j_q|  || j¡ |  || j¡ d S )Nrý   r  r   )rH   r_   r   r4   rŠ  rz  r	  r×   r  r´  rº  r’  r  r=  Údeclare_python_argrÙ  rÚ  r+  r0   r0   r1   r  Ì  s    

zDefNode.declare_argumentsc                 C   sR   |rN|j d dkrtj}nt}| |j||j¡}d|_d|_d|_	d|_
||_d S )NZinfer_typesFr   r  )rÊ   r	   Zunspecified_typer
   rz  r_   r4   r’  r  r´  r  r×   )rx   r}   rt  r	  r×   r0   r0   r1   rR  Ü  s    zDefNode.declare_python_argc                 C   sb   |j | j_ |  |¡ |  |¡ |  |¡sR| jrR| jd d d… D ]}|j |¡|_q>| j 	|¡ | S )Nr´   )
rÊ   r7  r)  r,  rq  rû  rñ  rh   r6  Úprepare_argument_coercion)rx   r}   rñ  r0   r0   r1   rh   é  s    


zDefNode.analyse_expressionsc                 C   sv   | j r
dS | js| jjrdS | jr&dS | jjr2dS | jjr>dS |jsJ|jrj|d kr^| j	j
d S |jj
d S |jpt|jS )NTFZbinding)r-  Úspecialized_cpdefsr×   rù  Úno_assignment_synthesisr©  Zis_anonymousrô  rV  r7  rÊ   rÐ   r4  rg  rë   r0   r0   r1   rq  õ  s    z"DefNode.needs_assignment_synthesisc                 C   s
   | j jjS rs   )r×   r4  rš  rƒ   r0   r0   r1   rš    s    zDefNode.error_valuec                 C   s
   | j jjS rs   )r×   r4  rI  rƒ   r0   r0   r1   r  
  s    z$DefNode.caller_will_check_exceptionsc                 C   sZ   | j r(| ¡ }t | j |¡}| ||¡ | jrH| jj| j_| j ||¡ t	 | ||¡ d S rs   )
Údefaults_getterrÕ   rÈ   rÍ   rÑ   Úpy_wrapper_requiredr×   r  r6  r(  )rx   r}   rK   Ú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rNdtj }| jsDd| }| 	|¡ dd„ }| j
D ]}| 	||ƒ¡ q\| jr†| 	|| jƒ¡ | jrœ| 	|| jƒ¡ |r¬d |¡}nd}| j | jj¡}	|jd }
|  ¡ }|rà|
 |¡ |
 d	|	|f ¡ |r|
 d
¡ | d|	|f ¡ d S )NTúPyObject *%súCYTHON_UNUSED c                 S   s8   | j }|jr|j}n|j}|j |¡}|js4d| }|S )NrZ  )r×   ry  r  rX  r	  r  r  )rt  r×   rX  Údeclr0   r0   r1   Úarg_decl_code(  s    z7DefNode.generate_function_header.<locals>.arg_decl_coderž   r  Zdeclszstatic %s(%s); /* proto */r[  zstatic %s(%s) {)rW  r6  rt  r×   r4  Úhas_dummy_argr   r†  rw  r8  rH   rÙ  rÚ  r£   rb  r  rM  rÐ   rj  rF   )rx   rK   r?  r@  Úarg_code_listÚself_argr\  rt  rÀ  ÚdcZ
decls_coder±  r0   r0   r1   rt    sF      ÿ






ÿ
z DefNode.generate_function_headerc                 C   s   d S rs   r0   rë   r0   r0   r1   rx  I  s    z&DefNode.generate_argument_declarationsc                 C   s   d S rs   r0   r’   r0   r0   r1   r|  L  s    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 r¬| jjrJ| jjd k	st‚ˆ j t dd¡¡ ˆ  	d 
| j| j¡¡ nˆ  	d| j| jf ¡ | jjr|| j ˆ | jd¡ n0| jr˜ˆ  | ¡ ˆ  | ¡ nˆ  | ¡ ˆ  | ¡ d S )NZIncludeStringHzStringTools.czmemcpy({0}, {1}, sizeof({0}));r¢  T)ry  r	  r  r2  r_  rÐ   rÍ  r   rm  rF   ÚformatrX  r  rõ  r  r  rŽ  Zput_var_xgiverefr‹  r  r  r]  r0   r1   r  Q  s    

z@DefNode.generate_argument_parsing_code.<locals>.put_into_closure)rH   r×   rÙ  rÚ  )rx   r}   rK   r  rt  r0   r]  r1   r‰  O  s    
z&DefNode.generate_argument_parsing_codec                 C   s   d S rs   r0   r’   r0   r0   r1   r  n  s    z$DefNode.generate_argument_type_tests)	NNTNNFNFF)N)r   )/r+   r,   r-   rˆ   rÅ   r-  r,  rQ  Zreqd_kw_flags_cnamerÁ   rU  rû  r*  r×   rd  r?  Zpy_cfunc_nodeÚrequires_classobjÚdefaults_structr:   Úfused_py_funcrT  r6  rW  r  rV  rz   r)  r*  r   r0  r3  rC  r2  r1  r  rR  rh   rq  rš  r  rÑ   rt  rx  r|  r‰  r  r0   r0   r0   r1   rô  $  s`         ÿ
K7@g

.rô  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 );r5  NFc                 O   sN   t j| f|ž|Ž | jj| _| jj| _| jj| _| jj| _| jj| _d | _d S rs   )	r(  rz   r¨  r#  r$  r%  r&  r?  r4  )rx   rH   rk   r0   r0   r1   rz   y  s    




zDefNodeWrapper.__init__c                 C   sX   | j j}| j}| |j¡}ttj| | ƒ|_ttj	| | ƒ|_
|j| _| j j| _d S rs   )r¨  r×   r_   rK  rL  r   r   Zpywrap_prefixr  Zpymethdef_prefixÚpymethdef_cnamer4  r;  )rx   r}   Útarget_entryr_   rP  r0   r0   r1   r   ‚  s    z#DefNodeWrapper.analyse_declarationsc                 C   s€   | j D ]4}|jjs |j |¡s:q|jr|jjs|j |¡sq| jr|| jjjs|| jj}d|_	|j
D ]}|js`|jjr`d|j_q`d S )Nr   T)rH   r	  r  Úcreate_from_py_utility_coder9  rø  rÚ  r×   r  r  Zcf_assignmentsr’  r¶  r½   Zcf_maybe_null)rx   r}   rt  r×   Zassr0   r0   r1   rS    s    

z(DefNodeWrapper.prepare_argument_coercionc                 C   s:   t | jƒ}|dks2|dkr6| jd js2| jd jr6dS dS r2   )r?   rH   r=  r«  )rx   Zargcountr0   r0   r1   Úsignature_has_nongeneric_args£  s    
ÿ
ÿ
þz,DefNodeWrapper.signature_has_nongeneric_argsc                 C   s   | j jS rs   )r4  r@  rƒ   r0   r0   r1   Úsignature_has_generic_args«  s    z)DefNodeWrapper.signature_has_generic_argsc                 C   s  g }| j jr| tj¡ | jD ]x}|jjrR|j 	t
 dd¡¡ | d|jj ¡ q|jrˆ|jjsˆ|jjsˆ|jjsˆ| |j |jj¡¡ q| |jj¡ q| jr®| | jjj¡ | jrÄ| | jjj¡ d |¡}| jjsæ| dtj ¡ | d| jjj|f ¡ d S )NÚMoveIfSupportedúCppSupport.cppú__PYX_STD_MOVE_IF_SUPPORTED(%s)rž   z%s = r  )r4  r]  r8  r   r†  rH   r	  r"  rÐ   rÍ  r   rm  r×   rX  r9  rõ  r  rÀ  rŸ  rÙ  rÚ  r£   rb  r  ru  r{  rF   r¨  rM  )rx   rK   rH   rt  r0   r0   r1   r:  ®  s6    

ÿÿþ
 ÿz%DefNodeWrapper.generate_function_bodyc                 C   s¨  | j j}| | j¡ | d¡ | d¡ | j  ¡ }|r@| |¡ | |¡ | ¡ |_| j  	||¡ph| j j
}|  ||¡ |  ||¡ | ¡ }| jjr˜d}nd}| jjsÀ| d| j tj¡|f ¡ | ¡  | td| j ƒ¡ |  |||¡ |  |¡ |  |¡ | |j¡ | | j¡ | d¡ | d¡ | d¡}| |j¡r¶| |j ¡ | !|j¡ |j "¡ D ]\}	}
| #|	|
¡ qd|  $¡ }|d k	r¢| dtj|f ¡ |  %|¡ | |¡ | !|j ¡ |  %|¡ | !|¡ |j&D ],}|j'rÜ|j(rü| )|¡ n
| *|¡ qÜt+|j&ƒ}| j,D ]@}|j-js|j.|kr|j.j(rL| )|j.¡ n| *|j.¡ q| /¡  | jjs~| d	tj ¡ | d
¡ | 0¡  |r¤| d| ¡ d S )Nr°   z/* Python wrapper */z = 0rC  z%s (wrapper)rM  Z
cleaned_upr¢  re  rH  rf  )1r¨  r7  ræ   r4   rF   rj  rn  ro  rp  rq  rr  rt  rx  rB   rb  r  r  r  r   r{  r«  r¬  r   r_   r‰  r  r:  r®  r  r’  r“  r”  r•  r–  r—  r˜  rš  Ú%generate_argument_values_cleanup_coder  r’  r  r¦  Zput_var_decrefr«   rH   r	  r×   r­  r¯  )rx   r}   rK   r1  r±  r?  rµ  Zretval_initZvalues_cleaned_up_labelrX  r	  r¸  r×   Zvar_entries_setrt  r0   r0   r1   rÑ   É  s€    





ÿþ















z,DefNodeWrapper.generate_function_definitionsr   c                 C   sŠ  g }| j }|js| jr8dtj }|js.d| }| |¡ | jD ]<}|js>|jsT|j	rf| d|j
 ¡ q>| |j |j
¡¡ q>| jj}|js¤| ¡ tjgkr¤| d¡ |jròdtjtjf }	|jrèdtjtjtjf }
| d|
|	f ¡ n
| |	¡ |jr$tt| jƒ| ¡ ƒD ]}| d| ¡ qd |¡}d	}|jd
krP|jjrPd}d}| j |j ¡}d|||f }| !d| ¡ |r¢| jj"rž| jj"j#||dd d S t$j%rD|j&rD| jj"sD|jj'sD|jrÖ|j(rD|j&}|j)rì| *¡ }|jr |jd
ks| !d|j+| ,¡ f ¡ |jrD| !d¡ | !d|j( ¡ | !d¡ |sT| jj"rx| -d|j. ¡ |j/| jjddd | !d| ¡ d S )NrY  rZ  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 = rA  )Z
allow_skipz%s {)0r4  r]  r?  r   r†  r8  rH   r¬  r=  r«  r‹  r9  r  r¨  r×   r©  rD  r   Zmethod_noargsr@  Ú
args_cnameÚ
kwds_cnameÚuse_fastcallÚnargs_cnamer  r?   r=  r£   r_   rw  rV  rb  r  rF   rd  rt  r    rú  r:   Zis_property_scoperO  Z
is_unicodeZas_utf8_stringrN  rˆ  ru  re  Zput_pymethoddef)rx   rK   r?  r@  r^  rE  rÀ  rt  r×   Zvarargs_argsZfastcall_argsrÿ  rF  r`  r  Zdocstrr0   r0   r1   rt     sª    


ÿ
 ÿ  ÿ ÿÿ

ÿ
  ÿÿþýýþ
ÿ
ÿz'DefNodeWrapper.generate_function_headerc                 C   sª   | j D ].}|jr|jr(| d|j ¡ q| |j¡ q|jD ]}|jr<| |¡ q<|  	¡ r–dt
j }| jjrŒ| 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;)rH   r¬  rŠ  rF   r‹  rz  r×   r  r’  ri  r   rr  r4  rq  Úkwvalues_cname)rx   r}   rK   rt  r×   Z
nargs_coder0   r0   r1   rx  s  s     





z-DefNodeWrapper.generate_argument_declarationsc           
   	   C   sH  |  ¡ }|j}| d¡}| jdk}| jd k	p8| jd k	p8|}| jD ]}	|	jjs@|	j 	|¡s@q@|  
¡ rä| jjrt| d¡ | d¡ | dtjtjf ¡ | d¡ | dtjtj| dtj ¡|  ¡ f ¡ | d	¡ | jjrä| d	¡ |j t d
d¡¡ | dtj| jjtjtjf ¡ |  
¡ s@|r4t| jdƒ |  |¡ n,|  ¡ sV|  |¡ 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   rs  z#if CYTHON_ASSUME_SAFE_SIZEz%s = PyTuple_GET_SIZE(%s);rY  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 argumentsTre  )/Únew_error_labelr“  ro  r$  rÙ  rÚ  rH   r	  r  rg  ri  r4  rq  rF   r   rr  ro  r¤  rš  rÐ   rÍ  r   rm  rt  Úfastvarr   r4   r  rh  Úgenerate_stararg_copy_codeÚ'generate_tuple_and_keyword_parsing_codeÚneeds_values_cleanupr’  r”  r–  rm  Úgenerate_arg_decrefr×   r  Úput_var_xdecref_clearÚput_var_decref_clearr¥  r¦  r   r¨  r¡  r­  )
rx   r}   rK   Ú	decl_codeÚold_error_labelÚour_error_labelÚ	end_labelZhas_kwonly_argsZhas_star_or_kw_argsrt  r0   r0   r1   r‰  Œ  s„    


ÿÿ


 ÿ
ü


ÿ   ÿ





z-DefNodeWrapper.generate_argument_parsing_codec                 C   s   |r|  |j¡ d S rs   )r|  r×   ©rx   rt  rK   r0   r0   r1   Úgenerate_arg_xdecrefÛ  s    z#DefNodeWrapper.generate_arg_xdecrefc                 C   s   |r|  |j¡ d S rs   )r}  r×   r‚  r0   r0   r1   r{  ß  s    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rtd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rh| jjsh| jjrt‚| 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_nP| jr¸| jjr~t‚| jjj}| t	j&t¡ | |› dt	j&› d¡ d2| jj_d S )3Nr  rA  ÚRaiseArgTupleInvalidr»  úif (unlikely(z$ > 0)) { __Pyx_RaiseArgtupleInvalid(z, 1, 0, 0, ú); ú }úconst Py_ssize_t rB  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)) rG  z = PyDict_New();rH  ÚRejectKeywordsz > 0)) {__Pyx_RejectKeywords(z = PyTuple_New(z + 1); z__Pyx_PyTuple_SET_ITEM(z, 0, ú)r  úfor (ú=0; z < z; z++) {z(PyObject* item = __Pyx_PyTuple_GET_ITEM(z#if !CYTHON_ASSUME_SAFE_MACROSrŸ   r[  z	+1, item)r   )(rš  r_   rˆ  rÙ  rÐ   rÍ  r   rm  rF   r   rr  Úkwds_len_cnamerÚ  rp  r4  rw  r×   r  r  rX  rt  Úput_var_gotrefr?  r¨  r-  rq  r_  r  r4   r„  r†  r
   r¥  Úerror_goto_if_negr  r  r	   Úc_py_ssize_t_typero  r"  )rx   rK   Ú
goto_errorÚfunction_nameZstarstar_arg_cnameZstar_arg_cnamer#  r0   r0   r1   rx  ã  sœ    

ÿ ÿ6ÿ
ÿÿ

"ÿ

ÿ ÿ

ÿÿÿÿ

ÿ

ÿz)DefNodeWrapper.generate_stararg_copy_codec                    sÖ  ˆ j  t dd¡¡ | j ¡ }ˆ  d¡}ˆ  | j¡}g }g }g }	d }
}|D ]\}|j	sXqL|j
sL|jrfqL|jr‚|jrv|	n| |¡ qL| |¡ |jrL|
d7 }
|jsL|d7 }qL||	 }| j| j }t|ƒdkræ|d j
sÞ|d jræ|d8 }t|ƒ}| j oü||k}t|ƒ}| js| jr"|  |ˆ ¡ t|ƒt|ƒ }dd„ |D ƒ}|pJ| 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rþˆ j  t dd¡¡ ˆ  dtj$› d|› d ¡ ˆ  d!|› d|d"›d|d"›d|d"›d#|› d$¡ ˆ  d%¡ | jrhˆ j  t d&d¡¡ ˆ  d|› d|| j › d ¡ ˆ  d'|› d(tj› d)|
› d*|› d$	¡ ˆ  d%¡ | jrz|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 ]R}|jsˆ j  t d&d¡¡ ˆ  &|j'j¡}ˆ  d0|› d|› d|› ¡  q0qnÒˆ  d/¡ ||krÊt(|ƒD ]J\}}ˆ  d1|› d2| jj › dtj)› d|› d3	¡ ˆ  d4|› d5|› ¡ qznZˆ  d6tj$› d7¡ | jrðˆ  d8¡ t*t(|ƒƒd d d9… }|D ]Œ\}}||d krT||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ˆ ¡ qBˆ  d%¡ ˆ  .|¡rÒˆ  dB¡}ˆ  %|¡ ˆ  /|¡ ˆ j  t dd¡¡ ˆ  dC||||tj$|f ¡ ˆ  /|¡ d S )DNru  r»  Zargtuple_errorr   r   c                 S   s   g | ]}|j s|‘qS r0   r<  rü  r0   r0   r1   r‡   t  s      zJDefNodeWrapper.generate_tuple_and_keyword_parsing_code.<locals>.<listcomp>Ú{ú,c                    s    g | ]}d ˆ   |jj¡› ‘qS )ú&)Úintern_identifierr×   r_   rü  r]  r0   r1   r‡   y  s   ÿr  zPyObject ** const %s[] = {%s};rˆ  rB  r°   r¤  r‰  rŠ  r‹  r…  z) < 0) z > 0z
likely(%s)rb  rŽ  z__Pyx_RejectKeywords(rž   r†  r„  zfor (Py_ssize_t i = z; i < z; i++) {z7if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid(Údz, i); r‡  rH  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)) {rG  z__Pyx_RaiseKeywordRequired(úvalues[ú] = __Pyx_ArgRef_rŒ  ú3if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[ú])) zswitch (ú) {údefault:r´   úCYTHON_FALLTHROUGH;úcase Ú2dú:ú	case  0: úbreak;ú	default: ú]Úskipz2__Pyx_RaiseArgtupleInvalid(%s, %d, %d, %d, %s); %s)0rÐ   rÍ  r   rm  r_   rˆ  ro  r   r4   r¬  r=  r«  r®  rû   r8  r¯  r&  r%  r?   rÙ  ÚboolrÚ  Úgenerate_stararg_init_codeÚtuplerF   r£   r   Úpykwdlist_cnameÚ#generate_argument_values_setup_coder’  rp  r4  rw  Úgenerate_posargs_unpacking_codeÚgenerate_keyword_unpacking_codeÚ*generate_argument_defaults_assignment_coderr  r”  r›  r×   rU  ro  rŠ   ru  r  Úgenerate_arg_assignmentr’  r–  )rx   rH   rK   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_argsrt  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_cnamern  Zreversed_argsZskip_error_handlingr0   r]  r1   ry  H  sZ   
ÿ



 ÿ
þýþ6ÿ
ÿ"     þ  ÿ

ÿ(ÿ

ÿÿ	
  ÿ
 ÿ


ÿ

"ÿ

"ÿ












ÿ  üz6DefNodeWrapper.generate_tuple_and_keyword_parsing_codec                 C   sÜ   |j jr<|jr t |j tj|¡}|j}| d|j|f ¡ nœ|j j	rÆ|j
rX| d| ¡ | |j  ||jj|j|¡¡ |j
rØ| d¡ | d|jj| |¡f ¡ |j jrº|j|jdd | d¡ nt|jd|j  ƒ d S )Nr¢  rb  rG  TrI  rH  ú2Cannot convert Python object argument to type '%s')r	  r  r¬  r	   Ztypecastr
   r×   rF   rX  Úfrom_py_functionrû   Úfrom_py_call_coder4   r   rõ  rŒ  r   )rx   rt  rŸ   rK   r×   r0   r0   r1   rµ  2  s0    
   ÿ
þz&DefNodeWrapper.generate_arg_assignmentc                 C   sF  | j rL| j jjrLd| j j_| d| j jj| j jj|  ¡ f ¡ | | j j¡ | jrBd| jj_|dkrœ| j	j
rrt‚| tjt¡ | d| jjjtjf ¡ n¦| | 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 )Nr   z0%s = PyDict_New(); if (unlikely(!%s)) return %s;r¢  z = __Pyx_ArgsSlice_r‰  rž   rŒ  r  z)) {r  rA  rH  )rÚ  r×   r  r  rF   rX  rš  r“  rÙ  r4  rq  r_  r„  r   ro  r
   rw  rr  r	  Znullcheck_stringr}  r­  )rx   rº  rK   r0   r0   r1   r®  K  s4    
ý
.ÿÿ
z)DefNodeWrapper.generate_stararg_init_codec                 C   sR   t |ƒ}| d|d d| ¡f ¡ | jjrN| d| jjtj| jjtjf ¡ d S )NzPyObject* values[%d] = {%s};r™  r  z9struct %s *%s = __Pyx_CyFunction_Defaults(struct %s, %s);)r?   rF   r£   r¨  rc  r   Zdynamic_args_cnamer†  )rx   rH   rK   r~  Zmax_argsr0   r0   r1   r±  n  s     ÿ  þz2DefNodeWrapper.generate_argument_values_setup_codec                 C   sT   t |ƒD ]F\}}|jr|jjr| |¡}| d|› d|› d|j |¡› d¡ qd S )Nzif (!values[z
]) values[z] = __Pyx_NewRef(rŒ  )rU  rû   r	  r  r   rF   Zas_pyobject)rx   rH   rK   rn  rt  rh  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]);rH  )rz  r   Zquick_temp_cnamerF   )rx   rK   Zloop_varr0   r0   r1   rm  ‚  s    z4DefNodeWrapper.generate_argument_values_cleanup_codec                 C   sÚ  d}|D ]}	|	j r|	js|d7 }q| dtj ¡ | jrB| d¡ t|d |d dƒD ]n}
| d|
d d›d¡ | d	|
› d
| jj› dtj	› d|
› d	¡ | d|
› d| 
| j¡› ¡ | d¡ qV|dkrL| d|d›d¡ t|d ddƒD ]L}
| d	|
› d
| jj› dtj	› d|
› d	¡ | d|
› d| 
| j¡› ¡ qô| 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ª  rH  )r¯  rû   rF   r   rr  rÙ  r  r4  rw  ro  r   r4   ru  r”  )rx   r¹  rº  r»  r¼  r½  r·  rK   Znum_required_posonly_argsrt  rn  r0   r0   r1   r²  ‹  s:    

*
* 





z.DefNodeWrapper.generate_posargs_unpacking_codec           
      C   sL  d}|D ]}|j r|d7 }q|dkr@| dtj|tj|f ¡ n|dkrX| dtj ¡ |dkrfd}n0| jr’|| }| d|› d|› d¡ d	}nd
}d|  k r®t|ƒ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 k	d›d¡ d S )Nr   r   zBconst Py_ssize_t kwd_pos_args = (unlikely(%s < %d)) ? 0 : %s - %d;z#const Py_ssize_t kwd_pos_args = %s;r  z1const Py_ssize_t used_pos_args = (kwd_pos_args < z) ? kwd_pos_args : rA  Zused_pos_argsZkwd_pos_argsz	values + r0  ZParseKeywordsr»  z__Pyx_ParseKeywords(rž   rœ  r  )r¯  rF   r   rr  rÙ  r?   r_   rˆ  rÐ   rÍ  r   rm  Úput_error_if_negr4   rp  rt  r°  rÚ  r×   rX  r’  )
rx   rº  r½  rK   r¸  rt  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 rs   )rH   rŠ  Úgenerate_arg_conversionrÅ  r0   r0   r1   r  ð  s    
z0DefNodeWrapper.generate_argument_conversion_codec                 C   s¢   |j }|j}|jrR|jr*| d|j ¡ n| d|j ¡ |  ||¡ | d¡ nL|jrf|  ||¡ n8| |¡rŠ| d|j	j
|jf ¡ nt|jd||f ƒ d S )Nrb  zassert(%s); {rH  r¢  z+Cannot convert 1 argument from '%s' to '%s')r9  r	  r  rû   rF   r‹  Ú%generate_arg_conversion_from_pyobjectÚ#generate_arg_conversion_to_pyobjectre  r×   rX  r   r4   )rx   rt  rK   Úold_typeÚnew_typer0   r0   r1   rÄ  ø  s    
z&DefNodeWrapper.generate_arg_conversionc                 C   s@   |j }|jr,| | |j|jj|j|¡¡ nt|jd| ƒ d S )Nr¿  )	r	  rÀ  rF   rÁ  r‹  r×   rX  r4   r   )rx   rt  rK   rÈ  r0   r0   r1   rÅ    s    üz4DefNodeWrapper.generate_arg_conversion_from_pyobjectc              
   C   s\   |j }|j}|rH| d|jj||j| |jj|j¡f ¡ | |j¡ nt	|jd| ƒ d S )Nz%s = %s(%s); %sz5Cannot convert argument of type '%s' to Python object)
r9  Zto_py_functionrF   r×   rX  r‹  r  r4   r“  r   )rx   rt  rK   rÇ  rQ   r0   r0   r1   rÆ    s    üz2DefNodeWrapper.generate_arg_conversion_to_pyobjectc                 C   sV  | j D ]B}|jr|  ||¡ q|js|jjs<|jjs<|jjr|  ||¡ q| j	j
jrRttt| j ƒ| j ¡ ƒƒD ]‚}| j	j
jdkrŒ| d¡ | d| ¡ | d| j	j
j| j ¡ |f ¡ | d| | j¡ ¡ | d¡ | j	j
jdkrp| d¡ qp| j	j
jdkrRt| j ƒdkrR| d	¡ | d
| j	j
j ¡ | d| | j¡ ¡ | d¡ d S )NÚ__ipow__z #if PY_VERSION_HEX >= 0x03080000z)if (unlikely(unused_arg_%s != Py_None)) {zNPyErr_SetString(PyExc_TypeError, "%s() takes %s arguments but %s were given");ú%s;rH  z'#endif /*PY_VERSION_HEX >= 0x03080000*/r%   z$if ((PY_VERSION_HEX < 0x03080000)) {zYPyErr_SetString(PyExc_NotImplementedError, "3-argument %s cannot be used in Python<3.8");)rH   r  rÂ  r¿  r	  r  r  rõ  rÄ  r¨  r×   r©  Úreversedr  r?   r4  r=  r_   rF   r¡  r   r4   )rx   rK   rt  rÿ  r0   r0   r1   r  %  sF    
ÿþ
  ÿÿÿ
 
þÿz+DefNodeWrapper.generate_argument_type_testsc                 C   s   | j jS rs   )r4  rš  rƒ   r0   r0   r1   rš  P  s    zDefNodeWrapper.error_value)r   )!r+   r,   r-   Zdefnoder¨  rz  rz   r   rS  rh  ri  r:  rÑ   rt  rx  r‰  rƒ  r{  rx  ry  rµ  r®  r±  r´  rm  r²  r³  r  rÄ  rÅ  rÆ  r  rš  r0   r0   r0   r1   r5  r  s>   	W
SOe k#	(=+r5  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|Ž d S )NT)rÛ   rÀ   r•   )rÚ   r\   rz   ©rx   r4   rk   rd   r0   r1   rz   a  s    zGeneratorDefNode.__init__c                    s&   t ƒ  |¡ | j| j_| j |¡ d S rs   )r\   r   r7  rÎ  r|   rd   r0   r1   r   f  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rÖd}| 	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;rH  )rÎ  r×   r  r›  r_   ÚqualnameÚmodule_namer~  r  rF   Úgen_type_namer€  r   rh  r  r4   r§  r
   rb  r†  r„  r¥  r­  )rx   r}   rK   Z
body_cnamer_   rÑ  rÒ  Zclassobj_cnamer0   r0   r1   r:  k  s*    

Fÿ	 ÿ
z'GeneratorDefNode.generate_function_bodyc                    sD   |  t | jd¡¡ | jj|dd tƒ  ||¡ | j ||¡ d S )NúCoroutine.cT)Úproto)rÍ  r   rm  rÓ  rÎ  rt  r\   rÑ   rë   rd   r0   r1   rÑ   ˆ  s    z.GeneratorDefNode.generate_function_definitions)r+   r,   r-   rk  Úis_iterable_coroutinerÓ  r5  rô  rˆ   rz   r   r:  rÑ   re   r0   r0   rd   r1   rÌ  T  s   rÌ  c                   @   s   e Zd ZdZdZdS )ÚAsyncDefNodeÚ	CoroutineTN)r+   r,   r-   rÓ  rÕ  r0   r0   r0   r1   r×    s   r×  c                   @   s   e Zd ZdZdZdS )ÚIterableAsyncDefNodeZIterableCoroutineTN)r+   r,   r-   rÓ  rÖ  r0   r0   r0   r1   rÙ  ”  s   rÙ  c                   @   s   e Zd ZdZdZdS )ÚAsyncGenNodeZAsyncGenTN)r+   r,   r-   rÓ  rÖ  r0   r0   r0   r1   rÚ  ™  s   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•   r_   Úis_coroutine_bodyÚis_async_gen_bodyr:   rH   rÙ  rÚ  )r\   rz   )rx   r4   r_   r•   rÜ  rÝ  rd   r0   r1   rz   ¨  s         üzGeneratorBodyDefNode.__init__c                 C   s\   |  |j¡}|  d¡}tj| | }|jd t| j|dd}||_t| j	ƒ|_
d|_|| _d S )NÚ	generatorr	  )rX  r  T)rK  rL  r   Zgenbody_prefixrz  r
   r4   r  r   r_   r¡  r  r×   )rx   r}   rP  r_   rX  r×   r0   r0   r1   Údeclare_generator_body¯  s    
 ÿz+GeneratorBodyDefNode.declare_generator_bodyc                 C   s   |   |¡ |  |¡ d S rs   )r0  rß  r|   r0   r0   r1   r   ½  s    
z)GeneratorBodyDefNode.analyse_declarationsc                 C   s@   d| j jtjtjtjf }|r.| d| ¡ n| d| ¡ d S )Nz]static PyObject *%s(__pyx_CoroutineObject *%s, CYTHON_UNUSED PyThreadState *%s, PyObject *%s)z%s; /* proto */z%s /* generator body */
{)r×   r  r   Úgenerator_cnameZlocal_tstate_cnameÚsent_value_cnamerF   )rx   rK   rÕ  r  r0   r0   r1   rt  Á  s    üz-GeneratorBodyDefNode.generate_function_headerc              	   C   s  | j }| j ||¡ | |¡ | ¡ |_| | j¡ |  ||¡ | 	d¡ |  
|¡ | ¡ }| 	dtj ¡ | ¡ }| ¡  | | jjpŽ| jj¡ | ¡ }|r²|jdd d|j_| j |¡ |j |jjj¡ | ¡ }| d¡}| |¡ | |¡ |r |jjs
t ‚|j!| jj| jdd | j"r@| 	| #tj$| j¡¡ nj| 	dtj$› d¡ | j%rbd}	n| j&rpd	}	nd
}	| 	dtj$› d|	› d¡ | 	| '| j¡¡ | 	d¡ | j"r6| j(d k	r6| j(}
|
t)j*krÖd}n0|
t)j+krèd}n|
t)j,krúd}nt-d|
 ƒ‚| 	dtj|| #tj| j¡f ¡ | .tjt/¡ |  0||¡ |jjjj1rŽ| 	d|jj 2tj3¡|jj 4dtj5 ¡f ¡ | 	dtj3 ¡ |r¶| jj6s¶d|j_|j7d| jd | | j¡ | 	d¡ | 	d¡ | j"sö| jj6sö| 8tjt/¡ | 9|j:¡rä| jj6s| ;|j<¡ | |j:¡ | j"rH| j(d k	rH| =tjt/¡ |j >¡ D ]\}}| ?||¡ qR| 	d¡ |r‚| @¡  tAjB|jCjDkrº|jE FtG Hdd¡¡ | 	dtI| j%ƒ ¡ | J| jj¡ |rÚ| K| j¡ | 	d¡ | |j<¡ | Ltjt/¡ |r| M¡  | 	d¡ | 	dtj5 ¡ | 	d ¡ | 	d!tj5 ¡ | 	d"tj5 ¡ | N¡  | 	d#tj ¡ | 	d¡ | O|j¡ | 	d$tj5 ¡ | 	d%| ¡ |jPD ]\}}| 	d&||f ¡ q¢| 	d'¡ |rö|j!| jj| jdd |j7d| jd | N¡  | 	d(¡ | 	d¡ | Q¡  d S ))Nr°   zPyObject *%s = NULL;T)rk  Z	first_runr…  z != Py_None)) {zasync generatorÚ	coroutinerÞ  zQ)) PyErr_SetString(PyExc_TypeError, "can't send non-None value to a just-started z");rH  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);FrF  r3   rM  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);re  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;)Rr7  r•   rÑ   rn  ro  rp  ræ   r4   rØ   rF   rt  rB   r   r{  r«  r¬  r×   r_   r¡  rl  r}  r  rˆ  r~  r  Zinit_closure_tempsrv  r	  rw  Z	use_labelr–  rS  r_  r‡  Ú
is_inlinedr  rá  rÝ  rÜ  r   Úinlined_comprehension_typer   Z	list_typeÚset_typeÚ	dict_typer   r  r
   r:  r  r  rh  rŸ  rà  rÀ   r‘  r  r’  r“  r”  r•  Úput_xdecref_clearr—  r˜  r›  r   Úgenerator_stoprÏ  Zfuture_directivesrÐ   rÍ  r   rm  r­  r   rœ  r¨  rª  r­  r®  Zyield_labelsr¯  )rx   r}   rK   r1  Zclosure_init_coderµ  r²  Zresume_codeZfirst_run_labelZ	coro_typeÚtarget_typeZ	comp_initrX  r	  rn  Úlabelr0   r0   r1   rÑ   Ì  sì    






ÿ
ÿ þ
ÿþ







ÿ


z2GeneratorBodyDefNode.generate_function_definitions)NNNFF)F)r+   r,   r-   r×  rã  rÜ  rÝ  rä  rz   rß  r   rt  rÑ   re   r0   r0   rd   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st|jjržtˆ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 rþ  )r6  r4   r_   rü  r   r0   r1   r‡   †  s   ÿz9OverrideCheckNode.analyse_expressions.<locals>.<listcomp>©r  rH   )Úexpr©rŽ   rã   )rŠ  rH   rs  rô  r°   r&  ÚRawCNameExprNoder4   r
   Ú	func_noder  rb  r  Úis_returncoderÚ   ÚExprStatNoder  r•   rh   )rx   r}   Z	first_argZ	call_noder0   r   r1   rh   |  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s†| j jj d¡r’| 
d¡ nˆ| 
d¡ | 
d	¡ | | j jjjj¡}| 
d
|› d|› d¡ | 
d|› d¡ | 
d¡ | 
d
|› d|› d¡ | 
d¡ | 
d¡ | 
d¡ |j t 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 */rv   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))rY  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);Tr  ZPyObjectGetAttrStrz*%s = __Pyx_PyObject_GetAttrStr(%s, %s); %sz5if (!__Pyx_IsSameCFunction(%s, (void(*)(void)) %s)) {rH  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;)&rs  rd  r×   r›  r_   rô  r   Úmodule_cnamerH   rX  rF   r  rw  rÒ  r  rZ  rƒ  rÐ   rÍ  r   rm  Ztp_dict_version_tempZobj_dict_version_tempZtype_dict_guard_tempr  r  r
   rï  Ú	set_cnamer  r4   r  r  r•   rÒ   r!  r	   r"  )rx   rK   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•   rh   rÒ   r0   r0   r0   r1   rú  n  s   
rú  c                   @   s   e Zd ZdS )ÚClassDefNodeN©r+   r,   r-   r0   r0   r0   r1   rõ  ì  s   rõ  c                   @   s˜   e Zd Zddddddddd	d
dg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•   rZ   Ú	metaclassÚmkwr`   Úclass_resultr¨  Ú
class_cellrû  Ú
orig_basesNFc	              	   C   s  t  | |¡ || _|| _|| _|| _|| _ddlm}	 | jrvt	j
rvt| 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r¶| jd k	ràt|jd
ƒ |j| _|j|= q¶|| _n| jd k	st‚n|	 |¡| _|s6| js6| js6| jrÂ| jd krŽ|rX|jsX| j}nd }|sx| jjrx| jjsxn|	j || d| _d}nd}|	j!|||
| d| _"|	j#||| |
|||d| _$n$|	j%|g d| _"|	j&||| |
d| _$|	j||d| _'|	 (| j¡| _)d S )Nr   rû  rí  rq   )r_   r	  r4   FTr´   rù  z2keyword argument 'metaclass' passed multiple times)Úclass_def_node)r_   r:   rþ  )r_   rþ  r:   Zcalculate_metaclassÚallow_py2_metaclassZ
force_type©rà  )r_   rþ  r:   rü   )*rê   rz   r_   r:   r•   rû  r`   r°   r&  r    rú  r;   r4   ZUnicodeNoder6  r   r
   rø  Úis_py3_style_classZis_dict_literalrà  rŠ   rU  rª   rŽ   rù  r   rú  r_  Ú	ProxyNodeÚis_sequence_constructorrH   ZPyClassMetaclassNodeZPyClassNamespaceNoderZ   ZPy3ClassNodeÚclassobjÚDictNodeZ	ClassNoder¨  ZClassCellInjectorNoderü  )rx   r4   r_   r`   r:   r•   rû  rÕ  Zforce_py3_semanticsr&  rø  rÿ  rn  rŸ   ZmkdictZneeds_metaclass_calculationr0   r0   r1   rz     sˆ     

ÿþ ÿ   ÿ   ü
   ÿzPyClassDefNode.__init__c                 C   sZ   | j rt| jjdƒ dS ddlm} t| jdd| j| jpF|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û  r	  ©rH   F)r  rÒ  Ú
class_namer`   rû  r•   r  r:   )r  r   r  r4   r°   r&  ÚCClassDefNoder_   r`   r  rû  r•   r:   ©rx   r&  r0   r0   r1   Ú	as_cclassW  s    øzPyClassDefNode.as_cclassc                 C   s0   |}|j s|jr|j}qt| j|d }| _|S )N)r_   ró  )r4  rV  ró  r   r_   rw  )rx   r}   r8  r³  r0   r0   r1   Úcreate_scopej  s
    zPyClassDefNode.create_scopec                 C   sØ   | j  }}| jrLddlm} | jd d d… D ]}||j|j|gd}q,d | _|| _| jrd| j |¡ | j	rv| j	 |¡ | j |¡ | j
 |¡ |  |¡}|j|_| j
jj|_| jr¾| j |¡ | j |¡ | |¡ d S )Nr   )r  r´   rë  )r  rû  r&  r  r4   rñ  rû  r`   r   rú  r¨  Úanalyse_target_declarationr  rÊ   r×   rX  Úclass_obj_cnamerø  r•   r,  )rx   r}   Zunwrapped_class_resultrû  r  rñ  r³  r0   r0   r1   r   q  s0    
ý
z#PyClassDefNode.analyse_declarationsc                 C   sö   | j rf| j jrt| j jƒdksfddlm}m} | j  |¡}||jd| j	t
 dd¡||ƒgd| _ || _| j rz| j  |¡| _ | jrŽ| j |¡| _| jr¢| j |¡| _| j |¡| _| j |¡| _| j}| j |¡| _| j || j¡| _| j |¡| _| S )Nr   r   )ÚPythonCapiCallNodeÚ	CloneNodeZ__Pyx_PEP560_update_basesZPy3UpdateBasesrò  )r—  rO  Zutility_coderH   )r`   r  r?   rH   r&  r  r  rh   r4   Úupdate_bases_functyper   rm  rý  rú  rù  rZ   rû  rw  r•   r¨  Úanalyse_target_expressionr  rü  )rx   r}   r  r  rý  r³  r0   r0   r1   rh     s.    
üz"PyClassDefNode.analyse_expressionsc                 C   s"   |   | j|¡ | j | j|¡ d S rs   )rÙ   rw  r•   rÑ   rë   r0   r0   r1   rÑ   ¨  s    z,PyClassDefNode.generate_function_definitionsc                 C   s  |  | j¡ |j | ¡ | j}| jr0| j |¡ | jrB| j |¡ | jrT| j |¡ | j	rf| j	 |¡ | j
 |¡ | jrà| d| j ¡ | j ¡ f ¡ | | d| j
 ¡ | j ¡ f | j¡¡ | d¡ | j |¡ | j |¡ | j
 ¡  |_|_| j}|d k	r|jsd }|d k	r"| |¡ | j |¡ | j |¡ |d k	rV| || j ¡ ¡ |d k	rt| |¡ | |¡ | 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)rH  )ræ   r4   Zpyclass_stackr8  rw  rý  rž  r`   rú  rù  rZ   rF   rŒ   r”  Úgenerate_disposal_coder§  Únamespace_cnamer  rü  Z	is_activer•   rÒ   rû  Zgenerate_injection_coder  r¨  rª  Úpop)rx   rK   r³  rü  r0   r0   r1   rÒ   ¬  sn     ÿþÿ



 ÿ


z&PyClassDefNode.generate_execution_code)NNF)r+   r,   r-   rˆ   rû  rû  r  rù  rú  rø  rý  rz   r
  r  r   r	   ri  r
   r[  r  rh   rÑ   rÒ   r0   r0   r0   r1   r÷  ð  s8      ÿ    ÿ
Iÿÿr÷  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 )r  r•   NFc                 C   s
   t | jƒS rs   )r   r  rƒ   r0   r0   r1   Úpunycode_class_name  s    z!CClassDefNode.punycode_class_namec                 C   sD   t | dƒs>ddlm} | jr8|j| j|g | jdd| _nd | _| jS )NÚ_buffer_defaultsr   rÝ  F)Zneed_complete)rå  r°   rÞ  Úbuffer_defaults_noderá  Úbuffer_defaults_posr  )rx   r}   rÞ  r0   r0   r1   râ  
  s    
  ý
zCClassDefNode.buffer_defaultsc                 C   sž   | j r4| jdkr4| j  d¡}| || j¡}|s8d S n|}|j| j| jdd| j d | j| j| j| j	| j
| j|  |¡| jd| _| jršt| jjƒdkršd| jj_d S )Nr!  Ú.r   )r_   r4   rá  ÚimplementingrÒ  r
  Úobjstruct_cnameÚtypeobj_cnamer  rx  Ú
check_sizerð  râ  Úshadowr   T)rÒ  r  Úsplitr½  r4   Údeclare_c_classr  Úobjstruct_nameÚtypeobj_namerx  r  rð  râ  r  r×   r`   r?   rH   r	  Úmultiple_bases)rx   r}   r¹  Ú
home_scoper0   r0   r1   r     s0    òzCClassDefNode.declarec                 C   sò   i }| j s|S ddlm} g }| j D ]®}|j}d }t||jƒrH|}|j}t ||¡}|dkrx|rlt	|j
dƒ d|d< q$nP|dkrÈd }	i }
|rºt||jƒr |j}	n|jj}	|j}|rº| ¡ }
|	|
f||< q$| |¡ q$|rèt	|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.)rû  r°   r&  rñ  r@   ÚCallNoder  r   Z'exprnode_to_known_standard_library_namer   r4   r  rH   rÔ  rÕ  Zas_python_dictr8  )rx   r}   Úextra_directivesr&  Zremaining_decoratorsZoriginal_decoratorrñ  Zdecorator_callZ
known_namerH   rI   Zkwds_r0   r0   r1   Ú_handle_cclass_decorators1  sD    
z'CClassDefNode._handle_cclass_decoratorsc                    s´  ˆ j rˆjstˆjdƒ ˆ ˆ ¡}d ˆ_ˆjr‚d ˆ_ˆ jD ]}|j	ˆjkr:|ˆ_q:ˆjd kr‚t
ˆjd ˆ jƒˆ_dˆj_ˆ  ˆj¡ ˆjjròˆjjd }| ˆ ¡}|tjkrºˆ  d¡j}n.|tjkrÒˆ  d¡j}n|tjkrèˆ  d¡j}|d krt|jdˆj ƒ n¾|tkrd }n®|js@|jr.|js@t|jd| ƒ n„| ¡ sdt|jd	|j	ˆjf ƒ n`|jr–|jjr–|jr–t|jd
|ˆjf ƒ n.|jr¾|j	dkr¾t|jd|j	 ƒ n|ˆ_ˆ j  dd¡dkrò|tjkròt!ˆjddƒ ˆj"d k	}|r0ˆjr0ˆjjs0ˆjj# $‡ ‡fdd„¡ d S ˆjrjˆj%dkrjˆj &d¡}ˆ  '|ˆj¡}	|	snd S nˆ }	ˆj%dkr¼ˆjdkr¼ˆjt(j)kr¼ˆ j*d d… dkr¼t!ˆjdˆj dƒ |	j+ˆjˆj|oÒˆj,|oÞˆj, ˆjˆjˆjˆj-ˆj.ˆj%ˆj/ˆj0ˆ 1ˆ ¡ˆj2dˆ_3ˆjr6t4ˆjjƒdkr6dˆj3j_5ˆj2rNˆj3|	 ˆj¡_6|	ˆ k	rxˆj%dkrxˆ  7ˆjˆj3ˆj¡ ˆj3jj ˆ_}
|
d k	r|r²ˆ j 8¡ |
_|
j 9|¡ nˆ j|
_d|
jkrd}|
jd }|r |d }|  d¡}|oþ|j:oþ|j;}|r
dnd|
_<ˆj=r0t>j?r0t@ˆjˆj=ƒ|
_=|r¤ˆj" A|
¡ ˆj Bd¡}|rŽ|jCrŽ|
jDsŽ|
jEsŽˆj Fd¡|_Gˆj Hd|j=|j¡ ˆj,ržd|
_Dnd|
_Et4ˆjjƒdkrT|rÄˆj,rØtˆjjd jdƒ ˆjjdd … D ]}| ˆ ¡rèt|jdƒ qèdˆj3j_Idd lJmK} |jLˆj|jMˆjˆjd!ˆj|jNˆjg d"gd#ˆ_On8ˆjr|ˆjjPplˆ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-  rg  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 rs   )r   r0   rQ  r0   r1   Ú<lambda>š  ra  z4CClassDefNode.analyse_declarations.<locals>.<lambda>r!  r  Ú__builtin__é   zcpython.z %s already a builtin Cython type)r_   r4   rá  r  rÒ  r
  r  r  r  r  rx  rð  râ  r  Tr&  FÚfrozenrv   Z__dict__getterz'Only declare first base in declaration.z+Only one extension type base class allowed.rû  rí  r   r  )Rrï   r!  r   r4   r)  r
  rÒ  ÚmoduleÚcimported_modulesr_   r   rÏ  Zhas_extern_classÚadd_imported_moduler`   rH   r  r	   r{  rº  r	  Zc_float_typerÂ  r  r
   r:  r¾  r  r/  rw  rÊ   rJ  rã  r   r•   Zdefered_declarationsr8  r  r  r½  r   Zbuiltin_typesr¡  r   r  r"  r  rx  rð  râ  r  r×   r?   r#  rõ  Úadd_imported_entryr   rw   r¿   rŽ   Zis_c_dataclass_scoper:   r    rú  r;   r   rÒ  Zis_variableZdefinedZimplementedZmangle_internalÚgetter_cnameÚdeclare_propertyÚ
early_initr°   r&  r  ZIdentifierStringNoder  Útype_init_argsÚis_externalZallocate_vtable_names)rx   r}   r(  r/  r  r
  Zbase_class_scopeZhas_bodyr¹  r$  rw  Ú	is_frozenZdataclass_configZdecorator_kwargsZfrozen_flagZ
dict_entryZ
other_baser&  Zthunkr0   rQ  r1   r   \  s   









ÿÿ
 ÿ
ÿ ÿ
ÿÿ 

ÿþ
ò




þþ

z"CClassDefNode.analyse_declarationsc                 C   s4   | j r| jjj}| j  |¡| _ | jr0| j |¡ | S rs   )r•   r×   r	  rw  rh   r6  rÿ  r0   r0   r1   rh   û  s    
z!CClassDefNode.analyse_expressionsc                 C   s(   | j r$|  | j|¡ | j  | j|¡ d S rs   )r•   rÙ   rw  rÑ   rë   r0   r0   r1   rÑ     s    z+CClassDefNode.generate_function_definitionsc           
      C   sn  |  | j¡ | jjjsVd }| 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 k	rV| |tj	¡ |j |¡ | jrj| j |¡ d S )NTr  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);rH  z = NULL;)Úbases_tuple_cnameÚcheck_heap_type_bases)ræ   r4   r×   r	  r5  r6  r  r  r	   r
   rž  rF   rŒ   Úerror_goto_ifr„  r   rB  r  r  r!  r"  r   r  r§  Úgenerate_type_ready_coder•   rÒ   )
rx   rK   r`   Z
first_baseZ
trial_typeZtype_newZ
type_tupleZ
args_tupler#  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rZ|jrV|jr@t‚| d|j|jf ¡ d S |sbt‚|jslt‚d|j }| d¡ d }|sÔ|j	j
rÔ|jjtdd}| d|| |j	j
¡| || j¡f ¡ | |t¡ |sÞ|rz|r&|j t d	d
¡¡ | | jd|t d|j¡ |¡|p|f ¡ | d|tj||p<|f ¡ |rd|j|td |j |¡ | | || j¡¡ n"| d|tj|| || j¡f ¡ t d|jj¡}	|	 |¡s¢| d¡ | d||	j|	 |¡f ¡ dD ]x}
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'rXd$nd%|j&|j'rjd$nd%|j&f ¡ |j t d&d
¡¡ | |j
¡}| | jd'| ¡ | d¡ qÂ|j
}q,| d¡ t  |jj¡D ]}| (||¡ qÚ| d¡ | d(¡ |j t d)d
¡¡ | | jd*| ¡ | d¡ t )|d+¡}t )|d¡}|dkrœ|dkrœ| d¡ | d,||f ¡ | d-| ¡ | d¡ | d¡ | j jj*D ]
}|j+dk}|j,r¦t-j.r¦|j/r¦|s¦t  | j jj¡ !|j+¡}|rú| 0¡ nd }|r| |¡ | d.¡ | d/¡ | d0||j+| d1| j¡f ¡ | d2¡ | d3|j/ ¡ | d4|j/|j1f ¡ | d5|j/ ¡ | d¡ | d¡ | d¡ |r¦| d¡ q¦|j2r|j t d6d7¡¡ | | jd8||j3f ¡ |j t d9d7¡¡ | | jd:| ¡ |jj4sJ|jj 5d;¡sJ| | jd<tj| 6|j7¡|f ¡ |j8s\| 9d=¡nd }|rÎ|j tkrÂd>| }|j'rŠ|j&}n
d?|j& }| d@¡ | dA||||j:f ¡ | d¡ nt;|jdBƒ |j8sä| 9dC¡rnd r|j t dDd
¡¡ | | jdE| ¡ d S )FNr>   r!  z	%s = &%s;z%s_specz#if CYTHON_USE_TYPE_SPECSTr  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Ð  r  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;rH  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.")rY  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)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;rn  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))<r	  r   Zmodulestatevalue_cnamerƒ  rw  r  r  r_  rF   rZ  r
  r  r  r
   r½  r  r4   r  rÐ   rÍ  r   rm  rÃ  r   Zget_slot_by_namerÊ   Z	slot_coderó  rç  r"  Zis_emptyZ	slot_namerÑ  rÒ  Zget_base_slot_functionr„  r¥  r7  r  rx  Zgenerate_dynamic_init_codeZget_slot_code_by_nameZpyfunc_entriesr_   r©  r    rú  rO  rÓ  rN  Zvtable_cnameZvtabptr_cnameZis_internalrã  r›  r  Zis_closure_class_scoperÒ  rX  r   )r×   rK   r9  r:  r	  rƒ  rw  Ztypespec_cnameZ
tuple_tempZbuffer_slotZbuffer_method_namer
  Zbase_typeptr_cnamerÔ  Zgetattr_slot_funcZdictoffset_slot_funcrQ   r  r±  Zweakref_entryZtp_weaklistoffsetZ	objstructr0   r0   r1   r<  V  sÖ   

þ


ý

ÿ
ýüüÿ	
ýÿÿ  ýþ  þ







ÿ
 ÿ
þ
  þ
ÿ
ÿ





ÿ

 ÿÿÿ


ÿÿÿÿ


ýÿÿÿÿÿÿÿ



ÿ
þ
ÿ

ý

ü
ÿz&CClassDefNode.generate_type_ready_codec                 C   s(   | j r| j  |¡ | jr$| j |¡ d S rs   )r6  r–   r•   r’   r0   r0   r1   r–   E  s    zCClassDefNode.annotate)NF)r+   r,   r-   rˆ   r  r  rx  rð  r!  r"  r  rû  r  r±  r  râ  r   r)  r   rh   rÑ   rÒ   ré   r<  r–   r0   r0   r0   r1   r  å  s0   
+  N or  c                   @   s:   e Zd ZdgZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚPropertyNoder•   c                 C   s*   |  | j| j| j¡| _| j | jj¡ d S rs   )r4  r_   r:   r4   r×   r•   r   rw  r|   r0   r0   r1   r   V  s    z!PropertyNode.analyse_declarationsc                 C   s   | j  |¡| _ | S rs   rò   r|   r0   r0   r1   rh   Z  s    z PropertyNode.analyse_expressionsc                 C   s   | j  ||¡ d S rs   ró   rë   r0   r0   r1   rÑ   ^  s    z*PropertyNode.generate_function_definitionsc                 C   s   d S rs   r0   r’   r0   r0   r1   rÒ   a  s    z$PropertyNode.generate_execution_codec                 C   s   | j  |¡ d S rs   rô   r’   r0   r0   r1   r–   d  s    zPropertyNode.annotateNrõ   r0   r0   r0   r1   r@  L  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"t|ƒ‚|d S r/  )r•   rÛ   r@   r  r_  ©rx   rÛ   r0   r0   r1   r  s  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   r_   r•   r   r4  r:   r4   r  rb  r×   rX  r3  )rx   r}   rw  r×   r0   r0   r1   r   y  s        ÿz"CPropertyNode.analyse_declarationsc                 C   s   | j  |¡| _ | S rs   rò   r|   r0   r0   r1   rh   €  s    z!CPropertyNode.analyse_expressionsc                 C   s   | j  ||¡ d S rs   ró   rë   r0   r0   r1   rÑ   „  s    z+CPropertyNode.generate_function_definitionsc                 C   s   d S rs   r0   r’   r0   r0   r1   rÒ   ‡  s    z%CPropertyNode.generate_execution_codec                 C   s   | j  |¡ d S rs   rô   r’   r0   r0   r1   r–   Š  s    zCPropertyNode.annotateN)r+   r,   r-   rq   rˆ   rÂ   r±  r  r   rh   rÑ   rÒ   r–   r0   r0   r0   r1   rA  h  s   
rA  c                   @   s(   e Zd Zg Zdd„ Zdd„ Zdd„ ZdS )Ú
GlobalNodec                 C   s   | j D ]}| || j¡ qd S rs   )ÚnamesZdeclare_globalr4   ©rx   r}   r_   r0   r0   r1   r   •  s    
zGlobalNode.analyse_declarationsc                 C   s   | S rs   r0   r|   r0   r0   r1   rh   ™  s    zGlobalNode.analyse_expressionsc                 C   s   d S rs   r0   r’   r0   r0   r1   rÒ   œ  s    z"GlobalNode.generate_execution_codeNr'  r0   r0   r0   r1   rD  Ž  s   rD  c                   @   s(   e Zd Zg Zdd„ Zdd„ Zdd„ ZdS )ÚNonlocalNodec                 C   s   | j D ]}| || j¡ qd S rs   )rE  Zdeclare_nonlocalr4   rF  r0   r0   r1   r   §  s    
z!NonlocalNode.analyse_declarationsc                 C   s   | S rs   r0   r|   r0   r0   r1   rh   «  s    z NonlocalNode.analyse_expressionsc                 C   s   d S rs   r0   r’   r0   r0   r1   rÒ   ®  s    z$NonlocalNode.generate_execution_codeNr'  r0   r0   r0   r1   rG     s   rG  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ñ  rì  c           
      C   sÜ   ddl m} | j}t||jƒrž|j ¡ }|dkrØ| ¡ \}}t|ƒrPt	|j
dƒ |jD ]>\}}| |¡}	|	d kr~t	|j
dƒ qV|j|j|	|j
dd qVt| _n:t|dd ƒd k	rØ|jrÆ| |¡ t| _n|jsÒ|jrØt| _d S )	Nr   rû  r   z!Variable names must be specified.úUnknown typeT)rñ  r†  )r°   r&  rì  r@   ZGeneralCallNoder  rÙ  Úexplicit_args_kwdsr?   r   r4   rà  r  rz  rŽ   ÚPassStatNoderA   r‰   r½   Zdeclare_from_annotationr%  Úis_subscript)
rx   r}   r&  rì  rQ   rH   rI   Úvarrp  r	  r0   r0   r1   r   ¹  s(    


z!ExprStatNode.analyse_declarationsc                 C   s"   d| j _| j  |¡| _ d| j _| S r  )rì  Úresult_is_usedrh   r|   r0   r0   r1   rh   Ò  s    z ExprStatNode.analyse_expressionsc                 C   s    | j jjr| j  ¡ r|  ¡  d S rs   )rì  r	  r  Ú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sPd| }| 	d| ¡ | j 
|¡ | j |¡ d S )NFz
(void)(%s)rÊ  )ræ   r4   rì  rM  rž  rN  rŒ   r	  r  rF   r  r§  )rx   rK   rŒ   r0   r0   r1   rÒ   ß  s    

z$ExprStatNode.generate_execution_codec                 C   s   | j  ||¡ d S rs   )rì  rÑ   rë   r0   r0   r1   rÑ   ë  s    z*ExprStatNode.generate_function_definitionsc                 C   s   | j  |¡ d S rs   )rì  r–   r’   r0   r0   r1   r–   î  s    zExprStatNode.annotateN)r+   r,   r-   rˆ   r   rh   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   sD   |j }|j }|jr@|jjr@|jr@|jjs@t| jd ||¡dd d S )Nz4Assigning to '{}' from '{}' discards const qualifierr   r©   )r	  r  r
  r+  r   r4   ra  )rx   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 rs   )r@   rO  rQ  r¶  rP  )rx   rJ   r0   r0   r1   Ú_check_const_assignment  s    
z&AssignmentNode._check_const_assignmentc                 C   sL   |   |¡}|  |¡ t|tƒrHt|tƒsH|jjjrH|j ¡ rHt	| j
dƒ |S )Nz9Storing unsafe C derivative of temporary Python reference)rg   rR  r@   rO  ÚParallelAssignmentNoderP  r	  r  Zis_ephemeralr   r4   )rx   r}   rJ   r0   r0   r1   rh     s    

z"AssignmentNode.analyse_expressionsc                 C   s$   |  | j¡ |  |¡ |  |¡ d S rs   )ræ   r4   Úgenerate_rhs_evaluation_coderª  r’   r0   r0   r1   rÒ     s    
z&AssignmentNode.generate_execution_codeN)r+   r,   r-   rQ  rR  rh   rÒ   r0   r0   r0   r1   rO  ò  s   	rO  c                   @   sx   e Zd Zddg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¶  rP  Fc                 C   sl  ddl m} t| j|jƒrö| jj ¡ }|rö| j ¡ \}}|dkr¬t|ƒdkrft	|d j
dƒ d S |d k	r¢| d ¡}|dksˆd|kr˜t	|j
dƒ d S |d }nd	}|d
  |¡}|d krÐt	|d
 j
dƒ d S | j}	|dkrrt|	|jƒrü|	j|	j
fg}
n0t|	|jƒrdd„ |	jD ƒ}
nt	|	j
dƒ d S |
D ]\}}|j|||d|d q0t|ƒdkrj|d | _nd| _n6d| _t|	|jƒs’t	|	j
dƒ |j|	j|| j
d	d nJ|dkr°d| _t|ƒd
ksÔ|d kræt	| jj
dƒ d S g }|jD ]@\}}| |¡}|d krt	|j
dƒ n| |j||j
f¡ qðt|ƒt|jƒk rJd S t| j|jƒsht	| jj
dƒ | jj}t|ƒ}| |||d| jj
¡ |D ]\}}}| |||¡ q’nF|dkröd| _|rÖt	| jjj
dƒ t| jj
| jj|d}| |¡ | jrd S | jr| j |¡ nP| j |¡ | jjs8| jj rh| jj!rh| jj!j"sh| j #¡ }|rh|| jj!_"d S )Nr   rû  )r   Útypedefr%   zInvalid positional argument.rV  r  zInvalid keyword argument.r	  r   rH  r   c                 S   s   g | ]}|j |jf‘qS r0   )r_   r4   ©r…   rL  r0   r0   r1   r‡   G  s     z=SingleAssignmentNode.analyse_declarations.<locals>.<listcomp>zInvalid declarationT)rñ  r  zInvalid declaration.)r  )ru  Úunionz.Struct or union members must be given by name.FZ
fused_typez*fused_type does not take keyword arguments)r_   rX   )$r°   r&  r@   rP  r'  r  rÙ  rI  r?   r   r4   Úcompile_time_valuer  r¶  r6  r_   r  rH   rz  Údeclaration_onlyrì  rà  r8  rŽ   r   r}  rë  r   Úis_assignment_expressionZ0analyse_assignment_expression_target_declarationr  r%  r½   r×   r¼  Ú!get_known_standard_library_import)rx   r}   r&  Ú	func_namerH   rI   Zkwdictr  r	  r¶  ÚvarsrL  r4   ÚmembersÚmemberrp  r_   rw  Z	fusednodeZstdlib_import_namer0   r0   r1   r   *  sš    








ÿ ÿ
*
z)SingleAssignmentNode.analyse_declarationsr   c                 C   s  ddl m} | j |¡| _| jjrt| jjjjrt|j	r\| jjj
d kr\| j ¡ r\| jj| jj_
nt| jd| jj› dƒ |  |¡}|r†|S | j |¡| _| j |¡ |  |¡}|r²|S t| j|jƒrà| 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 k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| '|¡}|| _| S )Nr   rû  zAssignment to const 'ú')r  rM   Ústopú=TrA  ZCppExceptionConversionrk  )(r°   r&  rP  rg   r¶  r½   r×   r	  r+  rô  r´  rf  rF  r   r4   r_   Ú
unroll_rhsri   Úgil_assignment_checkÚ
unroll_lhsr@   ZMemoryViewIndexNodeZanalyse_broadcast_operationZ$analyse_as_memview_scalar_assignmentr  ÚSliceIndexNoder"  Zlookup_operator_for_typesÚis_overloaded_assignmentrI  r5  rÍ  r   rm  rd  r%  r¿   r  Úcoerce_to_tempÚcoerce_to_simple)rx   r}   Úuse_tempr&  Zunrolled_assignmentr¶  ÚoprP  r0   r0   r1   rg   ˆ  sX    



ÿÿþ

z"SingleAssignmentNode.analyse_typesc              	   C   s0  ddl m}m} |}d  } } }	}
|jjr8|jj}nh|jjsJ|jjrœt||j	ƒrn|j
sn|jsn|j }}qJt||j	ƒrr|j}|j
}|rš| tj|¡}|j}|r´| tj|¡}nT|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 d }	|	r |	 tj|¡}	dd„ }z"||d ƒ||dƒ ||	dƒ }W n$ tk
rn   t| jdƒ Y d S X n(|jjr–|jj}t|tƒsšd S nd S nd S ||krÂt| jd	||f ƒ d S g }| |¡}|g}|rø|jsø| |¡}| |¡ |r|js| |¡}| |¡ |	r<|	js<| |	¡}	| |	¡ t|ƒD ]à}|j| jt|ƒ|tjd
}|	d k	r®|	 ¡ rš|j|	j }|j| jt|ƒ|d}n|j| jd|	|d}|d k	r| ¡ rð| ¡ rð|j|j }|j| jt|ƒ|d}n|j| jd||d}| |j| j||  |¡d¡ qD|
||fS )Nr   )r&  Ú	UtilNodes)rŽ   rF  z*C array iteration requires known end indexc                 S   s&   | d kr|S |   ¡ r| jS tdƒ‚d S )NzNot a constant.)rf  rF  r.  )rJ   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 %s)rŽ   rF  r	  rG  )ÚoperatorZoperand1Zoperand2rA  )r  r'  )!r°   r&  rm  r	  Ú	is_ctupler2  r  r  r@   rg  rM   rb  r  rd  r	   r•  ZIntNoder4   r`  r-  Zconstant_value_not_setr   r.  Z
LetRefNoder¿   r8  r  rf  rF  ZMulNodeZAddNodeZ	IndexNoderg   )rx   rJ   Ztarget_sizer}   r&  rm  r  Z
start_nodeZ	stop_nodeZ	step_nodeÚ
check_nodeZ
slice_sizern  r[   Úrefsr1  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 |¡}
|rht	| j||
gd}
|d d d… D ]}| 
||
¡}
qv|
S )Nr   )rm  )r¶  rP  Úfirst)r4   rÛ   r´   )r°   rm  ræ  r8  rU  r4   rt  rS  rh   rÚ   ZLetNode)rx   rr  rq  Úlhs_listZrhs_listr}   rm  Úassignmentsr¶  rP  rJ   Ú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 ƒƒr8d S |  | jt	| jjƒ|¡}|sXd S |\}}}|  
||| jj||¡S )Nr   rû  c                 s   s   | ]}|j V  qd S rs   )Z
is_starredrü  r0   r0   r1   rî   ,  s     z2SingleAssignmentNode.unroll_rhs.<locals>.<genexpr>)r°   r&  r@   r¶  r  rØ  rH   rs  rP  r?   rx  )rx   r}   r&  Úunrolledrq  rr  rP  r0   r0   r1   rd  (  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
ƒ|¡}|sLd S |\}}}|  |||| jj
|¡S ©Nr   rû  )r¶  r	  rp  r°   r&  r@   rP  r  rs  r?   rH   rx  )rx   r}   r&  ry  rq  rr  r¶  r0   r0   r1   rf  5  s    

zSingleAssignmentNode.unroll_lhsc                 C   s   | j  |¡ d S rs   ©rP  rž  r’   r0   r0   r1   rT  C  s    z1SingleAssignmentNode.generate_rhs_evaluation_codec                 C   s:   | j r&| jj| j|| j | j| jd n| j | j|¡ d S )N)r©  rI  r5  )rh  r¶  rª  rP  rI  r5  )rx   rK   r©  r0   r0   r1   rª  F  s    ûz-SingleAssignmentNode.generate_assignment_codec                 C   s   | j  ||¡ d S rs   ©rP  rÑ   rë   r0   r0   r1   rÑ   Q  s    z2SingleAssignmentNode.generate_function_definitionsc                 C   s   | j  |¡ | j |¡ d S rs   ©r¶  r–   rP  r’   r0   r0   r1   r–   T  s    zSingleAssignmentNode.annotateN)r   )F)r+   r,   r-   rˆ   rt  rh  r[  rZ  r   rg   rs  rx  rd  rf  rT  rª  rÑ   r–   r0   r0   r0   r1   rU    s   ^
6^
rU  c                   @   s`   e Zd Zddddg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 )ÚCascadedAssignmentNoderu  rP  Úcoerced_valuesÚcloned_valuesNc                 C   s(   t |tƒr$|jD ]}|  ||j¡ qd S rs   )r@   r~  ru  rQ  rP  )rx   rJ   r¶  r0   r0   r1   rR  l  s    

z.CascadedAssignmentNode._check_const_assignmentc                 C   s   | j D ]}| |¡ qd S rs   )ru  r  )rx   r}   r¶  r0   r0   r1   r   q  s    
z+CascadedAssignmentNode.analyse_declarationsr   c                 C   sÈ  ddl m}m} tƒ }t| jƒD ]2\}}| |¡ }| j|< | |¡ | |j	¡ q | j
 |¡}t|ƒdkr²tt|ƒƒjr¢| d|| j
g¡}	|	s²| | ¡ |¡}n| | ¡ |¡}|jsÜ|jsÜ|sÐ|jsÐ|j	jrÜ| |¡}n
| |¡}| ¡ rö||ƒn|| _
g | _i }
g | _| jD ]|}|j	jo0| d|| j
g¡}| j |¡ |j	|
kr|j	|j	kr|| j
ƒ}|sv| |j	|¡}| j |¡ ||
|j	< qg | _| jD ]&}|
 |j	| j
¡}| j ||ƒ¡ qœ| S )Nr   )r  r  rc  )r&  r  r  r«   rU  ru  ri   re  r­   r	  rP  rg   r?   ÚnextÚiterr"  Zlookup_operatorrd  r  r½   r¿   r%  r  ri  rj  rN  r  Úassignment_overloadsr8  r€  rã  )rx   r}   rk  r  r  Z	lhs_typesrn  r¶  rP  rl  r  Z
overloadedr0   r0   r1   rg   u  sP    
ÿÿÿ



z$CascadedAssignmentNode.analyse_typesc                 C   s   | j  |¡ d S rs   r{  r’   r0   r0   r1   rT  ¦  s    z3CascadedAssignmentNode.generate_rhs_evaluation_codeFc                 C   sŠ   | j D ]}| |¡ qt| j| j| jƒD ]$\}}}| |¡ |j|||d q(| j D ]}| |¡ | |¡ qT| j	 |¡ | j	 |¡ d S )N)r©  )
r  rž  ræ  ru  r€  rƒ  rª  r  r§  rP  )rx   rK   r©  rP  r¶  ÚoverloadÚ	rhs_valuer0   r0   r1   rª  ©  s    



z/CascadedAssignmentNode.generate_assignment_codec                 C   s   | j  ||¡ d S rs   r|  rë   r0   r0   r1   rÑ   ¸  s    z4CascadedAssignmentNode.generate_function_definitionsc                 C   sR   | j D ]}| |¡ qt| j| jƒD ]\}}| |¡ | |¡ q$| j |¡ d S rs   )r  r–   ræ  ru  r€  rP  )rx   rK   rP  r¶  r0   r0   r1   r–   »  s    

zCascadedAssignmentNode.annotate)r   )F)r+   r,   r-   rˆ   r€  r  rƒ  rR  r   rg   rT  rª  rÑ   r–   r0   r0   r0   r1   r~  Y  s   
1
r~  c                   @   s:   e Zd ZdgZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )rS  rÛ   c                 C   s   | j D ]}| |¡ qd S rs   rÝ   rÞ   r0   r0   r1   r   Ô  s    
z+ParallelAssignmentNode.analyse_declarationsc                    s0   ‡ fdd„| j D ƒ| _ | j D ]}| |¡ q| S )Nc                    s   g | ]}|j ˆ d d‘qS )r   )rk  )rg   rá   râ   r0   r1   r‡   Ù  s   ÿz>ParallelAssignmentNode.analyse_expressions.<locals>.<listcomp>)rÛ   rR  rÞ   r0   râ   r1   rh   Ø  s    
ÿ
z*ParallelAssignmentNode.analyse_expressionsc                 C   s<   |  | j¡ | jD ]}| |¡ q| jD ]}| |¡ q(d S rs   )ræ   r4   rÛ   rT  rª  rç   r0   r0   r1   rÒ   æ  s
    

z.ParallelAssignmentNode.generate_execution_codec                 C   s   | j D ]}| ||¡ qd S rs   rä   rå   r0   r0   r1   rÑ   í  s    
z4ParallelAssignmentNode.generate_function_definitionsc                 C   s   | j D ]}| |¡ qd S rs   rè   rç   r0   r0   r1   r–   ñ  s    
zParallelAssignmentNode.annotateN©	r+   r,   r-   rˆ   r   rh   rÒ   rÑ   r–   r0   r0   r0   r1   rS  Ä  s   rS  c                   @   s<   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¶  rP  c                 C   s   | j  |¡ d S rs   ©r¶  r  r|   r0   r0   r1   r   
  s    z*InPlaceAssignmentNode.analyse_declarationsc                 C   sl   | j  |¡| _ | j |¡| _| jjs,| jjrB| j  | jj|¡| _ n&| jjjrh| j	dkrh| j  t
j|¡| _ | S )Nz+-)rP  rg   r¶  ri   Úis_memview_indexÚis_buffer_accessrd  r	  Ú	is_stringro  r	   r•  r|   r0   r0   r1   rg     s    z#InPlaceAssignmentNode.analyse_typesc                 C   s
  |  | j¡ | j| j }}| |¡ | |¡ | j}|dkrBd}n|dkrVt| jdƒ |jsb|j	r®|j
jrvt| jdƒ |dkrž|j
jrž|jjd sžt| jdƒ | |||¡ n0|jrÂt| 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¶  rP  rž  Z generate_subexpr_evaluation_codero  r   rŠ  r‰  r	  r  r*  rÐ   rÊ   Zgenerate_buffer_setitem_codeZis_memview_slicerF   rŒ   Zgenerate_subexpr_disposal_codeZfree_subexpr_tempsr  r§  )rx   rK   r¶  rP  Zc_opr0   r0   r1   rÒ     s,    




z-InPlaceAssignmentNode.generate_execution_codec                 C   s   | j  |¡ | j |¡ d S rs   r}  r’   r0   r0   r1   r–   4  s    zInPlaceAssignmentNode.annotatec                 C   s$   ddl m} | | j| j| j| j¡S rz  )r°   r&  Z
binop_noder4   ro  r¶  rP  r	  r0   r0   r1   Úcreate_binop_node8  s    z'InPlaceAssignmentNode.create_binop_nodeN)	r+   r,   r-   rˆ   r   rg   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_tuplerD   c                 C   sd   | j r| j  |¡}| |¡| _ | j |¡}| |¡| _| t¡ t| jjƒdkr`| jr`| t	¡ | S )Nr   )
rD   rh   Úcoerce_to_pyobjectr  rÍ  Úprinting_utility_coder?   rH   Úappend_newlineÚprinting_one_utility_code)rx   r}   rD   r  r0   r0   r1   rh   F  s    

z!PrintStatNode.analyse_expressionszPython print statementc              	   C   sü   |  | j¡ | jr*| j |¡ | j ¡ }nd}t| jjƒdkr| jr| jjd }| |¡ | 	d|| ¡ | 
| j¡f ¡ | |¡ | |¡ nJ| j |¡ | 	d|| j ¡ | j| 
| j¡f ¡ | j |¡ | j |¡ | jrø| j |¡ | j |¡ d S )Nr  r   r   z"if (__Pyx_PrintOne(%s, %s) < 0) %sz#if (__Pyx_Print(%s, %s, %d) < 0) %s)ræ   r4   rD   rž  r€  r?   r  rH   r“  rF   r   r  r§  )rx   rK   Zstream_resultrt  r0   r0   r1   rÒ   T  s>    

ýÿ

üÿz%PrintStatNode.generate_execution_codec                 C   s&   | j r| j  ||¡ | j ||¡ d S rs   )rD   rÑ   r  rë   r0   r0   r1   rÑ   u  s    z+PrintStatNode.generate_function_definitionsc                 C   s"   | j r| j  |¡ | j |¡ d S rs   )rD   r–   r  r’   r0   r0   r1   r–   z  s    zPrintStatNode.annotateN)r+   r,   r-   rˆ   rh   ru   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 )
ÚExecStatNoderH   c                 C   sB   t | jƒD ]&\}}| |¡}| |¡}|| j|< q
| tj¡ | S rs   )rU  rH   rh   r‘  rÍ  r   Zpyexec_utility_code©rx   r}   rn  rt  r0   r0   r1   rh   ‡  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 )Nr  r³   Tr  z%s = __Pyx_PyExec3(%s, %s, %s);)ræ   r4   rH   rž  r8  r€  r¯  r?   r  r  r	   r
   rF   r  r§  r  r  r!  r"  )rx   rK   rH   rt  Ztemp_resultr0   r0   r1   rÒ   ’  s"    

 

ÿz$ExecStatNode.generate_execution_codec                 C   s   | j D ]}| |¡ qd S rs   ©rH   r–   rÅ  r0   r0   r1   r–   ¤  s    
zExecStatNode.annotateN)r+   r,   r-   rˆ   rh   ru   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 )ÚDelStatNoderH   Fc                 C   s   | j D ]}| |¡ qd S rs   )rH   r  r+  r0   r0   r1   r   ±  s    
z DelStatNode.analyse_declarationsc                 C   s¶   t | jƒD ]¦\}}| |d ¡ }| j|< |jjs>|jrZ|jjrZ|jr°|jjr°t	|j
dƒ q
|jjrx|jjjrx|  |¡ q
|jjrŽt	|j
dƒ q
|jr¤|jjtjkr¤q
t	|j
dƒ q
| S )NzDeletion of global C variablezDeletion of non-heap C++ objectz&Deletion of non-Python, non-C++ object)rU  rH   r  r	  r  r½   rõ  r×   Z
is_cglobalr   r4   r  r
  r"  r   rK  r  r   Úbytearray_typer–  r0   r0   r1   rh   µ  s    zDelStatNode.analyse_expressionsc                 C   s    | j D ]}|jjr|  ¡  qd S rs   )rH   r	  r  r~   r+  r0   r0   r1   rÆ   Æ  s    
zDelStatNode.nogil_checkzDeleting Python objectc                 C   s”   |  | j¡ | jD ]|}|jjs:|jjs:|jrL|jjtj	krL|j
|| jd q|jjr|jjjr| |¡ | d| ¡  ¡ | |¡ | |¡ qd S )N)Úignore_nonexistingz
delete %s;)ræ   r4   rH   r	  r  rõ  rK  r  r   r™  Zgenerate_deletion_coderš  r  r
  r"  rž  rF   rŒ   r  r§  rÅ  r0   r0   r1   rÒ   Í  s$    
ÿþþ ÿ

z#DelStatNode.generate_execution_codec                 C   s   | j D ]}| |¡ qd S rs   r—  rÅ  r0   r0   r1   r–   Ü  s    
zDelStatNode.annotateN)r+   r,   r-   rˆ   rš  r   rh   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 )rJ  c                 C   s   | S rs   r0   r|   r0   r0   r1   rh   æ  s    z PassStatNode.analyse_expressionsc                 C   s   |j jd r| | j¡ d S )Nr=  )rÐ   rÊ   ræ   r4   r’   r0   r0   r1   rÒ   é  s    z$PassStatNode.generate_execution_codeN)r+   r,   r-   rˆ   rh   rÒ   r0   r0   r0   r1   rJ  á  s   rJ  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\   rz   r4   rB  rd   r0   r1   rz   ô  s    zIndirectionNode.__init__)r+   r,   r-   rq   rz   re   r0   r0   rd   r1   r›  î  s   r›  c                   @   s$   e Zd Zg ZdZdd„ Zdd„ ZdS )ÚBreakStatNodeTc                 C   s   | S rs   r0   r|   r0   r0   r1   rh   ý  s    z!BreakStatNode.analyse_expressionsc                 C   s0   |  | j¡ |js t| jdƒ n| |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À   rh   rÒ   r0   r0   r0   r1   rœ  ø  s   rœ  c                   @   s$   e Zd Zg ZdZdd„ Zdd„ ZdS )ÚContinueStatNodeTc                 C   s   | S rs   r0   r|   r0   r0   r1   rh     s    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Ÿ    s   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 )r  rŽ   TFc                 C   sÆ   |j }|| _ |s t| jdƒ | S | jr¤| jr8t| jdƒ | j |¡| _|jsR|jrbt| jjdƒ qÂ| j |j |¡| _|j	d sˆ|j	d rÂ|j
sÂ| |¡rÂ| |¡ n|jsÂ|j
sÂ|jsÂt| jdƒ | S )Nz!Return not inside a function bodyz$Return with value in async generatorz"Return with value in void functionrî  r=  zReturn value required)rb  r   r4   rŽ   Úin_async_genrg   r  rð  rd  rÊ   r  Zcan_coerce_to_pyobjectrø  )rx   r}   rb  r0   r0   r1   rh   (  s,    ÿþz"ReturnStatNode.analyse_expressionsc                 C   s   | j jr|  ¡  d S rs   )rb  r  r~   r|   r0   r0   r1   rÆ   @  s    zReturnStatNode.nogil_checkzReturning Python objectc                 C   sj  |  | j¡ | jsd S | j}| jjrB| tj| j¡ |rB|jrBd }|r| 	|¡ | jj
rddlm} |jtj| j|j||| jd | |¡ nf| |¡ | dtj| | j¡f ¡ | |¡ |jjd sØ|jjd rö|jtj| j| j|jj d | |¡ n6| jjr| tj| j¡ n| jjr8|  || jj¡ |j ¡ D ]\}}| ||¡ qB| |j ¡ d S )Nr   rÈ  )Z	lhs_cnameZlhs_typeZlhs_posrP  rK   rJ  r¢  rî  r=  rV  )!ræ   r4   rb  rŽ   r  r˜  r   r{  r¾   rž  rõ  r°   rÉ  Zput_acquire_memoryviewslicerÇ   r¦  r£  rF   r¤  rÐ   rÊ   r‘  r  rS  r§  r  rð  Ú
put_returnrh  Ztemps_holding_referencer!  r”  r•  )rx   rK   rŽ   rÉ  rX  r	  r0   r0   r1   rÒ   F  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_openmprF   r   r{  )rx   rK   rŽ   r0   r0   r1   r¢  x  s    
zReturnStatNode.put_returnc                 C   s   | j d k	r| j  ||¡ d S rs   )rŽ   rÑ   rë   r0   r0   r1   rÑ   }  s    
z,ReturnStatNode.generate_function_definitionsc                 C   s   | j r| j  |¡ d S rs   )rŽ   r–   r’   r0   r0   r1   r–     s    zReturnStatNode.annotateN)r+   r,   r-   rˆ   rÀ   Úin_generatorr¡  r£  rh   rÆ   r{   rÒ   r¢  rÑ   r–   r0   r0   r0   r1   r    s   2r  c                   @   sR   e Zd Zddddg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rˆ| j |¡}| jr||jtjksJ|jjs|ddl	m
} ||j| |¡gdd}|j|dd}| |¡| _| jr¦| j |¡}| |¡| _| jrÄ| j |¡}| |¡| _| j rš| jsš| jsš| j }ddlm	} t||jƒr |js |jd k	r|jjs |j}|jrš|jjršddlm}	 |j| _| jdkrZd | _ n@| jd	krš|jrš|jd
krš|jrš|jjrš| jsšd | _ | S )Nr   r  T)rH   Zslow)Zskip_childrenrû  )ÚSymtabÚMemoryErrorÚStopIterationÚ__next__)r§  rg   r‘  r¨  Úwrap_tuple_valuer	  r   Z
tuple_typer¾  r&  r  r4   r©  rª  r°   r@   r  rH   r  r  r½   r×   Ú
is_builtinr«  r_   Úbuiltin_exc_nameZis_local_scoper3  rV  Úin_try_block)
rx   r}   r§  r¨  r  r©  rª  Úexcr&  r«  r0   r0   r1   rh   —  s\    ÿÿÿÿÿþþýz!RaiseStatNode.analyse_expressionsúRaising exceptionc                 C   s€  |  | j¡ | jdkr0| d| | j¡ ¡ d S | jdkrp| jsp| dtj ¡ | d| d ¡ ¡ d|j_	d S | jr¦| j 
|¡ | j ¡ }| jjrª|j | jj¡ nd}| jrÈ| j 
|¡ | j ¡ }nd}| jrê| j 
|¡ | j ¡ }nd}| jr| j 
|¡ | j ¡ }nd}|j t¡ | d||||f ¡ | j| j| j| jfD ] }|rH| |¡ | |¡ qH| | | j¡¡ d S )	Nr¬  zPyErr_NoMemory(); %sr­  z%s = 1;rÊ  Tr  z__Pyx_Raise(%s, %s, %s, %s);)ræ   r4   r±  rF   r   r§  r   rŸ  r  rž  rž  r€  r½   rÐ   Zuse_entry_utility_coder×   r¨  r©  rª  rÍ  Úraise_utility_coder  r§  )rx   rK   Z	type_codeZ
value_codeZtb_codeZ
cause_coderÆ  r0   r0   r1   rÒ   Ä  sV    

üÿ

ÿz%RaiseStatNode.generate_execution_codec                 C   sd   | j d k	r| j  ||¡ | jd k	r0| j ||¡ | jd k	rH| j ||¡ | jd k	r`| j ||¡ d S rs   )r§  rÑ   r¨  r©  rª  rë   r0   r0   r1   rÑ   ô  s    



z+RaiseStatNode.generate_function_definitionsc                 C   sL   | j r| j  |¡ | jr$| j |¡ | jr6| j |¡ | jrH| j |¡ d S rs   )r§  r–   r¨  r©  rª  r’   r0   r0   r1   r–   þ  s    zRaiseStatNode.annotate)r+   r,   r-   rˆ   rÀ   r±  r¯  r²  rh   ru   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   s   | S rs   r0   r|   r0   r0   r1   rh     s    z#ReraiseStatNode.analyse_expressionsr´  c                 C   sÎ   |  | j¡ |jj}|r‚|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‡     s     z;ReraiseStatNode.generate_execution_code.<locals>.<listcomp>ZReRaiseExceptionúExceptions.cz__Pyx_ReraiseException();T©Úreraise)ræ   r4   r  Úexc_varsrÐ   rÍ  r™  r¥  r
   r¨  rF   r¯  r£   r   rm  rl  Úput_trace_exceptionr   )rx   rK   r^  r0   r0   r1   rÒ     s     
ÿ
z'ReraiseStatNode.generate_execution_codeN)r+   r,   r-   rˆ   rÀ   rh   ru   r~   rÆ   r{   rÒ   r0   r0   r0   r1   r¶  	  s   r¶  c                   @   sB   e Zd Zdddg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 kstdƒ‚| jd k	s$tdƒ‚| j |¡ d S )Nz0Message should have been replaced in PostParse())rŽ   r_  rÀ  r   r|   r0   r0   r1   r   2  s    z#AssertStatNode.analyse_declarationsc                 C   s    | j  |¡| _ | j |¡| _| S rs   )r¿  Úanalyse_temp_boolean_expressionrÀ  rh   r|   r0   r0   r1   rh   7  s    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())) {rE  rH  rY  zif ((1)); else %sFrD  r[  )rÐ   rÍ  r   rm  rF   ræ   r4   r¿  rž  rŒ   rÀ  rÒ   r  r§  r   r’   r0   r0   r1   rÒ   <  s,    
ÿ

ÿÿÿ
z&AssertStatNode.generate_execution_codec                 C   s    | j  ||¡ | j ||¡ d S rs   )r¿  rÑ   rÀ  rë   r0   r0   r1   rÑ   Q  s    z,AssertStatNode.generate_function_definitionsc                 C   s   | j  |¡ | j |¡ d S rs   )r¿  r–   rÀ  r’   r0   r0   r1   r–   U  s    zAssertStatNode.annotate)
r+   r,   r-   rˆ   rÀ  r   rh   rÒ   rÑ   r–   r0   r0   r0   r1   r¾  (  s   
r¾  c                   @   s<   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 )Ú
IfStatNodeÚ
if_clausesÚelse_clausec                 C   s,   | j D ]}| |¡ q| jr(| j |¡ d S rs   )rÃ  r   rÄ  )rx   r}   Ú	if_clauser0   r0   r1   r   b  s    
zIfStatNode.analyse_declarationsc                    s.   ‡ fdd„| j D ƒ| _ | jr*| j ˆ ¡| _| S )Nc                    s   g | ]}|  ˆ ¡‘qS r0   rà   )r…   rÅ  râ   r0   r1   r‡   i  s     z2IfStatNode.analyse_expressions.<locals>.<listcomp>)rÃ  rÄ  rh   r|   r0   râ   r1   rh   h  s    zIfStatNode.analyse_expressionsc                 C   s–   |  | j¡ | ¡ }t| jƒ}| js,|d8 }t| jƒD ]\}}|j||||kd q6| jrˆ|  | jj¡ | d¡ | j |¡ | d¡ | 	|¡ d S )Nr   )Úis_lastú
/*else*/ {rH  )
ræ   r4   ro  r?   rÃ  rÄ  rU  rÒ   rF   r–  )rx   rK   r  Úlastrn  rÅ  r0   r0   r1   rÒ   n  s    


z"IfStatNode.generate_execution_codec                 C   s4   | j D ]}| ||¡ q| jd k	r0| j ||¡ d S rs   )rÃ  rÑ   rÄ  )rx   r}   rK   Zclauser0   r0   r1   rÑ   }  s    

z(IfStatNode.generate_function_definitionsc                 C   s,   | j D ]}| |¡ q| jr(| j |¡ d S rs   )rÃ  r–   rÄ  )rx   rK   rÅ  r0   r0   r1   r–   ƒ  s    
zIfStatNode.annotateNr†  r0   r0   r0   r1   rÂ  Z  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   s   | j  |¡ d S rs   )r•   r   r|   r0   r0   r1   r   “  s    z!IfClauseNode.analyse_declarationsc                 C   s    | j  |¡| _ | j |¡| _| S rs   )r¿  rÁ  r•   rh   r|   r0   r0   r1   rh   –  s    z IfClauseNode.analyse_expressionsc                 C   sœ   | j  |¡ | | j¡ | j  ¡ }| jr6d| j|f }| d| ¡ | j  |¡ | j  |¡ | j	 
|¡ |j| jdd |sŽ| j	jsŽ| |¡ | d¡ d S )Nz%s(%s)rb  FrK  rH  )r¿  rž  ræ   r4   rŒ   Úbranch_hintrF   r  r§  r•   rÒ   rÀ   r”  )rx   rK   r  rÆ  r¿  r0   r0   r1   rÒ   ›  s    

z$IfClauseNode.generate_execution_codec                 C   s    | j  ||¡ | j ||¡ d S rs   )r¿  rÑ   r•   rë   r0   r0   r1   rÑ   ª  s    z*IfClauseNode.generate_function_definitionsc                 C   s   | j  |¡ | j |¡ d S rs   )r¿  r–   r•   r’   r0   r0   r1   r–   ®  s    zIfClauseNode.annotate)
r+   r,   r-   rˆ   rÊ  r   rh   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   s   | j D ]}| |¡ qd S rs   )rÌ  rž  ©rx   rK   r¹  r0   r0   r1   Ú"generate_condition_evaluation_code»  s    
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¤  FrK  r©  )r?   rÌ  rÐ   rÊ   rU  rF   rŒ   ræ   r4   r•   rÒ   )rx   rK   Znum_conditionsZline_tracing_enabledrn  r¹  r0   r0   r1   rÒ   ¿  s    
z&SwitchCaseNode.generate_execution_codec                 C   s*   | j D ]}| ||¡ q| j ||¡ d S rs   )rÌ  rÑ   r•   )rx   r}   rK   r¹  r0   r0   r1   rÑ   Ì  s    
z,SwitchCaseNode.generate_function_definitionsc                 C   s&   | j D ]}| |¡ q| j |¡ d S rs   )rÌ  r–   r•   rÍ  r0   r0   r1   r–   Ñ  s    
zSwitchCaseNode.annotateN)r+   r,   r-   rˆ   rÎ  rÒ   rÑ   r–   r0   r0   r0   r1   rË  ³  s
   rË  c                   @   s.   e Zd Zdddg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 ]}| |¡ qH| j	d k	r„| d¡ | j	 |¡ | d¡ n
| d¡ | d¡ | j  
|¡ | j  |¡ d S )NrÂ  r£  r©  zdefault: break;rH  )rÐ  rž  rÑ  rÎ  ræ   r4   rF   rŒ   rÒ   rÄ  r  r§  ©rx   rK   Úcaser0   r0   r1   rÒ   à  s    





z&SwitchStatNode.generate_execution_codec                 C   sB   | j  ||¡ | jD ]}| ||¡ q| jd k	r>| j ||¡ d S rs   )rÐ  rÑ   rÑ  rÄ  )rx   r}   rK   rÓ  r0   r0   r1   rÑ   ÷  s
    

z,SwitchStatNode.generate_function_definitionsc                 C   s<   | j  |¡ | jD ]}| |¡ q| jd k	r8| j |¡ d S rs   )rÐ  r–   rÑ  rÄ  rÒ  r0   r0   r1   r–   þ  s
    

zSwitchStatNode.annotateN)r+   r,   r-   rˆ   rÒ   rÑ   r–   r0   r0   r0   r1   rÏ  ×  s   
rÏ  c                   @   s   e Zd ZdS )ÚLoopNodeNrö  r0   r0   r0   r1   rÔ    s   rÔ  c                   @   s>   e Zd ZdddgZdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )ÚWhileStatNoder¿  r•   rÄ  c                 C   s"   | j  |¡ | jr| j |¡ d S rs   )r•   r   rÄ  r|   r0   r0   r1   r     s    z"WhileStatNode.analyse_declarationsc                 C   s:   | j r| j  |¡| _ | j |¡| _| jr6| j |¡| _| S rs   )r¿  rÁ  r•   rh   rÄ  r|   r0   r0   r1   rh     s    z!WhileStatNode.analyse_expressionsc                 C   sÐ   |  | j¡ | ¡ }| d¡ | jr\| j |¡ | j |¡ | d| j ¡  ¡ | j |¡ | j	 
|¡ | |j¡ | d¡ |j}| |¡ | jrÂ|  | jj¡ | d¡ | j 
|¡ | d¡ | |¡ d S )Nzwhile (1) {zif (!%s) break;rH  rÇ  )ræ   r4   Únew_loop_labelsrF   r¿  rž  r  rŒ   r§  r•   rÒ   r–  r   r  Úset_loop_labelsrÄ  )rx   rK   Úold_loop_labelsr  r0   r0   r1   rÒ      s.    ÿÿ



z%WhileStatNode.generate_execution_codec                 C   s>   | j r| j  ||¡ | j ||¡ | jd k	r:| j ||¡ d S rs   )r¿  rÑ   r•   rÄ  rë   r0   r0   r1   rÑ   7  s
    
z+WhileStatNode.generate_function_definitionsc                 C   s4   | j r| j  |¡ | j |¡ | jr0| j |¡ d S rs   )r¿  r–   r•   rÄ  r’   r0   r0   r1   r–   >  s
    zWhileStatNode.annotateNr†  r0   r0   r0   r1   rÕ  
  s   
rÕ  c                
   @   s\   e Zd Zddddddddd	d
g
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Ú  rÛ  rÜ  rà  rá  râ  rã  Úis_tempr	  ©ru   rz   r4   r	   Zc_bint_type)rx   rÚ  rÛ  rÜ  rà  rá  râ  rã  r0   r0   r1   rz   R  s     özDictIterationNextNode.__init__c                 C   s  ddl m} | j |¡| _| j |¡| _| jr<| j |¡| _| jrx| j |¡| _| | jj	t
j¡| _| j | jj|¡| _| jr¶| j |¡| _|j| jj	t
jd| _| j | jj|¡| _| jrò| j |¡| _| | jj	t
j¡| _| j | jj|¡| _| j |¡| _| S ©Nr   rû  r´  )r°   r&  rÚ  rg   rÛ  rÜ  rà  ri   ÚTempNoder4   r	   r
   Úkey_refrd  r	  rÝ  rá  Ú	value_refrÞ  râ  Ú	tuple_refrß  rã  ©rx   r}   r&  r0   r0   r1   rh   `  s&    z)DictIterationNextNode.analyse_expressionsc                 C   s   | j  ||¡ d S rs   )rÚ  rÑ   rë   r0   r0   r1   rÑ   u  s    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 ]H\}}}|d krnd}n&| |||f¡ | |¡ d| ¡  }| |¡ qV|j tjd¡}| d|| j ¡ | j ¡ | j ¡ |d |d |d	 | j ¡ f ¡ | d
| ¡ | | d| | j¡¡ |j |¡ |D ]\}}}| |¡ q(|D ]\}}}| |¡ qD|D ]"\}}}| ||¡ |  |¡ q`d S )NZ	dict_iterú
Optimize.crZ  ú&%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   rm  rÚ  rž  rè  rÝ  rà  ré  rÞ  rá  rê  rß  râ  r8  ÚallocaterŒ   r  r  r	   r{  rF   r€  rÛ  rÜ  rã  r;  r4   r"  Úgenerate_gotrefrª  Úrelease)	rx   rK   rv  Ztemp_addressesrL  rŒ   r¨  ÚaddrÚresult_tempr0   r0   r1   rÒ   x  sF    þ
ø
z-DictIterationNextNode.generate_execution_code)r+   r,   r-   rˆ   rÝ  rè  rÞ  ré  rß  rê  rz   rh   rÑ   rÒ   r0   r0   r0   r1   rÙ  F  s         þrÙ  c                   @   sD   e Zd ZddddddgZd ZZdd	„ Zd
d„ Zdd„ Zdd„ Z	dS )ÚSetIterationNextNodeÚset_objrÛ  rÜ  rÞ  rá  Úis_set_flagNc                 C   s$   t j| |j|||||dtjd	 d S )NT)rö  rÛ  rÜ  rá  r÷  rä  r	  rå  )rx   rö  rÛ  rÜ  rá  r÷  r0   r0   r1   rz   ª  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 ræ  )r°   r&  rö  rg   rÛ  rÜ  rá  ri   rç  r4   r	   r
   ré  rd  r	  rÞ  r÷  rë  r0   r0   r1   rh   µ  s    z(SetIterationNextNode.analyse_expressionsc                 C   s   | j  ||¡ d S rs   )rö  rÑ   rë   r0   r0   r1   rÑ   À  s    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_iterrì  Fz/%s = __Pyx_set_iter_next(%s, %s, &%s, &%s, %s);rî  rï  )rÐ   rÍ  r   rm  rö  rž  ré  rð  r  r  r	   r{  rF   r€  rÛ  rŒ   rÜ  r÷  r;  r4   r"  rñ  rÞ  rá  rª  rò  )rx   rK   ré  rô  r0   r0   r1   rÒ   Ã  s(    
ú
z,SetIterationNextNode.generate_execution_code)
r+   r,   r-   rˆ   rÞ  ré  rz   rh   rÑ   rÒ   r0   r0   r0   r1   rõ  ¢  s     ÿrõ  c                 K   s<   d|kr,|d j rt| f|ŽS t| f|ŽS nt| f|ŽS d S )NÚiterator)Úis_asyncÚAsyncForStatNodeÚForInStatNodeÚForFromStatNode)r4   ry   r0   r0   r1   ÚForStatNodeÞ  s
    
rý  c                   @   sR   e Zd Zdddddg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 )Ú_ForInStatNoder¨  rŸ   rø  r•   rÄ  NFc                 C   s   t dƒ‚d S )Nz!must be implemented by subclasses)ÚNotImplementedErrorrƒ   r0   r0   r1   Ú_create_item_nodeö  s    z _ForInStatNode._create_item_nodec                 C   s6   | j  |¡ | j |¡ | jr*| j |¡ |  ¡  d S rs   )r¨  r  r•   r   rÄ  r   r|   r0   r0   r1   r   ù  s
    z#_ForInStatNode.analyse_declarationsc                 C   sš   | j  |¡| _ | j |¡| _|  ¡  | j |¡| _| js`| jjjsL| jjj	r`| j j 
| jj¡r`n| j | j j|¡| _| j |¡| _| jr–| j |¡| _| S rs   )r¨  ri   rø  rh   r   rŸ   rù  r	  r  r  re  rd  r•   rÄ  r|   r0   r0   r1   rh      s"    ÿÿþz"_ForInStatNode.analyse_expressionsc                 C   sV  |  | j¡ | ¡ }| j |¡ | d¡ | j |¡ | d¡ | j |¡ | j	 
| j|¡ | | j¡ | j |¡ |  | j¡ | |j¡ | d¡ | j |¡ | jr²| d¡nd }| d¡}|j|jg|g|pÔ|| jd}|  | j¡ |D ]}| j |¡ qî| |¡ | j |¡ | jrH| d¡ | |¡ | j |¡ | d¡ | |¡ d S )Nr  r¢  rH  Zfor_elseZfor_end)Úskip_to_labelr4   rÇ  )ræ   r4   rÖ  rø  rž  ru  Zgenerate_for_loop_headerrF   rŸ   r¨  rª  Úwrite_trace_liner•   rÒ   r–  r   r  rÄ  ro  Úlabel_interceptorr  r×  r§  )rx   rK   rØ  Z
else_labelr  Úlabel_interceptsrè  r0   r0   r1   rÒ     sB    



ü



z&_ForInStatNode.generate_execution_codec                 C   sF   | j  ||¡ | j ||¡ | j ||¡ | jd k	rB| j ||¡ d S rs   )r¨  rÑ   rø  r•   rÄ  rë   r0   r0   r1   rÑ   ;  s
    
z,_ForInStatNode.generate_function_definitionsc                 C   sF   | j  |¡ | j |¡ | j |¡ | jr6| j |¡ | j |¡ d S rs   )r¨  r–   rø  r•   rÄ  rŸ   r’   r0   r0   r1   r–   B  s    z_ForInStatNode.annotate)r+   r,   r-   rˆ   rŸ   rù  r   r   rh   rÒ   rÑ   r–   r0   r0   r0   r1   rþ  è  s   
*rþ  c                   @   s   e Zd ZdZdd„ ZdS )rû  Fc                 C   s   ddl m} || jƒ| _d S )Nr   )ÚNextNode)r&  r  rø  rŸ   )rx   r  r0   r0   r1   r   P  s    zForInStatNode._create_item_nodeN)r+   r,   r-   rù  r   r0   r0   r0   r1   rû  K  s   rû  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )rú  Tc                 K   sD   d|kst ‚ddlm} |j|d jd d|d< tj| |f|Ž d S )NrŸ   r   rû  rø  )rt  )r_  r°   r&  ZAwaitIterNextExprNoder4   rþ  rz   )rx   r4   ry   r&  r0   r0   r1   rz   ]  s    zAsyncForStatNode.__init__c                 C   s    ddl m} | | j¡| j_d S rz  )r°   r&  ZAsyncNextNoderø  rŸ   rt  r	  r0   r0   r1   r   d  s    z"AsyncForStatNode._create_item_nodeN)r+   r,   r-   rù  rz   r   r0   r0   r0   r1   rú  U  s   rú  c                   @   sv   e Zd Zddddddg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 )rü  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 rs   )r¨  r  r  r	  r  r~   )rx   r}   r†   r0   r0   r1   rÆ   „  s    zForFromStatNode.nogil_checkc                 C   s.   | j  |¡ | j |¡ | jr*| j |¡ d S rs   )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 k	rlt| j|j	ƒr^t
| jjddƒ | j |¡| _|  |¡ | jj}|js˜|js˜t| jjdƒ | j |¡| _| jrº| j |¡| _| S )Nr   rû  zdProbable infinite loop in for-from-by statement. Consider switching the directions of the relations.r%   z>for-from loop variable must be c numeric type or Python object)r°   r&  r¨  ri   r  rg   r  r  r@   ZUnaryMinusNoder   r4   Úset_up_loopr	  r  r¿  r   r•   rh   rÄ  )rx   r}   r&  ré  r0   r0   r1   rh     s$    

ÿ
z#ForFromStatNode.analyse_expressionsc                 C   s|  ddl m} | jj}|jr |}n~|jr4t| jjdƒ |jr@t	j
nt	j}| jjjs`t	 || jj¡}| jjjszt	 || jj¡}| jd k	rž| jjjsžt	 || jj¡}| j ||¡| _| j ||¡| _| jjsÔ| j |¡| _| jd k	r| j ||¡| _| jjs| j |¡| _|js|jrJd| _t| j|jƒr:t| jdƒ‚| j| _d | _n.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°   r&  r¨  r	  r¿  Úis_enumr   r4   r  r	   Úc_long_typer{  r  Úwidest_numeric_typer  r  rd  r¿   ri  Úis_py_targetr@   ZBufferIndexNoder   Úloopvar_nodeÚpy_loopvar_noderç  r  r‘  )rx   r}   r&  ré  Z	loop_typeZc_loopvar_noder0   r0   r1   r	  ¤  sB    ÿ


zForFromStatNode.set_up_loopc                 C   s  |  | j¡ | ¡ }| j}| j |¡ | j |¡ | j| j \}}| j	d k	rt| j	 |¡ | j	 
¡ }d|d |f }nd}ddlm} t| j|jƒrž| j |¡ t| j|jƒr¸| j |¡ | jjjrÈtjn| jj}|rê| jsê|j |d¡}	n
| j 
¡ }	|jrF|jsF| jd dkrF| d|	| j 
¡ |||	| j| j 
¡ ||	|f
 ¡ n,| d	|	| j 
¡ ||	| j| j 
¡ |	|f ¡ | j}
|
d krš|rš| | jj||	¡}
|
d k	r¼|
 |¡ | j |
|¡ |  | j¡ | j! "|¡ | #|j$¡ |sü| jrü| jj%j&r¦| '| jjd ¡}| |¡ | (| jj%j)¡}| jj%j*j+rL|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&rü| 7| 
¡ |j¡ | 8|¡ | d¡ |s0| jr0| j |¡ | j | j|¡ |rJ| jsJ|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 k	r| j	 =|¡ | j	 >|¡ 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); %srH  rÇ  )?ræ   r4   rÖ  Ú
from_ranger  rž  r  Úrelation_tableZ	relation1r  rŒ   r°   r&  r@   r  rç  rð  r  r¨  r	  r
  r	   r  r  r  r  r*  r¸  Z	relation2rF   rî  rª  r  r•   rÒ   r–  r   r×   Zis_pyglobalZ
PyTempNoder›  r_   rw  rô  rÐ   rÍ  r   rm  ra  r  r  rñ  ZCoerceFromPyTypeNodeZ	temp_coder  r§  rò  r"  r  r×  rÄ  r  r§  )rx   rK   rØ  r  ÚoffsetZincopr  r&  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>=r  c                 C   sl   | j  ||¡ | j ||¡ | j ||¡ | jd k	rB| j ||¡ | j ||¡ | jd k	rh| j ||¡ d S rs   )r¨  rÑ   r  r  r  r•   rÄ  rë   r0   r0   r1   rÑ   D  s    

z-ForFromStatNode.generate_function_definitionsc                 C   sX   | j  |¡ | j |¡ | j |¡ | jr6| j |¡ | j |¡ | jrT| j |¡ d S rs   )r¨  r–   r  r  r  r•   rÄ  r’   r0   r0   r1   r–   N  s    zForFromStatNode.annotate)r+   r,   r-   rˆ   r  r  r  r  r{   rÆ   r   rh   r	  rÒ   r  rÑ   r–   r0   r0   r0   r1   rü  i  s$   &tû
rü  c                   @   sD   e Zd ZdZddddg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 rs   )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   )rç  )r  rg   r	  Zis_cython_lock_typeÚCythonLockStatNodeÚfrom_withstatrh   r  r¨  r&  rç  r4   Útarget_tempr•   )rx   r}   rç  r0   r0   r1   rh   €  s    
z WithStatNode.analyse_expressionsc                 C   s.   | j  ||¡ | j ||¡ | j ||¡ d S rs   )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rjd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:*/ {Fr  ZPyObjectLookupSpecialrò  z-%s = __Pyx_PyObject_LookupSpecial(%s, %s); %sÚ	__aexit__Ú__exit__r¢  rH  )&ræ   r4   rF   r  rž  r  r  r
   Zexit_varrÐ   rÍ  r   rm  r€  r›  r   rù  r  r  rv  r“  r  r¨  r  rð  r£  rŒ   r¦  r  r§  r•   rÒ   r’  ro  r”  r–  r!  r"  )rx   rK   r  Zintermediate_error_labelZstep_over_labelr0   r0   r1   rÒ   ‘  sJ    

ÿü



z$WithStatNode.generate_execution_code)r+   r,   r-   rq   rˆ   r  r  r   rh   rÑ   rÒ   r0   r0   r0   r1   r  Y  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 )ÚWithTargetAssignmentStatNoderP  r¶  Nc                 C   s   | j  |¡ d S rs   rˆ  r|   r0   r0   r1   r   Ð  s    z1WithTargetAssignmentStatNode.analyse_declarationsc                 C   s4   | j  |¡| _ | j  |¡ | jj | j j|¡| _| S rs   )r¶  ri   re  Ú	with_noder  rd  r	  rP  r|   r0   r0   r1   rh   Ó  s    z0WithTargetAssignmentStatNode.analyse_expressionsc                 C   s.   | j  |¡ | j | j |¡ | jj |¡ d S rs   )rP  rž  r¶  rª  r   r  rò  r’   r0   r0   r1   rÒ   Ù  s    z4WithTargetAssignmentStatNode.generate_execution_codec                 C   s   | j  |¡ | j |¡ d S rs   r}  r’   r0   r0   r1   r–   Þ  s    z%WithTargetAssignmentStatNode.annotate)
r+   r,   r-   rˆ   r   rP  r   rh   rÒ   r–   r0   r0   r0   r1   r  Â  s   
r  c                   @   sL   e Zd Zdddg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 )ÚTryExceptStatNoder•   Úexcept_clausesrÄ  Fc                 C   s8   | j  |¡ | jD ]}| |¡ q| jr4| j |¡ d S rs   )r•   r   r"  rÄ  )rx   r}   Úexcept_clauser0   r0   r1   r   í  s
    
z&TryExceptStatNode.analyse_declarationsc                 C   sr   | j  |¡| _ d}t| jƒD ]6\}}| |¡ }| j|< |rHt|jdƒ |jsd}q|| _| jrn| j |¡| _| S )Nr   zdefault 'except:' must be lastr   )	r•   rh   rU  r"  r   r4   ÚpatternÚhas_default_clauserÄ  )rx   r}   Zdefault_clause_seenrn  r#  r0   r0   r1   rh   ô  s    z%TryExceptStatNode.analyse_expressionszTry-except statementc                    sŠ  ˆ   | j¡ ˆ  d¡ ˆ j}ˆ j}ˆ j}ˆ  ¡ }ˆ j}ˆ  d¡}ˆ  d¡}ˆ  d¡}	ˆ  d¡}
|rlˆ  d¡nd }|r~ˆ  d¡nd }ˆ  d¡}‡ fd	d
„t	dƒD ƒ‰ˆ  
¡ }ˆ  d¡ |
ˆ _|ˆ _|ˆ _| j ˆ ¡ ˆ j | jdd ˆ  d¡ ˆ j ¡ }ˆ  |¡}|rtˆ j t¡ | js.| d¡ | d¡ | dd dd
„ ˆD ƒ¡ ¡ ˆD ]}| |t¡ qP‡ ‡fdd„}n*dd
„ ˆD ƒ}| dd |¡ ¡ dd„ }|ˆ _|	ˆ _| jj}| jröˆ   | jj¡ ˆ  d¡ | j ˆ ¡ ˆ  d¡ |sö| jj}|r |s$ˆD ]}ˆ  |t¡ qˆ  |¡ ˆ  |¡ |D ]\}}ˆ  ||¡ q2ˆ  ¡ r\ˆ  ¡  ˆ jj}| ˆ j_| jD ]}|  ˆ |¡ qr|ˆ j_| j!s ˆ  |¡ ˆ j"||||
|	g|||||g|sÒˆ  |¡sÒ|nd | jdd}|D ]}|rä|ƒ  qäˆ  |¡r6|s ˆ  |¡s ˆ  |¡ ˆ  |¡ |r6|ƒ  ˆ  |¡rLˆ  |¡ ˆ  d¡ ˆD ]}ˆ j #|¡ qZ|ˆ _|ˆ _|ˆ _|ˆ _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 )F©r  r  r
   ©r…   rè  r]  r0   r1   r‡      s   ÿz=TryExceptStatNode.generate_execution_code.<locals>.<listcomp>r³   ú
/*try:*/ {FrK  rH  rW  rX  z__Pyx_ExceptionSave(%s);rž   c                 S   s   g | ]}d | ‘qS )rí  r0   rW  r0   r0   r1   r‡   ,   s     c                     s.   ˆD ]} ˆ   | t¡ qˆ  dd ˆ¡ ¡ d S )Nz__Pyx_ExceptionReset(%s);rž   )r¨  r
   rF   r£   rü   ©rK   Zexc_save_varsr0   r1   Úrestore_saved_exception0   s
    ÿzJTryExceptStatNode.generate_execution_code.<locals>.restore_saved_exceptionc                 S   s   g | ]}d | ‘qS )z	(void)%s;r0   rW  r0   r0   r1   r‡   8   s     z%s /* mark used */r<   c                   S   s   d S rs   r0   r0   r0   r0   r1   r*  ;   s    z/*else:*/ {)r  r4   rL  )$ræ   r4   rF   r•  r  r   rv  r“  ro  r  rB   r•   rÒ   r  Úall_free_managed_tempsr’  rÐ   rÍ  Úreset_exception_utility_coder¥  r£   Úput_xgotrefr
   rÀ   rÄ  rç  r”  r–  rl  r›  Zcurrent_exceptr"  Úgenerate_handling_coder%  r  r"  )rx   rK   Ú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_raiserL  r*  Zmark_vars_usedZnormal_case_terminatesÚ	temp_nameÚ	temp_typeZouter_exceptr#  r  rè  rX  r0   r)  r1   rÒ      sÊ    






ÿÿÿ



ÿÿÿ




û




z)TryExceptStatNode.generate_execution_codec                 C   sB   | j  ||¡ | jD ]}| ||¡ q| jd k	r>| j ||¡ d S rs   )r•   rÑ   r"  rÄ  )rx   r}   rK   r#  r0   r0   r1   rÑ      s
    

z/TryExceptStatNode.generate_function_definitionsc                 C   s8   | j  |¡ | jD ]}| |¡ q| jr4| j |¡ d S rs   )r•   r–   r"  rÄ  )rx   rK   Zexcept_noder0   r0   r1   r–   †   s
    
zTryExceptStatNode.annotateN)r+   r,   r-   rˆ   r¥  r   rh   ru   r~   rÆ   r{   rÒ   rÑ   r–   r0   r0   r0   r1   r!  ã  s   
zr!  c                   @   sT   e Zd Zddddg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S )ÚExceptClauseNoder$  r¨  r•   r¨  NFc                 C   s"   | j r| j  |¡ | j |¡ d S rs   )r¨  r  r•   r   r|   r0   r0   r1   r   ¥   s    z%ExceptClauseNode.analyse_declarationsc                 C   s€   |j | _| jr<t| jƒD ]"\}}| |¡}| |¡| j|< q| jrnddlm} | 	| j
¡| _| j || j¡| _| j |¡| _| S rz  )r¡  r—  r$  rU  rh   r‘  r¨  r°   r&  ZExcValueNoder4   r¨  r  r•   )rx   r}   rn  r$  r&  r0   r0   r1   rh   ª   s    
z$ExceptClauseNode.analyse_expressionsc                 C   sn   | j }t|tƒrH|jD ],}t|tƒr(qqt|tƒr<|} qHq dS qdS t|tƒrj|j}|d ksf|jrjdS dS )NTF)r•   r@   rÚ   rÛ   rJ  r  rŽ   r¿   )rx   r•   rJ   rŽ   r0   r0   r1   Úbody_may_need_exceptionº   s    




z(ExceptClauseNode.body_may_need_exceptionc                    s\  ˆ   | j¡ | jrtdd„ | jD ƒƒ }|rt‡ fdd„tdƒD ƒ}ˆ j t dd¡¡ ˆ  	dt
|ƒ ¡ |d	 ‰nd  }‰| jD ]}| ˆ ¡ q‚d
d„ | jD ƒ}g }ˆrˆ j t dd¡¡ t|ƒdkrê| dˆ|d	 |d f ¡ n| ‡fdd„|D ƒ¡ nft|ƒdkrBˆ 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 k	pL| jd k	pL|  ¡ }|sZ|
rfˆ  | j¡ |
rxˆ  | j¡ |ràˆ 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rB| j" #|d ¡ | j" ˆ ¡ | j $| j"ˆ ¡ | jd k	rrt%|| jj&ƒD ]\}}| #|¡ q\ˆ  'd"¡}|r’ˆ jj(}|ˆ j_(| j) *ˆ ¡ |r¬|ˆ j_(| j)j+sÞ|rÔ|D ]}ˆ  ,|t!¡ qÀˆ  -|¡ |rDˆ  .ˆ  /¡ |¡D ]6}ˆ  0|d	 t!¡ ˆ  0|d t!¡ ˆ  ,|d t!¡ qô|D ]}	ˆ j |	¡ q0ˆ  1|¡ ˆ  	d#¡ d S )$Nc                 s   s&   | ]}|j p| ¡ o| ¡  V  qd S rs   )r¿   Ú	is_simplerN  ©r…   r$  r0   r0   r1   rî   Ö   s   ÿz:ExceptClauseNode.generate_handling_code.<locals>.<genexpr>c                    s   g | ]}ˆ j jtd d‘qS ©Tr  r&  r'  r]  r0   r1   r‡   Ü   s   ÿz;ExceptClauseNode.generate_handling_code.<locals>.<listcomp>r³   ÚPyErrFetchRestorer¹  z__Pyx_ErrFetch(&%s, &%s, &%s);r   c                 S   s   g | ]}|  ¡ ‘qS r0   )r€  r6  r0   r0   r1   r‡   æ   s     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   r6  )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   r6  r0   r0   r1   rî   þ   s   ÿFr  r¢  z || ú__Pyx_ErrRestore(%s, %s, %s);r<   c                 S   s   g | ]}d | ‘qS ©ú%s = 0;r0   rW  r0   r0   r1   r‡   !  s     rb  z/*except:*/ {c                    s   g | ]}ˆ j jtd d‘qS r7  r&  r'  r]  r0   r1   r‡   (!  s   ÿz&%s, &%s, &%sz"if (__Pyx_GetException(%s) < 0) %sz__Pyx_ErrRestore(0,0,0);z__Pyx_TraceExceptionDone();Zexcept_rH  )2ræ   r4   r$  rð   r  rÐ   rÍ  r   rm  rF   r¯  rž  r?   r8  Úextendr  r  r	   r{  r£   r  r§  r"  rl  r¨  Úexcinfo_targetr4  r   r—  Úput_trace_exception_handledÚget_exception_utility_coder   r-  r
   r¨  Zset_varrª  ræ  rH   rÖ  r¼  r•   rÒ   rÀ   rç  r”  r  Zget_loop_labelsr!  r×  )rx   rK   r  Zhas_non_literalsr¼  r$  ÚpatternsZ	exc_testsZ
match_flagr#  r²  Zneeds_exceptionZexc_argsrL  ZtempvarrJ   rØ  Úold_exc_varsrè  r0   )rK   r§  r1   r.  Ò   sê    þ

ÿ


ÿ  ÿ
þ

ÿ ÿ

ÿ
þ

ÿÿ
ÿý
ÿ 
ÿ





ÿz'ExceptClauseNode.generate_handling_codec                 C   s*   | j d k	r| j  ||¡ | j ||¡ d S rs   )r¨  rÑ   r•   rë   r0   r0   r1   rÑ   a!  s    
z.ExceptClauseNode.generate_function_definitionsc                 C   s>   | j r| j D ]}| |¡ q| jr.| j |¡ | j |¡ d S rs   )r$  r–   r¨  r•   )rx   rK   r$  r0   r0   r1   r–   f!  s    
zExceptClauseNode.annotate)r+   r,   r-   rˆ   r¨  r>  Zis_except_asr   rh   r4  r.  rÑ   r–   r0   r0   r0   r1   r3  Ž   s    r3  c                   @   sˆ   e Zd Zdddg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 )ÚTryFinallyStatNoder•   Úfinally_clauseÚfinally_except_clauser   TNFc                 C   s   t | ||d}|S )N©r•   rD  )rC  )r4   r}   r•   rD  rJ   r0   r0   r1   rÜ   ‰!  s    z"TryFinallyStatNode.create_analysedc                 C   s6   | j  |¡ t | j¡| _| j |¡ | j |¡ d S rs   )r•   r   r   ÚdeepcopyrD  rE  r|   r0   r0   r1   r   Ž!  s    z'TryFinallyStatNode.analyse_declarationsc                 C   sD   | j  |¡| _ | j |¡| _| j |¡| _|jr@|jjs@|j| _| S rs   )r•   rh   rD  rE  rb  r  Úfunc_return_typer|   r0   r0   r1   rh   ”!  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oªˆ  |¡}	ˆjj }
ˆjjsðˆ  d¡ |ƒ  	ˆ ¡ ˆjjsæˆ  |¡ ˆ  d¡ |	r¶ˆ  |¡ ˆ  d¡ ˆjsˆ  d¡ ˆjr,ˆ  ¡  |
rlt‡ 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¡ |
rpˆ #ˆ |||¡ |r:|D ]}ˆ j
 $|¡ q&|rLˆ j
 $|¡ ˆ  ¡ rfˆ j%ˆjdd ˆ  |¡ ˆ  &ˆ  ¡ |¡D ]}ˆ 'ˆ |¡ q€|D ]}ˆ j
 $|¡ q˜ˆ  d¡ ˆ  |¡ ˆ j(}d}t)t*||ƒƒD ](\}\}}ˆ  |¡söqØ||kr
|	r
qØˆ  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¡ qØˆ  |¡ ˆ  d¡ d S )Nr(  rH  z/*finally:*/ {c                    s.   | d }t  |¡}|ˆ jkr&|| d< n|}|S r/  )r   rG  rD  )Ú_nextrJ   Z	node_copyrƒ   r0   r1   Úfresh_finally_clause¶!  s    


zHTryFinallyStatNode.generate_execution_code.<locals>.fresh_finally_clausez/*normal exit:*/{z/*exception exit:*/{rW  c                    s   g | ]}ˆ j jtjd d‘qS ©Fr  )r  r  r	   r{  r'  r]  r0   r1   r‡   Ò!  s   ÿz>TryFinallyStatNode.generate_execution_code.<locals>.<listcomp>r%   Fr  c                    s   g | ]}ˆ j jtd d‘qS rK  r&  r'  r]  r0   r1   r‡   Ú!  s   ÿé   r˜  r³   Trº  r0   z%s: {r¢  r<  )1ræ   r4   rF   r“  Zall_new_labelsÚget_all_labelsÚhandle_error_casero  r•   rÒ   r  r+  rD  Úset_all_labelsÚpreserve_exceptionr’  rÀ   r”  r–  r¥  Úis_try_finally_in_nogilrQ  r¯  r  r  r	   ÚCPtrTyper‚  rc  rl  r›  r?  Úput_error_catcherr¼  rE  Úput_error_uncatcherr"  r½  r  Úput_error_cleanerr•  rU  ræ  rH  r@   ÚGILExitNoder   r{  r  )rx   rK   r  Z
old_labelsZ
new_labelsrv  Zcatch_labelr0  rJ  Zpreserve_errorZneeds_success_cleanupÚexc_lineno_cnamesÚexc_filename_cnamer¼  Zfinally_old_labelsrB  rX  rè  r•  rn  ro  Z	old_labelZret_tempr0   )rK   rx   r1   rÒ   Ÿ!  sâ    












þþþ
    ÿ







ÿ
þ ÿ





ÿz*TryFinallyStatNode.generate_execution_codec                 C   s4   | j  ||¡ | j ||¡ | jr0| j ||¡ d S rs   )r•   rÑ   rD  rE  rë   r0   r0   r1   rÑ   )"  s    z0TryFinallyStatNode.generate_function_definitionsc           	   	   C   sø   |j  t¡ |j  t¡ |j  t¡ | jr6|jdd | d¡ | d dd„ |D ƒ¡¡ |D ]\}}| 	||¡ q^| d|dd …  ¡ | d	|d d… d
  ¡ |D ]}| 
|t¡ q¨|ræ| d|d tj|d tj|tjf ¡ | jrô| ¡  d S )NFrP  rX  r<   c                 S   s   g | ]}d | ‘qS r;  r0   rW  r0   r0   r1   r‡   9"  s     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_coderQ  rR  rF   r£   rç  r-  r
   r   Úlineno_cnameÚclineno_cnameÚfilename_cnamer^  )	rx   rK   r0  r¼  rW  rX  r1  r	  rL  r0   r0   r1   rS  /"  s4    
ü   ýz$TryFinallyStatNode.put_error_catcherc              	   C   sô   |j  t¡ |j  t¡ | jr4|jdd | d¡ |dd … D ]}| |t¡ q@| d|dd …  ¡ |d d… D ]}| |t¡ qt| d|d d…  ¡ | jrª| 	¡  | d 
dd	„ |D ƒ¡¡ |rð| d
tj|d tj|d tj|f ¡ d S )NFrP  rX  r³   ú!__Pyx_ExceptionReset(%s, %s, %s);r:  r<   c                 S   s   g | ]}d | ‘qS r;  r0   rW  r0   r0   r1   r‡   e"  s     z:TryFinallyStatNode.put_error_uncatcher.<locals>.<listcomp>rY  r   r   )rÐ   rÍ  r™  r,  rQ  rR  rF   r¨  r
   r^  r£   r   r[  r\  r]  )rx   rK   r¼  rW  rX  rL  r0   r0   r1   rT  P"  s.    
   ýz&TryFinallyStatNode.put_error_uncatcherc                 C   s®   |j  t¡ | jr(|jdd | d¡ |dd … D ]}| |t¡ q4| d|dd …  ¡ |d d… D ]}| |t¡ qh| jrˆ| 	¡  | d 
dgd ¡|dd …  ¡ d S )NFrP  rX  r³   r^  r<   r<  )rÐ   rÍ  r,  rQ  rR  rF   r¨  r
   rç  r^  r£   )rx   rK   r¼  rL  r0   r0   r1   rU  l"  s    
z$TryFinallyStatNode.put_error_cleanerc                 C   s   | j  |¡ | j |¡ d S rs   )r•   r–   rD  r’   r0   r0   r1   r–   ~"  s    zTryFinallyStatNode.annotate)NN)NN)r+   r,   r-   rˆ   rP  rN  rH  rE  rQ  r¥  ré   rÜ   r   rh   ru   r~   rÆ   r{   rÒ   rÑ   rS  rT  rU  r–   r0   r0   r0   r1   rC  o!  s,   

    ÿ
!
rC  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-   rq   rP  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_temprF  )ra  r¿  Úcreate_state_temp_if_neededrC  rz   rV  rb  )rx   r4   ra  r•   r¿  r0   r0   r1   rz   —"  s       ÿýzGILStatNode.__init__c                 C   sZ   ddl m} |ƒ }| |¡ |js&d S |dkr6tj}ntj}ddlm} | 	||¡| _
d S )Nr   ©ÚYieldNodeCollectorÚgilrû  )ÚParseTreeTransformsre  ÚvisitchildrenÚyieldsr	   Zc_gilstate_typeZc_threadstate_ptr_typer°   r&  rç  rb  )rx   r4   ra  r•   re  Ú	collectorr2  r&  r0   r0   r1   rc  ¡"  s    
z'GILStatNode.create_state_temp_if_neededc                    s>   | j dk|_| j dkrd|_| jd k	r2| j |¡ tƒ  |¡S )Nrf  T)ra  Z_in_with_gil_blockZhas_with_gil_blockr¿  r   r\   r|   rd   r0   r1   r   ¯"  s    

z GILStatNode.analyse_declarationsc                 C   sR   |  t dd¡¡ | jd k	r*| j |¡| _|j}| jdk|_t | |¡}||_|S )NZForceInitThreadsr9  rJ  )rÍ  r   rm  r¿  rh   rJ  ra  rC  )rx   r}   Ú	was_nogilrJ   r0   r0   r1   rh   ¹"  s    
ÿ
zGILStatNode.analyse_expressionsc                 C   sª   |  | j¡ | ¡  | jr2| j |¡ | j ¡ }nd }|jj}| jdkr^|j	|d d|j_n|j
|| j d d|j_t | |¡ | jr–| j |¡ ||j_| ¡  d S )Nrf  )ÚvariableT)rl  Úunknown_gil_stateF)ræ   r4   Úbegin_blockrb  rð  rŒ   r  rS  ra  rR  Zput_release_gilÚscope_gil_state_knownrC  rÒ   rò  Ú	end_block)rx   rK   rl  Zold_gil_configr0   r0   r1   rÒ   Æ"  s"    

z#GILStatNode.generate_execution_code)N)r+   r,   r-   r_  rˆ   rb  ro  rz   rc  r   rh   rÒ   re   r0   r0   rd   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 )rV  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   s   | S rs   r0   r|   r0   r0   r1   rh   í"  s    zGILExitNode.analyse_expressionsc                 C   sB   | j r| j  ¡ }nd }| jdkr,| |¡ n|j|| j d d S )Nrf  )rm  )rb  rŒ   ra  r^  Zput_acquire_gilro  )rx   rK   rl  r0   r0   r1   rÒ   ð"  s    
z#GILExitNode.generate_execution_code)	r+   r,   r-   rq   rˆ   rb  ro  rh   rÒ   r0   r0   r0   r1   rV  à"  s   rV  c                   @   s   e Zd ZdZdd„ ZdS )ÚEnsureGILNodezI
    Ensure the GIL in nogil functions for cleanup before returning.
    c                 C   s   |j dd d S )NFrP  )rR  r’   r0   r0   r1   rÒ   #  s    z%EnsureGILNode.generate_execution_codeN)r+   r,   r-   rq   rÒ   r0   r0   r0   r1   rq  ü"  s   rq  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
    rH   NFc             	      sX   t |ƒdkrtj| _ntj| _|  ||¡ tƒ j|f||t|t |ƒ| ddœ|—Ž d S )Nr   )r?   Úcritical_section)rH   r•   rD  )	r?   r	   Zc_py_critical_section2_typeÚvar_typeZc_py_critical_section_typerc  r\   rz   ÚCriticalSectionExitNode)rx   r4   rH   r•   rI   rd   r0   r1   rz   #  s"    
ÿ  ÿüúz CriticalSectionStatNode.__init__c                 C   sF   ddl m} |ƒ }| |¡ |js&d S ddlm} | || j¡| _d S )Nr   rd  rû  )	rg  re  rh  ri  r°   r&  rç  rt  rb  )rx   r4   r•   re  rj  r&  r0   r0   r1   rc  $#  s    
z3CriticalSectionStatNode.create_state_temp_if_neededc                    s"   | j D ]}| |¡ qtƒ  |¡S rs   )rH   r   r\   r+  rd   r0   r1   r   .#  s    
z,CriticalSectionStatNode.analyse_declarationsc                    sN   t | jƒD ]6\}}| |¡ |¡}|jjs6t|jdƒ || j|< q
tƒ  |¡S )Nz<Arguments to cython.critical_section must be Python objects.)	rU  rH   rh   ri  r	  r  r   r4   r\   r–  rd   r0   r1   rh   3#  s    þz+CriticalSectionStatNode.analyse_expressionsc              
   C   sü   |j  t dd¡¡ | | j¡ | ¡  | jrF| j |¡ | j 	¡ }nt
j}| | j |¡› d¡ | jD ]}| |¡ qjdd„ | jD ƒ}| dt|ƒ› d|› dd |¡› d	¡ t | |¡ | jD ]}| |¡ | |¡ qÄ| jrð| j |¡ | ¡  d S )
NZCriticalSectionsúSynchronization.crA  c                 S   s   g | ]}d |  ¡ › ‘qS )z(PyObject*))rŒ   rü  r0   r0   r1   r‡   U#  s     zCCriticalSectionStatNode.generate_execution_code.<locals>.<listcomp>Z__Pyx_PyCriticalSection_Beginú(&rž   rŒ  )rÐ   rÍ  r   rm  ræ   r4   rn  rb  rð  rŒ   r   Úcritical_section_variablerF   rt  r  rH   rž  r?   r£   rC  rÒ   r  r§  rò  rp  )rx   rK   rl  rt  rH   r0   r0   r1   rÒ   F#  s.    
ÿ
 ÿ

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Æ   e#  s    z#CriticalSectionStatNode.nogil_check)r+   r,   r-   rq   rC  rˆ   rt  rb  rP  rz   rc  r   rh   rÒ   rÆ   re   r0   r0   rd   r1   rr  #  s   
rr  c                   @   s,   e Zd ZdZg Zdd„ Zdd„ Zdd„ ZdS )	ru  zG
    critical_section - the CriticalSectionStatNode that owns this
    c                 C   s   | S rs   r0   )rx   Úmemor0   r0   r1   Ú__deepcopy__o#  s    z$CriticalSectionExitNode.__deepcopy__c                 C   s   | S rs   r0   r|   r0   r0   r1   rh   v#  s    z+CriticalSectionExitNode.analyse_expressionsc                 C   s:   | j jr| j j ¡ }ntj}| d| j› d|› d¡ d S )NZ__Pyx_PyCriticalSection_Endrw  rŒ  )rs  rb  rŒ   r   rx  rF   r?   )rx   rK   Zvariable_namer0   r0   r1   rÒ   y#  s    ÿz/CriticalSectionExitNode.generate_execution_codeN)r+   r,   r-   rq   rˆ   rz  rh   rÒ   r0   r0   r0   r1   ru  i#  s
   ru  c                       s`   e Zd ZdZdgej ZdZdZdZe	dd„ ƒZ
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
    rt  NFc                 C   sx   ddl m} t|jtƒst‚t|jjtƒs.t‚| |j|j|jjjt	|jƒ| 
|jt |jj¡¡d}||j_|j|_|S )Nr   rû  )rt  r•   rD  Ú	lock_temp)r°   r&  r@   r•   rC  r_  r!  r4   r  ÚCythonLockExitNoderç  r	   rR  r	  rD  Úlock_stat_noderE  )r^   rJ   r&  rŒ   r0   r0   r1   r  “#  s    ÿù	z CythonLockStatNode.from_withstatc                 C   sP   ddl m} |ƒ }| | j¡ |jrL| jjjdd ¡ }t	| j
d|› dƒ d S )Nr   rd  T)rÿ   z&Cannot use a 'with' statement with a 'zy' in a generator. If you really want to do this (and you are confident that there are no deadlocks) then use try-finally.)rg  re  rh  r•   ri  rt  r	  r‘  Ústripr   r4   )rx   re  rj  Útypenamer0   r0   r1   Úcheck_for_yields¦#  s    
þz#CythonLockStatNode.check_for_yieldsc                    s   | j  |¡ tƒ  |¡S rs   )rt  r   r\   r|   rd   r0   r1   r   ¶#  s    z'CythonLockStatNode.analyse_declarationsc                    sJ   | j  |¡| _ |  ¡  | j}t|tƒr>t|jƒdkr>|jd }tƒ  |¡S rå  )	rt  rh   r€  r•   r@   rÚ   r?   rÛ   r\   )rx   r}   r•   rd   r0   r1   rh   º#  s    
z&CythonLockStatNode.analyse_expressionsc              	   C   sî   |j  | jj ¡ ¡ | | j¡ | ¡  | j 	|¡ | j 
¡ }| j |¡ | |› d| j 
¡ › d¡ | jtjkrxd}n| jtjkrŠd}nd}| d| jjj› d|› d|› d	¡ t | |¡ | j |¡ | j |¡ | j |¡ | ¡  d S )
Nz = &rA  ZNogilr°   ZGilÚ__Pyx_Locks_Z_Lockz(*rŒ  )rÐ   rÍ  rt  r	  Zget_utility_coderæ   r4   rn  r{  rð  rŒ   rž  rF   rÇ   r*   r.   r/   Ú
cname_partrC  rÒ   r  r§  rò  rp  )rx   rK   r1  Zgil_strr0   r0   r1   rÒ   Â#  s$    
$z*CythonLockStatNode.generate_execution_code)r+   r,   r-   rq   rC  rˆ   r{  rP  rÆ   rÔ   r  r€  r   rh   rÒ   re   r0   r0   rd   r1   r  ‚#  s   	
r  c                   @   s$   e Zd ZdZg Zdd„ Zdd„ ZdS )r|  zI
    lock_stat_node   CythonLockStatNode   the associated with block
    c                 C   s   | S rs   r0   r|   r0   r0   r1   rh   å#  s    z&CythonLockExitNode.analyse_expressionsc                 C   s0   | j jjj}| d|› d| j j ¡ › d¡ d S )Nr  z	_Unlock(*rŒ  )r}  rt  r	  r‚  rF   r{  rŒ   )rx   rK   r‚  r0   r0   r1   rÒ   è#  s    z*CythonLockExitNode.generate_execution_codeN)r+   r,   r-   rq   rˆ   rh   rÒ   r0   r0   r0   r1   r|  ß#  s   r|  c                 C   s   ddl m} | | j¡S rÇ  )r°   rÉ  rÎ  rÐ  )rä  rÉ  r0   r0   r1   Úcython_view_utility_codeí#  s    rƒ  c                 C   s   t  dd¡S ©NZArrayAPIzarrayarray.h©r   rm  ©rä  r0   r0   r1   r+  õ#  ra  r+  c                 C   s   t  dd¡S r„  r…  r†  r0   r0   r1   r+  ö#  ra  )zcpython.arrayzcpython.array.arrayzcython.viewc                 C   sŒ   |j jjjD ]z}|j| jkrq| d¡}| d¡}|r<|jpD|oD|j}|sN|r|s|r|jj	rt
| 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_noderw  r0  r_   rÒ  rÒ  r  r	  r$  r   r4   rÍ  r   rm  )rJ   rK   Ú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krÒdd„ | j d¡D ƒ}|d }|j |¡}|}|dd … D ]"}| |¡}| 	||| j¡ |}qx| j
r¶| 	| j
|| j¡ qö| |¡ | 	||| j¡ n$| j
pÜ| j}| 	||| j¡}| j|_| jtkr| t| j |jjƒ¡ d S )	Nú$cimport only allowed at module levelr   r´   ©Úrelative_levelr  c                 S   s   g | ]}t |ƒ‘qS r0   r   )r…   r_   r0   r0   r1   r‡   %$  s     z8CImportStatNode.analyse_declarations.<locals>.<listcomp>r   )rô  r   r4   Úfind_modulerÒ  Úis_absoluter  rÏ  Zfind_submoduleÚdeclare_moduleÚas_namer1  r¼  Úutility_code_for_cimportsrÍ  rä  )	rx   r}   rX  rE  Ztop_nameZtop_module_scoper_   Úsubmodule_scoper×   r0   r0   r1   r   $  s4      ÿ


z$CImportStatNode.analyse_declarationsc                 C   s   | S rs   r0   r|   r0   r0   r1   rh   9$  s    z#CImportStatNode.analyse_expressionsc                 C   s   | j dkrt| |ƒ d S ©NZnumpy©rÒ  rŠ  r’   r0   r0   r1   rÒ   <$  s    
z'CImportStatNode.generate_execution_codeN)r+   r,   r-   rˆ   r  r   rh   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rf| j|krFt| jdƒ d S | j|krf|jsft| jdƒ d S |j| j| j| jd}|s„d S |j}| 	|¡ | j
D ]Ö\}}}|dkrÔt|j ¡ ƒD ]\}}	| ||	|¡ qºqš| |¡}	|	rêd|	_nj| jd k	oü| jdk}
|jj||| jd	|
d
}|sqš|j|krB| |p6||| j¡ nt|d||f ƒ |	rš|p`|}| ||	|¡ qš| d¡sŠ| d¡rê|tkrª| t| |jjƒ¡ | j
D ]8\}}}d||f }|tkr°| t| |jjƒ¡ q°d S )NrŒ  r  r   z3relative cimport beyond main package is not allowedz:relative cimport from non-package directory is not allowedr  rG  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Ò  r1  Úimported_namesrŠ   rÖ   r[   r2  rº  r  rÏ  Úparent_moduler‘  Ú
startswithr“  rÍ  rä  )rx   r}   Zqualified_name_componentsrX  rÒ  r4   r_   r’  Z
local_namer×   Zis_relative_importr”  rè  Zfqnamer0   r0   r1   r   M$  s\    


    ÿ


z(FromCImportStatNode.analyse_declarationsc                 C   s@   |j s
dS |j}|dkr$|js<dS n|js.dS ||jkr<dS dS )Nr   Úclassr   )r»  r	  r:  Zis_struct_or_unionrv  )rx   r×   rv  r	  r0   r0   r1   Údeclaration_matches$  s    
z'FromCImportStatNode.declaration_matchesc                 C   s   | S rs   r0   r|   r0   r0   r1   rh   $  s    z'FromCImportStatNode.analyse_expressionsc                 C   s   | j dkrt| |ƒ d S r•  r–  r’   r0   r0   r1   rÒ   $  s    
z+FromCImportStatNode.generate_execution_code)r+   r,   r-   rˆ   rÒ  rŽ  r  r   r¡  rh   rÒ   r0   r0   r0   r1   r—  A$  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 ]v\}}|dkr<|js.t| jdƒ  d S d|_d| _q| |¡ |jrt| ¡ d kr|t	d| j
jj|f ƒ|j_qd|j_qd S )NrG  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¼  )rx   r}   r_   r¨  r0   r0   r1   r   ¡$  s    
ÿ
z'FromImportStatNode.analyse_declarationsc           	   	   C   sV  ddl m} | j |¡| _| | jt¡| _g | _| j	D ]\}}|dkr‚|j
 	¡ D ],\}}|jsR|jjrR| t dd¡¡  q€qRq6| |j¡}|jr|jj|krt|jdƒr|jj| jjjkrÆq6z2|j| jjj| j| jjd}|jj|jkröW q6W n tk
r   Y nX | |d ¡}|jtkr.d }n| j |j|¡}| j |||f¡ q6| S )Nr   rû  rG  ZExtTypeTestrò  rÒ  )r4   rŽ  )r°   r&  r/  rh   rî  r4   r
   rŸ   Úinterned_itemsr[   rÖ   r»  r	  r:  rÍ  r   rm  rº  r_   rå  rÒ  rŽ   r  r¡   r¡  r—   r  rd  r8  )	rx   r}   r&  r_   r¨  rè  r×   r/  Úcoerced_itemr0   r0   r1   rh   ´$  s<    
ÿÿz&FromImportStatNode.analyse_expressionsc                 C   s.  |  | j¡ | j |¡ | jrB| dtj| j ¡ | | j¡f ¡ |j	j
tdd}| j |¡ | jrx|j t dd¡¡ | jD ]†\}}}| d|| j ¡ | |¡| || j¡f ¡ | |t¡ |d krØ| | j|¡ n | |¡ | |¡ | ||¡ | |t¡ q~|j	 |¡ | j |¡ | j |¡ d S )Nzif (%s(%s) < 0) %s;Tr  Z
ImportFromr>  z!%s = __Pyx_ImportFrom(%s, %s); %s)ræ   r4   r/  rž  r£  rF   r   r€  r   r  r  r
   rŸ   rô  r¤  rÐ   rÍ  r   rm  r›  r  r  rª  Zallocate_temp_resultr  r!  r"  r  r§  )rx   rK   Z	item_tempr_   r¨  r¥  r0   r0   r1   rÒ   ×$  sF    
ýÿ
ÿüÿ

z*FromImportStatNode.generate_execution_codeN)r+   r,   r-   rˆ   r£  r   rh   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-   rq   rÆ   r0   r0   r0   r1   r¦  ù$  s   r¦  c                       sV  e Zd ZdZdddg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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)d*„Z*d+d,„ Z+d-d.„ Z,d/d0„ Z-d1d2„ Z.dAd3d4„Z/d5Z0d6Z1d7e0e1f Z2d8d9„ Z3d:d;„ Z4d<d=„ Z5‡  Z6S )BÚ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                    s8   t ƒ j|f|Ž | d¡pi | _tƒ | _i | _g | _d S )Nrv  )r\   rz   rã  rv  r«   Úseen_closure_varsÚprivatesÚassigned_nodesrÏ  rd   r0   r1   rz   C%  s
    zParallelStatNode.__init__c              
   C   sj  | j  |¡ d | _d | _| jr g }tƒ }| jjD ]œ}|jj|krVt	| j
d|jj ƒ | |jj¡ |jjdkr‚|jjsÎ|j| _q2|jjdkr |jjsÎ|j| _q2| jrÄ|jjdkrÄ|jjsÎ|j| _q2| |¡ q2|| j_z| j |¡| _W n2 tk
r } zt	| jj
dƒ W 5 d }~X Y nX ni | _| j ¡ D ]4\}}|| jkrVt	| j
d| ƒ nt| ||ƒ q0d 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©  rk   r«   rà  rª   rŽ   r   r4   r­   r¾   Ú	is_pranger®  r8  rY  Ú	Exceptionr[   Úvalid_keyword_argumentsr‹   )rx   r}   ÚpairsÚseenZdictitemrÌ  ry   r·  r0   r0   r1   r   T%  s<    


"z%ParallelStatNode.analyse_declarationsc                 C   s  | j r| j  |¡| _ | jr<| jr0| j |¡| _nt| jdƒ | jrP| j |¡| _| j |¡| _|  |¡ | j d k	r| j	rœ| j	j d k	rœ| j	j
sœt| jdƒ nJ| j	r¸| j	j
s¸t| jdƒ n.| j jjræ| j jræ| j  |¡dkræt| jdƒ | j  ¡ rü| j jjr| j  tj|¡ |¡| _ | S )Nz@'use_threads_if' must de declared in the parent parallel sectionz-num_threads already declared in outer sectionz;num_threads must be declared in the parent parallel sectionr   z.argument to num_threads must be greater than 0)r¨  rh   r©  Úis_parallelr   r4   r®  r•   Úanalyse_sharing_attributesÚparentr¯  r	  r*  r¿   rY  r5  r  rd  r	   r{  ri  r|   r0   r0   r1   rh   ~%  s:    

ÿþ ÿÿz$ParallelStatNode.analyse_expressionsc                 C   sj   | j  ¡ D ]Z\}\}}| jr:| js:|| jj kr:t|dƒ q
| jsP|rPt|dƒ q
d}|  ||||¡ 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 blocksTN)rv  r[   r¯  r´  r¶  r   Úpropagate_var_privatization)rx   r}   r×   r4   rl  Úlastprivater0   r0   r1   rµ  %  s    


z+ParallelStatNode.analyse_sharing_attributesc                 C   sl   ||f| j |< |jjr$t|dƒ dS | jrh| jsF|| jjkrF| jj}n| j}|rh|sX|rh| ||||¡ 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«  r	  rõ  r   r¯  r´  r¶  rv  r·  )rx   r×   r4   rl  r¸  r¶  r0   r0   r1   r·  ·%  s    5

z,ParallelStatNode.propagate_var_privatizationc                 C   s€   | j r| j  ||¡S |j| jk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_temprX  rª  r  r  r	  r­   Úmodified_entriesr8  rF   )rx   rK   r×   rX  r0   r0   r1   r¹  þ%  s    z'ParallelStatNode._allocate_closure_tempc                 C   sp   d}t | j ¡ ƒD ]X\}\}}|s|r.||kr|j ¡ }|r|rN| d¡ d}| d|j|j |¡f ¡ qd S )NTz4/* Initialize private variables to invalid values */Fr¢  )Úsortedr«  r[   r	  Úinvalid_valuerF   rX  rŸ  )rx   rK   Úexcludert  r×   rl  r¸  r¼  r0   r0   r1   Úinitialize_privates_to_nan&  s    



ÿz+ParallelStatNode.initialize_privates_to_nanc                 C   s0   | j }|jj}||j_| |¡ ||j_| ¡ S rs   )Ú1begin_of_parallel_control_block_point_after_declsr  Úownerrž  rŒ   )rx   rK   rì  rœ   rÀ  r0   r0   r1   Úevaluate_before_block#&  s    
z&ParallelStatNode.evaluate_before_blockc                 C   s&   | j dk	r"| d|  || j ¡ ¡ dS )zS
        Write self.num_threads if set as the num_threads OpenMP directive
        Nz num_threads(%s))r¨  ru  rÁ  r’   r0   r0   r1   Úput_num_threads/&  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)rº  r»  rv  Zfrom_closurery  r¹  )rx   rK   r×   r0   r0   r1   Údeclare_closure_privates7&  s    z)ParallelStatNode.declare_closure_privatesc                 C   s<   | j D ]0\}}| 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)rº  rF   rX  r  r"  )rx   rK   r×   r  r0   r0   r1   Úrelease_closure_privatesD&  s    z)ParallelStatNode.release_closure_privatesr0   c           
      C   s   | j }d| _ | jrü|j ¡  | _}g g  }}t|ƒD ]*\}}|jsH|jrT| |¡ q4| |¡ q4|rx| 	dd 
|¡ ¡ |r| 	dd 
|¡ ¡ | jrütjg}	| jrè|	 | j¡ |j t dd¡¡ | 	dtj› d¡ | 	d	| j ¡ | 	d
d 
|	¡ ¡ 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SharedInFreeThreadingrv  z' __Pyx_shared_in_cpython_freethreading(r  z private(%s, %s, %s)z shared(%s))Úprivatization_insertion_pointr´  r  Zstop_collecting_tempsrÄ   r»  r  rõ  r8  ru  r£   Úbreaking_label_usedr   Úparallel_whyÚerror_label_usedr=  Úparallel_excrÐ   rÍ  r   rm  Úparallel_freethreading_mutexÚpos_info)
rx   rK   Zexclude_tempsrœ   rÄ   r«  Zfirstprivatesr#  r	  Zshared_varsr0   r0   r1   Úprivatize_tempsO&  s4    
þÿz ParallelStatNode.privatize_tempsc                 C   s>   | j r:| js:| d¡ t| jƒD ]\}}|j||dd q d S )Nz/* Clean up any temporaries */FrI  )r´  Úis_nested_prangerF   r»  rÄ   rç  )rx   rK   r#  r	  r0   r0   r1   Úcleanup_tempsr&  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Ø  rv  r  r•  r/  ro  rn  rB   Ú%begin_of_parallel_control_block_pointr¿  Ú"undef_builtin_expect_apple_gcc_bugr’   r0   r0   r1   Ú!setup_parallel_control_flow_blocky&  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)rB   Úbegin_of_parallel_blockr’   r0   r0   r1   Úbegin_parallel_blockž&  s    	z%ParallelStatNode.begin_parallel_blockc                 C   s®   | j }d| _ | jrª|}| d¡ |jdd | d¡ | d¡ | d¡ | d¡ | d¡ | d	¡ | ¡  | d¡ |  |¡ | ¡  | d
¡ | d¡ | d¡ 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 _OPENMPTrP  ZPy_BEGIN_ALLOW_THREADSú#endif /* _OPENMP */ZPy_END_ALLOW_THREADSrY  z{
z#ifndef _OPENMPz}
)rÔ  rÉ  rF   rR  Zput_saferÏ  r^  )rx   rK   Z
begin_codeZend_coder0   r0   r1   Úend_parallel_block©&  s&    











z#ParallelStatNode.end_parallel_blockc           	      C   sV  |  ¡ }|  ¡ }d| _d| _d| _g | _| ¡ }|D ]&}| |¡r4| jpP||jk| _d| _q4| jrl| |¡ t	|ƒD ]ˆ\}}| |¡sˆqt||jk}| 
|¡ |r¤|sÖ||jkr¾d| _|  |¡ | dtj|d f ¡ | jrò| jrò|sò| |¡ qt| |¡ qt| jrR| jr*| jr*| 
|¡ |  |¡ | 
|¡ |rR| jrR| dtj ¡ 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)ro  Úany_label_usedrÇ  rÉ  Úparallel_private_tempsrM  r’  r   r”  rU  r–  r“  Úfetch_parallel_exceptionrF   r   rÈ  r¯  Úsave_parallel_varsr¤  )	rx   rK   Úshould_flushZsave_lastprivates_labelZdont_return_labelZ
all_labelsrê  rn  Zis_continue_labelr0   r0   r1   Útrap_parallel_exitÊ&  sJ    
ÿ





ÿ


z#ParallelStatNode.trap_parallel_exitc                 C   s<  d| j  }| d| ¡ t j d7  _ | ¡  | j}d}t| j ¡ ƒD ]è\}\}}|rF|jj	r`qF|jj
rŠ|jjsŠ|jjd rŠ|j d¡}n
|j ¡ }d| }	|j}
|d7 }|j ¡ }|rÊd|j |¡ }nd}| d	||	|f ¡ | j |	|
|jf¡ |jj
r|j t d
d¡¡ d|
 }
| d|	|
f ¡ qF| ¡  dS )a¨  
        The following shenanigans are instated when we break, return or
        propagate errors from a prange. In this case we cannot rely on
        lastprivate() to do its job, as no iterations may have executed yet
        in the last thread, leaving the values undefined. It is most likely
        that the breaking thread has well-defined values of the lastprivate
        variables, so we keep those values.
        z__pyx_parallel_lastprivates%dz#pragma omp critical(%s)r   r   Z
cpp_localsr°   z__pyx_parallel_temp%drB  z%s %s%s;rj  rk  rl  r¢  N)Úcritical_section_counterr¤  r§  rn  rÑ  r»  r«  r[   r	  r  r"  Zis_fake_referencerÐ   rÊ   Zcpp_optional_declaration_coder‘  rX  r¼  rŸ  rF   rÛ  r8  rÍ  r   rm  rp  )rx   rK   Úsection_namerœ   Z
temp_countr×   rl  r¸  Z	type_declÚ
temp_cnameÚprivate_cnamer¼  r´  r0   r0   r1   rÝ  '  s8    	




ÿz#ParallelStatNode.save_parallel_varsc                 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
        TrP  rÙ  r\  z'__Pyx_ErrFetchWithState(&%s, &%s, &%s);rY  rH  N)rn  rR  Úput_acquire_freethreading_lockr¤  r   Úparallel_exc_typerF   rÊ  r   ræ  Úparallel_pos_inforÌ  r  Zuses_error_indicatorr¯  r  r
   Úput_release_freethreading_lockr^  rp  ©rx   rK   rÌ  r0   r0   r1   rÜ  B'  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 exceptionTrP  r·  rY  N)rn  rR  rä  r¥  r   rå  r
   rF   rÊ  r   ræ  rÌ  ræ  r¯  rç  r^  rp  rè  r0   r0   r1   Úrestore_parallel_exceptionr'  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)rO  rØ  r/  r  r’   r0   r0   r1   Úrestore_labels'  s    ÿzParallelStatNode.restore_labelsc           
      C   s  | j }d| _ d| _| jdk	r4| j |¡ | j |¡ | ¡ rF| d¡ | jrÈ| d| j ¡ | d| j	 ¡ | d¡ | dt
j› d¡ | d¡ | d	t
j ¡ | d
¡ | dt
j ¡ | d¡ |rÔ| j}n| j}|rò| dt
j ¡ | dt
j ¡ | d	t
j ¡ | jD ].\}}}	|	jr0d| }| d||f ¡ q| dt
j ¡ |rr| 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[  rb  zg/* This may have been overridden by a continue, break or return in another thread. Prefer the error. */z%s = 4;rH  zint %s;r<  rl  r¢  rÂ  z    case 1: z    case 2: z    case 3: z    case 4:)rÑ  r¿  r¨  r  r§  rl  rF   rÉ  ræ  rÊ  r   rË  rå  rÈ  rÚ  rÇ  rÛ  r"  ru  r”  r   r  r•  rÐ   rÍ  r™  ré  r“  rp  Ú"redef_builtin_expect_apple_gcc_bug)
rx   rK   Úbreak_Ú	continue_Úreturn_rœ   rÚ  râ  rã  r2  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 )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   rÒ  é'  s    z3ParallelStatNode.undef_builtin_expect_apple_gcc_bugc                 C   s   | j s| | j¡ d S rs   )r¶  Zredef_builtin_expectrð  r’   r0   r0   r1   rë  ð'  s    z3ParallelStatNode.redef_builtin_expect_apple_gcc_bugc                 C   s8   t ||ƒD ](\}}|d k	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æ  r	  r  r   r4   )rx   r}   rE  Únodesr_   rJ   r0   r0   r1   Ú_parameters_nogil_checkô'  s
    ÿz(ParallelStatNode._parameters_nogil_check)N)r0   )F)FFF)7r+   r,   r-   rq   rˆ   r•   r¯  rÎ  rÉ  r¨  r®  r©  r   rå  Zparallel_exc_valueZparallel_exc_tbrÊ  Zparallel_filenameZparallel_linenoZparallel_clinenoræ  r]  r[  r\  rÌ  rà  rz   r   rh   rµ  r·  r¹  r¾  rÁ  rÂ  rÃ  rÄ  rÍ  rÏ  rÓ  rÕ  rØ  rß  rÝ  rÜ  ré  rê  rï  Zbuggy_platform_macro_conditionZhave_expect_conditionrð  rÒ  rë  rò  re   r0   r0   rd   r1   r§  %  sj   
ýýý*G

#%!
C5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 )Nz=cython.parallel.parallel() does not take positional arguments)r\   r   rH   r   r4   r|   rd   r0   r1   r   (  s    z*ParallelWithBlockNode.analyse_declarationsc                 C   s€  | j d k	r| j  |¡ |  |¡ |  |¡ | d¡ | d¡ | j d k	r\| d| j  ¡  ¡ | jrŽdd„ | jD ƒ}|rŽ| dd t	|ƒ¡ ¡ | 
¡ | _|  |¡ | d¡ | d	¡ | ¡  |  |¡ |  |¡ |j ¡  | j |¡ |  |¡ |  |¡ |  |¡ | ¡  | |j¡}| |j¡}| |j¡}|  |¡ | j||||d
 | j d k	rr| j  |¡ | j  |¡ |   |¡ d S )NrÖ  z#pragma omp parallel zif(%s) c                 S   s   g | ]}|j js|j‘qS r0   )r	  r  rX  )r…   rÌ  r0   r0   r1   r‡   (  s    ÿzAParallelWithBlockNode.generate_execution_code.<locals>.<listcomp>zprivate(%s)rž   r°   r×  )rì  rí  rî  )!r©  rž  rÃ  rÓ  rF   ru  rŒ   r«  r£   r»  rB   rÆ  rÂ  rn  rÕ  r¾  r  Ústart_collecting_tempsr•   rÒ   rß  rÍ  rØ  rp  r’  r   r  r•  rê  rï  r  r§  rÄ  )rx   rK   r«  rí  rì  rî  r0   r0   r1   rÒ   (  sJ    
















þz-ParallelWithBlockNode.generate_execution_codec                 C   s   |   |dg| jg¡ d S )Nr­  )rò  r©  r|   r0   r0   r1   rÆ   B(  s    z!ParallelWithBlockNode.nogil_check)r+   r,   r-   rq   r±  r¨  r©  r   rÒ   rÆ   re   r0   r0   rd   r1   ró  ü'  s   6ró  c                       s˜   e Zd ZdZdddddddgZd	 Z Z ZZd	 Z	 Z
Zd
Zd	Zd	Zdddddg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Ä  rH   r¨  r®  r©  NTÚschedulerJ  r­  c                    s   t ƒ j|f|Ž t|ƒ| _d S rs   )r\   rz   rJ  rø  )rx   r4   rI   rd   r0   r1   rz   \(  s    zParallelRangeNode.__init__c                    s¾   t ƒ  |¡ | j |¡ | jd k	r.| j |¡ | jrBt| jƒdkrRt| jdƒ d S t| jƒdkrl| j\| _	n0t| jƒdkrŠ| j\| _
| _	n| j\| _
| _	| _| jdkrºt| jd| jf ƒ 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Ä  rH   r?   r   r4   rb  rM   r  rö  r|   rd   r0   r1   r   a(  s    

z&ParallelRangeNode.analyse_declarationsc                    sN  |j }| j rd|_ | jd kr,t| jdƒ | S | j |¡| _| jjjsn| jjjsdt| jjd| jj ƒ tj	| _
n
| jj| _
d| _| j| j| jf}t|| jƒD ]b\}}|d k	rš| |¡ |jjsÎt|jd| ƒ qš|jsê| |¡}t| ||ƒ t | j
|j¡| _
qš| jd k	r| j |¡| _t| jdd ƒ}|rB| jjd f| j| jj< tƒ  |¡}|jrØ|jsnt|jjdƒ nR|jdkrŠt|jjd	ƒ n6|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#rJ|}|j!r |j!j"r |j!}q|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)rM   rb  r  z%s argument must be numericr×   z$Must provide schedule with chunksizer÷  z,Chunksize not valid for the schedule runtimer   zChunksize must not be negative)(rJ  r¨  r   r4   ri   r	  r¿  r  r	   r•  Ú
index_typerE  rM   rb  r  ræ  rg   r¿   ri  r‹   r  rÄ  rh   r‰   rv  r×   r\   r®  rö  r*  rY  rd  r{  r¶  r¯  rÎ  rw   r«  r¬  r=  )rx   r}   rk  Ústart_stop_steprJ   r_   rf  r¶  rd   r0   r1   rh   u(  s†    



ÿ



 ÿÿÿÿþ ÿÿ
z%ParallelRangeNode.analyse_expressionsc                 C   s.   d}| j | j| j| j| jf}|  |||¡ d S )N)rM   rb  r  r¨  r­  )rM   rb  r  r¨  r©  rò  )rx   r}   rE  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 ]B\}}}|dkr`|}	n"|jrp| ¡ }	n| |¡ | ¡ }	|	||< qH| jdk	r¢| j |¡ |j | jd¡|d< |j | jd¡|d< | jdk	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k	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¨  ré  )r  r  r  NFrn  Znstepsr   z!Iteration with step 0 is invalid.r  zif (((%(step)s) == 0)) abort();ZIncludeStdlibHr9  zS%(nsteps)s = (%(stop)s - %(start)s + %(step)s - %(step)s/abs(%(step)s)) / %(step)s;zif (%(nsteps)s > 0)úif (%s < 2)z
/* else */)/rÃ  r¨  r×   rX  r	  r‘  rM   rb  r  ræ  rE  r¿   r,  rž  rŒ   r©  r  r  rø  rf  rF  r   r4   Úisdigitr-  rF   rÓ  rÐ   rÍ  r   rm  rn  Úgenerate_looprp  rê  rÄ  rÇ  ru  r   rÈ  rÒ   rï  r®  r  r§  r"  rÄ  )rx   rK   Ztarget_index_cnameÚfmt_dictrù  ÚdefaultsrJ   r_   rû   rŒ   r#  r0   r0   r1   rÒ   Ð(  s\    (


þ



  





z)ParallelRangeNode.generate_execution_codec           
      C   s¼  | j r| d¡ n
| d¡ | js@| d¡ | ¡ | _| jj}n„| d¡ | jd k	rh| d| j ¡  ¡ | ¡ | _| j}| d¡ | d¡ | 	¡  |  
|¡ | j r°| d¡ n
| d¡ | d¡ t| j ¡ ƒD ]´\}\}}|r*|dkr*|| jjkr*|jjrt| jd	ƒ n| d
||jf ¡ qÒ|| jjkrZ| d|j ¡ | d|j ¡ qÒ|jjsÒ|rnd}nd}| d||jf ¡ qÒ| jrÄ| jr¬d|  || j¡ }nd}| d| j|f ¡ |  |¡ | d¡ | d¡ | d| ¡ | 	¡  | ¡ }	| 	¡  | d| ¡ | j|| jjd | jrB| j sB|j ¡  | j |¡ | j|dd | jrv| j sv|  |¡ | j rŽ|	 dt!j" ¡ | #¡  | #¡  | jr¸|  $|¡ | #¡  d S )Nz#if 0rÖ  z#pragma omp forz#pragma omp parallelz if(%s)r°   r×  z+*-&^|z#Python objects cannot be reductionsz reduction(%s:%s)rÅ  z lastprivate(%s)r¸  r	  z %s(%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);)r½  T)rÞ  rú  )%rÎ  rF   r´  ru  rB   rÆ  r¶  r©  rŒ   rn  rÕ  r»  r«  r[   r¨  r×   r	  r  r   r4   rX  rö  r®  rÁ  rÂ  r¾  r  rô  r•   rÒ   rß  rÍ  rÇ  r   rÈ  rp  rØ  )
rx   rK   rý  Zreduction_codepointr×   rl  r¸  r	  r®  Zguard_around_body_codepointr0   r0   r1   rü  J)  s~    












ÿ





zParallelRangeNode.generate_loop)r+   r,   r-   rq   rˆ   r•   r¨  rÄ  rH   rM   rb  r  r¯  rJ  rö  r±  rz   r   rh   rÆ   rÒ   rü  re   r0   r0   rd   r1   rõ  F(  s"   
 ÿVzrõ  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
    rJ   c                 C   sD  | j  |¡ | j }t|tƒr(|jjd }t|ttfƒ| _t|t	t
fƒ}|j}| jrˆ| j|_| j|_d|_|jr†d|jkr†|  |j¡|_n¸|rž| j |_|j_n¢|j}| j|_| jd |j_tj| j |j_| jd |j_|jj|jj_|jj|j_| jd |_|j ¡ D ]6\}}|jr&|  |j¡|_|jr|  |j¡|_qd S )Nr   Tr  Ú_objÚ_typerè  )rJ   r   r@   rÈ   r•   rÛ   r(  rí   Úis_functionrü  r  r×   rX  r  r  rM  r|  r	  rw  r  r   Ztypeobj_prefixr  rƒ  r  rõ  rL  rÖ   r[   )rx   r}   rJ   Zis_struct_or_enumrÌ  rw  r_   r×   r0   r0   r1   r   Ã)  s8    
z'CnameDecoratorNode.analyse_declarationsc                 C   s$   d|kr|  d¡d }d| j|f S )Nr  r´   z%s_%s)r  rX  )rx   rX  r0   r0   r1   r|  é)  s    zCnameDecoratorNode.manglec                 C   s   | j  |¡| _ | S rs   )rJ   rh   r|   r0   r0   r1   rh   ï)  s    z&CnameDecoratorNode.analyse_expressionsc                 C   s†   | j rt|jrt|jd }t| jtƒr6| 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)r  rV  rÐ   r@   rJ   rô  rt  r°   r  r×   rX  r  Zgenerate_cfunction_declarationrÕ   rÑ   )rx   r}   rK   Zh_coder  r×   rX  r0   r0   r1   rÑ   ó)  s(    
  ÿüz0CnameDecoratorNode.generate_function_definitionsc                 C   s   | j  |¡ d S rs   )rJ   rÒ   r’   r0   r0   r1   rÒ   *  s    z*CnameDecoratorNode.generate_execution_codeN)
r+   r,   r-   rq   rˆ   r   r|  rh   rÑ   rÒ   r0   r0   r0   r1   rÿ  ³)  s   &rÿ  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-   rq   rˆ   r0   r0   r0   r1   r  *  s   r  aC  
/* Test for GCC > 2.95 */
#if defined(__GNUC__)     && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))
  #define likely(x)   __builtin_expect(!!(x), 1)
  #define unlikely(x) __builtin_expect(!!(x), 0)
#else /* !__GNUC__ or GCC < 2.95 */
  #define likely(x)   (x)
  #define unlikely(x) (x)
#endif /* __GNUC__ */
z1
#define likely(x)   (x)
#define unlikely(x) (x)
ZPrintz
Printing.cZPrintOner8  r¹  ZRaiseExceptionZGetExceptionZSwapExceptionZSaveResetExceptionZAddTraceback)­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   rY   r   ZStringEncodingr   r   r    r!   ZPythranr"   r#   r$   ZUtilsr&   r'   r.  ÚIntEnumr*   r5   r;   rS   r	  rT   rf   rt   ru   rÈ   r”   rÚ   rê   rì   rö   rú   r  r  r  r  r  r4  r  r„  r²  r˜  rµ  rÃ  rÑ  r“  rç  ré  rë  rî  rí   rü  r  r  r$  r&  r(  r  r"  ró  rô  r5  rÌ  r×  rÙ  rÚ  rÛ  rú  rõ  r÷  r  r@  rA  rD  rG  rñ  rO  rU  r~  rS  r‡  r  r•  r˜  rJ  r›  rœ  rŸ  r  r¦  r¶  r¾  rÂ  rÉ  rË  rÏ  rÔ  rÕ  rÙ  rõ  rý  rþ  rû  rú  rü  r  r  r!  r3  rC  r_  r`  rV  rq  rr  ru  r  r|  rƒ  r“  rŠ  r‹  r—  r¢  r¦  r§  ró  rõ  rÿ  r  Zgcc_branch_hintsZbranch_prediction_macrosrm  r’  r”  r™  rµ  r@  rZ  r,  Ztraceback_utility_coder0   r0   r0   r1   Ú<module>   s   
          û4 /5%(#
1 t /	g% 's-][+!     o   B    R       i; Q~ v    k&@%  Dk2GC)8
n 20)$/<\<
c
 qi! , b  	T	d]û-Td      J  o]