o
    Ni                    @   sR	  d dl Z e jdi dededededededed	ed
ededededededededede d dlZd dlmZ d dlZddlmZ ddl	m
Z
mZmZmZmZ ddlmZ ddlmZ ddlmZ ddlmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZ ddl m!Z! ddl"m#Z# ddlm$Z$ dd lm%Z% dd!lm&Z& dd"l'm(Z(m)Z)m*Z* d#d$l+m,Z,m-Z- d%d&hZ.G d'd( d(ej/Z0d)d* Z1d+d, Z2d-d. Z3G d/d0 d0e4Z5G d1d2 d2e4Z6G d3d4 d4Z7d5d6 Z8e8G d7d8 d8Z9G d9d: d:e9Z:G d;d< d<Z;G d=d> d>e9Z<G d?d@ d@e9Z=G dAdB dBe=Z>G dCdD dDe9Z?G dEdF dFe?Z@G dGdH dHe?ZAG dIdJ dJe?ZBG dKdL dLeBZCG dMdN dNeBZDG dOdP dPe?ZEG dQdR dRe?ZFG dSdT dTe?ZGG dUdV dVe9ZHG dWdX dXe9ZIG dYdZ dZe9ZJG d[d\ d\eIZKG d]d^ d^eIZLG d_d` d`eIZMG dadb dbeIZNG dcdd ddeIZOG dedf dfeIZPG dgdh dheIZQG didj djeIZRG dkdl dle=ZSG dmdn dne=ZTG dodp dpeTe;ZUG dqdr dre=ZVG dsdt dte=ZWG dudv dve=ZXG dwdx dxe=e;ZYG dydz dzeYZZG d{d| d|e9Z[G d}d~ d~e9Z\G dd deYZ]G dd deYZ^G dd de]Z_G dd de_Z`G dd de`ZaG dd de`ZbG dd de]ZcG dd de=ZdG dd de=e;ZeG dd deeZfG dd deeZgG dd de=ZhG dd de=ZiG dd de=ZjG dd de=ZkG dd de=ZlG dd de=ZmG dd demZnG dd demZoG dd demZpG dd demZqG dd de=ZrG dd de=ZsG dd de=ZtG dd de=ZuG dd de<ZvG dd de=ZwG dd de=ZxG dd de=ZyG dd de=ZzG dd de=Z{G dd de=Z|G dd de=Z}G dd de9Z~G ddĄ de=ZG ddƄ de=ZG ddȄ dȃZG ddʄ dee=ZG dd̄ de9ZG dd΄ de9ZddЄ ZG dd҄ dee=ZG ddԄ deZG ddք deZG dd؄ dee=ZG ddڄ de=ZG dd܄ demZG ddބ de=ZG dd de9ZG dd de=ZG dd deZG dd deZG dd de=ZG dd deZG dd deZG dd de=ZG dd deZG dd de=e7Zdd Zdd dd edZdd ZG dd de=ZG dd de=ZG dd  d e=ZG dd de9ZG dd de=eZG dd deZG dd deZG d	d
 d
e=ZG dd de9Ze%jrddZndZe!ddZe!ddZe!ddZe!ddZe!ddZe!ddZe!ddZe!ddZdS (      NoscopychainBuiltinerrorwarningNaming
PyrexTypespy_object_typeModuleScope
LocalScopeClosureScopeStructOrUnionScopePyClassScopeCppClassScopeUtilityCodeEncodedString
error_type)r      )r   )r   r   InternalErrorCompileErrorCannotSpecialize)r   )r	   )	TypeSlots)r
   r   )r   r   r   PropertyScoper   r   r   TemplateScopeGeneratorExpressionScopeCppScopedEnumScopepunycodify_name)r   r   )Future)Options)
DebugFlags)has_np_pythranpythran_typeis_pythran_buffer   )add_metaclassstr_to_number__init_subclass____class_getitem__c                   @   s   e Zd ZdZdZdZdS )
NoGilStater   r   r%   N)__name__
__module____qualname__HasGilNoGil
NoGilScope r1   r1   I/home/ubuntu/.local/lib/python3.10/site-packages/Cython/Compiler/Nodes.pyr*   (   s    r*   c                 C   s   | d   | d fS Nr   r   )get_filenametable_entryposr1   r1   r2   relative_position0   s   r7   c                 C   s   t js|S dt|  }|d u rt|S |j}|d ur-z|| W n ty,   d }Y nw |s4t|}nt|d | }||_|S )NzFile: %s (starting at line %s)
)r    embed_pos_in_docstringr7   r   encodingencodeUnicodeEncodeError)r6   	docstringpos_liner:   docr1   r1   r2   embed_position4   s"   
r@   c                        fdd}|S )Nc                     s   t | dkr`t| d  r`| d d \}}dd|j |jjj|jdd  f }| }|jj	 }| jd7  _| i |}| jd8  _||jj	 kr^|
|ddd |
| |S | i |S )Nr   r%   z(                    /* %s -> %s.%s %s */    ->z<-)len
isinstance
call_level	__class__r+   r6   insertion_pointbufferstreamtellputlnreplace)argskwdsnodecodemarkerrI   startrescodewriter_classfuncr1   r2   fO   s$   
zwrite_func_call.<locals>.fr1   )rX   rW   rY   r1   rV   r2   write_func_callN   s   rZ   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)
typesr]   Coder^   dictitemsrF   rZ   super__new__)clsnamebasesattrsr]   r^   mnamemrH   r1   r2   rd   k   s   
zVerboseCodeWriter.__new__)r+   r,   r-   rd   __classcell__r1   r1   rk   r2   r[   h   s    r[   c                       s,   e Zd ZdZeh dZ fddZ  ZS )CheckAnalyserszCMetaclass to check that type analysis functions return a node.
    >   analyse_typesanalyse_expressionsanalyse_target_typesc                    sb   ddl m} dd }t|}| D ]\}}t||r'|| jv r'|||||< qt | |||S )Nr   r\   c                    rA   )Nc                     s,    | i |}|d u rt d| |f  |S )Nz%s %s %s)print)rO   kwargsretvalrX   rf   r1   r2   call   s   z3CheckAnalysers.__new__.<locals>.check.<locals>.callr1   )rf   rX   ru   r1   rt   r2   check   s   z%CheckAnalysers.__new__.<locals>.check)r_   r]   ra   rb   rF   methodsrc   rd   )re   rf   rg   rh   r]   rv   ri   rj   rk   r1   r2   rd   ~   s   zCheckAnalysers.__new__)r+   r,   r-   __doc__	frozensetrw   rd   rl   r1   r1   rk   r2   rm   u   s    rm   c                   @      e Zd Zdd ZdS )CopyWithUpTreeRefsMixinc                 C   s\   | j }||}| j D ]\}}|| jv r|t||}nt||}t	||| q|S N)
rH   rd   __dict__rb   uptree_ref_attrsgetidr   deepcopysetattr)selfmemore   resultkvr1   r1   r2   __deepcopy__   s   

z$CopyWithUpTreeRefsMixin.__deepcopy__N)r+   r,   r-   r   r1   r1   r1   r2   r{      s    r{   c                 C   s   t jr	tt| S | S r|   )r!   debug_trace_code_generationr&   r[   )re   r1   r1   r2   _with_metaclass   s   r   c                   @   s   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdd ZdZdZdZd ddZdZd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd!ddZd"ddZdS )#Noder   FNc                 K   s   || _ | j| d S r|   )r6   r}   update)r   r6   kwr1   r1   r2   __init__   s   zNode.__init__	Operationc                 C      t | jd| j  d S )Nz%s not allowed without gil)r   r6   gil_messager   envr1   r1   r2   	gil_error      zNode.gil_errorc                 C   s   |  s
|   d S d S r|   )is_cpp	cpp_errorr   r1   r1   r2   	cpp_check      zNode.cpp_checkc                 C   r   )Nz%s only allowed in c++)r   r6   cpp_messager   r1   r1   r2   r      r   zNode.cpp_errorc                 C   sD   t  | }|jD ]}t||}t|trt||dd |D  q|S )ac  Clone the node. This is defined as a shallow copy, except for member lists
           amongst the child attributes (from get_child_accessors) which are also
           copied. Lists containing child nodes are thus seen as a way for the node
           to hold multiple children directly; the list is not treated as a separate
           level in the tree.c                 S   s   g | ]}|qS r1   r1   .0xr1   r1   r2   
<listcomp>   s    z#Node.clone_node.<locals>.<listcomp>)r   child_attrsgetattrrF   listr   )r   r   attrnamevaluer1   r1   r2   
clone_node   s   



zNode.clone_nodec                 C      d S r|   r1   r   r1   r1   r2   analyse_declarations     zNode.analyse_declarationsc                 C      t d| jj )Nz*analyse_expressions not implemented for %sr   rH   r+   r   r1   r1   r2   ro        zNode.analyse_expressionsc                 C   r   )Nz$generate_code not implemented for %sr   r   rR   r1   r1   r2   generate_code  r   zNode.generate_codec                 C   s   t | tr| j| d S d S r|   )rF   	BlockNodebodyannotater   r1   r1   r2   r     s   
zNode.annotatec              	   C   s   z| j W S  tyH   | j}| js|| _ | Y S | jD ]%}t| |}|d u r'qt|tr9|D ]	}t|| }q.qt|| }q|| _ | Y S w r|   )	_end_posAttributeErrorr6   r   r   rF   r   maxend_pos)r   r6   attrchildcr1   r1   r2   r     s&   


zNode.end_posr5   d   c           
   	      s    dkrdS du rt  t| v rd| jjt| f S t|   fddfdd| j D }t|dkrId	| jjt| f S d
| }d| jjt| f }|D ]\}}	|d|||	|d f 7 }qY|d| 7 }|S )zYDebug helper method that returns a recursive string representation of this node.
        r   z<...nesting level cutoff...>Nz<%s (0x%x) -- already output>c                    sN   t | tr|  d S t | tr#dd fdd| D  S t| S )Nr   z[%s], c                    s   g | ]} |qS r1   r1   )r   item)
dump_childlevelr1   r2   r   8      z1Node.dump.<locals>.dump_child.<locals>.<listcomp>)rF   r   dumpr   joinrepr)r   r   cutoffr   encountered
filter_outr   r2   r   4  s
   

zNode.dump.<locals>.dump_childc                    s    g | ]\}}| vr||fqS r1   r1   )r   keyr   )r   r1   r2   r   <  s     zNode.dump.<locals>.<listcomp>z<%s (0x%x)>z  z<%s (0x%x)
z%s  %s: %s
r   z%s>)setr   rH   r+   addr}   rb   rE   )
r   r   r   r   r   rh   indentrU   r   r   r1   r   r2   r   )  s"   z	Node.dump(#)c           
   	   C   s   | j sdS | j \}}}|jddd}|td|d | }|d }|r1|d| | ||d  }| d	 |d< ||||d
  7 }d|}	d|  d|dd|dd|	 d	S )z[Debug helper method that returns the source code context of this node as a string.
         ASCIIignore)r:   error_handlingr      Nz             # <<<<<<<<<<<<<<r%   r8   "z":d:)r6   	get_linesr   rstripr   get_escaped_description)
r   mark_columnrS   source_desclinecolcontentslinescurrentrR   r1   r1   r2   dump_posG  s   
&zNode.dump_posr|   )r   r5   r   N)Fr   ) r+   r,   r-   is_nameis_noneis_nonecheck
is_literalis_terminator
is_wrapperis_cpropertyis_templated_type_nodetempsr   outer_attrscf_statecoercion_typer   r   nogil_checkin_nogil_contextr   r   r   r   r   r   ro   r   r   r   r   r   r1   r1   r1   r2   r      s<    
%
r   c                   @   sV   e Zd ZdZdgZedd Zedd Zdd Zd	d
 Z	dd Z
dd Zdd ZdS )CompilerDirectivesNodez9
    Sets compiler directives for the children nodes
    r   c                 K   s(   t j|jfi |}| |j|||jdS N)r   
directivesr   )r    copy_inherited_directivesr   r6   r   )re   r   r   r   new_directivesr1   r1   r2   for_directivesc  s   z%CompilerDirectivesNode.for_directivesc                 C   s    t |j}| |j|||jdS r   )r    copy_for_internalr   r6   r   )re   r   r   r   r1   r1   r2   for_internalh  s   z#CompilerDirectivesNode.for_internalc                 C   s$   |j }| j |_ | j| ||_ d S r|   )r   r   r   r   r   oldr1   r1   r2   r   m  s   
z+CompilerDirectivesNode.analyse_declarationsc                 C   s&   |j }| j |_ | j|| _||_ | S r|   )r   r   ro   r   r1   r1   r2   ro   s  s
   z*CompilerDirectivesNode.analyse_expressionsc                 C   s8   |j }|jj }| j |j_ | j|| ||_ ||j_ d S r|   )r   globalstater   generate_function_definitions)r   r   rR   env_oldcode_oldr1   r1   r2   r   z  s   
z4CompilerDirectivesNode.generate_function_definitionsc                 C   *   |j j}| j|j _| j| ||j _d S r|   )r   r   r   generate_execution_coder   rR   r   r1   r1   r2   r        
z.CompilerDirectivesNode.generate_execution_codec                 C   r   r|   )r   r   r   r   r   r1   r1   r2   r     r   zCompilerDirectivesNode.annotateN)r+   r,   r-   rx   r   classmethodr   r   r   ro   r   r   r   r1   r1   r1   r2   r   Z  s    

r   c                   @      e Zd Zdd Zdd ZdS )r   c                 C   s.   |  j}|D ]}|j| q|d d = d S r|   )global_scopeundeclared_cached_builtinsr   add_cached_builtin_decl)r   r   rR   entriesentryr1   r1   r2   generate_cached_builtins_decls  s   
z(BlockNode.generate_cached_builtins_declsc                 C   s   |j D ]}||| qd S r|   )lambda_defsr   )r   r   rR   rQ   r1   r1   r2   generate_lambda_definitions     
z%BlockNode.generate_lambda_definitionsN)r+   r,   r-   r  r  r1   r1   r1   r2   r     s    r   c                   @   sF   e Zd ZdgZedd Zdd Zdd Zdd	 Zd
d Z	dd Z
dS )StatListNodestatsc                 K   s   t | fi |}|S r|   )r
  )r6   r   r   rQ   r1   r1   r2   create_analysed  s   zStatListNode.create_analysedc                 C      | j D ]}|| qd S r|   r  r   r   r   statr1   r1   r2   r     s   
z!StatListNode.analyse_declarationsc                    s    fdd| j D | _ | S )Nc                       g | ]}|  qS r1   ro   r   r  r   r1   r2   r     s    z4StatListNode.analyse_expressions.<locals>.<listcomp>r  r   r1   r  r2   ro     s   
z StatListNode.analyse_expressionsc                 C      | j D ]}||| qd S r|   r  r   r   r   rR   r  r1   r1   r2   r     s   
z*StatListNode.generate_function_definitionsc                 C   s&   | j D ]}||j || qd S r|   )r  mark_posr6   r   r   rR   r  r1   r1   r2   r     s   
z$StatListNode.generate_execution_codec                 C   r  r|   r  r   r  r1   r1   r2   r        
zStatListNode.annotateN)r+   r,   r-   r   staticmethodr  r   ro   r   r   r   r1   r1   r1   r2   r
    s    
r
  c                   @   r   )StatNodec                 C   r   r|   r1   r   r   rR   r1   r1   r2   r     r   z&StatNode.generate_function_definitionsc                 C   r   )Nz.generate_execution_code not implemented for %sr   r   r1   r1   r2   r     r   z StatNode.generate_execution_codeN)r+   r,   r-   r   r   r1   r1   r1   r2   r    s    r  c                   @   :   e Zd ZdgZdd Zdd Zdd Zdd	 Zd
d ZdS )CDefExternNoder   c                 C   sx   |j }d|_ | j| ||_ | js| jr:| jj}|jd s!d}n|s&d}n	tdd |D }|| j| j| d S d S )Nr   preliminary_late_includes_cy28Fc                 s   s    | ]}t |tV  qd S r|   )rF   CVarDefNode)r   rQ   r1   r1   r2   	<genexpr>      z6CDefExternNode.analyse_declarations.<locals>.<genexpr>)	in_cincluder   r   include_fileverbatim_includer  r   alladd_include_file)r   r   old_cinclude_flagr  later1   r1   r2   r     s   
z#CDefExternNode.analyse_declarationsc                 C      | j || _ | S r|   r   ro   r   r1   r1   r2   ro        z"CDefExternNode.analyse_expressionsc                 C      | j || d S r|   r   r   r  r1   r1   r2   r        z,CDefExternNode.generate_function_definitionsc                 C   r   r|   r1   r   r1   r1   r2   r     r   z&CDefExternNode.generate_execution_codec                 C      | j | d S r|   r   r   r   r1   r1   r2   r        zCDefExternNode.annotateN	r+   r,   r-   r   r   ro   r   r   r   r1   r1   r1   r2   r!    s    r!  c                   @   $   e Zd Zg ZdZdd Zdd ZdS )CDeclaratorNoder   c                 C   r   r|   r1   r   r1   r1   r2   declared_name  r   zCDeclaratorNode.declared_namec                 C   r   r|   r1   r   r1   r1   r2   analyse_templates  s   z!CDeclaratorNode.analyse_templatesN)r+   r,   r-   r   calling_conventionr9  r:  r1   r1   r1   r2   r8    s
    r8  c                   @   s(   e Zd ZdgZdZdd Zd	ddZdS )
CNameDeclaratorNodedefaultNc                 C      | j S r|   rf   r   r1   r1   r2   r9  !     z!CNameDeclaratorNode.declared_namer   Fc                 C   s   |r,| j dkr,|js|js|jrt| jd n|jr!t| jd n|jdddd| _ t}|j	rM|j
rMz||j
}W n tyL   t| jd| j   Y nw || _| |fS )Nr   Missing argument nameJUse spam() rather than spam(void) to declare a function with no arguments.r   )for_displaypyrexR'%s' cannot be specialized since its type is not a fused argument to this function)rf   is_ptris_array	is_bufferr   r6   is_voiddeclaration_coder
   is_fusedfused_to_specific
specializer   type)r   	base_typer   nonempty
visibilityin_pxdr1   r1   r2   analyse$  s&   zCNameDeclaratorNode.analyser   NF)r+   r,   r-   r   r=  r9  rS  r1   r1   r1   r2   r<    s
    r<  c                   @   s,   e Zd ZdgZdd Zdd Zdd	d
ZdS )CPtrDeclaratorNodebasec                 C   
   | j  S r|   rV  r9  r   r1   r1   r2   r9  @     
z CPtrDeclaratorNode.declared_namec                 C   rW  r|   rV  r:  r   r1   r1   r2   r:  C  rY  z$CPtrDeclaratorNode.analyse_templatesr   NFc                 C   2   |j r	t| jd t|}| jj|||||dS )Nz+Pointer base type cannot be a Python objectrP  rQ  rR  )is_pyobjectr   r6   r	   
c_ptr_typerV  rS  )r   rO  r   rP  rQ  rR  ptr_typer1   r1   r2   rS  F     
zCPtrDeclaratorNode.analyserT  )r+   r,   r-   r   r9  r:  rS  r1   r1   r1   r2   rU  ;  s
    rU  c                   @   s"   e Zd ZdgZdd Zdd ZdS )_CReferenceDeclaratorBaseNoderV  c                 C   rW  r|   rX  r   r1   r1   r2   r9  P  rY  z+_CReferenceDeclaratorBaseNode.declared_namec                 C   rW  r|   rZ  r   r1   r1   r2   r:  S  rY  z/_CReferenceDeclaratorBaseNode.analyse_templatesN)r+   r,   r-   r   r9  r:  r1   r1   r1   r2   ra  M  s    ra  c                   @      e Zd ZdddZdS )CReferenceDeclaratorNoder   NFc                 C   r[  )Nz-Reference base type cannot be a Python objectr\  )r]  r   r6   r	   
c_ref_typerV  rS  r   rO  r   rP  rQ  rR  ref_typer1   r1   r2   rS  X  r`  z CReferenceDeclaratorNode.analyserT  r+   r,   r-   rS  r1   r1   r1   r2   rc  W      rc  c                   @   rb  ) CppRvalueReferenceDeclaratorNoder   NFc                 C   r[  )Nz4Rvalue-reference base type cannot be a Python objectr\  )r]  r   r6   r	   cpp_rvalue_ref_typerV  rS  re  r1   r1   r2   rS  `  r`  z(CppRvalueReferenceDeclaratorNode.analyserT  rg  r1   r1   r1   r2   ri  _  rh  ri  c                   @   s   e Zd ZddgZdddZdS )	CArrayDeclaratorNoderV  	dimensionr   NFc                    s  |j r| s|js|jrRddlm} t| j|r| jj}n| jf} fdd|D }d |v r?|	d }	t
||	 jd t}n|| j |}| jj| |||dS d }
| jr| j | _| jjjsjt
| jjd | jjjr}| jjjdkr}t
| jjd	 t| jjtr| jjn| j }
zt|
}
W n	 ty   Y nw | st
| jd
|  |jrt
| jd |jrt
| jd t||
}| jj| |||dS )Nr   	TupleNodec                    r  r1   )analyse_as_type)r   r   r  r1   r2   r   v  r   z0CArrayDeclaratorNode.analyse.<locals>.<listcomp>zTemplate parameter not a typer\  zArray dimension not integerexternz(Array dimension cannot be const variablez%Array element type '%s' is incompletez'Array element cannot be a Python objectz"Array element cannot be a function)is_cpp_classis_template_typeis_cfunctionpython_type_constructor_name	ExprNodesrn  rF   rl  rO   indexr   r6   r   specialize_hererV  rS  analyse_const_expressionrN  is_intis_constr  rQ  constant_resultintget_constant_c_result_code
ValueErroris_completer]  r	   c_array_type)r   rO  r   rP  rQ  rR  rn  rO   valuesixsize
array_typer1   r  r2   rS  m  sN   


zCArrayDeclaratorNode.analyserT  r+   r,   r-   r   rS  r1   r1   r1   r2   rk  g      rk  c                   @   sH   e Zd Zg dZdZdZdZdZdd Zdd Z	dd	d
Z
dddZdS )CFuncDeclaratorNode)rV  rO   exception_valuer   Nc                 C   rW  r|   rX  r   r1   r1   r2   r9    rY  z!CFuncDeclaratorNode.declared_namec                 C   s   t | jtrRddlm}m} | jj}t ||r|j}nt ||r$|g}nt|j	d d S g | _
|D ]}t ||rC| j
t|j q1t|j	d q1| jj| _| j
S d S )Nr   )rn  NameNodez*Template arguments must be a list of names)rF   rV  rk  ru  rn  r  rl  rO   r   r6   	templatesappendr	   TemplatePlaceholderTyperf   )r   rn  r  template_nodetemplate_nodestemplater1   r1   r2   r:    s"   



z%CFuncDeclaratorNode.analyse_templatesFc                    s4  |d u ri }|r|d8 }g }t jD ]\}}	|	j ||dko& jo&d jvd\}
}|
j}||v r`|| }| }|d u rFt|jd n|t	j
ur^||s^tjjd t|jd n|}|
jritjd |dkrv jrv|jrv j}|jrt	|j}|jrt|	jd	 t	|||	j}|	jrd
|_|	jrd
|_|| |	jr jd7  _qjrtjd qd }d} jd r|js׈js׈jr|dkrd_tjddd jdkr   d  d  d  d n	|jrjrd_|jrj sjrjdkrtjd n|jr1js1|dkr1jr1tjdd nވj d u rojrojdkro|j d uro|dkro|so jsot!jt"soddl#m$} |j%jt&|j ||j d_ j d urjdkrj ' _ j j(}|j)s|js|j*r|j+js|jr|t	j,krj j-dkstj jd j }nYj . /| ' _ j 0 }|1j j(stj jd |dkr|j2s|j3rj 4 rzt5|j6}W n
 t7y   Y nw j j8|krtjdj j8  j}|j*rtjd t	j9||j:j||jj;j<j=j>j?j@d }jrL|jArF fd!d"}||_BnC|   jd# }|rl|j;}|ri||kritjd$||f  ||_;|j+jDrxtjd%d |jD ]}|j(jDr|E stjd&d q{jj| ||d'S )(Nr   r   r  rP  is_self_arg
Not a type2Signature does not agree with previous declarationPrevious declaration herez2Function argument cannot have C name specificationrB  Tz-Non-default argument follows default argumentlegacy_implicit_noexceptrp  FzdImplicit noexcept declaration is deprecated. Function declaration should contain 'noexcept' keyword.r%   r   +iosnew	stdexcepttypeinfozAException clause not allowed for function returning Python objectz?noexcept clause is ignored for function returning Python object	ConstNoder   rN  r{  *zTException value must be a Python exception, or C++ function with no arguments, or *.z6Exception value incompatible with function return typez;Ambiguous exception value, same as default return value: %rz!Function cannot return a function)	optional_arg_countr  exception_checkr;  nogilwith_gilis_overridableis_const_methodr  c                    s    |  | d S r|   )declare_optional_arg_struct)	func_typefused_cnamer   r   r1   r2   declare_opt_arg_structU  r2  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rQ  rR  )F	enumeraterO   rS  is_c_class_scoper   rf   ro  r   r6   r	   r
   same_asrV  cnameis_unspecifiedparent_typerG  r^  rO  rI  CFuncTypeArgnot_noneor_noner  r=  r  r]  has_explicit_exc_clauser  r   r   r*  r  rF   rU  ru  r  for_typestrrx  rN  is_errorrs  return_typec_char_typer   rn   	coerce_toas_exception_valueassignable_fromry  is_floathas_constant_resultfloatdefault_valuer~  r{  	CFuncTypehas_varargsr;  r  r  overridabler  r  rK  r  r  is_rvalue_referenceis_forwarding_reference)r   r  r   rP  directive_localsrQ  rR  func_type_argsiarg_nodename_declaratorrN  rf   	type_node
other_typefunc_argexc_val	exc_checkr  exc_val_typetype_default_valuer  r  r  r   argr1   r  r2   rS    s<  









" 
	


zCFuncDeclaratorNode.analysec           	      C   s   t  }dtj }||tj| j |jt|j| j	 d D ]}|j|j
|j|jddd q|tj| jj
}|durAt||}| j|d|d| j|d}d|_d|_t|j|_dS )	a  
        Declares the optional argument struct (the struct used to hold the
        values for optional arguments). For fused cdef functions, this is
        deferred as analyse_declarations is called only once (on the fused
        cdef function).
        z%snNT)allow_pyobjectallow_memoryviewstructr   )rf   kindscopetypedef_flagr6   r  r   )r   r   pyrex_prefixdeclare_varr	   
c_int_typer6   rO   rE   r  rf   rN  mangleopt_arg_prefixrV  get_fused_cnamer  declare_struct_or_uniondefined_in_pxdusedr^  op_arg_struct)	r   r  r   r  r  arg_count_memberr  struct_cnameop_args_structr1   r1   r2   r  l  s&   
z/CFuncDeclaratorNode.declare_optional_arg_struct)r   NNFr|   )r+   r,   r-   r   r  r  r  r  r9  r:  rS  r  r1   r1   r1   r2   r    s    
 (r  c                   @   s   e Zd ZdgZdddZdS )CConstDeclaratorNoderV  r   NFc                 C   r[  )Nz)Const base type cannot be a Python objectr\  )r]  r   r6   r	   c_const_typerV  rS  )r   rO  r   rP  rQ  rR  constr1   r1   r2   rS    s   
zCConstDeclaratorNode.analyserT  r  r1   r1   r1   r2   r        r  c                   @   s   e Zd Zg dZddgZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZdZdd	 Zed
d Zedd ZdddZdd Zdd Zdd Z		dddZdS )CArgDeclNode)rO  
declaratorr=  
annotationr=  r  r   r   FNc                 C   rW  r|   r  r9  r   r1   r1   r2   r9    rY  zCArgDeclNode.declared_namec                 C   rW  r|   )rf   as_c_string_literalr   r1   r1   r2   name_cstring     
zCArgDeclNode.name_cstringc                 C   s*   | j rttj| jj S ttj| jj S r|   )needs_conversionr   r   
arg_prefixr  rf   
var_prefixr   r1   r1   r2   	hdr_cname  s   zCArgDeclNode.hdr_cnamec                 C   sf  |r	| | j _| _| jd ur| j| jfS t| jtrH| jjdkrH|rE| j jr3| j j	|dd}|
 }n| j j}t|| j_d | j _d| j _d}nd}d| j _| j j	||d}t| j dd }|rc|| j_|jrt| j trt| jtr| j}	t|	jtr|	j}	t|	jts{| j j|	_|j }| jr|r|jd rt| j dd d u r| |}
|
d ur|
}| jj	|||dS )	Nr   T)could_be_nameFarg_nameannotation_typingrf   rP  )rO  r  rN  r  rF   r  r<  rf   is_basic_c_typerS  empty_declaration_coder   is_argr   rG  TemplatedTypeNoderk  rV  array_declaratorr  r   inject_type_from_annotations)r   r   rP  r  rN  r  r  rO  base_arg_namer  arg_typer1   r1   r2   rS    sJ   





zCArgDeclNode.analysec                 C   s   | j }|sd S |j|| jd\}}|d urt|j|dd| _|rgd|v r3| }|r/| s/n8d| _n4|t	u r;d| _n,| jr]| jj
r]| sI|jr]| sP|j}| js\t| jd d| _n
| jsg| rgd| _|rld| _|S )N)assigned_valueT)rN  r  ztyping.OptionalzIPEP-484 recommends 'typing.Optional[...]' for arguments that can be None.)r  analyse_type_annotationr=  CAnalysedBaseTypeNoder6   rO  resolvecan_be_optionalr  r
   r   equivalent_typer   r  type_from_annotation)r   r   r  	modifiersr  r1   r1   r2   r    s8   z)CArgDeclNode.inject_type_from_annotationsc                 C   sJ   | j d u r"| jr"| jjr| j| | j| j S || j| _ | j S r|   )r  r=  r   generate_evaluation_coderN  	cast_coder   get_argument_default_constr   r1   r1   r2   calculate_default_value_code+  s   
z)CArgDeclNode.calculate_default_value_codec                 C      | j r| j | d S d S r|   )r=  r   r   r1   r1   r2   r   5     zCArgDeclNode.annotatec                 C   s   | j }|d u s|jr|d u rd S |p| |}|| || |r'| n|| j}|d||f  |	| | j |
| || d S N%s = %s;)r=  r   r  r
  make_owned_referencer   	result_asrN  rM   put_giverefgenerate_post_assignment_code
free_temps)r   rR   overloaded_assignmentcyfunc_struct_targetr=  targetr   r1   r1   r2   generate_assignment_code9  s   


z%CArgDeclNode.generate_assignment_code)r   FFN)r+   r,   r-   r   r   r  is_type_arg
is_genericis_special_method_optionalkw_onlypos_onlyr  r  rN  r  r  r  
is_dynamicdefaults_class_keyr  r9  propertyr  r  rS  r  r  r   r  r1   r1   r1   r2   r    s<    


	2%
r  c                   @   rz   )CBaseTypeNodec                 C   s
   |  |S r|   rS  r   r1   r1   r2   ro  R  rY  zCBaseTypeNode.analyse_as_typeN)r+   r,   r-   ro  r1   r1   r1   r2   r$  J  s    r$  c                   @   s   e Zd Zg ZdddZdS )r  Fc                 C   r>  r|   rN  )r   r   r  r1   r1   r2   rS  [  r@  zCAnalysedBaseTypeNode.analyseNFr  r1   r1   r1   r2   r  V  s    r  c                   @   s.   e Zd Zg ZdZg ZdZdZdZdddZ	dS )CSimpleBaseTypeNodeNFc           	      C   s>  d }| j rt| j| j| j}|st| jd n| jdkr#| js#t	}n| jd u r5| j
r2|jr2|j}nt	}n|}| jr| jD ]%}||}|d urW|jsR|jrW|jjrW|jj}q=|r`|jr`|j}q=d } |d u rt| jdkrddlm} || jd }|r|jr||j}|d u r|| j| j}|r|jr| }|| j}|d urn7|r| j
r|jr|j}nt	}t| j| _n"| jr| j| jvrt| jd| j  t| j}n	t| jd| j  |r|jr|jr| |j}| j!r|j"r|j#rt| jd t$|}|%| n|tj&u rtj'}|%| d| _!|stj(}|S )	Nz&Unrecognised type modifier combinationobjectr   )'get_known_standard_library_module_scoper   z'%s' is not a type identifierz#can only complexify c numeric typesT))r  r	   simple_c_typesignedlongnessrf   r   r6   module_pathr
   r  r  r  lookuprq  is_typerN  r  	as_modulerE   r   r*  known_standard_library_importfind_imported_moduler  lookup_typer   r  r  r  rK  rL  rM  complex
is_numeric
is_complexCComplexTypecreate_declaration_utility_codecomplex_typec_double_complex_typer   )	r   r   r  rN  r  r   r  r*  found_entryr1   r1   r2   rS  p  s   








zCSimpleBaseTypeNode.analyser'  )
r+   r,   r-   r   r  r.  r  r5  r  rS  r1   r1   r1   r2   r(  _  s    
r(  c                   @   s*   e Zd ZdZddgZd
ddZdd Zd	S )MemoryViewSliceTypeNode
memoryviewbase_type_nodeaxesFc              
   C   s   | j |}|jr|S ddlm} z	||| j}W n! ty; } zt|j	|j
 t | _| jW  Y d }~S d }~ww || j|sIt| _| jS t||| _| j| j | | | jS Nr   
MemoryView)r?  rS  r  r   rC  get_axes_specsr@  r   r   positionmessage_onlyr	   	ErrorTyperN  validate_axesr6   r   MemoryViewSliceTypevalidate_memslice_dtypeuse_memview_utilities)r   r   r  rO  rC  
axes_specser1   r1   r2   rS    s$   


zMemoryViewSliceTypeNode.analysec                 C   s$   ddl m} |||jj d S rA  )r   rC  use_utility_codeget_view_utility_codecontextshared_utility_qualified_name)r   r   rC  r1   r1   r2   rK    s   z-MemoryViewSliceTypeNode.use_memview_utilitiesNr'  )r+   r,   r-   rf   r   rS  rK  r1   r1   r1   r2   r=    s
    
r=  c                   @   s   e Zd ZdgZdddZdS )CNestedBaseTypeNoderO  Nc                 C   sr   | j |}|tju rtjS |jst| jd|  tjS |j| j	}|r(|j
s6t| jd|| j	f  tjS |jS )Nz'%s' is not a valid type scopez '%s.%s' is not a type identifier)rO  rS  r	   r   rq  r   r6   r  lookup_hererf   r0  rN  )r   r   r  rO  
type_entryr1   r1   r2   rS    s   

zCNestedBaseTypeNode.analyser|   r  r1   r1   r1   r2   rR    s    rR  c                   @   s:   e Zd Zg dZdZdZdZdd ZdddZd	d
 Z	dS )r  )r?  positional_argskeyword_args
dtype_nodeTNc           
   	   C   s6  |j dk}|jo
| }g }| jD ]9}|jrq||pt|t ||}W d    n1 s0w   Y  |d u rD|jrDt	|j
d t}|| q|j rb|j dkr]tdd | jD |_| }nd}t|D ]0\}	}|d u rqqh|rv|jr||r| s|jr| s|j||	< qht	|j
d|j |f  t||	< qh|S )Nzdataclasses.ClassVarz!unknown type in template argumentztyping.Unionc                 s       | ]}|j V  qd S r|   )r   r   r1   r1   r2   r$  &      z<TemplatedTypeNode._analyse_template_types.<locals>.<genexpr>Fz$%s[...] cannot be applied to type %s)rt  in_c_type_contextrU  r   new_c_type_contextrF   r$  ro  rq  r   r6   r   r  anycontains_noneallows_noner  r]  r  r  as_cython_attribute)
r   r   rO  require_python_typesrZ  template_typesr  ttyperequire_optional_typesr  r1   r1   r2   _analyse_template_types  s@   



z)TemplatedTypeNode._analyse_template_typesFc           
      C   s  |d u r
| j |}|jr|S |jr| s|jrF| jr6| jjr6|jr%dnd}t| j	d|  t
j| _| jS | ||}|| j	||| _nq|jr{ddlm} || j	|| j| j|j}t
j|fi || _t|rzt| jrzt
t| j| j| _n<t| j	dd d}t| jdks| jjrt| j	d t
j| _n| jsd }	n| jd	 }	t| j	||	d
| _| j||d | _| jr| jjr|jrz| j |j| _W | jS  t!y   t| j	d| j"  Y | jS w | jS )Nzc++ templateszindexed typesz %s cannot take keyword argumentsr   Bufferr   rf   r  zinvalid array declarationr   )rV  rl  rE  )#r?  rS  r  rq  rr  rt  rV  key_value_pairsr   r6   r	   r   rN  rd  rw  r]  r   rf  analyse_buffer_optionsrU  buffer_defaults
BufferTyper"   r$   PythranExprr#   r<  rE   rk  r  rK  rL  rM  r   rf   )
r   r   r  rO  tpra  rf  optionsempty_declaratorrl  r1   r1   r2   rS  ;  sh   


zTemplatedTypeNode.analysec                 C   sn   g }| }|j r5|jr5t|jdkr5| j|}|jr#|jr#||j |jd }|j r5|jr5t|jdks|S Nr   r   )r   r?  rE   rU  ro  rt  modifier_namer  )r   r   r	  modifier_nodemodifier_typer1   r1   r2   analyse_pytyping_modifiersx  s   
z,TemplatedTypeNode.analyse_pytyping_modifiersr  )
r+   r,   r-   r   r   rW  rf   rd  rS  rt  r1   r1   r1   r2   r    s    	
*=r  c                   @   s   e Zd ZddgZdddZdS )CComplexBaseTypeNoderO  r  Fc                 C   s$   | j ||}| j||\}}|S r|   )rO  rS  r  )r   r   r  rV  _rN  r1   r1   r2   rS    s   zCComplexBaseTypeNode.analyseNr'  r  r1   r1   r1   r2   ru    r  ru  c                   @      e Zd ZdgZdddZdS )CTupleBaseTypeNode
componentsFc                 C   sX   g }| j D ]}||}|jrt|jd t  S || q|| j|}d|_|j	S )Nz/Tuple types can't (yet) contain Python objects.T)
ry  rS  r]  r   r6   r   r  declare_tuple_typer  rN  )r   r   r  component_typesr   rN  r  r1   r1   r2   rS    s   

zCTupleBaseTypeNode.analyseNr'  r  r1   r1   r1   r2   rx    r  rx  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)rS  declare_typedefrf   r6   r&  )r   r   rN  r  r1   r1   r2   r     s   

z"FusedTypeNode.analyse_declarationsFc                 C   s\   g }| j D ] }||}|st|jd q||v r t|jd q|| qtj|| jdS )Nr  zType specified multiple timesr?  )r_   ro  r   r6   r  r	   	FusedTyperf   )r   r   r  r_   r  rN  r1   r1   r2   rS    s   

zFusedTypeNode.analyseNr'  )r+   r,   r-   rx   r   r   rS  r1   r1   r1   r2   r|    s
    	r|  c                   @   rw  )CConstOrVolatileTypeNoderO  Fc                 C   s2   | j ||}|jrt| jd t|| j| jS )Nz2Const/volatile base type cannot be a Python object)	rO  rS  r]  r   r6   r	   c_const_or_volatile_typerz  is_volatile)r   r   r  rV  r1   r1   r2   rS    s   z CConstOrVolatileTypeNode.analyseNr'  r  r1   r1   r1   r2   r    s    r  c                   @   s&   e Zd ZddgZdZdZdddZdS )r#  rO  declaratorsNc                 C   s6  | j d u ri | _ |s|}|| _| jr| jd  }nd }|d urS| jdkr+t| jd t| jdkr;t| jd jd td|}|j	j
|_
|D ]}||j|| j qG| j|}d }| jjre| j|}|jry| jsy|jsq|jryt| jd tS d | _| j}| jD ]}t| jdkrt|ts|j
d rt|jd	d | jo| jdko|j}	|	rd
|_t|tr|j||| j || jd\}
}n|j|||| jd\}
}| s| jdkr|js|jst|jd|  | jdkr|jrt|jd |
j}|
j }|dkrt|jd  d S |j!r| jdkrt|jd |j"r&| jdkr&t|jd |j#red|j
v r3d|_$|j%|||j|| j| j| j&| j'| jd	| _| jd urVt((| j | j_ |	rd| jj)*| d| j_+q| jrot| jd | j ryt| jd |j,|||j||| j| j&d|d	| _t-j.rt/| j| j0| j_0qd S )Nr   rp  zOnly extern functions allowedr   z%Can't multiply declare template typesfunc_templatezFused types not allowed herezwarn.multiple_declaratorszNon-trivial type declarators in shared declaration (e.g. mix of pointers and values). Each pointer declaration should be on its own line.F)r  rQ  rR  r  z Variable type '%s' is incompletez'Python object cannot be declared externr   zMissing name in declaration.z8C++ references cannot be declared; use a pointer insteadz(C++ rvalue-references cannot be declaredr  T)r  rQ  rR  apir	  r  z>Variables cannot be declared with 'cpdef'. Use 'cdef' instead.z,Decorators can only be followed by functions)r  rQ  rR  r  is_cdefpytyping_modifiers)1r  
dest_scoper  r:  rQ  r   r6   rE   r   outer_scoper   declare_typerf   rO  rS  r   rt  rK  rR  r  is_module_scoper   r  rF   r<  r   r  r  r  rG  is_memoryviewslicer]  r  is_referencer  rs  is_static_methoddeclare_cfunctionr  r	  r   rN  create_to_py_utility_codecreate_wrapperr  r    
docstringsr@   r?   )r   r   r  r  template_paramrO  r	  rQ  r  create_extern_wrapperr  rN  rf   r  r1   r1   r2   r     s   








z CVarDefNode.analyse_declarationsr|   )r+   r,   r-   r   
decoratorsr  r   r1   r1   r1   r2   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)rQ  r  packed)
r  rf   r  r  r6   r  rQ  r  r  r  r   r   r  r1   r1   r2   declare[  s
   zCStructOrUnionDefNode.declarec                 C   s   d }| j d urt| j}| || | j d urP| jr!|js!d| j_| j D ]}||| q$| j	dkrR|j
D ]}|j}|jrC|j}|js=|| jjkrOt|jd q5d S d S d S )Nr   rp  z)Struct cannot contain itself as a member.)r  r   rf   r  rR  r&  r  r  r   rQ  var_entriesrN  rG  rO  r   r6   )r   r   r  r   rN  r1   r1   r2   r   a  s*   





z*CStructOrUnionDefNode.analyse_declarationsc                 C      | S r|   r1   r   r1   r1   r2   ro   s  r   z)CStructOrUnionDefNode.analyse_expressionsc                 C   r   r|   r1   r   r1   r1   r2   r   v  r   z-CStructOrUnionDefNode.generate_execution_coder|   )r+   r,   r-   r   r  r   ro   r   r1   r1   r1   r2   r  M  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 u rd }n)dd | j D }tdd | j D }|r1tdd | j d |  D s1t| jd |j| jd | j| jg | j|d| _	d S )Nc                 S      g | ]\}}t || qS r1   r	   r  r   template_namerequiredr1   r1   r2   r         z(CppClassNode.declare.<locals>.<listcomp>c                 s   s    | ]\}}| V  qd S r|   r1   r   rv  r  r1   r1   r2   r$    r%  z'CppClassNode.declare.<locals>.<genexpr>c                 s   s    | ]\}}|V  qd S r|   r1   r  r1   r1   r2   r$    s    zGRequired template parameters must precede optional template parameters.)base_classesrQ  r  )
r  sumr)  r   r6   declare_cpp_classrf   r  rQ  r  )r   r   ra  num_optional_templatesr1   r1   r2   r    s   
"zCppClassNode.declarec           
   	      s     stjddd jd u rd  }}ndd jD }dd jD }d jd ur5tj |dfdd	}t| fd
djD } j	jjj
|j|d_jd u rad S dj_d urnjj_g }fddjd urjr jsdj_jD ]}t|dd }|r| | qjD ]}	||	 jd urdd| |	_qtj|d__d S )Nz0Using 'cppclass' while Cython is not in c++ moder   r   c                 S   s   g | ]\}}|qS r1   r1   )r   r  rv  r1   r1   r2   r         z5CppClassNode.analyse_declarations.<locals>.<listcomp>c                 S   r  r1   r  r  r1   r1   r2   r     r  )r  c                    s$   | j s| jrdS t jd|   d S )NTz&Base class '%s' not a struct or class.)rq  	is_structr   r6   )
base_classr   r1   r2   base_ok  s   z2CppClassNode.analyse_declarations.<locals>.base_okc                    s   g | ]	}| p	 qS r1   r%  )r   b)r   r  r1   r2   r         )rQ  r  c                 3   sd    | D ],}t |tr|V  qt |tr |jjE d H  qt |tr/|jd ur/ |jE d H  qd S r|   )rF   CFuncDefNoder   r   r  r  r  )r  r   )func_attributesr1   r2   r    s   

z:CppClassNode.analyse_declarations.<locals>.func_attributesr  ztemplate <typename %s>z, typename r  )r   r   r6   r  r  r   rf   filterr  r  r  rQ  r  rq  rN  rR  r&  r  r   r  r   r  r   template_declarationr
  r   r  )
r   r   ra  template_namesr  base_class_typesdefined_funcsr   r  rX   r1   )r   r  r  r   r2   r     sT   











z!CppClassNode.analyse_declarationsc                 C   s   | j | jjj| _ | S r|   )r   ro   r  rN  r  r   r1   r1   r2   ro     s   z CppClassNode.analyse_expressionsc                 C   s   | j | jjj| d S r|   )r   r   r  rN  r  r  r1   r1   r2   r        z*CppClassNode.generate_function_definitionsc                 C   r3  r|   r   r   r   r1   r1   r2   r     r5  z$CppClassNode.generate_execution_codec                 C   r3  r|   r4  r   r1   r1   r2   r     r5  zCppClassNode.annotate)
r+   r,   r-   r  r  r   ro   r   r   r   r1   r1   r1   r2   r  z  s    4r  c                   @   s8   e Zd ZddgZdZdd Zdd Zdd	 Zd
d ZdS )CEnumDefNoderb   underlying_typeNc                 C   sJ   d }t jrt| j| j}|j| j| j| j| j| j	| j
| j| j|d	| _d S )N)r  scopedr  rQ  r  r  r?   )r    r  r@   r6   r?   declare_enumrf   r  r  r  rQ  r  r  r  )r   r   r?   r1   r1   r2   r    s   zCEnumDefNode.declarec                 C   s   d }| j |}|jst| j jd || jj_ | jr/| jd ur/t	| j
|}| jj|_|j|_n|}| jd uri| jr@|js@d| j_| jdk}|rIdnd }| jD ]}||| j| |rhd|jjd ure|jjn| }qNd S d S )Nz'underlying type is not an integral typer   rp  r   )r  rS  ry  r   r6   r  rN  r  rb   r   rf   r   rR  r&  r  rQ  analyse_enum_declarationsenum_int_value)r   r   r  r  is_declared_enumnext_int_enum_valuer   r1   r1   r2   r     s0   





	z!CEnumDefNode.analyse_declarationsc                 C   r  r|   r1   r   r1   r1   r2   ro     r   z CEnumDefNode.analyse_expressionsc              
   C   s   | j rd S | js| js| jdksd S || j |jjtj	dd}| j
jD ]6}|d||j|||jf  ||tj	 |d|tj|j |||jf  ||tj	 q%|j| d S )NpublicT
manage_refz%s = PyLong_FromLong(%s); %sz,if (PyDict_SetItemString(%s, %s, %s) < 0) %s)r  r  rf   rQ  r  r6   	funcstateallocate_tempr	   r
   r  enum_valuesrM   r  error_goto_if_null
put_gotrefname_in_module_stater   moddict_cnamer  
error_gotoput_decref_clearrelease_temp)r   rR   tempr   r1   r1   r2   r     s*   

z$CEnumDefNode.generate_execution_code)	r+   r,   r-   r   r?   r  r   ro   r   r1   r1   r1   r2   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r,d|j| j	f }n| j}|j
| j	|j| j | j||j|j|joE|j	d u d | _}|}| j ro| j jr[t| j j }n| j jsc| j jrm| j jrm| j jj}nd }|d urv||_|j| |j	r|jj|j	 d S d S )Nz%s::%s)r  rQ  r  r  )r   rx  rN  ry  r  r	   r  is_cpp_enumr  rf   declare_constr6   rQ  r  r  r  r   r'   r   is_attributer  r  r  r  )r   r   
enum_entryincremental_int_valuer  r  
enum_valuer1   r1   r2   r  9  s6   

z*CEnumDefItemNode.analyse_enum_declarationsN)r+   r,   r-   r   r  r1   r1   r1   r2   r  2  s    r  c                   @   s,   e Zd ZddgZdd Zdd Zdd Zd	S )
CTypeDefNoderO  r  c                 C   sz   | j |}| jj||| j| jd\}}|j}|j}|j||| j|| j| j	d}|j
r.d|_| jr9|js;d|_d S d S d S )Nr  )r  rQ  r  Tr   )rO  rS  r  rQ  rR  rf   r  r}  r6   r  rK  r&  r  )r   r   rV  r  rN  rf   r  r  r1   r1   r2   r   f  s   


z!CTypeDefNode.analyse_declarationsc                 C   r  r|   r1   r   r1   r1   r2   ro   w  r   z CTypeDefNode.analyse_expressionsc                 C   r   r|   r1   r   r1   r1   r2   r   z  r   z$CTypeDefNode.generate_execution_codeNr+   r,   r-   r   r   ro   r   r1   r1   r1   r2   r  ]  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 ]D}|jr;d}|jr |j||_|j|j||_q|jr1|jjs0t|j	d d |_qt|j	d d |_q|j
rAd}q|rIt|j	d qd S )Nr   r   z2This argument cannot have a non-None default valuez)This argument cannot have a default valuez/Non-default argument following default argument)rO   r=  r  rn   r  rN  r  r   r   r6   r  )r   r   default_seenr  r1   r1   r2   analyse_default_values  s(   
z"FuncDefNode.analyse_default_valuesc                 C   s<   | j D ]}|jr|j||_q| jr| j|| _d S d S r|   )rO   r  rn   return_type_annotationr   r   r  r1   r1   r2   analyse_annotations  s   
zFuncDefNode.analyse_annotationsc                 C   s   | j }|j}|j|v r||j }||}nt|tr2|jr2|jd r2|j}||}|d u r1|S n|S |d u r@t	|j
d |S |turX||sXt	|jj
d t	|j
d |S ||_|jjre|j| |S )Nr  r  r  r  )r  rN  rf   ro  rF   r  r  r   r  r   r6   r
   r  rO  r7  r9  )r   r   r  r  	orig_typer  r  r1   r1   r2   align_argument_type  s.   


	zFuncDefNode.align_argument_typec                 C      dS Nr   r1   r   lenvr1   r1   r2   need_gil_acquisition  r   z FuncDefNode.need_gil_acquisitionc                 C   s   |}|j s|jr|j}|j s|js| jr1| jrtnt}|| jj||| jj	d}| j
s-| jr0d|_n	t| jj||d}| j|_| jj}|jrM|joK|j |_|| _|j|_|S )N)rf   r  parent_scope
scope_nameT)rf   r  r  )is_py_class_scoper  r  needs_closureis_generator_expressionr   r   r  rf   r  is_generator_bodyis_generatoris_generator_scoper   r  rN  rs  r  r  local_scoper   )r   r   genvre   r  rN  r1   r1   r2   create_local_scope  s2   zFuncDefNode.create_local_scopec                 C   s   | j | d S r|   r  r  r1   r1   r2   generate_function_body  r5  z"FuncDefNode.generate_function_bodyc           '   
      s  ddl m} j}|jr|jsdtjtjf }ntj}|| j	
|| || jjdko7jjj}jjdkoBjjj}|pF|}|rUdjvrUjdg _ }	jr_d}
n| }
|
ry|jtdd	 |jjd
 ry|  || | |_|j |j_| j! "|| |#d |	r|#|	 $||pj%}j&rj&j'||dd j'||d |}|j(s|jr|j)}|j(s|jsňj*r|+|j,j-.tj |#d n'j/r	|jr|+|j,j-.tj |#d |+|j,j-.tj |#d 0|| |j1D ]}|j2s!|j3s!|4| qd}j5}|j6r3|j7r3|j8}|j9sW|j:r>d}n|j;rJd|<|j= }|#d|.tj>|f  |? }@| jA}dd |jBD }|jouj*puj/}d d}|s|r|C  d|j_d}n|? |
r|D  d }jErjEF| jEG }|H| |rI| |? }|? }|jj }|rɈJ| j*r=tKLdd}tKM|j,j-j|}|sd|N|j,j-jO }|#dtj|j,j-P ||N|j,j-jO|NtjQf  |#dtj  |#dtj|j,j-Rdf  |SdtT |#|Uj! |#d |Vtj|j,j- |#d j/rjWrU|#d||j,j-P tjXf  n|#d||j,j-P tjXf  |jrs|#dtj|f  nj*r|S||j,j- |Y||j,j- |
rjZrt[jjd  }njj}|j\|j!|jj j&d ud! d|j_]^|| |j_D ]+}|j-j;s|s|j`r|j2s|a| q|j`r|j2s|jb||jjd" q|j1D ]:}|j3r|j`r|j2s|j-j;r|jb||jjd" |jcr|d| n|a| |j-e|r |j-f|| q|j1|j_ D ]}|j-jgr;|jhjijjr;|k|| q(l| |j_D ]}|j-jgrT|m||j! qE|jjnr]d}|r{|jr{d ursC  d d|j_|o  d|j_p|| |j j!dd# |#d |#d$ |jj|jjd u d%|ffd&d'	 j5}j	jqs|j:rtj>} d( |r|| n!|j;s|j=}|r|#dtj>|f  n|j9s|#d)tj>  |
r|jstj>j!|d(  d* |t|jurWj	jqs|v|jw |x|ju |jy D ]\}} d+ |jz||d+ d" qt{|d,k} | r]|jt| |#d- |#d.  d+ |#d/ |#d0 |D ]	}|}|| qN|#d1 |j;rrdd2l m~}! |!tj>| tj>}"n }"|
r d+ |  |#d3 |j! |#d4 |jsd5j!d(  d6 |#d7  }#|"d us|#rو d+ |jjr|#d8tj  |#d9tj  |jj |jjr|#d ntjj!d:jj d,  d+ |jj |j=}$|"d u r|$r|$}"|"d ur|"tj>kr|#dtj>|"f  n|j9s|#d)tj>  |r+ d+ | |? f fd;d<	}%| sA|sA|j;rSd+ sL|j;sLJ |v|j n|%  nd=d< }%|t|jwsi|t|jus|x|jw |D ]} d( |}|| qq|r d( | |j;r||tj>}&|#d>|&  d( s|C  |#d? d( s|o  |#d |t|jr|%  |x|j |j1D ]=}|jjr|j2rڐq|j-jr|j3r|j`sq|j-jr d( n|j-|r|j-|| |j|d( d" q|j_D ]0}|j2rq|j-j;r#|j`s"qn|s,|j`s,q|j-jr5 d( |j|d( d" qj*rQ d( |tj|j,j- |jsm|j=}$ }"|"d u rf|$rf|$}"|tj>| jjrjjd@kr d( |#dAtj>tj>f  |
rd|j_]|j|jj d6 |jjnr|  |jjj|dB |jd(  d6 |s|jrǈd( r|o  d|j_|j9s|#dCtj>  |#d |	r|#dD|	  ||j |  j&rj&
|| | d S )ENr   re  z%s->%s__getbuffer____releasebuffer__cython_unusedFProfilez	Profile.c	linetracer   Twith_pymethdef
proto_only)r  ;z = NULL = %s%s;c                 S   s   g | ]}|j r|qS r1   r  )r   r  r1   r1   r2   r   a  r   z=FuncDefNode.generate_function_definitions.<locals>.<listcomp>tp_newrd   z
%s->tp_newz%s = (%s)%s(%s, %s, NULL);if (unlikely(!%s)) {r  Py_None} else {}z*%s = (%s) __Pyx_CyFunction_GetClosure(%s);z%s = (%s) %s;z
 (wrapper))r  is_cpdef_funchave_giltrace/* function exit code */)successr   gil_state_declaredc                    s<    |  s d s   d d< |jdd d | < d S d S )Nr  TFdeclare_gilstate)r	  put_ensure_gil)	code_pathrR   )	gil_ownedgilstate_declr1   r2   
assure_gil  s   z=FuncDefNode.generate_function_definitions.<locals>.assure_gilr  z!__Pyx_pretend_to_initialize(&%s);r  r  r   r   z0{ PyObject *__pyx_type, *__pyx_value, *__pyx_tb;__Pyx_PyThreadState_declare__Pyx_PyThreadState_assignz5__Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);z5__Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}rB  z#if CYTHON_USE_SYS_MONITORING#elseNULL)r  #endifzint %s = 0; /* StopIteration */
if (!%s) {z&Unraisable exception in function '%s'.c                    s^   d r d| d nd r|    dd< d d ks-J djd d f d S )Nr  r   rR   Fz$%s: error path %s != success path %s)put_release_ensured_gilr6   r  )r  r  r   r1   r2   $align_error_path_gil_to_success_patha	  s   zWFuncDefNode.generate_function_definitions.<locals>.align_error_path_gil_to_success_pathc                   S   r   r|   r1   r1   r1   r1   r2   r  w	  s    	if (%s) {zOPyErr_SetString(PyExc_TypeError, "Memoryview return value is not initialized");__hash__z5if (unlikely(%s == -1) && !PyErr_Occurred()) %s = -2;)acquire_gil
return %s;#endif /*!(%s)*/)r   rf  r  is_closure_scopeis_passthroughr   cur_scope_cnameouter_scope_cnamemangle_closure_cnamesr   r   r  r  rf   r  r  r	  get_preprocessor_guardr  
is_tracingr   rN  r   load_cachedr   use_fast_gil_utility_codeenter_cfunc_scope	new_labelreturn_from_error_cleanup_labelr  r  r  r  r6   r  rM   needs_assignment_synthesispymethdef_requiredpy_funcgenerate_function_headerr  r  r  putscope_classrN  rJ  needs_outer_scopegenerate_argument_declarationsr  
in_closurer  put_var_declarationr  is_cv_qualifiedrz  cv_base_typerI  r]  r  literal_coder  retval_cnamerI   generate_keyword_listr  buffer_entriesr
  put_trace_declarationscode_objectgenerate_result_code	py_resultput_trace_frame_initgetbuffer_checkgetbuffer_initr   ConstructorSlotget_slot_functionr  typeptr_cnamer  empty_tupler  
put_increfr
   r  r  is_cyfunction
self_cnamer  r   r   put_trace_start	can_tracegenerate_argument_parsing_codearg_entriescf_is_reassignedput_var_increfput_var_incref_memoryviewslicexdecref_cleanupput_var_xincrefneeds_explicit_constructiongenerate_explicit_constructionrH  
buffer_auxbuflocal_nd_varr  put_init_varsgenerate_argument_type_testsput_acquire_arg_bufferneeds_refnannyr  r  r   put_init_to_py_noneput_trace_return
label_usederror_labelput_gotoreturn_label	put_labelall_managed_tempsput_xdecrefrE   restore_exception_utility_codeput_release_buffer_coderC  put_init_entryerror_valueput_trace_exception_propagatingput_trace_unwindcaller_will_check_exceptionserror_without_exceptionerror_without_exception_cnameput_add_tracebackqualified_namer   put_unraisablegetbuffer_error_cleanupgetbuffer_normal_cleanupunlikelyerror_conditionneeds_refcountingrefcounting_needs_gilneeds_explicit_destructiongenerate_explicit_destructionput_var_xdecref
put_decrefput_xgiveref
is_specialput_trace_exitput_declare_refcount_contextput_setup_refcount_contextput_finish_refcount_contextput_temp_declarationsexit_cfunc_scopegenerate_wrapper_functions)'r   r   rR   rf  r  r!  is_getbuffer_slotis_releasebuffer_slotis_buffer_slotpreprocessor_guardtracingr  cenvr  initr  tempvardecl_coder  used_buffer_entriesvar_decls_definitely_need_gilvar_decls_need_gilr;  refnanny_decl_coderefnanny_setup_coderefnanny_needs_giltp_slotslot_func_cname
trace_namelhsvalr  rN  buffers_presentrC  err_valr  default_retvalr  condr1   )r  r  r  r   r2   r     s  





































	

























z)FuncDefNode.generate_function_definitionsc                 C   sh   |j jrt|jd n|j  s!|j js!|j js!t|jd|j   ||j|j |j}|j	r2|j	|_	|S )NzInvalid use of 'void'z Argument type '%s' is incomplete)
rN  rI  r   r6   r  rG  r  declare_argrf   r  )r   r   r  r  r1   r1   r2   declare_argument	  s   zFuncDefNode.declare_argumentc                 C   s   |j  rA|jtdd ||j }d|jj }d}|j j	r,|j j
r,|jr*dnd}|d|||j|j|||jf  d S t|jd d S )	NArgTypeTestFunctionArguments.c((PyObject *)%s)r   r%   r   z8if (unlikely(!__Pyx_ArgTypeTest(%s, %s, %d, %s, %s))) %szICannot test type of extern C class without type object name specification)rN  typeobj_is_availabler   rN  r   r%  typeptr_cname_in_module_stater  r  is_builtin_typerequire_exactr  rM   accept_noner  r  r6   r   )r   r  rR   rC  arg_codeexactr1   r1   r2   generate_arg_type_test	  s(   


	z"FuncDefNode.generate_arg_type_testc                 C   sd   |j jrd|jj }n|jj}|d|  |dtdt|j|j||j	f  |d d S )Nz
%s.memviewz,if (unlikely(((PyObject *)%s) == Py_None)) {zKPyErr_Format(PyExc_TypeError, "Argument '%%.%ds' must not be None", %s); %s   r  )
rN  r  r  r  rM   r   rE   r  r  r6   )r   r  rR   r  r1   r1   r2   generate_arg_none_check
  s   
z#FuncDefNode.generate_arg_none_checkc                 C   r   r|   r1   r   r1   r1   r2   r  
  r   z&FuncDefNode.generate_wrapper_functionsc                 C   s6   | | j | js| jD ]}|js|| qd S d S r|   )r  r6   r   rO   r!  r  r   rR   r  r1   r1   r2   r   
  s   

z#FuncDefNode.generate_execution_codec              	   C   sJ   | j jd }z|jjjjd j}W ||fS  ttfy$   d }Y ||fS w )Nr   obj)r  rK  rN  rO  r  r  r   KeyError)r   	py_bufferobj_typer1   r1   r2   _get_py_buffer_info(
  s   zFuncDefNode._get_py_buffer_infoc                 C   sB   |   \}}|j}|d|  |d |d |d d S )Nzif (unlikely(%s == NULL)) {zZPyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete");z
return -1;r  )r  r  rM   )r   rR   r  rv  viewr1   r1   r2   r?  8
  s   

zFuncDefNode.getbuffer_checkc                 C   sR   |   \}}|j}|r |jr |d| | |d| | d S |d|  d S )N%s->objz%s->obj = NULL;)r  r  r]  rY  r  rM   r   rR   r  r  r  r1   r1   r2   r@  A
  s   
zFuncDefNode.getbuffer_initc                 C   sj   |   \}}|j}|r,|jr,|d|  |d| | |d| | |d d S |d|  d S )Nzif (%s->obj != NULL) {r  r  zPy_CLEAR(%s->obj);r  r  r]  rM   r  r  r  r1   r1   r2   rn  J
  s   
z#FuncDefNode.getbuffer_error_cleanupc                 C   s`   |   \}}|j}|r,|jr.|d|  |d| | |d| | |d d S d S d S )Nzif (%s->obj == Py_None) {r  r  r  r  r1   r1   r2   ro  U
  s   
z$FuncDefNode.getbuffer_normal_cleanupc                 C   sh   | j jsd S | j j}t| jj|}|sd S |dkr%| j j	ds%d S |dv r0| j jj
r0d S | S )N__long____int__r  r  )r  ry  rf   r   get_slot_tabler  r   get_slot_by_method_namer  rS  r  preprocessor_guard_code)r   rf   slotr1   r1   r2   r#  ^
  s   z"FuncDefNode.get_preprocessor_guard)'r+   r,   r-   r,  r  r0  r+  r  r  is_coroutineis_asyncgenr  is_async_defr	  has_fused_argumentsstar_argstarstar_argrF  r;  r  r   r  r  r  r  r  r  r   r  r  r  r  r   r  r?  r@  rn  ro  r#  r1   r1   r1   r2   r  ~  sP       r
			r  c                       s  e Zd Zg dZddgZdZdZdZdZdZ	dZ
dZdZdZdd Zdd	 Zed
d Zejdd Zdd Zdd Zdd Zd7ddZdd Zdd Zdd Zdd Zd8ddZd9d!d"Zd#d$ Zd%d& Zd'd( Zd)d* Z d+d, Z! fd-d.Z"d/d0 Z#d1d2 Z$d3d4 Z% fd5d6Z&  Z'S ):r  )rO  r  r   r  py_func_statr  r  FNc                 C      | j jS r|   )r  rf   r   r1   r1   r2   unqualified_name
     zCFuncDefNode.unqualified_namec                 C   rW  r|   r  r   r1   r1   r2   r9  
  rY  zCFuncDefNode.declared_namec                 C   s   | j r| j jS | jS r|   )r,  r;  _code_objectr   r1   r1   r2   r;  
  s   zCFuncDefNode.code_objectc                 C   s
   || _ d S r|   )r  )r   r;  r1   r1   r2   r;  
  r  c                 C   s~  |j d | _|j| _| jd u ri | _| j|j di  | jd urB| j|}|d u rA| jj	r7| j
|}nt| jjd tj}n| j
|}d|j v oR|d | _t| jtro| jj||d| jd u | j| jd\}}n| jj||d| jd u | jd\}}|jst| jd || _| j|_| j}t|d	s|j}t|d	r|| _|j| _| jj}| jd
ks| j r|rt| jjd |j!dkr| jdkr|j"d ur|j"j#rt| jd nt$| jdd t%| j|jD ]\\}}| &|| |j|_|j'|_'|j(|_(| )|j|j| |jj*rd| _+|jj,rd| j-v rt$|jdd |jj,s(|jj.rA| jj/r4t|jd qd| j-v rAt$|jdd q| )|j0| j| |j'}	|j(}
| j1|_1| j|_|j2|	|| j|
| j| j | jd u| j-| j| j3d
| _4|j0| _0| j0j5r| jdkrt| jd | j0j6r| j07| jd | jr|j8s| jst9| jdk s| jd jj:sd| _| ;| | <| d S )Nc_compile_guardlocalsr  r  r%   )rP  r  rQ  )rP  rQ  z*Suite attached to non-function declarationrO   r  zBFunction with optional arguments may not be declared public or apir  rp  z/Only extern functions can throw C++ exceptions.Tinlinez$Buffer unpacking not optimized away.r   zUBuffer may not be acquired without the GIL. Consider using memoryview slices instead.)r  rQ  r  definingr	  r  rR  zFunction cannot return an arrayzused as a return valuer   F)=r   r  r  is_c_class_methodr  r   r   directive_returnsro  is_annotationrO  rS  r   r6   r	   r   rS  r  rF   r  r  r   rQ  rs  rN  r  r  hasattrrV  cfunc_declaratorrO   r  r  r  r  r   r   zipr  rf   r  _validate_type_visibilityrK  r  rH  r	  is_pythran_exprr  r  r  r  inline_in_pxdr  rG  rq  check_nullary_constructorr  rE   r]  declare_cpdef_wrapperr  )r   r   rO  r  typr  opt_arg_count
formal_argtype_argrf   r  r1   r1   r2   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rtj r| j!r| jj"sJ | j| j!_d S t#| j| jd| _!t| j| j!| j$gd| _$d S d S d S )Nz&static cpdef methods not yet supported)r  F)profiler  r   r  r  r?  	decoratorr   r  )	r6   rf   rO   r  r  r?   r   r  r   T)r,  )%r  r  r   r6   call_self_noder  r   r   ru  r  DecoratorNoder   r  rn   r  rf   DefNoderO   r?   r
  r,  r   r  r  r	   r
   rN  as_variabler  r  is_final_cmethodr    lookup_module_cpdefoverrideis_fused_specializedOverrideCheckNoder   )r   r   py_func_bodyr  r  rf   r1   r1   r2   r  
  sV   
	

z"CFuncDefNode.declare_cpdef_wrapperc                 C   sf   | j dkp| j}t|dd}|r'|r)|jr+|j dv s-|js/|js1t|d dS dS dS dS dS dS dS )zo
        Ensure that types used in cdef functions are public or api, or
        defined in a C header.
        r  r  N)r  rp  z:Function declared public or api may not have private types)rQ  r  r   r  r&  r   )r   rN  r6   r   public_or_apir  r1   r1   r2   r  9  s   
z&CFuncDefNode._validate_type_visibilityr   c                    s   ddl m  jj}|r|d t|jj  }dd |D }|r. jjjj	d}|}nAjj
rPjjjj} jj|j	d}||_ jj|jj	d}njjd jj}	 jj|	j	d}
|	|
_ jj|
jj	d}|ostj } jj| fdd|D |d	}tjtj|d
S )Nr   ru  c                 S      g | ]}|j qS r1   r?  r   r  r1   r1   r2   r   J      z/CFuncDefNode.call_self_node.<locals>.<listcomp>r?  )r  	attributer   c                    s   g | ]
} j j|d qS r?  )r  r6   )r   nru  r   r1   r2   r   ]      )functionrO   wrapper_call)r6   r  r   )r   ru  rN  rO   rE   r  r  r6   r  rf   r  r  r  AttributeNoder    r  SimpleCallNodeReturnStatNoder	   r
   )r   omit_optional_argsr  rO   	arg_namescfunccall_arg_namesclass_entry
class_noderT  r  skip_dispatchc_callr1   r  r2   r  E  s2   zCFuncDefNode.call_self_nodec                 C   s0   | j jD ]}|jst|jd | || qd S )NrA  )rN  rO   rf   r   r6   r  r  r1   r1   r2   declare_argumentsa  s
   zCFuncDefNode.declare_argumentsc                 C   r  r|   )rN  r  r  r1   r1   r2   r  g  r  z!CFuncDefNode.need_gil_acquisitionc                 C   s^   | j }|j}|jr)|s+|jjrt| jd | jjD ]}|j jr(|j	s(t| jd qd S d S d S )Nz9Function with Python return type cannot be declared nogilz8Function declared nogil has Python locals or temporaries)
rN  r  r  r  r]  r   r6   r  r  in_with_gil_block)r   r   rN  r  r  r1   r1   r2   r   j  s   
zCFuncDefNode.nogil_checkc                 C   sd   |j | j_ | jd ur| j|| _n| jd ur| j|| _n
| | | | | | j| _| S r|   )	r   r  r  ro   r,  r  r  r  r  r   r1   r1   r2   ro   u  s   




z CFuncDefNode.analyse_expressionsc                 C   r  NFr1   r  r1   r1   r2   r*    r   z'CFuncDefNode.needs_assignment_synthesisr   c                 C   s  | j }g }| j}|jd t|j|j  D ]}	|	 }
||	j}|js(d|
 }
|	|
 q|rJ| j
rJtjtj}| jrC|	| n|	d|  |jrY|rY|	|jtj |jra|	d |sfdg}|d u rn| jj}||d|}| jjdkrd|vrd}nd}d }|| jj}| jj||d	}| jp| jj}| jr|r|jjd
  | j | | j |r| ! }|r|jjd
  | |jjd
  d|||f  |r|jjd
  d | d|||f  |j"| j d S )NzCYTHON_UNUSED %sz...voidr   privatez::zstatic r   )dll_linkagemodule_declarationsz%s%s%s; /* proto*/r  z%s%s%s {)#r  rN  rO   rE   r  rJ  r/  rf   cf_usedr  r  r	   r  r   skip_dispatch_cnamer  r  optional_args_cnamer  r  
func_cnamefunction_header_coder   rQ  build_function_modifiersfunc_modifiersr  r  r   r  r   partsrM   r#  use_entry_utility_code)r   rR   r  with_opt_argswith_dispatchr  r  	arg_declsrN  r  arg_declr  dispatch_argentitystorage_classr   r	  headerneeds_protor  r1   r1   r2   r-    s^   


z%CFuncDefNode.generate_function_headerc                 C   sZ   | j }| jD ]$}|jr*||j}| js|jr*||}|d|j	
|j|f  qd S r  )r  rO   r=  r/  rf   r  r  r  rM   rN  rJ  r  )r   r   rR   r  r  r  r   r1   r1   r2   r1    s   

z+CFuncDefNode.generate_argument_declarationsc                 C   r   r|   r1   r   r1   r1   r2   r8    r   z"CFuncDefNode.generate_keyword_listc           
   	      s
  d}d}| j }| jjrndtj  | jD ]F  jr\| j	}| j
s'|jrXdtjtj|f   j}t|dsC|j}t|dr;d jtj| j|j	f  |d7 }|d7 }qt|D ]}d qad  fdd	}	| jD ]
 |	| j	 qxd S )
Nr   r  zif (%s->%sn > %s) {rf   z%s = %s->%s;r   r  c                    s`   | j r, js.d| j| jf  | jjr | j| jd d S |  	|  d S d S d S )Nr  T)
r2  r=  rM   r  original_cnamerN  r  generate_incref_memoryviewslicerM  put_var_giverefr  r  rR   r1   r2   put_into_closure  s   
zECFuncDefNode.generate_argument_parsing_code.<locals>.put_into_closure)r  rN  r  rM   r   r  rO   r=  r/  rf   r  r  r  r  r  rV  r  opt_arg_cnamerangerS  )
r   r   rR   r  r  r  r  r  rv  r  r1   r  r2   rJ    sB   




z+CFuncDefNode.generate_argument_parsing_codec                 C   r   r|   r1   r   r1   r1   r2   !generate_argument_conversion_code  r   z.CFuncDefNode.generate_argument_conversion_codec                 C   s@   | j jD ]}|jr| || q|j jr|js| || qd S r|   )rN  rO   needs_type_testr  r]  r  r  r  r1   r1   r2   rV    s   z)CFuncDefNode.generate_argument_type_testsc                    sH   |j jd r|| j |d t | | jr"| j| d S d S )Nr  r   )r   r   r  r6   rM   rc   r   r  r   rk   r1   r2   r     s   
z$CFuncDefNode.generate_execution_codec                 C   s   | j jrdS | jjjS )N0)r  r]  r  rN  r  r   r1   r1   r2   re     s   
zCFuncDefNode.error_valuec                 C   
   | j jjS r|   )r  rN  r  r   r1   r1   r2   rh    rY  z)CFuncDefNode.caller_will_check_exceptionsc                 C   s$  d}| j }|j}|jd ur|d7 }|j}d| j jtj|f |_|  | j|d|jj|jj	|jd | j
js;|d | jj}dd |d t|| jj	  D }|jjr[|tj n|jrc|d |jj	rn|tj n|j	rv|d	 |d
| j jd|f  |d |jd usd S d S )Nr   r   z%s%swrap_%s)r  r  r  return c                 S   r  r1   )r  r  r1   r1   r2   r     r  z;CFuncDefNode.generate_wrapper_functions.<locals>.<listcomp>r  r  %s(%s);r   r  )r  rN  
prev_entryr  r   r  rM   r-  r  r  r  rI  r.  rO   rE   r  r  r  r   )r   rR   r   r  r  rO   arglistr1   r1   r2   r  	  s:   

"


z'CFuncDefNode.generate_wrapper_functionsc                    s(   t   }| jr|rJ d| j S |S )Nz#if )rc   r#  r  )r   super_guardrk   r1   r2   r#  (  s
   
z#CFuncDefNode.get_preprocessor_guard)r   r   r|   )r   r   N)(r+   r,   r-   r   r   r  r  r  r  r  r  r  r  r  r  r9  r#  r;  setterr   r  r  r  r  r  r   ro   r*  r-  r1  r8  rJ  r  rV  r   re  rh  r  r#  rl   r1   r1   rk   r2   r  l
  sL    

j/


3
&	r  c                   @   s    e Zd Zg ZdZdZdd ZdS )PyArgDeclNodeFc                 C   r0  r|   )r  r   r  r1   r1   r2   r   ;  r2  z+PyArgDeclNode.generate_function_definitionsN)r+   r,   r-   r   r  r  r   r1   r1   r1   r2   r&  0  s
    r&  c                   @      e Zd ZdgZdS )r  r  Nr+   r,   r-   r   r1   r1   r1   r2   r  ?  s    
r  c                   @   s"  e Zd Zg dZddgZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd	d
 Z		d3ddZdd Zdd Zdd Zdd Zdd Z dd Z!dd Z"dd Z#dd Z$dd  Z%d4d!d"Z&d#d$ Z'd%d& Z(d'd( Z)d5d)d*Z*d+d, Z+d-d. Z,d/d0 Z-d1d2 Z.dS )6r  )rO   r  r  r   r  r  r  r  FNr  r   Tc                 K   s   t j| |fi | d } } }}| jD ]}|jr|d7 }|jr,|d7 }|js,|d7 }|js3|d7 }q|| _|| _|| _|| _	d S r3   )
r  r   rO   r   r  r=  num_posonly_argsnum_kwonly_argsnum_required_kw_argsnum_required_args)r   r6   rP   pr   rkrr  r1   r1   r2   r   x  s    

zDefNode.__init__c
                 C   s  | j r
t| j jd | jrt| jjd |pd\}
}|p|	}|d u rXg }| jD ]}|j|dd\}}|tj|j	d |j
t|jd q'tjt|dd |||	|d}t| j|d	}nW|d u r_|j}|j}|jrgd
}t| jt|jkst|jrt| jd t|jd tt| j|jD ]%\}\}}|j|d|dko|jd\}}|d u s|tju r|j|_||_q|
d u r|jd urddlm} |j| jt|j|j|jjd}
t| jt| j| j	d d| jd|j|
||j |j!d	}t"| j|pg 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  )rf   r  r  rN  r6   F)r  rO   r  r  r  r  r  r  r&  Tzwrong number of argumentszprevious declaration herer   r  r  r  rg  )rV  rO   r  r  r  r  r  r  r  r  )r	  rO  r  r   r?   r  rN  r  r  rQ  r  r  r  )(r  r   r6   r  rO   rS  r  r	   r  rf   r  r
   r  r#  r  rN  r  rE   r  r  r  r  r  r  ru  r  r  r  r  python_valuer  r<  r  r  r  r  r   r?   r  r   )r   r  r  r  returns
except_valr  r	  r  r  r  r  
cfunc_argsr  r  rN  
cfunc_typer  r  r  r  r1   r1   r2   as_cfunction  s   


	
zDefNode.as_cfunctionc                 C   s   | j rdS | js| jrdS dS )zDetermines if the function's signature is compatible with a
        cdef function.  This can be used before calling
        .as_cfunction() to see if that will be successful.
        FT)r  r  r  r   r1   r1   r2   is_cdef_func_compatible  s
   zDefNode.is_cdef_func_compatiblec              	   C   s  | j r#| j D ]}|j}|jr"|  j|jdkO  _|  j|jdkO  _q| jr.|dr.d| _| jr9|dr9d| _|js?|jr| jdkrK|jrKd| _n9| jdkrZ|jrZt	| j
d n*| jtv r| jsd| _dd	lm} | j pog | _ | j d
t| j
|| j
tddd | | | jdkr| | n| | | | | jj | _| jtu r| jr|jd r| jjs| j|\}}|r|jr|| _| | t| j
| | jj| j | j!| j"| jd| _#| j#$| d S )Nr   r  Frd   Tr(   z7'__init_subclass__' is not supported by extension classr   r  r   r?  r  <lambda>r  )r  rf   rO   r  r  r  )%r  r  r   is_classmethodrf   is_staticmethodrS  r  r  r   r6   IMPLICIT_CLASSMETHODSru  r  insertr  r   analyse_argument_typesdeclare_lambda_functiondeclare_pyfunctionanalyse_signaturer  	signaturer  r
   r  r   ry  r  r]  r  DefNodeWrapperrO   r  r  
py_wrapperr   )r   r   r  rX   r  rv  r  r1   r1   r2   r     sZ   







zDefNode.analyse_declarationsc                 C   s  |j di | _|j d }|j}d |_| jD ]}t|dr d }n%|j|}t|r5|j	r5t
||jg}|j||\}}|j|_||_| || |rV|jrVt| jd |j |_d |_d|_d|_d|_|jjst|jjst|jjr|jr{d|_nE|jrd|_n>|jjs|jj s|jjs|jjr|j!r|j!j"d u rd|_n!||_nd|_n|jj#sd|_|jrt|jd	 |jrt|jd
 |jj$rd| _%q||_t|rdd t&| jD | _'d S g | _'d S )Nr  allow_none_for_extension_argsrf   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 r1   )rN  is_numpy_buffer)r   r  ar1   r1   r2   r   S  r  z2DefNode.analyse_argument_types.<locals>.<listcomp>)(r   r   r  rL  rO   r  rO  rS  r"   r  r	   r~  
org_bufferr  rf   rN  r  r  r   r6   as_argument_typehdr_typer  r  r  r]  rH  r  r  r  r  is_extension_typer  r=  r{  r  rK  r  r  np_args_idx)r   r   rC  f2sr  r  rO  rN  r1   r1   r2   r<    sh   




zDefNode.analyse_argument_typesc           	      C   s  | j jr| jrt| jd t| jdko| jp| j | j _	nr| js| js|j
d r3tdd | jD r| j jtju rbt| jdkrGtj| j _nIt| jdkra| jd jd u ra| jd jsatj| j _n.| j jtju rt| jdkrvtj| j _nt| jdkr| jd jd u r| jd jstj| j _| j j}| }| }|tju r|dkrt| jdkr| jrtj }| j _d| _d }}| jr|jrd }}d| _t| | j _}d	|_d|_d|_| js| jr| jr|jr| j j!d d = t"t#|t| jD ]X}| j| }d|_$||krd|_%|&|r2| js2| jr$d|_'t(j) |_*|_+n
d|_&|j, |_*|_+d|_-q|.||_*|j+/|j*sQ|j*j0rN|j+j0rNd|_1qd|_-q|t| jkr`| 2  d S |t| jk r|jsp| 2  | jD ]}|j$r|j+j3s|j+j4rd|_1qs|5 }|rtj6|v r| j js| jrd}| jD ]}|j$r|js|j&s|j'sd
}qnd
}|s|7  }| j _d S d S d S d S d S )Nz8special functions of cdef classes cannot have decoratorsr   always_allow_keywordsc                 S   r  r1   r   r  r1   r1   r2   r   ^  r  z-DefNode.analyse_signature.<locals>.<listcomp>r   r%   Tr  F)8r  ry  r  r   r6   rE   rO   r  r  trivial_signaturer   r)  r@  r   pyfunction_signaturepyfunction_noargsr=  r  pyfunction_oneargpymethod_signature	unaryfuncibinaryfuncmax_num_fixed_argsmin_num_fixed_argsself_in_starargr9  r  r   fixed_arg_formathas_generic_argsr8  r  decorator_indirectionr  r  minr  r  r  r  r   	type_typerH  rN  r  r  fixed_arg_typer  r]  r  bad_signaturerI  r  method_flagsmethod_varargswith_fastcall)	r   r   signfixed
min_nfixedr  r  mfuses_args_tupler1   r1   r2   r?  W  s   "





zDefNode.analyse_signaturec                 C   sv   | j j}d|  }|jr|d7 }n|jr|d|  7 }| j}| j jr'd}nd}t| j	d|| jt
| j|f  d S )Nz%dz or morez to %dzSpecial methodMethodz>%s %s has wrong number of arguments (%d declared, %s expected))r  r@  rV  rY  optional_object_arg_countrU  rf   ry  r   r6   rE   rO   )r   rb  expected_strrf   descr1   r1   r2   r^    s   
zDefNode.bad_signaturec                 C   s  | j }||}|r(|jr|jjst| jd |jjr(|j	s(| j
s(t| jdd |j|| j| j
 d}|| _||j}ttj| | | j_tjrt| j| j|_ttj| | |_|jr|j tjv sr|jrr|j dv rw|jd rwd |_d S ttj| | |_d S d S d |_d S )Nz:Only final types can have final Python (def/cpdef) methodszOverriding a c(p)def method with a def method. This can lead to different methods being called depending on the call context. Consider using a cpdef method for both.   )allow_redefine__getattr__fast_getattr) rf   rS  r  r  is_final_typer   r6   rN  rs  is_builtin_cmethodr   r   r>  r  next_idscope_prefixr   r   pyfunc_prefixpyfunc_cnamer    r  r@   r?   funcdoc_prefix	doc_cnamery  r   	invisibler   wrapperbase_cnamewrapperbase_prefix)r   r   rf   r  prefixr1   r1   r2   r>    s.   


zDefNode.declare_pyfunctionc                 C   s*   | | j| j}d |_|| _|j| j_d S r|   )r=  lambda_namer6   r?   r  r  rt  )r   r   r  r1   r1   r2   r=    s   zDefNode.declare_lambda_functionc                 C   s   | j D ]6}|jst|jd |jr%||j|j|j|_|jjr$d|j_	n| 
|||_d|j_d|j_|j|j_q| || j | || j d S )NrA  r  r   )rO   rf   r   r6   r  r  rN  r  r]  r  r  r  r  r  declare_python_argr  r  r  r1   r1   r2   r    s   
zDefNode.declare_argumentsc                 C   sV   |r)|j d dkrtj}nt}||j||j}d|_d|_d|_	d|_
||_d S d S )Ninfer_typesFr   r  )r   r	   unspecified_typer
   r  rf   r6   r  r  r  rO  r  )r   r   r  rN  r  r1   r1   r2   r|    s   
zDefNode.declare_python_argc                 C   sb   |j | j_ | | | | | |s)| jr)| jd d d D ]	}|j||_q| j	| | S )Nr   )
r   r  r  r  r*  r  r  ro   rB  prepare_argument_coercion)r   r   r  r1   r1   r2   ro     s   


zDefNode.analyse_expressionsc                 C   sv   | j rdS | js| jjrdS | jrdS | jjrdS | jjrdS |js%|jr5|d u r/| j	j
d S |jj
d S |jp:|jS )NTFbinding)r9  specialized_cpdefsr  r  no_assignment_synthesisry  is_anonymousr  r  r  r   r   r  r  r  r1   r1   r2   r*    s   z"DefNode.needs_assignment_synthesisc                 C   r  r|   )r  r@  re  r   r1   r1   r2   re  )  rY  zDefNode.error_valuec                 C   r  r|   )r  r@  r  r   r1   r1   r2   rh  ,  rY  z$DefNode.caller_will_check_exceptionsc                 C   sZ   | j r| }t| j |}||| | jr$| jj| j_| j|| t	| || d S r|   )
defaults_getterr  r   r   r   py_wrapper_requiredr  r  rB  r  )r   r   rR   module_scopedirectives_noder1   r1   r2   r   /  s   z%DefNode.generate_function_definitionsc                 C   s  |r| j r| j||d d S g }| jjjr'dtj }| js"d| }|	| dd }| j
D ]	}|	|| q.| jrC|	|| j | jrN|	|| j |rVd|}nd}| j| jj}	|jd }
|  }|rp|
| |
d	|	|f  |r|
d
 |d|	|f  d S )NTPyObject *%sCYTHON_UNUSED c                 S   s8   | j }|jr
|j}n|j}|j|}|jsd| }|S )Nr  )r  r2  r  r  rN  rJ  r  )r  r  r  declr1   r1   r2   arg_decl_codeJ  s   z7DefNode.generate_function_header.<locals>.arg_decl_coder   r  declszstatic %s(%s); /* proto */r  zstatic %s(%s) {)r  rB  r-  r  r@  has_dummy_argr   rG  r0  r  rO   r  r  r   r  rJ  rt  r   r#  rM   )r   rR   r  r  arg_code_listself_argr  r  r  dc
decls_coder  r1   r1   r2   r-  =  sB   







z DefNode.generate_function_headerc                 C   r   r|   r1   r  r1   r1   r2   r1  k  r   z&DefNode.generate_argument_declarationsc                 C   r   r|   r1   r   r1   r1   r2   r8  n  r   zDefNode.generate_keyword_listc                    sF    fdd}| j D ]}||j q	| j| jfD ]	}|r ||j qd S )Nc                    s   | j rZ| jjr%| jjd usJ  jtdd  d	| j
| j n d| j
| jf  | jjr?| j | j
d d S | jrN |   |  d S  |   |  d S d S )NIncludeStringHzStringTools.czmemcpy({0}, {1}, sizeof({0}));r  T)r2  rN  rG  r  r   rN  r   r%  rM   formatr  r  r  r  rO  rP  put_var_xgiverefrM  r  r  r  r1   r2   r  s  s   

z@DefNode.generate_argument_parsing_code.<locals>.put_into_closure)rO   r  r  r  )r   r   rR   r  r  r1   r  r2   rJ  q  s   

z&DefNode.generate_argument_parsing_codec                 C   r   r|   r1   r   r1   r1   r2   rV    r   z$DefNode.generate_argument_type_tests)	NNTNNFNFFr|   r   )/r+   r,   r-   r   r   r9  r8  r{  reqd_kw_flags_cnamer   r  r  r  r  r  rW  py_cfunc_noderequires_classobjdefaults_structr?   fused_py_funcr  rB  r  r  r  r   r5  r6  r   r<  r?  r^  r>  r=  r  r|  ro   r*  re  rh  r   r-  r1  r8  rJ  rV  r1   r1   r1   r2   r  F  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 );rA  NFc                 O   sT   t j| g|R i | | jj| _| jj| _| jj| _| jj| _| jj| _d | _d S r|   )	r  r   r  r)  r*  r+  r,  rW  r@  )r   rO   rr   r1   r1   r2   r     s   





zDefNodeWrapper.__init__c                 C   sX   | j j}| j}||j}ttj| | |_ttj	| | |_
|j| _| j j| _d S r|   )r  r  rf   rq  rr  r   r   pywrap_prefixr  pymethdef_prefixpymethdef_cnamer@  rJ  )r   r   target_entryrf   rz  r1   r1   r2   r     s   z#DefNodeWrapper.analyse_declarationsc                 C   s   | j D ]}|jjs|j|s	 q|jr|jjs|j|s	 q| jr@| jjjsB| jj}d|_	|j
D ]}|js?|jjr?d|j_q2d S d S d S )Nr   T)rO   rN  r]  create_from_py_utility_coderH  r  r  r  r  rO  cf_assignmentsr  r  r   cf_maybe_null)r   r   r  r  assr1   r1   r2   r    s$   

z(DefNodeWrapper.prepare_argument_coercionc                 C   s:   t | j}|dks|dkr| jd js| jd jrdS dS r3   )rE   rO   r  r  )r   argcountr1   r1   r2   signature_has_nongeneric_args  s   

z,DefNodeWrapper.signature_has_nongeneric_argsc                 C   r  r|   )r@  rY  r   r1   r1   r2   signature_has_generic_args  r  z)DefNodeWrapper.signature_has_generic_argsc                 C   s  g }| j jr|tj | jD ]<}|jjr)|j	t
dd |d|jj  q|jrD|jjsD|jjsD|jjsD||j|jj q||jj q| jrW|| jjj | jrb|| jjj d|}| jjss|dtj  |d| jjj|f  d S )NMoveIfSupportedCppSupport.cpp__PYX_STD_MOVE_IF_SUPPORTED(%s)r   z%s = r!  )r@  r  r  r   rG  rO   rN  rq  r   rN  r   r%  r  r  rH  r  r  r7  r  r  r  r   r  rI  r.  r7  rM   r  rt  )r   rR   rO   r  r1   r1   r2   r    s4   



z%DefNodeWrapper.generate_function_bodyc                 C   s  | j j}|| j |d |d | j  }|r || || | |_| j 	||p4| j j
}| || | || | }| jjrLd}nd}| jjs`|d| jtj|f  |  |td| j  | ||| | | | | ||j || j |d |d |d}||jr||j  |!|j |j" D ]
\}	}
|#|	|
 q| $ }|d ur|dtj|f  | %| || |!|j  | %| |!| |j&D ]}|j'r|j(r|)| q|*| qt+|j&}| j,D ]!}|j-js'|j.|vr'|j.j(r!|)|j. q|*|j. q|/  | jjs:|d	tj  |d
 |0  |rO|d|  d S d S )Nr   z/* Python wrapper */z = 0r  z%s (wrapper)r  
cleaned_upr  r  r  r  )1r  r  r  r6   rM   r#  r'  r(  r)  r*  r+  r-  r1  rI   r  r]  rI  rJ  r   r7  r{  r|  r   rf   rJ  rV  r  r~  r  r[  r\  r]  r^  r_  r`  ra  re  %generate_argument_values_cleanup_coder  r  rO  rv  put_var_decrefr   rO   rN  r  r}  r  )r   r   rR   r  r  r  r  retval_initvalues_cleaned_up_labelr  rN  r  r  var_entries_setr  r1   r1   r2   r     s   





















z,DefNodeWrapper.generate_function_definitionsr   c                 C   sx  g }| j }|js| jrdtj }|jsd| }|| | jD ]}|js=|js*|j	r3|d|j
  q||j|j
 q| jj}|jsR| tjgkrR|d |jrydtjtjf }	|jrtdtjtjtjf }
|d|
|	f  n||	 |jrtt| j| D ]	}|d|  qd|}d	}|jd
v r|jjrd}d}| j|j }d|||f }|!d|  |r| jj"r| jj"j#||dd d S t$j%r|j&r| jj"s|jj's|jr|j(r|j&}|j)r|* }|jr|jd
v s|!d|j+|, f  |jr|!d |!d|j(  |!d |s!| jj"r3|-d|j.  |j/| jjddd |!d|  d S )Nr  r  zCYTHON_UNUSED PyObject *unusedzPyObject *%s, PyObject *%sz0PyObject *const *%s, Py_ssize_t %s, PyObject *%sz-
#if CYTHON_METH_FASTCALL
%s
#else
%s
#endif
z%CYTHON_UNUSED PyObject *unused_arg_%sr   r   r  Fz%sstatic %s(%s)z%s; /*proto*/T)r  zPyDoc_STRVAR(%s, %s); #if CYTHON_UPDATE_DESCRIPTOR_DOCzstruct wrapperbase %s;r  zstatic PyMethodDef %s = r  )
allow_skipz%s {)0r@  r  rW  r   rG  r  rO   r  r  r  r  rH  rJ  r  r  ry  r_  r   method_noargsrY  
args_cname
kwds_cnameuse_fastcallnargs_cnamer  rE   rU  r   rf   r  r  r  r  rM   r  r-  r    r  r?   is_property_scoperx  
is_unicodeas_utf8_stringrv  r  r.  r  put_pymethoddef)r   rR   r  r  r  rb  r  r  r  varargs_argsfastcall_argsr  re  r  r  docstrr1   r1   r2   r-  B  s   








z'DefNodeWrapper.generate_function_headerc                 C   s   | j D ]}|jr|jr|d|j  q||j q|jD ]
}|jr(|| q| 	 rKdt
j }| jjrF|d || |d n|| |dt
j  d S )NzPyObject *%s = 0;zCYTHON_UNUSED Py_ssize_t %s;#if !CYTHON_METH_FASTCALLr  z"CYTHON_UNUSED PyObject *const *%s;)rO   r  r  rM   r  r3  r  r  r  r  r   r  r@  r  kwvalues_cname)r   r   rR   r  r  
nargs_coder1   r1   r2   r1    s$   






z-DefNodeWrapper.generate_argument_declarationsc           
   	   C   s8  |  }|j}|d}| jdk}| jd up| jd up|}| jD ]}	|	jjs-|	j	|s-	 q | 
 rs| jjr;|d |d |dtjtjf  |d |dtjtj|dtj |  f  |d	 | jjrs|d	 |jtd
d |dtj| jjtjtjf  | 
 s|rt| jd | | n|  s| | n| | j|| d| _||_| |r|!| |"| | #| |r| $| j| | jr| jj%j&r|'| jj% n|(| jj% | jD ]}	|	jjs|	jj)r|*|	j% q|+| j,j%j- |.  |d|    |"| d S )Nargument_unpacking_doner   r  z#if CYTHON_ASSUME_SAFE_SIZEz%s = PyTuple_GET_SIZE(%s);r  z)%s = PyTuple_Size(%s); if (%s) return %s;z%s < 0r  fastcallr  z%s = __Pyx_KwValues_%s(%s, %s);z.This method cannot have * or keyword argumentsTr  )/new_error_labelr\  r(  r*  r  r  rO   rN  r]  r  r  r@  r  rM   r   r  r  rp  re  r   rN  r   r%  r  fastvarr   r6   r  r  generate_stararg_copy_code'generate_tuple_and_keyword_parsing_codeneeds_values_cleanupr[  r]  r_  r  generate_arg_decrefr  rO  put_var_xdecref_clearput_var_decref_clearrr  rv  rk  r  rl  r}  )
r   r   rR   	decl_codeold_error_labelour_error_label	end_labelhas_kwonly_argshas_star_or_kw_argsr  r1   r1   r2   rJ    s   














z-DefNodeWrapper.generate_argument_parsing_codec                 C      |r
| |j d S d S r|   )r  r  r   r  rR   r1   r1   r2   generate_arg_xdecref     z#DefNodeWrapper.generate_arg_xdecrefc                 C   r  r|   )r  r  r  r1   r1   r2   r    r  z"DefNodeWrapper.generate_arg_decrefc                 C   s  d|    d}| j }| js.|jtdd |dt	j
 d| dt	j
 d| d		 |d
t	j d| jr:dnd dt	j d| jj dt	j d |dt	j d|  | jr|dt	j d |jtdd |d| dt	j d|  | jjjrd| jj_| jjj}|| d| jj dt	j dt	j d |d| d|  || jj |d || d |d| d|  || jj |d n|jtd d |dt	j d!| dt	j d| d	 | jr| jjs| jjrJ | jjj}|| d"t	j
 d#||| j  || jj |t	jt |t	jt || d$| d%t	j d&| j |j!j"t#j$dd'}|d(| d)| d*t	j
 d+| d,	 |d-t	j% d| d |d. ||d/| j |d0 |d/t |d/t || d$| d| d1| j |d |j!&| d2| jj_d S | jr| jjrJ | jjj}|t	j%t || dt	j% d d2| jj_d S d S )3Nr   r  RaiseArgTupleInvalidr  if (unlikely(z$ > 0)) { __Pyx_RaiseArgtupleInvalid(z, 1, 0, 0, );  }const Py_ssize_t r  r   rp  () ? __Pyx_NumKwargs_) : 0;z < 0)) zif (z > 0) {KeywordStringCheckz'if (unlikely(__Pyx_CheckKeywordStrings(r   z
) == -1)) Fz = __Pyx_KwargsAsDict_);if (unlikely(!z)) r  z = PyDict_New();r  RejectKeywordsz > 0)) {__Pyx_RejectKeywords(z = PyTuple_New(z + 1); z__Pyx_PyTuple_SET_ITEM(z, 0, )r  for (=0;  < ; ++) {z(PyObject* item = __Pyx_PyTuple_GET_ITEM(z#if !CYTHON_ASSUME_SAFE_MACROSr   r  z	+1, item)r   )'re  rf   r  r  r   rN  r   r%  rM   r   r  kwds_len_cnamer  r  r@  r  r  r  rO  r  r  put_var_gotrefrW  r  r9  r  r  r6   rE  rG  r
   r  error_goto_if_negr  r  r	   c_py_ssize_t_typer  r  )r   rR   
goto_errorfunction_namestarstar_arg_cnamestar_arg_cnamer  r1   r1   r2   r    s   
















z)DefNodeWrapper.generate_stararg_copy_codec                    s   j tdd | j } d} | j}g }g }g }	d }
}|D ].}|j	s,q&|j
s2|jr3q&|jrA|jr;|	n|| q&|| |jrT|
d7 }
|jsT|d7 }q&||	 }| j| j }t|dkrs|d j
so|d jrs|d8 }t|}| j o~||k}t|}| js| jr| |  t|t| }dd |D }|p| j} d |rd	 fd
d|D dg } dtj|f  | | |  dtj d|rdnd dtj d| jj  dtj d  dtj d|  tj d}| jdkrd| } d|  |s( j tdd  d| dtj d|  n| !||||||  | "||  | #|  ||kry j tdd  dtj$ d| d   d!| d|d"d|d"d|d"d#| d$  d% | jr j td&d  d| d|| j  d   d'| d(tj d)|
 d*| d$	  d% | jr|dks||kr||kr| jsd+}nd,} d-tj$||f   %| | jr'||kr| js d.tj$|f   %|  d/ |D ](}|js$ j td&d  &|j'j} d0| d| d|   nqn d/ ||kr\t(|D ]%\}} d1| d2| jj  dtj) d| d3	  d4| d5|  q5n d6tj$ d7 | jro d8 t*t(|d d d9 }|D ]F\}}||d kr||d d kr d:  d;|d d<d=  d1| d2| jj  dtj) d| d3	  d4| d5|  q||dkr҈ d:  +d>  d? | jr|rt,|d d9d9D ]} d;|d<d= q %| n
 +d@  %|  d% | #|   d% t(|D ]\}}| -|d1| dA  q d%  .|rb dB} %|  /|  j tdd  dC||||tj$|f   /| d S d S )DNr  r  argtuple_errorr   r   c                 S   s   g | ]}|j s|qS r1   rM  r  r1   r1   r2   r     r   zJDefNodeWrapper.generate_tuple_and_keyword_parsing_code.<locals>.<listcomp>{,c                    s    g | ]}d   |jj qS )&)intern_identifierr  rf   r  r  r1   r2   r     s    r  zPyObject ** const %s[] = {%s};r  r  r   rp  r  r  r  r  z) < 0) z > 0z
likely(%s)r  r  z__Pyx_RejectKeywords(r   r  r  zfor (Py_ssize_t i = z; i < z; i++) {z7if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid(r   z, i); r  r  RaiseKeywordRequiredz7if (unlikely(!values[i])) { __Pyx_RaiseKeywordRequired(z, *(z[i - z])); z!=<z } else if (unlikely(%s %s %d)) {z} else if (unlikely(%s > %d)) {r  z__Pyx_RaiseKeywordRequired(values[] = __Pyx_ArgRef_r  3if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[])) switch () {default:r   CYTHON_FALLTHROUGH;case 2dr   	case  0: break;	default: ]skipz2__Pyx_RaiseArgtupleInvalid(%s, %d, %d, %d, %s); %s)0r   rN  r   r%  rf   r  r(  r  r6   r  r  r  r  r=  r  r   r,  r+  rE   r  boolr  generate_stararg_init_codetuplerM   r   r   pykwdlist_cname#generate_argument_values_setup_coder  r  r@  r  generate_posargs_unpacking_codegenerate_keyword_unpacking_code*generate_argument_defaults_assignment_coder  r]  r  r  r  r  r   r.  r  generate_arg_assignmentr[  r_  )r   rO   rR   r  self_name_csafeargtuple_error_labelr  rU  required_kw_only_argsoptional_kw_only_argsnum_pos_only_argsnum_required_pos_only_argsr  kw_only_argsmin_positional_argsmax_positional_argshas_fixed_positional_counthas_kw_only_argsall_argsnon_posonly_argsaccept_kwd_argsnon_pos_args_idkw_unpacking_conditioncomparepystring_cnamer  reversed_argsskip_error_handlingr1   r  r2   r  j  s  



 




 





	






"

"













z6DefNodeWrapper.generate_tuple_and_keyword_parsing_codec                 C   s  |j jr6|j jr|j jdv r|j ||j||j|j |jr't	
|j t	j|}|j}|d|j|f  d S |j jr~|jrD|d|  ||j ||jj|j| |jr||d |d|jj||f  |j jru|j|jdd |d d S d S t|jd|j   d S )	N)r|  r  r  r  r  Tr  r  2Cannot convert Python object argument to type '%s')rN  r]  r  rf   convert_to_basetyper6   r  r  r  r	   typecastr
   r  rM   r  from_py_functionr=  from_py_call_coder  r  rN  r   )r   r  r   rR   r  r1   r1   r2   r  T  s0   

	z&DefNodeWrapper.generate_arg_assignmentc                 C   sH  | j r&| j jjr&d| j j_|d| j jj| j jj|  f  || j j | jrd| jj_|dkrN| j	j
r8J |tjt |d| jjjtjf  d S || jjj d| j	j dtj d| dtj d
 |d| jjj| jjj d	 | j r|| j j |  |d
|   d |d || jj d S d S )Nr   z0%s = PyDict_New(); if (unlikely(!%s)) return %s;r  z = __Pyx_ArgsSlice_r  r   r  r  z)) {r   r  r  )r  r  r  rO  rM   r  re  r  r  r@  r  rE  r   r  r
   r  r  rN  nullcheck_stringr  r}  )r   r  rR   r1   r1   r2   r  o  sB   


z)DefNodeWrapper.generate_stararg_init_codec                 C   sV   t |}|d|dd| f  | jjr)|d| jjtj| jjtjf  d S d S )NzPyObject* values[%d] = {%s};r  r  z9struct %s *%s = __Pyx_CyFunction_Defaults(struct %s, %s);)rE   rM   r   r  r  r   dynamic_args_cnamerG  )r   rO   rR   r  max_argsr1   r1   r2   r    s   

z2DefNodeWrapper.generate_argument_values_setup_codec                 C   sT   t |D ]#\}}|jr'|jjr'||}|d| d| d|j| d qd S )Nzif (!values[z
]) values[z] = __Pyx_NewRef(r  )r  r=  rN  r]  r  rM   as_pyobject)r   rO   rR   r  r  r  r1   r1   r2   r    s   
&z9DefNodeWrapper.generate_argument_defaults_assignment_codec              	   C   sN   | j sd S tj}|d| d| d| d |d| d |d d S )Nzfor (Py_ssize_t r  z5 < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++r  zPy_XDECREF(values[z]);r  )r  r   quick_temp_cnamerM   )r   rR   loop_varr1   r1   r2   r    s   z4DefNodeWrapper.generate_argument_values_cleanup_codec                 C   s  d}|D ]}	|	j r|	js|d7 }q|dtj  | jr!|d t|d |d dD ]7}
|d|
d dd |d	|
 d
| jj dtj	 d|
 d	 |d|
 d|
| j  |d q+|dkr|d|dd t|d ddD ]&}
|d	|
 d
| jj dtj	 d|
 d	 |d|
 d|
| j  qy|d t|d ddD ]}
|d|
d dd |d q|d |dkr|d n|| | js|d || |d d S )Nr   r   switch (%s) {r  r   r  r  r   r  r  r  r   r  r  r  r  z: r   r%   r  r  r  )r   r=  rM   r   r  r  r  r@  r  r  r  r6   r.  r]  )r   r  r  r  r  r  r  rR   num_required_posonly_argsr  r  r1   r1   r2   r	    s<   
** 




z.DefNodeWrapper.generate_posargs_unpacking_codec           
      C   sJ  d}|D ]	}|j r|d7 }q|dkr |dtj|tj|f  n|dkr,|dtj  |dkr3d}n| jrI|| }|d| d| d d	}nd
}d|  k rWt|k r_n nd| }nd}| j }	|j	t
dd || jdtj dtj dtj d| jr| jjjnd d| d| dtj d|	 d| jd udd d S )Nr   r   zBconst Py_ssize_t kwd_pos_args = (unlikely(%s < %d)) ? 0 : %s - %d;z#const Py_ssize_t kwd_pos_args = %s;r  z1const Py_ssize_t used_pos_args = (kwd_pos_args < z) ? kwd_pos_args : r  used_pos_argskwd_pos_argsz	values + r  ParseKeywordsr  z__Pyx_ParseKeywords(r   r   r  )r   rM   r   r  r  rE   rf   r  r   rN  r   r%  put_error_if_negr6   r  r  r  r  r  r  r  )
r   r  r  rR   r  r  pos_arg_count
max_kwargsvalues_arrayr  r1   r1   r2   r
    s`   



z.DefNodeWrapper.generate_keyword_unpacking_codec                 C   s"   | j D ]}|jr| || qd S r|   )rO   r  generate_arg_conversionr  r1   r1   r2   r    s
   
z0DefNodeWrapper.generate_argument_conversion_codec                 C   s   |j }|j}|jr*|jr|d|j  n|d|j  | || |d d S |jr5| || d S ||rH|d|j	j
|jf  d S t|jd||f  d S )Nr  zassert(%s); {r  r  z+Cannot convert 1 argument from '%s' to '%s')rH  rN  r]  r=  rM   r  %generate_arg_conversion_from_pyobject#generate_arg_conversion_to_pyobjectr  r  r  r   r6   )r   r  rR   old_typenew_typer1   r1   r2   r5    s   
z&DefNodeWrapper.generate_arg_conversionc                 C   sB   |j }|jr|||j|jj|j| d S t|jd|  d S )Nr!  )	rN  r$  rM   r%  r  r  r  r6   r   )r   r  rR   r9  r1   r1   r2   r6  /  s   
z4DefNodeWrapper.generate_arg_conversion_from_pyobjectc              
   C   s^   |j }|j}|r%|d|jj||j||jj|jf  ||j d S t	|jd|  d S )Nz%s = %s(%s); %sz5Cannot convert argument of type '%s' to Python object)
rH  to_py_functionrM   r  r  r  r  r6   r  r   )r   r  rR   r8  rX   r1   r1   r2   r7  <  s   z2DefNodeWrapper.generate_arg_conversion_to_pyobjectc                 C   s   | j D ]!}|jr| || q|js$|jjs|jjs|jjr$| || q| j	j
jrgttt| j | j D ]1}|d|dd |d| j	j
j  d| j  d|dd|| j  |d q7d S d S )Nzif (unlikely(unused_arg_r    != Py_None)) {z_PyErr_Format(PyExc_TypeError, "%.200s() takes %zd arguments but %zd were given", (const char*) z, (Py_ssize_t) r  r  )rO   r  r  r  rN  r]  rH  r  r  r  r  ry  reversedr  rE   r@  rU  rM   rl  r  r  r6   )r   rR   r  r  r1   r1   r2   rV  I  s6   


z+DefNodeWrapper.generate_argument_type_testsc                 C   r  r|   )r@  re  r   r1   r1   r2   re  d  r  zDefNodeWrapper.error_valuer  )!r+   r,   r-   defnoder  r  r   r   r  r  r  r  r   r-  r1  rJ  r  r  r  r  r  r  r  r  r  r	  r
  r  r5  r6  r7  rV  re  r1   r1   r1   r2   rA    s@    	
WSOe k#	(=rA  c                       sX   e Zd ZdZdZdZdZejdg Z fddZ	 fddZ
d	d
 Z fddZ  ZS )GeneratorDefNodeTF	Generatorgbodyc                    s*   t |g dd|d< t j|fi | d S )NT)r  r   r   )r
  rc   r   r   r6   rr   rk   r1   r2   r   u  s   zGeneratorDefNode.__init__c                    s&   t  | | j| j_| j| d S r|   )rc   r   r  r@  r   rk   r1   r2   r   z  s   
z%GeneratorDefNode.analyse_declarationsc                 C   s   | j jj}|| j}|| j}|| j}| j| |	d |	d| j
 d| d| j  dtj d| d| d| d|d| j  |tjt | jrkd}|	d	|tjf  ||t ||t |  |	d
 |	d d S )Nr  z#__pyx_CoroutineObject *gen = __Pyx_z_New((__pyx_coroutine_body_t) r   z, (PyObject *) r  genzgen->classobjz&%s = __Pyx_CyFunction_GetClassObj(%s);zreturn (PyObject *) gen;r  )r@  r  r  r  rf   qualnamemodule_namer;  r<  rM   gen_type_namer=  r   r   r  r6   rw  r
   r  rG  rE  r  r}  )r   r   rR   
body_cnamerf   rC  rD  classobj_cnamer1   r1   r2   r    sD   


	
z'GeneratorDefNode.generate_function_bodyc                    sD   | t| jd | jj|dd t || | j|| d S )NCoroutine.cT)proto)rN  r   r%  rE  r@  r-  rc   r   r  rk   r1   r2   r     s   z.GeneratorDefNode.generate_function_definitions)r+   r,   r-   r  is_iterable_coroutinerE  r  r  r   r   r   r  r   rl   r1   r1   rk   r2   r>  h  s    r>  c                   @      e Zd ZdZdZdS )AsyncDefNode	CoroutineTN)r+   r,   r-   rE  r  r1   r1   r1   r2   rL        rL  c                   @   rK  )IterableAsyncDefNodeIterableCoroutineTN)r+   r,   r-   rE  rJ  r1   r1   r1   r2   rO    rN  rO  c                   @   rK  )AsyncGenNodeAsyncGenTN)r+   r,   r-   rE  r  r1   r1   r1   r2   rQ    rN  rQ  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)	r6   r   rf   is_coroutine_bodyis_async_gen_bodyr?   rO   r  r  )rc   r   )r   r6   rf   r   rT  rU  rk   r1   r2   r     s   
zGeneratorBodyDefNode.__init__c                 C   s\   | |j}| d}tj| | }|jd t| j|dd}||_t| j	|_
d|_|| _d S )N	generatorr  )r  rQ  T)rq  rr  r   genbody_prefixr  r
   r6   r  r   rf   rl  r  r  )r   r   rz  rf   r  r  r1   r1   r2   declare_generator_body  s   

z+GeneratorBodyDefNode.declare_generator_bodyc                 C   s   |  | | | d S r|   )r<  rX  r   r1   r1   r2   r     s   
z)GeneratorBodyDefNode.analyse_declarationsc                 C   sB   d| j jtjtjtjf }|r|d|  d S |d|  d S )Nz]static PyObject *%s(__pyx_CoroutineObject *%s, CYTHON_UNUSED PyThreadState *%s, PyObject *%s)z%s; /* proto */z%s /* generator body */
{)r  r  r   generator_cnamelocal_tstate_cnamesent_value_cnamerM   )r   rR   rI  r  r1   r1   r2   r-    s   z-GeneratorBodyDefNode.generate_function_headerc              	   C   s  | j }| j|| || | |_|| j | || |	d | 
| | }|	dtj  | }|  || jjpG| jj | }|rY|jdd d|j_| j| |j|jjj | }|d}|| || |r|jjsJ |j | jj| jdd | j!r|	|"tj#| j n3|	dtj# d | j$rd}	n| j%rd	}	nd
}	|	dtj# d|	 d |	|&| j |	d | j!r| j'd ur| j'}
|
t(j)u rd}n|
t(j*u rd}n|
t(j+u rd}nt,d|
 |	dtj||"tj| jf  |-tjt. | /|| |jjjj0r?|	d|jj1tj2|jj3dtj4 f  |	dtj2  |rS| jj5sSd|j_|j6d| jd || j |	d |	d | j!ss| jj5ss|7tjt. |8|j9r| jj5s|:|j; ||j9 | j!r| j'd ur|<tjt. |j= D ]\}}|>|| q|	d |r|?  t@jA|jBjCv r|jDEtFGdd |	dtH| j$  |I| jj |r|J| j |	d ||j; |Ktjt. |r|L  |	d |	dtj4  |	d  |	d!tj4  |	d"tj4  |M  |	d#tj  |	d |N|j |	d$tj4  |	d%|  |jOD ]\}}|	d&||f  qI|	d' |rs|j | jj| jdd |j6d| jd |M  |	d( |	d |P  d S ))Nr   zPyObject *%s = NULL;T)r  	first_runr  r;  zasync generator	coroutinerV  zQ)) PyErr_SetString(PyExc_TypeError, "can't send non-None value to a just-started z");r  zPyList_New(0)zPySet_New(NULL)zPyDict_New()z)invalid type of inlined comprehension: %sz%s = %s; %sr  z%s->closurezCYTHON_MAYBE_UNUSED_VAR(%s);Fr  r5   r  zif (__Pyx_PyErr_Occurred()) {pep479rH  z*__Pyx_Generator_Replace_StopIteration(%d);z#if !CYTHON_USE_EXC_INFO_STACKz+__Pyx_Coroutine_ResetAndClearException(%s);r  z%s->resume_label = -1;z%__Pyx_Coroutine_clear((PyObject*)%s);r  zswitch (%s->resume_label) {zcase 0: goto %s;zcase %d: goto %s;z2default: /* CPython raises the right error here */zreturn NULL;)Qr  r   r   r'  r(  r)  r  r6   r  rM   r-  rI   r   r7  r{  r|  r  rf   rl  r$  r:  r  rI  r;  r<  init_closure_tempsr/  rN  r  	use_labelr_  r  rH  
is_inlinedr  r[  rU  rT  r  inlined_comprehension_typer   	list_typeset_type	dict_typer   r  r
   r  r  rJ  r   r  rY  r   rZ  rY  r[  r\  r]  r^  put_xdecref_clearr`  ra  rf  r   generator_stoprP  future_directivesr   rN  r   r%  r  rk  rg  rx  rz  r}  r~  yield_labelsr  )r   r   rR   r  closure_init_coder  r  resume_codefirst_run_label	coro_typetarget_type	comp_initr  rN  r  labelr1   r1   r2   r     s   























z2GeneratorBodyDefNode.generate_function_definitions)NNNFFr'  )r+   r,   r-   r  ra  rT  rU  rb  r   rX  r   r-  r   rl   r1   r1   rk   r2   rS    s    
rS  c                   @   s&   e Zd ZdgZdZdd Zdd ZdS )r  r   Nc                    s   |j _jjrd}nd}ddlm   jt_	 j
jj	 fddj|d  D d}|jjs:|jjrOtjtj|dtjd dgd	_ntj|d_j|_S )
Nr   r   r  c                    s   g | ]} j j|jd qS r  )r  r6   rf   r  r  r1   r2   r     s    z9OverrideCheckNode.analyse_expressions.<locals>.<listcomp>r  rO   )exprr   r  )rK  rO   r,  r  r   ru  RawCNameExprNoder6   r
   	func_noder  r  rI  is_returncoder
  ExprStatNoder  r   ro   )r   r   	first_arg	call_noder1   r  r2   ro     s(   z%OverrideCheckNode.analyse_expressionsc              
   C   s  | j jr	| j jjn| j j}||j}| j jrdtj }nd| jd j	 }|
d |
dtj  |
d | j jsC| j jjdrI|
d nD|
d |
d	 || j jjjj}|
d
| d| d |
d| d |
d |
d
| d| d |
d |
d |
d |jtdd |
dtjtjf  |
d|tjtjf  |
dtj|f  |
d |jjtdd}| j| |jtdd |
d|||||| jf  ||t |
d||j f  | j!"| |
d |
d |
d tj|f  |
d!tj|f  |
d"tjtjf  |
d#tjtjf  |
d |
d |#|t$j |j%| |
d |
d |
d |
d d S )$Nr  r   z /* Check if called by wrapper */zif (unlikely(%s)) ;z#/* Check if overridden in Python */r}   zelse {z	else if (z#if !CYTHON_USE_TYPE_SLOTSzunlikely(Py_TYPE(z) != z &&z __Pyx_PyType_HasFeature(Py_TYPE(z), Py_TPFLAGS_HAVE_GC))r  z9)->tp_dictoffset != 0 || __Pyx_PyType_HasFeature(Py_TYPE(z3), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))r  r  zQ#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTSPyDictVersioningObjectHandling.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  PyObjectGetAttrStrz*%s = __Pyx_PyObject_GetAttrStr(%s, %s); %sz5if (!__Pyx_IsSameCFunction(%s, (void(*)(void)) %s)) {r  z#%s = __Pyx_get_tp_dict_version(%s);z'%s = __Pyx_get_object_dict_version(%s);zif (unlikely(%s != %s)) {z"%s = %s = __PYX_DICT_VERSION_INIT;)&r,  r  r  r  rf   r  r   module_cnamerO   r  rM   r  r  rS  r  r  rC  r   rN  r   r%  tp_dict_version_tempobj_dict_version_temptype_dict_guard_tempr  r  r
   ru  	set_cnamer  r6   r  r  r   r   r  r	   r  )r   rR   method_entryinterned_attr_cnamer  rC  func_node_tempr1   r1   r2   r     s   




















z)OverrideCheckNode.generate_execution_code)r+   r,   r-   r   r   ro   r   r1   r1   r1   r2   r    s
    
r  c                   @      e Zd ZdS )ClassDefNodeNr+   r,   r-   r1   r1   r1   r2   r         r  c                   @   s   e Zd Zg dZdZdZdZdZdZdZ	dZ
		dddZdd Zdd	 Zd
d ZeejedejdgZdd Zdd Zdd ZdS )PyClassDefNode)doc_noder   ra   	metaclassmkwrg   class_resultr  
class_cellr  
orig_basesNFc	              	   C   s  t | | || _|| _|| _|| _|| _ddlm}	 | jr;t	j
r;t| j| j}|	j||d}
|	jtdt|d| _nd }
| }|rd}d| _|jr|jr{tt|jd d d D ]\}}|jjd	krv| jd urnt|jd
 |j| _|j|= qY|| _n| jd usJ n|	|| _|s| js| js| jr| jd u r|r|js| j}nd }|s| jjr| jjsn|	j|| d| _d}nd}|	j |||
| d| _!|	j"||| |
|||d| _#n|	j$|g d| _!|	j%||| |
d| _#|	j||d| _&|	'| j| _(d S )Nr   r  rs  rx   )rf   rN  r6   FTr   r  z2keyword argument 'metaclass' passed multiple times)class_def_node)rf   r?   r  )rf   r  r?   calculate_metaclassallow_py2_metaclass
force_typerh  )rf   r  r?   r?  ))r  r   rf   r?   r   r  rg   r   ru  r    r  r@   r6   UnicodeNoder  r   r
   r  is_py3_style_classis_dict_literalrh  r   r  r   r   r  r   r  	ProxyNodeis_sequence_constructorrO   PyClassMetaclassNodePyClassNamespaceNodera   Py3ClassNodeclassobjDictNode	ClassNoder  ClassCellInjectorNoder  )r   r6   rf   rg   r?   r   r  rV  force_py3_semanticsru  r  r  r  r   mkdictneeds_metaclass_calculationr1   r1   r2   r   "  sv    



zPyClassDefNode.__init__c                 C   sZ   | j rt| jjd dS ddlm} t| jdd| j| jp#|j	| jg d| j
| jd| jd	S )	zO
        Return this node as if it were declared as an extension class
        z7Python3 style class could not be represented as C classNr   r  r  rO   F)rQ  rD  
class_namerg   r  r   rR  r?   )r  r   r  r6   r   ru  CClassDefNoderf   rg   rn  r  r   r?   r   ru  r1   r1   r2   	as_cclassk  s   zPyClassDefNode.as_cclassc                 C   s:   |}|j s|jr|j}|j s|jst| j|d }| _|S )N)rf   r  )r  r  r  r   rf   r  )r   r   r  r  r1   r1   r2   create_scope~  s   zPyClassDefNode.create_scopec                 C   s   | j  }}| jr&ddlm} | jd d d D ]}||j|j|gd}qd | _|| _| jr2| j| | j	r;| j	| | j| | j
| | |}|j|_| j
jj|_| jr_| j| | j| || d S )Nr   )r  r   rq  )r  r  ru  r  r6   r  r  rg   r   r  r  analyse_target_declarationr  r   r  r  class_obj_cnamer  r   r  )r   r   unwrapped_class_resultr  r  r  r  r1   r1   r2   r     s0   

z#PyClassDefNode.analyse_declarationsrg   c                 C   s   | j r3| j jrt| j jdks3ddlm}m} | j |}||jd| j	t
dd||gd| _ || _| j r=| j || _ | jrG| j|| _| jrQ| j|| _| j|| _| j|| _| j}| j|| _| j|| j| _| j|| _| S )Nr   r   )PythonCapiCallNode	CloneNode__Pyx_PEP560_update_basesPy3UpdateBasesr{  )r  r  utility_coderO   )rg   r  rE   rO   ru  r  r  ro   r6   update_bases_functyper   r%  r  r  r  ra   r  r  r   r  analyse_target_expressionr  r  )r   r   r  r  r  r  r1   r1   r2   ro     s.   
z"PyClassDefNode.analyse_expressionsc                 C   s"   |  | j| | j| j| d S r|   )r  r  r   r   r  r1   r1   r2   r     s   z,PyClassDefNode.generate_function_definitionsc                 C   s  | | j |j|  | j}| jr| j| | jr!| j| | jr*| j| | j	r3| j	| | j
| | jrp|d| j | j f  ||d| j
 | j f | j |d | j| | j| | j
  |_|_| j}|d ur|jsd }|d ur|| | j| | j| |d ur||| j  |d ur|| || | j  |_|_| j| j| | j
| | j
| | j	r| j	| | j	| | jr| j| | j| | jr| j| | j| |j  d S )Nzif (%s != %s) {z.PyDict_SetItemString(%s, "__orig_bases__", %s)r  )r  r6   pyclass_stackr  r  r  r
  rg   r  r  ra   rM   r   r  generate_disposal_coder  namespace_cnamer  r  	is_activer   r   r  generate_injection_coder  r  r  pop)r   rR   r  r  r1   r1   r2   r     sj   




z&PyClassDefNode.generate_execution_code)NNF)r+   r,   r-   r   r  r  r  r  r  r  r  r   r  r  r   r	   r  r
   r  r  ro   r   r   r1   r1   r1   r2   r    s.    
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 r|   )r   r  r   r1   r1   r2   punycode_class_name  r  z!CClassDefNode.punycode_class_namec                 C   sH   t | ds!ddlm} | jr|j| j|g | jdd| _| jS d | _| jS )N_buffer_defaultsr   re  F)need_complete)r  r   rf  buffer_defaults_noderi  buffer_defaults_posr  )r   r   rf  r1   r1   r2   rj    s   
zCClassDefNode.buffer_defaultsc                 C   s   | j r| jdkr| j d}||| j}|sd S n|}|j| j| jdd| j d | j| j| j| j	| j
| j| || jd| _| jrOt| jjdkrQd| jj_d S d S d S )Nrp  .r   )rf   r6   r  implementingrD  rO  objstruct_cnametypeobj_cnamerQ  r  
check_sizer  rj  shadowr   T)rD  rQ  splitr3  r6   declare_c_classr  objstruct_nametypeobj_namer  r  r  rj  r  r  rg   rE   rO   rN  multiple_bases)r   r   r.  
home_scoper1   r1   r2   r  *  s4   zCClassDefNode.declarec                 C   s   i }| j s|S ddlm} g }| j D ]V}|j}d }t||jr$|}|j}t||}|dkr;|r6t	|j
d d|d< q|dkrcd }	i }
|r\t||jrO|j}	n|jj}	|j}|r\| }
|	|
f||< q|| q|rst	|d j
d	 || _ |S )
Nr   r  zfunctools.total_orderingz total_ordering cannot be called.Ttotal_orderingdataclasses.dataclassr   z8Cdef functions/classes cannot take arbitrary decorators.)r  r   ru  r  rF   CallNoder  r   'exprnode_to_known_standard_library_namer   r6   r  rO   rU  rV  as_python_dictr  )r   r   extra_directivesru  remaining_decoratorsoriginal_decoratorr  decorator_call
known_namerO   rP   kwds_r1   r1   r2   _handle_cclass_decoratorsE  sD   
z'CClassDefNode._handle_cclass_decoratorsc                    s   j rjstjd  }d _jrAd _ jD ]}|j	jkr(|_qjd u rAt
jd  j_dj_ j jjrjjd }| }|tju r\ dj}n|tju rh dj}n|tju rs dj}|d u rt|jdj  nU|tu rd }nN|js|jr|jst|jd|  n<| st|jd	|j	jf  n+|jr|jjr|jrt|jd
|jf  n|jr|j	dv rt|jd|j	  n|_ j dddkr|tjkrt!jdd j"d u}|r
jr
jjs
jj#$ fdd d S jr'j%dkr'j&d} '|j}	|	s&d S n }	j%dkrPjdkrPjt(j)v rP j*d d dkrPt!jdj d |	j+jj|o[j,|oaj, jjjj-j.j%j/j01 j2d_3jrt4jjdkrdj3j_5j2rj3|	j_6|	 urj%dkr 7jj3j j3jj _}
|
d ur|rˈ j8 |
_|
j9| n j|
_d|
jv rd}|
jd }|r|d }| d}|o|j:o|j;}|rdnd|
_<j=r
t>j?r
t@jj=|
_=|rDj"A|
 jBd}|r9|jCr9|
jDs9|
jEs9jFd|_GjHd|j=|j j,rAd|
_Dnd|
_Et4jjdkr|rTj,r^tjjd jd jjdd  D ]}| rtt|jd qfdj3j_Idd lJmK} |jLj|jMjjd!j|jNjg d"gd#_OnjrjjPpjjIj3j_Id _Ondj3j_Id _O Qj3 j3jj#D ]}|  qd S )$NzTObject struct name specification required for C class defined in 'extern from' blockr   r   r|  r  r5  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 supportedfreelistzIfreelists cannot be used on subtypes, only the base class can manage themc                      s
     S r|   )r   r1   r  r1   r2   <lambda>  s   
 z4CClassDefNode.analyse_declarations.<locals>.<lambda>rp  r  __builtin__   zcpython.z %s already a builtin Cython type)rf   r6   r  r  rD  rO  r  r  r  rQ  r  r  rj  r  Tr  Ffrozenr}   __dict__getterz'Only declare first base in declaration.z+Only one extension type base class allowed.r  rs  r  r  )Rr&  r  r   r6   r  rO  rD  modulecimported_modulesrf   r   rP  has_extern_classadd_imported_modulerg   rO   ro  r	   r  r/  rN  c_float_typer;  r  r
   rI  r  r  r  r  r   ro  r   r   r   defered_declarationsr  rQ  r  r3  r   builtin_typesrl  r  rR  r  r  r  r  rj  r  r  rE   r  r  add_imported_entryr   r   r   r   is_c_dataclass_scoper?   r    r  r@   r   rS  is_variabledefinedimplementedmangle_internalgetter_cnamedeclare_property
early_initr   ru  rn  IdentifierStringNoder  type_init_argsis_externalallocate_vtable_names)r   r   r  r  rV  rO  base_class_scopehas_bodyr.  r  r  	is_frozendataclass_configdecorator_kwargsfrozen_flag
dict_entry
other_baseru  thunkr1   r  r2   r   p  s  



















z"CClassDefNode.analyse_declarationsc                 C   s4   | j r| jjj}| j || _ | jr| j| | S r|   )r   r  rN  r  ro   r  r  r1   r1   r2   ro     s   
z!CClassDefNode.analyse_expressionsc                 C   s,   | j r| | j| | j | j| d S d S r|   )r   r  r  r   r  r1   r1   r2   r     s   z+CClassDefNode.generate_function_definitionsc           
      C   sp  | | j | jjjsd }| jr|jjtj	dd}| j
| |d|| j f  ||d| | j ||tj	 |jjtjdd}|| d| d ||d| | j |jjtj	dd}|d |d	 |jjtj	dd}|| d
 |||| j ||t	 |jjtj	dd}|| d |||| j ||t	 |jjtj	dd}|| d| d| j  d |||| j ||t	 || d| d| d |||fD ]}||tj	 |j| q|d |d |d|| j f  |||| j ||t	 |d||f  d| }	|d|	  |d|  |d |d |d |d ||| j |d || d |j| ||tj	 |j| | j| | j| | j| j||dd |d ur||tj	 |j| | jr| j| d S d S )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);r  z = NULL;)bases_tuple_cnamecheck_heap_type_bases)r  r6   r  rN  r  r  r  r  r	   r
   r
  rM   r   error_goto_ifrE  r   r\  r  r  r  r  r  r  r  generate_type_ready_coder   r   )
r   rR   rg   
first_base
trial_typetype_new
type_tuple
args_tupler  trial_type_baser1   r1   r2   r     s~   

"








z%CClassDefNode.generate_execution_codec              
   C   s  | j }tj d|j }|j}|sd S | jdkr-|jr+|jr J |d|j|jf  d S |s1J |js6J d|j }|d d }|sj|jj	rj|j
jtdd}|d|||jj	||| jf  ||t |sn|r|r|jtd	d
 || jd|td|j||p|f  |d|tj||p|f  |r|j|td |j
| |||| j n|d|tj|||| jf  td|jj}	|	|sK|d |d||	j|	|f  dD ];}
t|jj |
}	|	|dkr't!||	s'|d||	j|||	jf  |d||	j||	jf  |d q|d |d |d |d |d |d |d |jtdd
 || jd ||f  |d |r~|"|t |#|t |d!|j|f  |d||jf  |d |j	}|r|j$r|j%d"kr|d#|j&rd$nd%|j%|j&rd$nd%|j%f  |jtd&d
 ||j	}|| jd'|  |d n|j	}|s|d t|jjD ]	}|'|| q|d |d( |jtd)d
 || jd*|  |d |(d+|  t)|d,}t)|d}|dkrP|dkrP|d |d-||f  |d.|  |d |d | j jj*D ]}|j+dv }|j,rt-j.r|j/r|st| j jj |j+}|r~|0 nd }|r|| |d/ |d0 |d1||j+|d2| jf  |d3 |d4|j/  |d5|j/|j1f  |d6|j/  |d |d |d |r|d qU|j2r|jtd7d8 || jd9||j3f  |jtd:d8 || jd;|  |jj4s&|jj5d<s&|| jd=tj|6|j7|f  |j8s/|9d>nd }|rh|j tu rbd?| }|j&rF|j%}nd@|j% }|dA |dB||||j:f  |d nt;|jdC |j8ss|9dDrnd S |jtdEd
 || jdF|  d S d S )GNrD   rp  z	%s = &%s;z%s_specz#if CYTHON_USE_TYPE_SPECSTr  z(%s = PyTuple_Pack(1, (PyObject *)%s); %sValidateBasesTuplezExtensionTypes.cz+__Pyx_validate_bases_tuple(%s.name, %s, %s)tp_dictoffsetzB%s = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(%s, &%s, %s);r&  zG%s = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(%s, &%s, NULL); %s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;r  z>#elif defined(Py_bf_getbuffer) && defined(Py_bf_releasebuffer)zB/* PY_VERSION_HEX >= 0x03090000 || Py_LIMITED_API >= 0x030B0000 */z#elif defined(_MSC_VER)zU#pragma message ("The buffer protocol is not supported in the Limited C-API < 3.11.")r  zL#warning "The buffer protocol is not supported in the Limited C-API < 3.11."r  FixUpExtensionTypez.__Pyx_fix_up_extension_type_from_spec(&%s, %s)z%s.tp_bases = %s;PyTypeObjectz#if (sizeof(%s%s) != sizeof(%s%s)) {r   zstruct ValidateExternBasez__Pyx_validate_extern_base(%s)z#if !CYTHON_USE_TYPE_SPECSPyType_Readyz__Pyx_PyType_Ready(%s)(PyObject*)tp_getattrozif ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!%s->tp_dictoffset && %s->tp_getattro == PyObject_GenericGetAttr)) {z*%s->tp_getattro = PyObject_GenericGetAttr;r  r  zDPyObject *wrapper = PyObject_GetAttrString((PyObject *)%s, "%s"); %swrapperz3if (__Pyx_IS_TYPE(wrapper, &PyWrapperDescr_Type)) {z0%s = *((PyWrapperDescrObject *)wrapper)->d_base;z%s.doc = %s;z0((PyWrapperDescrObject *)wrapper)->d_base = &%s;	SetVTableImportExport.cz__Pyx_SetVtable(%s, %s)MergeVTablesz__Pyx_MergeVtables(%s)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'__reduce_cython__SetupReducez#__Pyx_setup_reduce((PyObject *) %s))<rN  r   modulestatevalue_cnamerC  r  rQ  r  rM   r  rO  r  r  r
   r  r  r6   r  r   rN  r   r%  r1  r   get_slot_by_namer   	slot_coder}  rf  r  is_empty	slot_namer  r  get_base_slot_functionrE  r  r  r  r  generate_dynamic_init_codeput_make_object_deferredget_slot_code_by_namepyfunc_entriesrf   ry  r    r  rx  r  rv  vtable_cnamevtabptr_cnameis_internalr   r  r  is_closure_class_scoperS  r  r   )r  rR   r  r  rN  rC  r  typespec_cname
tuple_tempbuffer_slotbuffer_method_namerO  base_typeptr_cnamer  getattr_slot_funcdictoffset_slot_funcrX   rH  r  weakref_entrytp_weaklistoffset	objstructr1   r1   r2   r  j  s  






	







































z&CClassDefNode.generate_type_ready_codec                 C   s,   | j r	| j | | jr| j| d S d S r|   )r  r   r   r   r1   r1   r2   r   Z  s
   zCClassDefNode.annotater  )r+   r,   r-   r   r  r  r  r  r  r  r  r  r  r#  r  rj  r  r  r   ro   r   r   r  r  r   r1   r1   r1   r2   r    s2    
+  N pr  c                   @   r   )PropertyNoder   c                 C   s*   | | j| j| j| _| j| jj d S r|   )r  rf   r?   r6   r  r   r   r  r   r1   r1   r2   r   k  s   z!PropertyNode.analyse_declarationsc                 C   r-  r|   r.  r   r1   r1   r2   ro   o     z PropertyNode.analyse_expressionsc                 C   r0  r|   r1  r  r1   r1   r2   r   s  r2  z*PropertyNode.generate_function_definitionsc                 C   r   r|   r1   r   r1   r1   r2   r   v  r   z$PropertyNode.generate_execution_codec                 C   r3  r|   r4  r   r1   r1   r2   r   y  r5  zPropertyNode.annotateNr6  r1   r1   r1   r2   r.  a  s    r.  c                   @   sN   e Zd ZdZdgZdZedd Zdd Zdd	 Z	d
d Z
dd Zdd ZdS )CPropertyNodezADefinition of a C property, backed by a CFuncDefNode getter.
    r   Tc                 C   s*   | j j}|rt|d tsJ ||d S r  )r   r  rF   r  r   r  r1   r1   r2   r    s   zCPropertyNode.cfuncc                 C   sN   t | j|d}| j| |j| j| j| j| jj|d }| _	| jj	j
|_d S )N)class_scope)ctypeproperty_scope)r   rf   r   r   r  r?   r6   r  r  r  r  r  )r   r   r  r  r1   r1   r2   r     s   z"CPropertyNode.analyse_declarationsc                 C   r-  r|   r.  r   r1   r1   r2   ro     r/  z!CPropertyNode.analyse_expressionsc                 C   r0  r|   r1  r  r1   r1   r2   r     r2  z+CPropertyNode.generate_function_definitionsc                 C   r   r|   r1   r   r1   r1   r2   r     r   z%CPropertyNode.generate_execution_codec                 C   r3  r|   r4  r   r1   r1   r2   r     r5  zCPropertyNode.annotateN)r+   r,   r-   rx   r   r   r#  r  r   ro   r   r   r   r1   r1   r1   r2   r0  }  s    
r0  c                   @   (   e Zd Zg Zdd Zdd Zdd ZdS )
GlobalNodec                 C      | j D ]	}||| j qd S r|   )namesdeclare_globalr6   r   r   rf   r1   r1   r2   r        
zGlobalNode.analyse_declarationsc                 C   r  r|   r1   r   r1   r1   r2   ro     r   zGlobalNode.analyse_expressionsc                 C   r   r|   r1   r   r1   r1   r2   r     r   z"GlobalNode.generate_execution_codeNr  r1   r1   r1   r2   r6    
    r6  c                   @   r5  )NonlocalNodec                 C   r7  r|   )r8  declare_nonlocalr6   r:  r1   r1   r2   r     r;  z!NonlocalNode.analyse_declarationsc                 C   r  r|   r1   r   r1   r1   r2   ro     r   z NonlocalNode.analyse_expressionsc                 C   r   r|   r1   r   r1   r1   r2   r     r   z$NonlocalNode.generate_execution_codeNr  r1   r1   r1   r2   r=    r<  r=  c                   @   sF   e Zd ZdgZdd Zdd Zdd ZdZd	d
 Zdd Z	dd Z
dS )rw  rr  c           
      C   s   ddl m} | j}t||jrR|j }|dkrP| \}}t|r(t	|j
d |jD ]\}}||}	|	d u r?t	|j
d q+|j|j|	|j
dd q+t| _d S d S t|dd d urr|jrg|| t| _d S |jsm|jrtt| _d S d S d S )	Nr   r  r  z!Variable names must be specified.Unknown typeT)r  r  )r   ru  rr  rF   GeneralCallNoder  r_  explicit_args_kwdsrE   r   r6   rh  ro  r  r   PassStatNoderH   r   r   declare_from_annotationr  is_subscript)
r   r   ru  rr  rX   rO   rP   varr  rN  r1   r1   r2   r     s.   





z!ExprStatNode.analyse_declarationsc                 C   s"   d| j _| j || _ d| j _| S r  )rr  result_is_usedro   r   r1   r1   r2   ro     s   z ExprStatNode.analyse_expressionsc                 C   s(   | j jjr| j  r|   d S d S d S r|   )rr  rN  r]  result_in_tempr   r   r1   r1   r2   r     s   zExprStatNode.nogil_checkzDiscarding owned Python objectc                 C   sz   | | j d| j_| j| | j s/| j r/| j }| jjjs(d| }|	d|  | j
| | j| d S )NFz
(void)(%s)%s;)r  r6   rr  rF  r
  rG  r   rN  rI  rM   r  r  )r   rR   r   r1   r1   r2   r     s   

z$ExprStatNode.generate_execution_codec                 C   r0  r|   )rr  r   r  r1   r1   r2   r      r2  z*ExprStatNode.generate_function_definitionsc                 C   r3  r|   )rr  r   r   r1   r1   r2   r     r5  zExprStatNode.annotateN)r+   r,   r-   r   r   ro   r   r   r   r   r   r1   r1   r1   r2   rw    s    rw  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
AssignmentNodec                 C   sT   |j }|j }|jr"|jjr$|jr&|jjs(t| jd||dd d S d S d S d S d S )Nz4Assigning to '{}' from '{}' discards const qualifierr   r   )rN  rF  rO  rz  r   r6   r  )r   r  rhsrhs_tlhs_tr1   r1   r2   _warn_on_const_assignment  s
   z(AssignmentNode._warn_on_const_assignmentc                 C   s"   t |tr| |j|j d S d S r|   )rF   rI  rM  r  rJ  )r   rQ   r1   r1   r2   _check_const_assignment  s   
z&AssignmentNode._check_const_assignmentc                 C   sL   |  |}| | t|tr$t|ts$|jjjr$|j r$t	| j
d |S )Nz9Storing unsafe C derivative of temporary Python reference)rn   rN  rF   rI  ParallelAssignmentNoderJ  rN  is_unowned_viewis_ephemeralr   r6   )r   r   rQ   r1   r1   r2   ro     s   

z"AssignmentNode.analyse_expressionsc                 C   s$   | | j | | | | d S r|   )r  r6   generate_rhs_evaluation_coder  r   r1   r1   r2   r   &  s   
z&AssignmentNode.generate_execution_codeN)r+   r,   r-   rM  rN  ro   r   r1   r1   r1   r2   rI    s
    	rI  c                   @   s|   e Zd ZddgZdZdZdZdZdZdd Z	dddZ
d	d
 Zdd Zdd Zdd Zdd ZdddZdd Zdd ZdS )SingleAssignmentNoder  rJ  Fc                 C   sj  ddl m} t| j|jrq| jj }|rq| j \}}|dv rt|dkr2t	|d j
d d S |d urP|d }|dksCd|vrKt	|j
d d S |d }nd	}|d
 |}|d u rgt	|d
 j
d d S | j}	|dkrt|	|jr||	j|	j
fg}
nt|	|jrdd |	jD }
nt	|	j
d d S |
D ]\}}|j|||d|d qt|dkr|d | _nd| _nd| _t|	|jst	|	j
d |j|	j|| j
d	d n|dv rNd| _t|d
ks|d u rt	| jj
d d S g }|jD ]\}}||}|d u rt	|j
d q||j||j
f qt|t|jk rd S t| j|js*t	| jj
d | jj}t|}||||d| jj
 |D ]\}}}|||| q?n#|dkrqd| _|rat	| jjj
d t| jj
| jj|d}|| | jrwd S | jr| j| d S | j| | jjs| jj r| jj!r| jj!j"s| j# }|r|| jj!_"d S d S d S d S d S )Nr   r  )r  typedefr%   zInvalid positional argument.rT  rQ  zInvalid keyword argument.r  r   r?  r  c                 S   s   g | ]}|j |jfqS r1   )rf   r6   r   rE  r1   r1   r2   r   ^  s    z=SingleAssignmentNode.analyse_declarations.<locals>.<listcomp>zInvalid declarationT)r  rQ  zInvalid declaration.)rQ  )r  unionz.Struct or union members must be given by name.F
fused_typez*fused_type does not take keyword arguments)rf   r_   )$r   ru  rF   rJ  r  r  r_  rA  rE   r   r6   compile_time_valuero  r  r  rf   rn  rO   r  declaration_onlyr}  rh  r  r   r   r  r|  r   is_assignment_expression0analyse_assignment_expression_target_declarationr  r  r   r  r2  !get_known_standard_library_import)r   r   ru  	func_namerO   rP   kwdictrQ  rN  r  varsrE  r6   membersmemberr  rf   r  	fusednodestdlib_import_namer1   r1   r2   r   A  s   







*
z)SingleAssignmentNode.analyse_declarationsr   c                 C   s  ddl m} | j|| _| jjr:| jjjjr:|j	r.| jjj
d u r.| j r.| jj| jj_
nt| jd| jj d | |}|rC|S | j|| _| j| | |}|rY|S t| j|jrp| j| j | j| j| _n| jjjrt| j|js|j| jj| jd d d}||| _| jjjr|| jd| jj| jjg}|r| j}d| _|jj| _|jj| _| jdkr| jd u r|t !d	d
 n| j"| jj|}n	| j"| jj|}|s|j#s|js|j$s|jj%r|&|}n	|jj%r|'|}|| _| j(r| jjjst)| jdd | S )Nr   r  zAssignment to const '')rV  rT   stop=Tr  CppExceptionConversionr  zHAssignment in pxd file will not be executed. Suggest declaring as const.r%   )*r   ru  rJ  rn   r  r   r  rN  rz  r  r  r  r{  r   r6   rf   
unroll_rhsrp   gil_assignment_check
unroll_lhsrF   MemoryViewIndexNodeanalyse_broadcast_operation$analyse_as_memview_scalar_assignmentrG  SliceIndexNoderq  lookup_operator_for_typesis_overloaded_assignmentr  r  rN  r   r%  r  r  r   r]  coerce_to_tempcoerce_to_simplefrom_pxd_cvardefr   )r   r   use_tempru  unrolled_assignmentr  oprJ  r1   r1   r2   rn     sf   







z"SingleAssignmentNode.analyse_typesc              	   C   s  ddl m}m} |}d  } } }	}
|jjr|jj}n|jjs#|jjrt||j	r@|j
s@|js@|j }}t||j	r@|j
s@|jr/t||j	r|j}|j
}|rU|tj|}|j}|rb|tj|}n*|jjr|jjr|j| jt|jjt|jjtr~|jjn|jd}nt| jd d S |	r|	tj|}	dd }z||d ||d ||	d }W n$ ty   t| jd Y d S w |jjr|jj}t|tsd S nd S d S ||krt| jd	||f  d S g }||}|g}|r|js||}|| |r	|js	||}|| |	r|	js||	}	||	 t|D ]i}|j| j|}|	d urMt|	jtrC|j|	j }|j| j|}n
|j| jd
|	|d}|d urwt|jtrm| rm|j|j }|j| j|}n
|j| jd||d}||j | j||!|d q|
||fS )Nr   )ru  	UtilNodes)r   r{  z*C array iteration requires known end indexc                 S   s"   | d u r|S |   r| jS td)NzNot a constant.)r  r{  r~  )rQ   
none_valuer1   r1   r2   	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 %sr  )operatoroperand1operand2r  )rV  rv  )"r   ru  rw  rN  	is_ctupler  rF  rG  rF   rn  rT   re  rV  r  r	   r  IntNoder6   r  r|  constant_value_not_setr   r~  
LetRefNoder   r  r  for_sizer{  MulNoder  AddNode	IndexNodern   )r   rQ   target_sizer   ru  rw  rV  
start_node	stop_node	step_node
check_node
slice_sizery  rb   refsr  ix_node
step_valueindex_valuer1   r1   r2   unroll  s   

"











"
zSingleAssignmentNode.unrollc              	   C   s   ddl m} g }t||D ]\}}	|t| j||	| jd qt| j|d|}
|r4t	| j||
gd}
|d d d D ]}|
||
}
q;|
S )Nr   )rw  )r  rJ  first)r6   r  r   )r   rw  r  r  rS  r6   r  rO  ro   r
  LetNode)r   r  r  lhs_listrhs_listr   rw  assignmentsr  rJ  rQ   refr1   r1   r2   unroll_assignments:  s   z'SingleAssignmentNode.unroll_assignmentsc                 C   sx   ddl m} t| j|jsd S tdd | jjD rd S | | jt	| jj|}|s,d S |\}}}| 
||| jj||S )Nr   r  c                 s   rX  r|   )
is_starredr  r1   r1   r2   r$  J  rY  z2SingleAssignmentNode.unroll_rhs.<locals>.<genexpr>)r   ru  rF   r  rn  r\  rO   r  rJ  rE   r  )r   r   ru  unrolledr  r  rJ  r1   r1   r2   rh  F  s   
zSingleAssignmentNode.unroll_rhsc                 C   sl   | j jjrd S ddlm} t| j|jsd S | | j t	| jj
|}|s&d S |\}}}| |||| jj
|S Nr   r  )r  rN  r}  r   ru  rF   rJ  rn  r  rE   rO   r  )r   r   ru  r  r  r  r  r1   r1   r2   rj  S  s   

zSingleAssignmentNode.unroll_lhsc                 C   r3  r|   rJ  r
  r   r1   r1   r2   rR  a  r5  z1SingleAssignmentNode.generate_rhs_evaluation_codec                 C   s<   | j r| jj| j|| j | j| jd d S | j| j| d S )N)r  r  r  )rp  r  r  rJ  r  r  )r   rR   r  r1   r1   r2   r  d  s   
z-SingleAssignmentNode.generate_assignment_codec                 C   r0  r|   rJ  r   r  r1   r1   r2   r   o  r2  z2SingleAssignmentNode.generate_function_definitionsc                 C      | j | | j| d S r|   r  r   rJ  r   r1   r1   r2   r   r     zSingleAssignmentNode.annotateNr  r'  )r+   r,   r-   r   r  rp  rZ  rY  rs  r   rn   r  r  rh  rj  rR  r  r   r   r1   r1   r1   r2   rS  ,  s"    
^>]
rS  c                   @   s\   e Zd Zg dZdZdZdZdd Zdd Zddd	Z	d
d Z
dddZdd Zdd ZdS )CascadedAssignmentNode)r  rJ  coerced_valuescloned_valuesNc                 C   s,   t |tr|jD ]}| ||j qd S d S r|   )rF   r  r  rM  rJ  )r   rQ   r  r1   r1   r2   rN    s
   

z.CascadedAssignmentNode._check_const_assignmentc                 C   r  r|   )r  r  )r   r   r  r1   r1   r2   r     r  z+CascadedAssignmentNode.analyse_declarationsr   c                 C   s  ddl m}m} t }t| jD ]\}}|| }| j|< || ||j	 q| j
|}t|dkrYtt|jrQ|d|| j
g}	|	sP|| |}n|| |}|jsn|jsn|sh|jsh|j	jrn||}n||}| r{||n|| _
g | _i }
g | _| jD ]9}|j	jo|d|| j
g}| j| |j	|
vr|j	|j	kr|| j
}|s||j	|}| j| ||
|j	< qg | _| jD ]}|
|j	| j
}| j|| q| S )Nr   )r  r  rf  )ru  r  r  r   r  r  rp   ri  r   rN  rJ  rn   rE   nextiterrq  lookup_operatorr  r  r   r   r  r]  rq  rr  rG  r  assignment_overloadsr  r  r   )r   r   rt  r  r  	lhs_typesr  r  rJ  rv  r  
overloadedr1   r1   r2   rn     sT   





z$CascadedAssignmentNode.analyse_typesc                 C   r3  r|   r  r   r1   r1   r2   rR    r5  z3CascadedAssignmentNode.generate_rhs_evaluation_codeFc                 C   s   | j D ]}|| qt| j| j| jD ]\}}}|| |j|||d q| j D ]}|| || q*| j	| | j	| d S )N)r  )
r  r
  r  r  r  r  r  r  r  rJ  )r   rR   r  rJ  r  overload	rhs_valuer1   r1   r2   r    s   



z/CascadedAssignmentNode.generate_assignment_codec                 C   r0  r|   r  r  r1   r1   r2   r     r2  z4CascadedAssignmentNode.generate_function_definitionsc                 C   sR   | j D ]}|| qt| j| jD ]\}}|| || q| j| d S r|   )r  r   r  r  r  rJ  )r   rR   rJ  r  r1   r1   r2   r     s   

zCascadedAssignmentNode.annotater  r'  )r+   r,   r-   r   r  r  r  rN  r   rn   rR  r  r   r   r1   r1   r1   r2   r  w  s    
1
r  c                   @   r   )rO  r  c                 C   r  r|   r  r  r1   r1   r2   r     r  z+ParallelAssignmentNode.analyse_declarationsc                    s0    fdd| j D | _ | j D ]}|| q| S )Nc                    s   g | ]	}|j  d dqS )r   )rt  )rn   r  r  r1   r2   r         z>ParallelAssignmentNode.analyse_expressions.<locals>.<listcomp>)r  rN  r  r1   r  r2   ro     s   

z*ParallelAssignmentNode.analyse_expressionsc                 C   s<   | | j | jD ]}|| q	| jD ]}|| qd S r|   )r  r6   r  rR  r  r  r1   r1   r2   r     s   

z.ParallelAssignmentNode.generate_execution_codec                 C   r  r|   r  r  r1   r1   r2   r     r	  z4ParallelAssignmentNode.generate_function_definitionsc                 C   r  r|   r  r  r1   r1   r2   r     r  zParallelAssignmentNode.annotateN	r+   r,   r-   r   r   ro   r   r   r   r1   r1   r1   r2   rO    s    rO  c                   @   <   e Zd ZddgZdd Zdd Zdd Zd	d
 Zdd ZdS )InPlaceAssignmentNoder  rJ  c                 C   r3  r|   r  r  r   r1   r1   r2   r   (  r5  z*InPlaceAssignmentNode.analyse_declarationsc                 C   sn   | j || _ | j|| _| jjs| jjr"| j | jj|| _ | S | jjjr5| j	dv r5| j t
j|| _ | S )Nz+-)rJ  rn   r  rp   is_memview_indexis_buffer_accessr  rN  	is_stringrz  r	   r  r   r1   r1   r2   rn   +  s   z#InPlaceAssignmentNode.analyse_typesc                 C   s
  | | j | j| j}}|| || | j}|dkr!d}n
|dkr+t| jd |js1|j	rW|j
jr;t| jd |dv rO|j
jrO|jjd sOt| jd |||| n|jrat| jd	 n|d
| || f  || || || || d S )Nz///z**zNo C inplace power operatorzAIn-place operators not allowed on object buffers in this release.)r  %	cdivisionz;In-place non-c divide operators not allowed on int buffers.z4Inplace operators not supported on memoryview slicesz
%s %s= %s;)r  r6   r  rJ  r
   generate_subexpr_evaluation_coderz  r   r  r  rN  r]  ry  r   r   generate_buffer_setitem_codeis_memview_slicerM   r   generate_subexpr_disposal_codefree_subexpr_tempsr  r  )r   rR   r  rJ  c_opr1   r1   r2   r   7  s,   




z-InPlaceAssignmentNode.generate_execution_codec                 C   r  r|   r  r   r1   r1   r2   r   R  r  zInPlaceAssignmentNode.annotatec                 C   s$   ddl m} || j| j| j| jS r  )r   ru  
binop_noder6   rz  r  rJ  r  r1   r1   r2   create_binop_nodeV  s   z'InPlaceAssignmentNode.create_binop_nodeN)	r+   r,   r-   r   r   rn   r   r   r  r1   r1   r1   r2   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_tuplerK   c                 C   sd   | j r| j |}||| _ | j|}||| _|t t| jjdkr0| jr0|t	 | S )Nr   )
rK   ro   coerce_to_pyobjectr  rN  printing_utility_coderE   rO   append_newlineprinting_one_utility_code)r   r   rK   r  r1   r1   r2   ro   d  s   

z!PrintStatNode.analyse_expressionszPython print statementc              	   C   s   | | j | jr| j| | j }nd}t| jjdkrH| jrH| jjd }|| |	d|| |
| jf  || || n%| j| |	d|| j | j|
| jf  | j| | j| | jr~| j| | j| d S d S )Nr  r   r   z"if (__Pyx_PrintOne(%s, %s) < 0) %sz#if (__Pyx_Print(%s, %s, %d) < 0) %s)r  r6   rK   r
  r=  rE   r  rO   r  rM   r  r  r  )r   rR   stream_resultr  r1   r1   r2   r   r  s@   



z%PrintStatNode.generate_execution_codec                 C   s&   | j r
| j || | j|| d S r|   )rK   r   r  r  r1   r1   r2   r     s   z+PrintStatNode.generate_function_definitionsc                 C   s"   | j r	| j | | j| d S r|   )rK   r   r  r   r1   r1   r2   r     s   zPrintStatNode.annotateN)r+   r,   r-   r   ro   r   r   r   r   r   r   r   r1   r1   r1   r2   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 )
ExecStatNoderO   c                 C   sB   t | jD ]\}}||}||}|| j|< q|tj | S r|   )r  rO   ro   r  rN  r   pyexec_utility_coder   r   r  r  r1   r1   r2   ro     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  r6   rO   r
  r  r=  r  rE   r  r  r	   r
   rM   r  r  r  r  r  r  )r   rR   rO   r  temp_resultr1   r1   r2   r     s"   

 

z$ExecStatNode.generate_execution_codec                 C   r  r|   rO   r   r  r1   r1   r2   r     r  zExecStatNode.annotateN)r+   r,   r-   r   ro   r   r   r   r   r   r   r1   r1   r1   r2   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 )DelStatNoderO   Fc                 C   r  r|   )rO   r  r  r1   r1   r2   r     r  z DelStatNode.analyse_declarationsc                 C   s   t | jD ]S\}}||d  }| j|< |jjs|jr-|jjr-|jr,|jjr,t	|j
d q|jjr<|jjjr<| | q|jjrGt	|j
d q|jrR|jjtju rRqt	|j
d q| S )NzDeletion of global C variablezDeletion of non-heap C++ objectz&Deletion of non-Python, non-C++ object)r  rO   r  rN  r]  r   r  r  
is_cglobalr   r6   rF  rO  rq  r   rD  rV  r   bytearray_typer  r1   r1   r2   ro     s   zDelStatNode.analyse_expressionsc                 C   s    | j D ]
}|jjr|   qd S r|   )rO   rN  r]  r   r  r1   r1   r2   r     s
   
zDelStatNode.nogil_checkzDeleting Python objectc                 C   s   | | j | jD ]>}|jjs|jjs|jr&|jjtj	u r&|j
|| jd q	|jjrG|jjjrG|| |d|   || || q	d S )N)ignore_nonexistingz
delete %s;)r  r6   rO   rN  r]  r  rD  rV  r   r  generate_deletion_coder  rF  rO  rq  r
  rM   r   r  r  r  r1   r1   r2   r     s$   



z#DelStatNode.generate_execution_codec                 C   r  r|   r  r  r1   r1   r2   r     r  zDelStatNode.annotateN)r+   r,   r-   r   r  r   ro   r   r   r   r   r1   r1   r1   r2   r    s    r  c                   @   s    e Zd Zg Zdd Zdd ZdS )rB  c                 C   r  r|   r1   r   r1   r1   r2   ro     r   z PassStatNode.analyse_expressionsc                 C   s    |j jd r|| j d S d S )Nr  )r   r   r  r6   r   r1   r1   r2   r     s   z$PassStatNode.generate_execution_codeN)r+   r,   r-   r   ro   r   r1   r1   r1   r2   rB    s    rB  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  )rc   r   r6   r1  rk   r1   r2   r     s   zIndirectionNode.__init__)r+   r,   r-   rx   r   rl   r1   r1   rk   r2   r    s    r  c                   @   r7  )BreakStatNodeTc                 C   r  r|   r1   r   r1   r1   r2   ro     r   z!BreakStatNode.analyse_expressionsc                 C   s2   | | j |jst| jd d S ||j d S )Nzbreak statement not inside loop)r  r6   break_labelr   r]  r   r1   r1   r2   r     s   z%BreakStatNode.generate_execution_codeNr+   r,   r-   r   r   ro   r   r1   r1   r1   r2   r    
    r  c                   @   r7  )ContinueStatNodeTc                 C   r  r|   r1   r   r1   r1   r2   ro   +  r   z$ContinueStatNode.analyse_expressionsc                 C   s2   |j st| jd d S || j ||j  d S )Nz"continue statement not inside loop)continue_labelr   r6   r  r]  r   r1   r1   r2   r   .  s
   z(ContinueStatNode.generate_execution_codeNr  r1   r1   r1   r2   r  &  r  r  c                   @   sV   e Zd ZdgZdZdZdZdZdd Zdd Z	dZ
d	d
 Zdd Zdd Zdd ZdS )r  r   TFc                 C   s   |j }|| _ |st| jd | S | jrT| jrt| jd | j|| _|js)|jr2t| jjd | S | j|j || _|j	d sE|j	d rR|j
sR||rR|| | S |jsc|j
sc|jsct| jd | S )Nz!Return not inside a function bodyz$Return with value in async generatorz"Return with value in void functionr  r  zReturn value required)r  r   r6   r   in_async_genrn   rI  rv  r  r   r]  can_coerce_to_pyobjectr  )r   r   r  r1   r1   r2   ro   F  s0   
z"ReturnStatNode.analyse_expressionsc                 C   s   | j jr
|   d S d S r|   )r  r]  r   r   r1   r1   r2   r   ^  r   zReturnStatNode.nogil_checkzReturning Python objectc                 C   sb  | | j | jsd S | j}| jjr!|tj| j |r!|jr!d }|re|	| | jj
rGddlm} |jtj| j|j||| jd || n|| |dtj|| jf  || || n| jjrr|tj| j n| jjr~| || jj |jjd s|jjd r|jtj| j| j|jj d |j D ]
\}}||| q||j  d S )Nr   rB  )	lhs_cnamelhs_typelhs_posrJ  rR   r  r  r  r  r  )!r  r6   r  r   r]  ra  r   r7  r   r
  r  r   rC  put_acquire_memoryviewslicer   r  r  rM   r  r  rY  rv  
put_returnr  r   r   rZ  r  r  temps_holding_referencer  r]  r^  )r   rR   r   rC  r  rN  r1   r1   r2   r   d  sT   




z&ReturnStatNode.generate_execution_codec                 C   s(   | j r|d |dtj|f  d S )Nz%#pragma omp critical(__pyx_returning)r  )in_parallelputln_openmprM   r   r7  )r   rR   r   r1   r1   r2   r    s   
zReturnStatNode.put_returnc                 C   s    | j d ur| j || d S d S r|   )r   r   r  r1   r1   r2   r     s   
z,ReturnStatNode.generate_function_definitionsc                 C   r  r|   )r   r   r   r1   r1   r2   r     r  zReturnStatNode.annotateN)r+   r,   r-   r   r   in_generatorr  r  ro   r   r   r   r  r   r   r1   r1   r1   r2   r  6  s    3r  c                   @   sN   e Zd Zg dZdZdZdZdZdd Ze	j
ZdZdd	 Zd
d Zdd ZdS )RaiseStatNode)exc_type	exc_valueexc_tbcauseTNFc           
      C   s  | j r| j |}||| _ | jrD| j|}| jr>|jtju s%|jjs>ddl	m
} ||j||gdd}|j|dd}||| _| jrS| j|}||| _| jrb| j|}||| _| j r| js| js| j }ddlm	} t||jr|js|jd ur|jjs|j}|jr|jjrddlm}	 |j| _| jdkrd | _ | S | jd	kr|jr|jd
kr|jr|jjr| jsd | _ | S )Nr   rm  T)rO   slow)skip_childrenr  )SymtabMemoryErrorStopIteration__next__)r  rn   r  r  wrap_tuple_valuerN  r   
tuple_typer  ru  rn  r6   r  r  r   rF   r  rO   r  r  r   r  
is_builtinr  rf   builtin_exc_nameis_local_scoper  r  in_try_block)
r   r   r  r  rn  r  r  excru  r  r1   r1   r2   ro     sV   



z!RaiseStatNode.analyse_expressionsRaising exceptionc                 C   sz  | | j | jdkr|d|| j  d S | jdkr8| js8|dtj  |d|d   d|j_	d S | jrS| j
| | j }| jjrR|j| jj nd}| jrd| j
| | j }nd}| jru| j
| | j }nd}| jr| j
| | j }nd}|jt |d||||f  | j| j| j| jfD ]}|r|| || q||| j d S )	Nr  zPyErr_NoMemory(); %sr  z%s = 1;rH  Tr  z__Pyx_Raise(%s, %s, %s, %s);)r  r6   r  rM   r  r  r   rj  r  ri  r
  r=  r   r   r
  r  r  r  r  rN  raise_utility_coder  r  )r   rR   	type_code
value_codetb_code
cause_coder  r1   r1   r2   r     sZ   




z%RaiseStatNode.generate_execution_codec                 C   sh   | j d ur| j || | jd ur| j|| | jd ur$| j|| | jd ur2| j|| d S d S r|   )r  r   r  r  r  r  r1   r1   r2   r     s   



z+RaiseStatNode.generate_function_definitionsc                 C   sP   | j r	| j | | jr| j| | jr| j| | jr&| j| d S d S r|   )r  r   r  r  r  r   r1   r1   r2   r     s   zRaiseStatNode.annotate)r+   r,   r-   r   r   r  r  r  ro   r   r   r   r   r   r   r   r1   r1   r1   r2   r    s    *0
r  c                   @   s.   e Zd Zg ZdZdd ZejZdZ	dd Z
dS )ReraiseStatNodeTc                 C   r  r|   r1   r   r1   r1   r2   ro   -  r   z#ReraiseStatNode.analyse_expressionsr  c                 C   s   | | j |jj}|rA|jt ||d t ||d t |	|d t |
dt|  |
ddd |D  n|jtdd	 |
d
 | r\|j| jdd |
|| j d S )Nr   r   r%   &__Pyx_ErrRestoreWithState(%s, %s, %s);rB   c                 S   s   g | ]}| d qS )z = 0; r1   )r   varnamer1   r1   r2   r   =  r   z;ReraiseStatNode.generate_execution_code.<locals>.<listcomp>ReRaiseExceptionExceptions.cz__Pyx_ReraiseException();Treraise)r  r6   r  exc_varsr   rN  rb  r  r
   rx  rM   r  r   r   r%  r$  put_trace_exceptionr  )r   rR   r_  r1   r1   r2   r   3  s    

z'ReraiseStatNode.generate_execution_codeN)r+   r,   r-   r   r   ro   r   r   r   r   r   r1   r1   r1   r2   r  (  s    r  c                   @   s@   e Zd Zg dZdZdd Zdd Zdd Zd	d
 Zdd Z	dS )AssertStatNode)	conditionr   	exceptionNc                 C   s4   | j d u s	J d| jd usJ d| j| d S )Nz0Message should have been replaced in PostParse())r   r  r   r   r1   r1   r2   r   Q  s   z#AssertStatNode.analyse_declarationsc                 C       | j || _ | j|| _| S r|   )r  analyse_temp_boolean_expressionr  ro   r   r1   r1   r2   ro   V     z"AssertStatNode.analyse_expressionsc                 C   s   |j tdd |d |d || j | j| |d| j	   | j
| |d | j| | j| |d |d |d|j| jd	d
  |d d S )NAssertionsEnabledr  z!#ifndef CYTHON_WITHOUT_ASSERTIONSz+if (unlikely(__pyx_assertions_enabled())) {r  r  r  zif ((1)); else %sFr  r  )r   rN  r   r%  rM   r  r6   r  r
  r   r  r   r  r  r  r   r1   r1   r2   r   [  s,   



z&AssertStatNode.generate_execution_codec                 C       | j || | j|| d S r|   )r  r   r  r  r1   r1   r2   r   p     z,AssertStatNode.generate_function_definitionsc                 C   r  r|   )r  r   r  r   r1   r1   r2   r   t  r  zAssertStatNode.annotate)
r+   r,   r-   r   r  r   ro   r   r   r   r1   r1   r1   r2   r  G  s    r  c                   @   r  )
IfStatNode
if_clauseselse_clausec                 C   0   | j D ]}|| q| jr| j| d S d S r|   )r  r   r  )r   r   	if_clauser1   r1   r2   r     
   
zIfStatNode.analyse_declarationsc                    s.    fdd| j D | _ | jr| j | _| S )Nc                    r  r1   r  )r   r  r  r1   r2   r     r   z2IfStatNode.analyse_expressions.<locals>.<listcomp>)r  r  ro   r   r1   r  r2   ro     s   zIfStatNode.analyse_expressionsc                 C   s   | | j | }t| j}| js|d8 }t| jD ]\}}|j||||kd q| jrD| | jj |d | j| |d |	| d S )Nr   )is_last
/*else*/ {r  )
r  r6   r(  rE   r  r  r  r   rM   r_  )r   rR   r  lastr  r  r1   r1   r2   r     s   


z"IfStatNode.generate_execution_codec                 C   s8   | j D ]}||| q| jd ur| j|| d S d S r|   )r  r   r  )r   r   rR   clauser1   r1   r2   r     s
   

z(IfStatNode.generate_function_definitionsc                 C   r  r|   )r  r   r  )r   rR   r  r1   r1   r2   r     r  zIfStatNode.annotateNr  r1   r1   r1   r2   r
  y  s    r
  c                   @   s@   e Zd ZddgZdZdd Zdd Zdd	 Zd
d Zdd Z	dS )IfClauseNoder  r   Nc                 C   r3  r|   )r   r   r   r1   r1   r2   r     r5  z!IfClauseNode.analyse_declarationsc                 C   r  r|   )r  r  r   ro   r   r1   r1   r2   ro     r  z IfClauseNode.analyse_expressionsc                 C   s   | j | || j | j  }| jrd| j|f }|d|  | j | | j | | j	
| |j| jdd |sG| j	jsG|| |d d S )Nz%s(%s)r  Fr  r  )r  r
  r  r6   r   branch_hintrM   r  r  r   r   r   r]  )r   rR   r  r  r  r1   r1   r2   r     s   

z$IfClauseNode.generate_execution_codec                 C   r  r|   )r  r   r   r  r1   r1   r2   r     r	  z*IfClauseNode.generate_function_definitionsc                 C   r  r|   )r  r   r   r   r1   r1   r2   r     r  zIfClauseNode.annotate)
r+   r,   r-   r   r  r   ro   r   r   r   r1   r1   r1   r2   r    s    r  c                   @   s4   e Zd ZddgZdd Zdd Zdd Zd	d
 ZdS )SwitchCaseNode
conditionsr   c                 C   r  r|   )r  r
  r   rR   r  r1   r1   r2   "generate_condition_evaluation_code  r  z1SwitchCaseNode.generate_condition_evaluation_codec                 C   s   t | j}|jjd }t| jdD ]\}}|d|   ||j |r/||k r/|d q| j	
| |j| jdd |d d S )Nr  r   zcase %s:r  Fr  r   )rE   r  r   r   r  rM   r   r  r6   r   r   )r   rR   num_conditionsline_tracing_enabledr  r  r1   r1   r2   r     s   

z&SwitchCaseNode.generate_execution_codec                 C   s*   | j D ]}||| q| j|| d S r|   )r  r   r   )r   r   rR   r  r1   r1   r2   r        
z,SwitchCaseNode.generate_function_definitionsc                 C   s&   | j D ]}|| q| j| d S r|   )r  r   r   r  r1   r1   r2   r     s   
zSwitchCaseNode.annotateN)r+   r,   r-   r   r  r   r   r   r1   r1   r1   r2   r    s    r  c                   @   s,   e Zd Zg dZdd Zdd Zdd ZdS )	SwitchStatNode)testcasesr  c                 C   s   | j | | jD ]}|| q	|| j |d| j    | jD ]}|| q$| j	d urB|d | j	| |d n|d |d | j 
| | j | d S )Nr,  r  r   zdefault: break;r  )r  r
  r  r  r  r6   rM   r   r   r  r  r  r   rR   caser1   r1   r2   r     s   





z&SwitchStatNode.generate_execution_codec                 C   F   | j || | jD ]}||| q
| jd ur!| j|| d S d S r|   )r  r   r  r  )r   r   rR   r!  r1   r1   r2   r        

z,SwitchStatNode.generate_function_definitionsc                 C   s@   | j | | jD ]}|| q	| jd ur| j| d S d S r|   )r  r   r  r  r   r1   r1   r2   r     s   

zSwitchStatNode.annotateN)r+   r,   r-   r   r   r   r   r1   r1   r1   r2   r    s
    r  c                   @   r  )LoopNodeNr  r1   r1   r1   r2   r$  %  r  r$  c                   @   s<   e Zd Zg dZdd Zdd Zdd Zdd	 Zd
d ZdS )WhileStatNode)r  r   r  c                 C   s&   | j | | jr| j| d S d S r|   )r   r   r  r   r1   r1   r2   r   2     z"WhileStatNode.analyse_declarationsc                 C   s:   | j r
| j || _ | j|| _| jr| j|| _| S r|   )r  r  r   ro   r  r   r1   r1   r2   ro   7  s   z!WhileStatNode.analyse_expressionsc                 C   s   | | j | }|d | jr.| j| | j| |d| j   | j| | j	
| ||j |d |j}|| | jra| | jj |d | j
| |d || d S )Nzwhile (1) {zif (!%s) break;r  r  )r  r6   new_loop_labelsrM   r  r
  r  r   r  r   r   r_  r  r  set_loop_labelsr  )r   rR   old_loop_labelsr  r1   r1   r2   r   ?  s.   



z%WhileStatNode.generate_execution_codec                 C   sB   | j r
| j || | j|| | jd ur| j|| d S d S r|   )r  r   r   r  r  r1   r1   r2   r   V  s   
z+WhileStatNode.generate_function_definitionsc                 C   s8   | j r	| j | | j| | jr| j| d S d S r|   )r  r   r   r  r   r1   r1   r2   r   ]  s   zWhileStatNode.annotateNr  r1   r1   r1   r2   r%  )  s    r%  c                   @   sL   e Zd Zg dZd ZZd ZZd ZZ	dd Z
dd Zdd Zd	d
 ZdS )DictIterationNextNode)
dict_objexpected_sizepos_index_varcoerced_key_varcoerced_value_varcoerced_tuple_var
key_targetvalue_targettuple_targetis_dict_flagNc                 C   s(   t j| |j|||||||dtjd d S )NT)	r+  r,  r-  r1  r2  r3  r4  is_temprN  r   r   r6   r	   c_bint_type)r   r+  r,  r-  r1  r2  r3  r4  r1   r1   r2   r   q  s   
zDictIterationNextNode.__init__c                 C   s  ddl m} | j|| _| j|| _| jr| j|| _| jr<| j|| _|| jj	t
j| _| j| jj|| _| jr[| j|| _|j| jj	t
jd| _| j| jj|| _| jry| j|| _|| jj	t
j| _| j| jj|| _| j|| _| S Nr   r  r&  )r   ru  r+  rn   r,  r-  r1  rp   TempNoder6   r	   r
   key_refr  rN  r.  r2  	value_refr/  r3  	tuple_refr0  r4  r   r   ru  r1   r1   r2   ro     s&   z)DictIterationNextNode.analyse_expressionsc                 C   r0  r|   )r+  r   r  r1   r1   r2   r     r2  z3DictIterationNextNode.generate_function_definitionsc           	      C   s  |j tdd | j| g }g }| j| j| jf| j	| j
| jf| j| j| jffD ]$\}}}|d u r7d}n||||f || d|  }|| q+|jtjd}|d|| j | j | j |d |d |d	 | j f  |d
|  ||d| | j |j| |D ]
\}}}|| q|D ]
\}}}|| q|D ]\}}}||| | | qd S )N	dict_iter
Optimize.cr  &%sFz7%s = __Pyx_dict_iter_next(%s, %s, &%s, %s, %s, %s, %s);r   r   r%   if (unlikely(%s == 0)) break;%s == -1)!r   rN  r   r%  r+  r
  r:  r.  r1  r;  r/  r2  r<  r0  r3  r  allocater   r  r  r	   r  rM   r=  r,  r-  r4  r  r6   r  generate_gotrefr  release)	r   rR   r  temp_addressesrE  r   r  addrresult_tempr1   r1   r2   r     sH   

z-DictIterationNextNode.generate_execution_code)r+   r,   r-   r   r.  r:  r/  r;  r0  r<  r   ro   r   r   r1   r1   r1   r2   r*  e  s    r*  c                   @   s<   e Zd Zg dZd ZZdd Zdd Zdd Zd	d
 Z	dS )SetIterationNextNode)set_objr,  r-  r/  r2  is_set_flagNc                 C   s$   t j| |j|||||dtjd	 d S )NT)rJ  r,  r-  r2  rK  r5  rN  r6  )r   rJ  r,  r-  r2  rK  r1   r1   r2   r     s   
zSetIterationNextNode.__init__c                 C   s   ddl m} | j|| _| j|| _| j|| _| j|| _|j| jj	t
jd| _| j| jj|| _| j|| _| S r8  )r   ru  rJ  rn   r,  r-  r2  rp   r9  r6   r	   r
   r;  r  rN  r/  rK  r=  r1   r1   r2   ro     s   z(SetIterationNextNode.analyse_expressionsc                 C   r0  r|   )rJ  r   r  r1   r1   r2   r     r2  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 )Nset_iterr?  Fz/%s = __Pyx_set_iter_next(%s, %s, &%s, &%s, %s);rA  rB  )r   rN  r   r%  rJ  r
  r;  rC  r  r  r	   r  rM   r=  r,  r   r-  rK  r  r6   r  rD  r/  r2  r  rE  )r   rR   r;  rH  r1   r1   r2   r     s(   

z,SetIterationNextNode.generate_execution_code)
r+   r,   r-   r   r/  r;  r   ro   r   r   r1   r1   r1   r2   rI    s    rI  c                 K   sB   d|v r|d j rt| fi |S t| fi |S t| fi |S )Niterator)is_asyncAsyncForStatNodeForInStatNodeForFromStatNode)r6   r   r1   r1   r2   ForStatNode  s
   
rR  c                   @   sL   e Zd Zg dZdZdZdd Zdd Zdd	 Zd
d Z	dd Z
dd ZdS )_ForInStatNode)r  r   rM  r   r  NFc                 C   s   t d)Nz!must be implemented by subclasses)NotImplementedErrorr   r1   r1   r2   _create_item_node  r  z _ForInStatNode._create_item_nodec                 C   s6   | j | | j| | jr| j| |   d S r|   )r  r  r   r   r  rU  r   r1   r1   r2   r     s
   z#_ForInStatNode.analyse_declarationsc                 C   s   | j || _ | j|| _|   | j|| _| js0| jjjs&| jjj	r0| j j
| jjr0n
| j| j j|| _| j|| _| jrK| j|| _| S r|   )r  rp   rM  ro   rU  r   rN  rN  rF  rG  r  r  r   r  r   r1   r1   r2   ro     s"   z"_ForInStatNode.analyse_expressionsc                 C   sT  | | j | }| j| |d | j| |d | j| | j	
| j| || j | j| | | j ||j |d | j| | jrY|dnd }|d}|j|jg|g|pj|| jd}| | j |D ]}| j| qw|| | j| | jr|d || | j| |d || d S )Nr  r  r  for_elsefor_end)skip_to_labelr6   r  )r  r6   r'  rM  r
  r.  generate_for_loop_headerrM   r   r  r  write_trace_liner   r   r_  r  r  r  r(  label_interceptorr  r(  r  )r   rR   r)  
else_labelr  label_interceptsrv  r1   r1   r2   r   0  sB   







z&_ForInStatNode.generate_execution_codec                 C   sJ   | j || | j|| | j|| | jd ur#| j|| d S d S r|   )r  r   rM  r   r  r  r1   r1   r2   r   Z  s   
z,_ForInStatNode.generate_function_definitionsc                 C   sF   | j | | j| | j| | jr| j| | j| d S r|   )r  r   rM  r   r  r   r   r1   r1   r2   r   a  s   z_ForInStatNode.annotate)r+   r,   r-   r   r   rN  rU  r   ro   r   r   r   r1   r1   r1   r2   rS    s    
*rS  c                   @      e Zd ZdZdd ZdS )rP  Fc                 C   s   ddl m} || j| _d S )Nr   )NextNode)ru  r_  rM  r   )r   r_  r1   r1   r2   rU  o  r  zForInStatNode._create_item_nodeN)r+   r,   r-   rN  rU  r1   r1   r1   r2   rP  j  s    rP  c                   @   s    e Zd ZdZdd Zdd ZdS )rO  Tc                 K   sH   d|vsJ ddl m} |j|d jd d|d< tj| |fi | d S )Nr   r   r  rM  )r  )r   ru  AwaitIterNextExprNoder6   rS  r   )r   r6   r   ru  r1   r1   r2   r   |  s   zAsyncForStatNode.__init__c                 C   s    ddl m} || j| j_d S r  )r   ru  AsyncNextNoderM  r   r  r  r1   r1   r2   rU    s   z"AsyncForStatNode._create_item_nodeN)r+   r,   r-   rN  r   rU  r1   r1   r1   r2   rO  t  s    rO  c                   @   sn   e Zd Zg dZdZdZdZdZdZdd Z	dd Z
d	d
 Zdd Zdd ZdddddZdd Zdd ZdS )rQ  )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 r|   )r  rb  rc  rN  r]  r   )r   r   r   r1   r1   r2   r     s
   zForFromStatNode.nogil_checkc                 C   s2   | j | | j| | jr| j| d S d S r|   )r  r  r   r   r  r   r1   r1   r2   r     s
   z$ForFromStatNode.analyse_declarationsc                 C   s   ddl m} | j|| _| j|| _| j|| _| jd ur6t| j|j	r/t
| jjdd | j|| _| | | jj}|jsL|jsLt| jjd | j|| _| jr]| j|| _| S )Nr   r  zdProbable infinite loop in for-from-by statement. Consider switching the directions of the relations.r%   z>for-from loop variable must be c numeric type or Python object)r   ru  r  rp   rb  rn   rc  rd  rF   UnaryMinusNoder   r6   set_up_looprN  r]  r6  r   r   ro   r  )r   r   ru  rn  r1   r1   r2   ro     s$   


z#ForFromStatNode.analyse_expressionsc                 C   st  ddl m} | jj}|jr|}n?|jrt| jjd |jr t	j
nt	j}| jjjs0t	|| jj}| jjjs=t	|| jj}| jd urO| jjjsOt	|| jj}| j||| _| j||| _| jjsj| j|| _| jd ur| j||| _| jjs| j|| _|js|jrd| _t| j|jrt| jd| j| _d | _d S d| _|| j||}|| _|||| _d S )Nr   r  zWInteger loops over enum values are fragile. Please cast to a safe integer type instead.FzEBuffer or memoryview slicing/indexing not allowed as for-loop target.T)r   ru  r  rN  r6  is_enumr   r6   r]  r	   c_long_typer  rb  widest_numeric_typerc  rd  r  r   rq  is_py_targetrF   BufferIndexNoder   loopvar_nodepy_loopvar_noder9  r  r  )r   r   ru  rn  	loop_typec_loopvar_noder1   r1   r2   rf    sB   



zForFromStatNode.set_up_loopc                 C   s  | | j | }| j}| j| | j| | j| j \}}| j	d ur:| j	| | j	
 }d|d |f }nd}ddlm} t| j|jrO| j| t| j|jr\| j| | jjjrdtjn| jj}|ru| jsu|j|d}	n| j
 }	|jr|js| jd dkr|d|	| j
 |||	| j| j
 ||	|f
  n|d	|	| j
 ||	| j| j
 |	|f  | j}
|
d u r|r|| jj||	}
|
d ur|
| | j|
| | | j | j!"| |#|j$ |sx| jrx| jj%j&rM|'| jjd }|| |(| jj%j)}| jj%j*j+r |j,-t./d
d d}n|j,-t./dd d0| jj%j*j1}|||
 ||2|
 | jjf  |3| n| j}|4| jj|| jj%j*}|	|_5|6| | jj%j&rx|7|
 |j |8| |d |s| jr| j| | j| j| |r| js|j9|	 |j:}|;| | j<r|d | j<"| |d |#| | j=| | j>| | j=| | j>| t| j|jr| j8| t| j|jr| j8| | j	d ur| j	=| | j	>| d S d S )Nz%s=%sr   1r   r  F>z-for (%s = %s%s + %s; %s %s %s + %s; ) { %s%s;z!for (%s = %s%s; %s %s %s; %s%s) {GetModuleGlobalNamer{  z%__Pyx_GetModuleGlobalName(%s, %s); %sGetNameInClassz$__Pyx_GetNameInClass(%s, {}, %s); %sr  r  )?r  r6   r'  
from_rangerb  r
  rc  relation_table	relation1rd  r   r   ru  rF   rl  r9  rC  rm  r  rN  rg  r	   rh  rj  r  r  ry  r,  	relation2rM   rt  r  rZ  r   r   r_  r  r  is_pyglobal
PyTempNoder  rf   r  r  r   rN  r   r%  r  r  r  rD  CoerceFromPyTypeNode	temp_coder<  rw  rE  r  r  r(  r  r  r  )r   rR   r)  rt  offsetincoprd  ru  loopvar_typeloopvar_namecoerced_loopvar_nodetarget_nodeinterned_cnamelookup_funcfrom_py_noder  r1   r1   r2   r     s   

















z'ForFromStatNode.generate_execution_code)r   ++)z+1r  )r   --)z-1r  )z<=r  z>=rq  c                 C   sp   | j || | j|| | j|| | jd ur!| j|| | j|| | jd ur6| j|| d S d S r|   )r  r   rb  rc  rd  r   r  r  r1   r1   r2   r   c  s   

z-ForFromStatNode.generate_function_definitionsc                 C   s\   | j | | j| | j| | jr| j| | j| | jr,| j| d S d S r|   )r  r   rb  rc  rd  r   r  r   r1   r1   r2   r   m  s   zForFromStatNode.annotate)r+   r,   r-   r   rj  rl  rm  rt  r   r   r   ro   rf  r   ru  r   r   r1   r1   r1   r2   rQ    s&    &t
rQ  c                   @   s@   e Zd ZdZg dZdZdZdd Zdd Zdd	 Z	d
d Z
dS )WithStatNodea  
    Represents a Python with statement.

    Implemented by the WithTransform as follows:

        MGR = EXPR
        EXIT = MGR.__exit__
        VALUE = MGR.__enter__()
        EXC = True
        try:
            try:
                TARGET = VALUE  # optional
                BODY
            except:
                EXC = False
                if not EXIT(*EXCINFO):
                    raise
        finally:
            if EXC:
                EXIT(None, None, None)
            MGR = EXIT = VALUE = None
    )manager
enter_callr  r   Nc                 C   s(   | j | | j| | j| d S r|   )r  r   r  r   r   r1   r1   r2   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   )r9  )r  rn   rN  is_cython_lock_typeCythonLockStatNodefrom_withstatro   r  r  ru  r9  r6   target_tempr   )r   r   r9  r1   r1   r2   ro     s   
z WithStatNode.analyse_expressionsc                 C   s.   | j || | j|| | j|| d S r|   )r  r   r  r   r  r1   r1   r2   r     s   z*WithStatNode.generate_function_definitionsc              
   C   s  | | j |d | j| |jjtdd| _|j	
tdd |d| j| j |t| jr5dnd|| j| jf  || jt | }|j}| j| | jr|| j| | j| |d	| j | j f  | j| n| j| | j| | j| | j| ||_| j| | |r|! }|"| |#| |$| jt |"| |#| |j%| j |d
 d S )Nz/*with:*/ {Fr  PyObjectLookupSpecialr{  z-%s = __Pyx_PyObject_LookupSpecial(%s, %s); %s	__aexit____exit__r  r  )&r  r6   rM   r  r
  r  r  r
   exit_varr   rN  r   r%  r=  r  r   rN  r  r  r  r\  r  r  r  rC  r  r   r  r  r  r   r   r[  r(  r]  r_  r  r  )r   rR   r  intermediate_error_labelstep_over_labelr1   r1   r2   r     sJ   






z$WithStatNode.generate_execution_code)r+   r,   r-   rx   r   r  r  r   ro   r   r   r1   r1   r1   r2   r  x  s    r  c                   @   s<   e Zd ZddgZdZdZdd Zdd Zdd	 Zd
d Z	dS )WithTargetAssignmentStatNoderJ  r  Nc                 C   r3  r|   r  r   r1   r1   r2   r     r5  z1WithTargetAssignmentStatNode.analyse_declarationsc                 C   s4   | j || _ | j | | jj| j j|| _| S r|   )r  rp   ri  	with_noder  r  rN  rJ  r   r1   r1   r2   ro     s   z0WithTargetAssignmentStatNode.analyse_expressionsc                 C   s.   | j | | j| j | | jj| d S r|   )rJ  r
  r  r  r  r  rE  r   r1   r1   r2   r     s   z4WithTargetAssignmentStatNode.generate_execution_codec                 C   r  r|   r  r   r1   r1   r2   r     r  z%WithTargetAssignmentStatNode.annotate)
r+   r,   r-   r   r  rJ  r   ro   r   r   r1   r1   r1   r2   r    s    
r  c                   @   sJ   e Zd Zg dZdZdd Zdd ZejZ	dZ
dd	 Zd
d Zdd ZdS )TryExceptStatNode)r   except_clausesr  Fc                 C   <   | j | | jD ]}|| q	| jr| j| d S d S r|   )r   r   r  r  )r   r   except_clauser1   r1   r2   r         
z&TryExceptStatNode.analyse_declarationsc                 C   sr   | j || _ d}t| jD ]\}}|| }| j|< |r$t|jd |js)d}q|| _| jr7| j|| _| S )Nr   zdefault 'except:' must be lastr   )	r   ro   r  r  r   r6   patternhas_default_clauser  )r   r   default_clause_seenr  r  r1   r1   r2   ro      s   z%TryExceptStatNode.analyse_expressionszTry-except statementc                    s~    | j  d  j} j} j}  } j} d} d} d}	 d}
|r6 dnd }|r? dnd } d} fd	d
t	dD  
 } d |
 _| _| _| j   j | jdd  d  j } |}|r jt | js|d |d |dddd
 D   D ]}||t q fdd}ndd
 D }|dd|  dd }| _|	 _| jj}| jr  | jj  d | j   d |s| jj}|rJ|sD ]} |t q |  | |D ]\}} || q  r(    jj}|  j_| jD ]	}|  | q3| j_| j!sJ |  j"||||
|	g|||||g|sc |sc|nd | jdd}|D ]	}|rt|  ql |r|s |s |  | |r|   |r |  d D ]	} j#| q| _| _| _| _d S )Nr  exception_handledexcept_errorexcept_return
try_return	try_breaktry_continuetry_endc                    s   g | ]	} j td qS r'  r  r  r
   r   rv  r  r1   r2   r   5   r  z=TryExceptStatNode.generate_execution_code.<locals>.<listcomp>r   
/*try:*/ {Fr  r  r  r  z__Pyx_ExceptionSave(%s);r   c                 S      g | ]}d | qS )r@  r1   rU  r1   r1   r2   r   K   r  c                     s.   D ]}   | t q dd  d S )Nz__Pyx_ExceptionReset(%s);r   )rx  r
   rM   r   r?  rR   exc_save_varsr1   r2   restore_saved_exceptionO   s
   
zJTryExceptStatNode.generate_execution_code.<locals>.restore_saved_exceptionc                 S   r  )z	(void)%s;r1   rU  r1   r1   r2   r   W   r  z%s /* mark used */rB   c                   S   r   r|   r1   r1   r1   r1   r2   r  Z   r   z/*else:*/ {)rX  r6   r  )$r  r6   rM   r^  r  r  r  r\  r(  r  rI   r   r   r  all_free_managed_tempsr[  r   rN  reset_exception_utility_coder  r   put_xgotrefr
   r   r  rf  r]  r_  r$  rf  current_exceptr  generate_handling_coder  r[  r  )r   rR   old_return_labelold_break_labelold_continue_labelr  r  except_end_labelexcept_error_labelexcept_return_labeltry_return_labeltry_break_labeltry_continue_labeltry_end_labelsave_exctemps_to_clean_up	can_raiserE  r  mark_vars_usednormal_case_terminates	temp_name	temp_typeouter_exceptr  r]  rv  r  r1   r  r2   r   $   s   




















z)TryExceptStatNode.generate_execution_codec                 C   r"  r|   )r   r   r  r  )r   r   rR   r  r1   r1   r2   r      r#  z/TryExceptStatNode.generate_function_definitionsc                 C   r  r|   )r   r   r  r  )r   rR   except_noder1   r1   r2   r      r  zTryExceptStatNode.annotateN)r+   r,   r-   r   r  r   ro   r   r   r   r   r   r   r   r1   r1   r1   r2   r     s    zr  c                   @   sX   e Zd Zg dZdZdZdZdd Zdd Zdd	 Z	d
d Z
dd Zdd Zdd ZdS )ExceptClauseNode)r  r  r   r  NFc                 C   sB   | j r| j | ddlm} || j| || _| j| d S )Nr   )ExcValueNode)	r  r  ru  r  r6   infer_exception_typer  r   r   )r   r   r  r1   r1   r2   r      s
   z%ExceptClauseNode.analyse_declarationsc                 C   sf   |j | _| jrt| jD ]\}}||}||| j|< q| jr*| j|| j| _| j	|| _	| S r|   )
rl  r  r  r  ro   r  r  r  r  r   )r   r   r  r  r1   r1   r2   ro      s   
z$ExceptClauseNode.analyse_expressionsc                 C   sR   | j r$t| j dkr$| j d }|jr$||j}|r$|jr$|jjr$|jS t	j
d S )Nr   r   BaseException)r  rE   r   r/  rf   r0  r  is_builtin_scoperN  r   r  )r   r   r  r  r1   r1   r2   r     s   

z%ExceptClauseNode.infer_exception_typec                 C   s   ddl m} | }|| j S )Nr   )HasNoExceptionHandlingVisitor)ParseTreeTransformsr  r   )r   r  tree_has_no_exceptionsr1   r1   r2   body_may_need_exception   s   z(ExceptClauseNode.body_may_need_exceptionc                    sR    | j | jr	tdd | jD  }|r: fddtdD } jtdd  	dt
|  |d	 nd  }| jD ]}|  qAd
d | jD }g }r jtdd t|dkrt|d|d	 |d f  n?|fdd|D  n2t|dkr jtdd |d|d	 |d f  n jtdd |dd |D   jjtjdd} 	d|d|f  | jD ]}|  |  q|r 	dt
|   	ddd |D  |D ]}	 j|	 q 	d|   j| n 	d   }
| jd up!| jd up!|  }|s(|
r. | j |
r7 | j |rk jt  fddtdD }dt
| } 	d| | jf  |D ]	}  |t! q`n jtdd  	d  |
r 	d! | jr| j"#|d  | j"  | j$| j"  | jd urt%|| jj&D ]
\}}|#| q 'd"}|rĈ jj(}| j_(| j)*  |r| j_(| j)j+s|r|D ]	} ,|t! qۈ -| |r . / |D ]} 0|d	 t!  0|d t!  ,|d t! q|D ]	}	 j|	 q 1|  	d# d S )$Nc                 s   s(    | ]}|j p| o|  V  qd S r|   )r   	is_simplerG  r   r  r1   r1   r2   r$     s
    
z:ExceptClauseNode.generate_handling_code.<locals>.<genexpr>c                       g | ]
} j jtd dqS Tr  r  r  r  r1   r2   r          z;ExceptClauseNode.generate_handling_code.<locals>.<listcomp>r   PyErrFetchRestorer  z__Pyx_ErrFetch(&%s, &%s, &%s);r   c                 S   s   g | ]}|  qS r1   )r=  r  r1   r1   r2   r      r  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)Nr1   r  )r  r1   r2   r$  !  s
    

z%__Pyx_PyErr_ExceptionMatches2(%s, %s)PyErrExceptionMatchesc                 s   s    | ]}d | V  qdS )z __Pyx_PyErr_ExceptionMatches(%s)Nr1   r  r1   r1   r2   r$  !  s
    
Fr  r  z || __Pyx_ErrRestore(%s, %s, %s);rB   c                 S   r  %s = 0;r1   rU  r1   r1   r2   r   !!  r  r  z/*except:*/ {c                    r  r  r  r  r  r1   r2   r   >!  r  z&%s, &%s, &%sz"if (__Pyx_GetException(%s) < 0) %sz__Pyx_ErrRestore(0,0,0);z__Pyx_TraceExceptionDone();except_r  )2r  r6   r  r)  r  r   rN  r   r%  rM   r  r
  rE   r  extendr  r  r	   r  r   r  r  r  r$  r  excinfo_targetr  rk  r  put_trace_exception_handledget_exception_utility_coder  r  r
   r  set_varr  r  rO   r'  r  r   r   r   rf  r]  r[  get_loop_labelsr  r(  )r   rR   r  has_non_literalsr  r  patterns	exc_tests
match_flagr  r  needs_exceptionexc_argsrE  tempvarrQ   r)  old_exc_varsrv  r1   )rR   r  r2   r     s   




















z'ExceptClauseNode.generate_handling_codec                 C   s*   | j d ur| j || | j|| d S r|   )r  r   r   r  r1   r1   r2   r   w!  r  z.ExceptClauseNode.generate_function_definitionsc                 C   s>   | j r| j D ]}|| q| jr| j| | j| d S r|   )r  r   r  r   )r   rR   r  r1   r1   r2   r   |!  s   
zExceptClauseNode.annotate)r+   r,   r-   r   r  r  is_except_asr   ro   r  r  r  r   r   r1   r1   r1   r2   r     s    
 r  c                   @   s   e Zd Zg dZdZdZdZdZdZdZ	e
dd Zdd	 Zd
d ZejZdZdd Zdd Z	dddZdddZdd Zdd ZdS )TryFinallyStatNode)r   finally_clausefinally_except_clauser   TNFc                 C   s   t | ||d}|S )Nr   r  )r  )r6   r   r   r  rQ   r1   r1   r2   r  !  r/  z"TryFinallyStatNode.create_analysedc                 C   s6   | j | t| j| _| j| | j| d S r|   )r   r   r   r   r  r  r   r1   r1   r2   r   !  s   z'TryFinallyStatNode.analyse_declarationsc                 C   sD   | j || _ | j|| _| j|| _|jr |jjs |j| _| S r|   )r   ro   r  r  r  rI  func_return_typer   r1   r1   r2   ro   !  s   z&TryFinallyStatNode.analyse_expressionszTry-finally statementc                    s    j  d  j}  }  } j}js| _  }j	   d  j
 }  jj  d  | jgffdd	}joU |}	jj }
jjsx d | 	  jjss |  d |	rW |  d js d jr   |
rt fd	d
tdD } j
jtttjdd}nd  }}t fdd
tdD }  r҈    j   ||||   } d  j
j!}|d d  j
_!j"	  | j
_! d |
r4# ||| |r|D ]	} j
$| q|r" j
$|   r/ j%jdd  |  &  |D ]	}' | q<|D ]	} j
$| qH d  |  j(}d}t)t*||D ]\}\}} |svqh||kr|	rqh d|  d }||krjjsj+rjst,jt-s j
jj+dd} d|t.j/f  j+j0r dt.j/  | 	  ||kr|r dt.j/|f  j+j0r d|   j
$| jjs |  d qh |  d d S )Nr  r  z/*finally:*/ {c                    s0   | d }t |}| ju r|| d< |S |}|S r  )r   r   r  )_nextrQ   	node_copyr   r1   r2   fresh_finally_clause!  s   

zHTryFinallyStatNode.generate_execution_code.<locals>.fresh_finally_clausez/*normal exit:*/{z/*exception exit:*/{r  c                    s   g | ]} j jtjd dqS Fr  )r  r  r	   r  r  r  r1   r2   r   !  s    z>TryFinallyStatNode.generate_execution_code.<locals>.<listcomp>r%   Fr  c                    r  r  r  r  r  r1   r2   r   !  s       r  r   Tr  r1   z%s: {r  r  )1r  r6   rM   r\  all_new_labelsget_all_labelshandle_error_caser(  r   r   r  r  r  set_all_labelspreserve_exceptionr[  r   r]  r_  r  is_try_finally_in_nogilr	  r  r  r  r	   CPtrTyper  r  r$  rf  r  put_error_catcherr  r  put_error_uncatcherr  r   r[  put_error_cleanerr^  r  r  r  rF   GILExitNoder   r7  r]  )r   rR   r  
old_labels
new_labelsr  catch_labelr  r  preserve_errorneeds_success_cleanupexc_lineno_cnamesexc_filename_cnamer  finally_old_labelsr  r  rv  r^  r  r(  	old_labelret_tempr1   )rR   r   r2   r   !  s   




























z*TryFinallyStatNode.generate_execution_codec                 C   s8   | j || | j|| | jr| j|| d S d S r|   )r   r   r  r  r  r1   r1   r2   r   ?"  s
   z0TryFinallyStatNode.generate_function_definitionsc           	   	   C   s   |j t |j t |j t | jr|jdd |d |ddd |D  |D ]
\}}|	|| q/|d|dd    |d	|d d d
   |D ]}|
|t qT|rs|d|d tj|d tj|tjf  | jr||  d S d S )NFr  r  rB   c                 S   r  r  r1   rU  r1   r1   r2   r   O"  r  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   rN  rb  r  swap_exception_utility_coder  r
  rM   r   rf  r  r
   r   lineno_cnameclineno_cnamefilename_cnamer  )	r   rR   r  r  r  r  r  rN  rE  r1   r1   r2   r  E"  s0   


z$TryFinallyStatNode.put_error_catcherc              	   C   s   |j t |j t | jr|jdd |d |dd  D ]}||t q |d|dd    |d d D ]}||t q:|d|d d   | jrU|	  |d
dd	 |D  |rz|d
tj|d tj|d tj|f  d S d S )NFr  r  r   !__Pyx_ExceptionReset(%s, %s, %s);r  rB   c                 S   r  r  r1   rU  r1   r1   r2   r   {"  r  z:TryFinallyStatNode.put_error_uncatcher.<locals>.<listcomp>r  r   r   )r   rN  rb  r  r  r
  rM   rx  r
   r  r   r   r
  r  r  )r   rR   r  r  r  rE  r1   r1   r2   r  f"  s*   


z&TryFinallyStatNode.put_error_uncatcherc                 C   s   |j t | jr|jdd |d |dd  D ]}||t q|d|dd    |d d D ]}||t q4| jrD|	  |d
dgd |dd    d S )NFr  r  r   r  rB   r  )r   rN  r  r  r
  rM   rx  r
   rf  r  r   )r   rR   r  rE  r1   r1   r2   r  "  s   
&z$TryFinallyStatNode.put_error_cleanerc                 C   r  r|   )r   r   r  r   r1   r1   r2   r   "  r  zTryFinallyStatNode.annotate)NN)r+   r,   r-   r   r  r  r  r  r  r  r  r  r   ro   r   r   r   r   r   r   r  r  r  r   r1   r1   r1   r2   r  !  s,    
 

!r  c                   @   s   e Zd ZdZdZdZdS )NogilTryFinallyStatNodezJ
    A try/finally statement that may be used in nogil code sections.
    FN)r+   r,   r-   rx   r  r   r1   r1   r1   r2   r  "  s    r  c                       sR   e Zd Zdgej ZdZdZdddZdd Z fdd	Z	d
d Z
dd Z  ZS )GILStatNoder  NTc              	   C   s<   || _ || _| ||| tj| ||t||| jdd d S )N)state
state_tempr  )r  r  create_state_temp_if_neededr  r   r  r  )r   r6   r  r   r  r1   r1   r2   r   "  s   
zGILStatNode.__init__c                 C   sZ   ddl m} | }|| |jsd S |dkrtj}ntj}ddlm} |	||| _
d S )Nr   YieldNodeCollectorgilr  )r  r  visitchildrenyieldsr	   c_gilstate_typec_threadstate_ptr_typer   ru  r9  r  )r   r6   r  r   r  	collectorr  ru  r1   r1   r2   r  "  s   
z'GILStatNode.create_state_temp_if_neededc                    s>   | j dk|_| j dkrd|_| jd ur| j| t |S )Nr  T)r  _in_with_gil_blockhas_with_gil_blockr  r   rc   r   rk   r1   r2   r   "  s   

z GILStatNode.analyse_declarationsc                 C   sR   | tdd | jd ur| j|| _|j}| jdk|_t| |}||_|S )NForceInitThreadsr  r  )rN  r   r%  r  ro   r  r  r  )r   r   	was_nogilrQ   r1   r1   r2   ro   "  s   

zGILStatNode.analyse_expressionsc                 C   s   | | j |  | jr| jsJ | j| | j }nd }|jj}| j	dkr4|j
|d d|j_n|j|| j d d|j_t| | | jrP| j| ||j_|  d S )Nr  )variableT)r  unknown_gil_stateF)r  r6   begin_blockr  scope_gil_state_knownrC  r   r  r  r  r
  put_release_gilr  r   rE  	end_block)r   rR   r  old_gil_configr1   r1   r2   r   "  s$   


z#GILStatNode.generate_execution_coder|   )r+   r,   r-   r  r   r  r"  r   r  r   ro   r   rl   r1   r1   rk   r2   r  "  s    


r  c                   @   s,   e Zd ZdZg ZdZdZdd Zdd ZdS )r  a  
    Used as the 'finally' block in a GILStatNode

    state   string   'gil' or 'nogil'
    #   scope_gil_state_known  bool  For nogil functions this can be False, since they can also be run with gil
    #                           set to False by GilCheck transform
    NTc                 C   r  r|   r1   r   r1   r1   r2   ro   #  r   zGILExitNode.analyse_expressionsc                 C   sD   | j r	| j  }nd }| jdkr|| d S |j|| j d d S )Nr  )r   )r  r   r  r  put_acquire_gilr"  )r   rR   r  r1   r1   r2   r   
#  s   
z#GILExitNode.generate_execution_code)	r+   r,   r-   rx   r   r  r"  ro   r   r1   r1   r1   r2   r  "  s    r  c                   @   r^  )EnsureGILNodezI
    Ensure the GIL in nogil functions for cleanup before returning.
    c                 C   s   |j dd d S )NFr  )r
  r   r1   r1   r2   r   #  r5  z%EnsureGILNode.generate_execution_codeN)r+   r,   r-   rx   r   r1   r1   r1   r2   r'  #  s    r'  c                       sh   e Zd ZdZdgej ZdZdZdZ fddZ	dd Z
 fd	d
Z fddZdd Zdd Z  ZS )CriticalSectionStatNodez
    Represents a freethreading Python critical section.
    In non-freethreading Python, this is a no-op.

    args    list of ExprNode    1 or 2 elements, must be object, pymutex or pymutex*
    rO   NFc                   sf   t |dkrtj| _ntj| _t |dkrtt |nd| _t j|f||t	|| jdd| d S )Nr   r   )
length_tag)rO   r   r  )
rE   r	   c_py_critical_section2_typevar_typec_py_critical_section_typer  r)  rc   r   CriticalSectionExitNode)r   r6   rO   r   rP   rk   r1   r2   r   -#  s   

z CriticalSectionStatNode.__init__c                 C   s8   ddl m} | }|| j |jrt| jd d S d S )Nr   r  z0Cannot yield while in a cython.critical_section.)r  r  r  r   r  r   r6   )r   r  r  r1   r1   r2   check_for_yields>#  s   z(CriticalSectionStatNode.check_for_yieldsc                    s"   | j D ]}|| qt |S r|   )rO   r   rc   r  rk   r1   r2   r   E#  s   
z,CriticalSectionStatNode.analyse_declarationsc                    s   |    t }d}t| jD ]5\}}||}|j|ks'|jjr/|jj|kr/|d7 }d| _	n|jj
r9||}nt|jd || j|< q|dkrV|t| jkrVt| jd t |S )Nr   r   TzRArguments to cython.critical_section must be Python objects, pymutex, or pymutex*.zHArguments to cython.critical_section must not mix objects and pymutexes.)r.  r	   get_cy_pymutex_typer  rO   ro   rN  rF  rO  is_pymutex_critical_sectionr]  rq  r   r6   rE   rc   )r   r   cy_pymutex_typemutex_countr  r  rk   r1   r2   ro   J#  s0   

z+CriticalSectionStatNode.analyse_expressionsc                 C   s  | j r|jtdd d}n|jtdd d}|| j |  tj	}|
| j| d | jD ]}|| q8| j rLdd | jD }nd	d | jD }|
d
| j d| d| dd| d	 t| | | jD ]}|| || qs|  d S )NCriticalSectionsMutexSynchronization.cMutexCriticalSectionsr   r  c                 S   s(   g | ]}|j jr
d nd |  qS )r   r  )rN  rF  r   r  r1   r1   r2   r   }#  s   ( zCCriticalSectionStatNode.generate_execution_code.<locals>.<listcomp>c                 S   s   g | ]	}d |   qS )r  )r   r  r1   r1   r2   r   #  r  __Pyx_PyCriticalSection_Beginz(&r   r  )r0  r   rN  r   r%  r  r6   r!  r   critical_section_variablerM   r+  rJ  rO   r
  r)  r   r  r   r  r  r$  )r   rR   mutexr  r  rO   r1   r1   r2   r   k#  s4   


$

z/CriticalSectionStatNode.generate_execution_codec                 C   s   t | jd d S )Nz!Critical sections require the GIL)r   r6   r   r1   r1   r2   r   #  r5  z#CriticalSectionStatNode.nogil_check)r+   r,   r-   rx   r  r   r+  r  r0  r   r.  r   ro   r   r   rl   r1   r1   rk   r2   r(  #  s    !!r(  c                   @   *   e Zd ZdZg ZdgZdd Zdd ZdS )r-  zG
    critical_section - the CriticalSectionStatNode that owns this
    critical_sectionc                 C   r  r|   r1   r   r1   r1   r2   ro   #  r   z+CriticalSectionExitNode.analyse_expressionsc                 C   s    | d| j dtj d d S )Nr7  z_End(&r  )rM   r)  r   r9  r   r1   r1   r2   r   #  s   z/CriticalSectionExitNode.generate_execution_codeNr+   r,   r-   rx   r   r~   ro   r   r1   r1   r1   r2   r-  #      r-  c                       sX   e Zd ZdZdgej ZdZdZdZe	dd Z
 fddZ fd	d
Zdd Z  ZS )r  z
    Represents
        with l:
            ...
    where l in a cython.pymutex or cython.pythread_type_lock.

    arg    ExprNode
    r  NFc                 C   sx   ddl m} t|jtsJ t|jjtsJ | |j|j|jjjt|j|	|jt
|jjd}||j_|j|_|S )Nr   r  )r  r   r  	lock_temp)r   ru  rF   r   r  r  r6   r  CythonLockExitNoder9  r	   r  rN  r  lock_stat_noder  )re   rQ   ru  r   r1   r1   r2   r  #  s   	z CythonLockStatNode.from_withstatc                    s   | j | t |S r|   )r  r   rc   r   rk   r1   r2   r   #     z'CythonLockStatNode.analyse_declarationsc                    sB   | j || _ | j}t|trt|jdkr|jd }t |S rp  )r  ro   r   rF   r
  rE   r  rc   )r   r   r   rk   r1   r2   ro   #  s
   
z&CythonLockStatNode.analyse_expressionsc              	   C   s   |j | jj  || j |  | j	| | j
 }| j| || d| j
  d | jtjkr<d}n| jtjkrEd}nd}|d| jjj d| d| d	 t| | | j| | j| | j| |  d S )
Nz = &r  Nogilr   Gil__Pyx_Locks__Lockz(*r  )r   rN  r  rN  get_usage_utility_coder  r6   r!  r?  rC  r   r
  rM   r   r*   r/   r0   
cname_partr  r   r  r  rE  r$  )r   rR   r  gil_strr1   r1   r2   r   #  s$   
$z*CythonLockStatNode.generate_execution_code)r+   r,   r-   rx   r  r   r?  r  r   r   r  r   ro   r   rl   r1   r1   rk   r2   r  #  s    	
r  c                   @   r;  )r@  zI
    lock_stat_node   CythonLockStatNode   the associated with block
    rA  c                 C   r  r|   r1   r   r1   r1   r2   ro   #  r   z&CythonLockExitNode.analyse_expressionsc                 C   s0   | j jjj}|d| d| j j  d d S )NrE  z	_Unlock(*r  )rA  r  rN  rH  rM   r?  r   )r   rR   rH  r1   r1   r2   r   #  s   $z*CythonLockExitNode.generate_execution_codeNr=  r1   r1   r1   r2   r@  #  r>  r@  c                 C   s   ddl m} || jS rA  )r   rC  rO  rQ  )rn  rC  r1   r1   r2   cython_view_utility_code#  rB  rJ  c                 C      t ddS NArrayAPIzarrayarray.hr   r%  rn  r1   r1   r2   r  $      r7  c                 C   rK  rL  rN  rO  r1   r1   r2   r  $  rP  )zcpython.arrayzcpython.array.arrayzcython.viewc                 C   s   |j jjjD ]=}|j| jkrq|d}|d}|r|jp"|o"|j}|s'|rC|sC|rC|jj	rCt
| jdd |j tdd  d S qd S )Nimport_array_import_arrayzx'numpy.import_array()' has been added automatically since 'numpy' was cimported but 'numpy.import_array' was not called.r   NumpyImportArrayzNumpyImportArray.c)r   module_noder  r  rf   rD  rS  r  rN  rs  r   r6   rN  r   r%  )rQ   rR   modrQ  rR  r  r1   r1   r2   cimport_numpy_check$  s&   


rV  c                   @   s,   e Zd Zg ZdZdd Zdd Zdd ZdS )	CImportStatNodeFc           	      C   s   |j st| jd d S |j| j| j| jrdndd}d| jv ridd | jdD }|d }|j|}|}|dd  D ]}||}|	||| j |}q<| j
r[|	| j
|| j n || |	||| j n| j
pn| j}|	||| j}| j|_| jtv r|t| j |jj d S d S )	N$cimport only allowed at module levelr   r   relative_levelr  c                 S   s   g | ]}t |qS r1   r   )r   rf   r1   r1   r2   r   1$  r  z8CImportStatNode.analyse_declarations.<locals>.<listcomp>r   )r  r   r6   find_modulerD  is_absoluter  rP  find_submoduledeclare_moduleas_namer  r2  utility_code_for_cimportsrN  rn  )	r   r   r  r8  top_nametop_module_scoperf   submodule_scoper  r1   r1   r2   r   *$  s2   



z$CImportStatNode.analyse_declarationsc                 C   r  r|   r1   r   r1   r1   r2   ro   E$  r   z#CImportStatNode.analyse_expressionsc                 C      | j dkrt| | d S d S NnumpyrD  rV  r   r1   r1   r2   r   H$  r	  z'CImportStatNode.generate_execution_codeN)r+   r,   r-   r   r\  r   ro   r   r1   r1   r1   r2   rW   $  s    rW  c                   @   s<   e Zd Zg ZdZdZdZdd Zdd Zdd Z	dd	 Z
dS )
FromCImportStatNodeNc                 C   s  |j st| jd d S |jdd }| jr3| j|kr#t| jd d S | j|kr3|js3t| jd d S |j| j| j| jd}|sBd S |j}|	| | j
D ]g\}}}|dkrjt|j D ]\}}	|||	| q]qM||}	|	rud|	_n2| jd uo~| jdk}
|jj||| jd	|
d
}|sqM|j|u r||p||| j n	t|d||f  |	r|p|}|||	| qM|ds|dr|tv r|t| |jj | j
D ]\}}}d||f }|tv r|t| |jj qd S d S )NrX  r  r   z3relative cimport beyond main package is not allowedz:relative cimport from non-package directory is not allowedrY  r  r   F)from_moduler6   absolute_fallbackrelative_importz%Name '%s' not declared in module '%s'cpythoncython%s.%s)r  r   r6   rl  countrZ  
is_packager[  rD  r  imported_namesr   r  rb   r  r/  r  rP  parent_moduler^  
startswithr`  rN  rn  )r   r   qualified_name_componentsr  rD  r6   rf   r_  
local_namer  is_relative_importrc  rv  fqnamer1   r1   r2   r   Y$  s^   



z(FromCImportStatNode.analyse_declarationsc                 C   sB   |j sdS |j}|dkr|jsdS dS |jsdS ||jkrdS dS )Nr   classr   )r0  rN  rI  is_struct_or_unionr  )r   r  r  rN  r1   r1   r2   declaration_matches$  s   
z'FromCImportStatNode.declaration_matchesc                 C   r  r|   r1   r   r1   r1   r2   ro   $  r   z'FromCImportStatNode.analyse_expressionsc                 C   rd  re  rg  r   r1   r1   r2   r   $  r	  z+FromCImportStatNode.generate_execution_code)r+   r,   r-   r   rD  rZ  rq  r   rz  ro   r   r1   r1   r1   r2   rh  M$  s    2rh  c                   @   s.   e Zd ZdgZdZdd Zdd Zdd Zd	S )
FromImportStatNoder  r   c                 C   s   | j D ];\}}|dkr|jst| jd  d S d|_d| _q|| |jr:| d u r9t	d| j
jj|f |j_qd|j_qd S )Nr  z%import * only allowed at module levelr   rn  r   )rb   r  r   r6   has_import_starimport_starr  r  r\  r   r  rD  r   r2  )r   r   rf   r  r1   r1   r2   r   $  s    

z'FromImportStatNode.analyse_declarationsc           	   	   C   sH  ddl m} | j|| _|| jt| _g | _| j	D ]\}}|dkr@|j
	 D ]\}}|js>|jjr>|tdd  nq(q||j}|jr|jj|krt|jdr|jj| jjjkr_qz|j| jjj| j| jjd}|jj|jkrwW qW n	 ty   Y nw ||d }|jtu rd }n| j|j|}| j|||f q| S )Nr   r  r  ExtTypeTestr{  rD  )r6   rZ  )r   ru  r  ro   rt  r6   r
   r   interned_itemsrb   r  r0  rN  rI  rN  r   r%  r/  rf   r  rD  r   r[  r   rl  r   r  r  r  )	r   r   ru  rf   r  rv  r  r  coerced_itemr1   r1   r2   ro   $  sB   

z&FromImportStatNode.analyse_expressionsc                    s    | j | j  | jr! dtj| j  | jf  | j	rz d  j
tdd  jjtjdd} jjtdd}| j|  fdd	| j	D } d
d| d g }g }g }t| j	D ]7\}\}	}
}|d ur|||	|
|f ql|
jr|
j|	kr|
jr|
jjr|
jjjr|| ql|||	|
f qlt|p|}t|dkrň d| d| dt| d| d	 n | d  | d| j  d| d  || j   !|t |r< d| d |D ]\}}	}
 d| d |
"| j   d q|D ] \}}	}
} d| d |  |
"|   d q d |rV #tj$} %| jd| d| d| d |r^ d   &|t  d   j'|  j'|  d  | j(  | j)  d S )!Nzif (%s(%s) < 0) %s;r  
ImportFromr  Fr  Tc                    s   g | ]
\}}}  |qS r1   )r  )r   rf   rv  r  r1   r2   r   $  s    z>FromImportStatNode.generate_execution_code.<locals>.<listcomp>z*PyObject* const __pyx_imported_names[] = {r  z};r   r  r  r  r  r  z = 0; {z = __Pyx_ImportFrom(z, __pyx_imported_names[z]); r  r  r  r   r   z	default:;zPyDict_SetItem(z], r  r  )*r  r6   r  r
  r}  rM   r   r=  r  r  r   rN  r   r%  r  r  r	   r  r
   r   r  r   r  r  r   rf   r  rx  r  r  r  rE   r  r  r  r  r  r1  r  r  r  r  )r   rR   counter_var	item_temprq  simple_pyglobalsdirect_assignmentscoerced_assignmentsr  rf   r  r  needs_specific_assignmentsmodule_dictr1   r  r2   r   $  s   




*




z*FromImportStatNode.generate_execution_codeN)r+   r,   r-   r   r}  r   ro   r   r1   r1   r1   r2   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-   rx   r   r1   r1   r1   r2   r  >%  s    r  c                       sD  e Zd ZdZg dZdZdZdZdZdZ	dZ
dZejejejfZejejejfZejejejfZdZ fddZdd	 Zd
d Zdd Zdd Zdd Zdd Z dd Z!dd Z"dd Z#d8ddZ$dd Z%dd  Z&d!d" Z'd#d$ Z(d9d%d&Z)d'd( Z*d)d* Z+d+d, Z,	d:d-d.Z-d/Z.d0Z/d1e.e/f Z0d2d3 Z1d4d5 Z2d6d7 Z3  Z4S );ParallelStatNodea  
    Base class for 'with cython.parallel.parallel():' and 'for i in prange():'.

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

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

    is_parallel is true for:

        #pragma omp parallel
        #pragma omp parallel for

    sections, but NOT for

        #pragma omp for

    We need this to determine the sharing attributes.

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

    args         tuple          the arguments passed to the parallel construct
    kwargs       DictNode       the keyword arguments passed to the parallel
                                construct (replaced by its compile time value)
    )r   num_threadsthreading_conditionNFr   c                    s<   t  j|fi | |dpi | _t | _i | _g | _d S )Nr  )rc   r   r   r  r   seen_closure_varsprivatesassigned_nodesrA  rk   r1   r2   r   %  s
   
zParallelStatNode.__init__c              
   C   sb  | j | d | _d | _| jrg }t }| jjD ]N}|jj|v r*t	| j
d|jj  ||jj |jjdkr@|jjs?|j| _q|jjdkrO|jjsN|j| _q| jra|jjdkra|jjs`|j| _q|| q|| j_z	| j|| _W n ty } zt	| jj
d W Y d }~nd }~ww i | _| j D ]\}}|| jvrt	| j
d|  qt| || qd 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  rr   r   rh  r   r   r   r6   r   r   	is_pranger  r  rX  	Exceptionrb   valid_keyword_argumentsr   )r   r   pairsseendictitemrM  r   r  r1   r1   r2   r   %  sH   
z%ParallelStatNode.analyse_declarationsc                 C   s  | j r
| j || _ | jr| jr| j|| _nt| jd | jr(| j|| _| j|| _| | | j d ur| j	rM| j	j d urM| j	j
sMt| jd n%| j	r[| j	j
s[t| jd n| j jjrr| j jrr| j |dkrrt| jd | j  r|| j jjr| j tj||| _ | S )Nz@'use_threads_if' must de declared in the parent parallel sectionz-num_threads already declared in outer sectionz;num_threads must be declared in the parent parallel sectionr   z.argument to num_threads must be greater than 0)r  ro   r  is_parallelr   r6   r  r   analyse_sharing_attributesparentr  rN  ry  r   rX  r  r]  r  r	   r  rq  r   r1   r1   r2   ro   %  s6   


z$ParallelStatNode.analyse_expressionsc                 C   sd   | j  D ]*\}\}}| jr| js|| jj v rt|d q| js(|r(t|d q| ||| qdS )z
        Analyse the privates for this block and set them in self.privates.
        This should be called in a post-order fashion during the
        analyse_expressions phase
        z0Cannot assign to private of outer parallel blockz*Reductions not allowed for parallel blocksN)r  rb   r  r  r  r   propagate_var_privatization)r   r   r  r6   rv  r1   r1   r2   r  %  s   


z+ParallelStatNode.analyse_sharing_attributesc                 C   sf   || j |< |jjrt|d dS | jr/| js!|| jjvr!| jj}n| j}|r1|||| dS dS dS )a
  
        Propagate the sharing attributes of a variable. If the privatization is
        determined by a parent scope, done propagate further.

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

        So the following cases propagate:

            sum is a reduction for all loops:

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

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

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

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

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

                sum = 0

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

                    #pragma omp parallel
                    with parallel:

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

                    # sum and j are well-defined here

                # sum and j are undefined here

            # sum and j are undefined here
        z9Memoryview slices can only be shared in parallel sectionsN)	r  rN  r  r   r  r  r  r  r  )r   r  r6   rv  r  r1   r1   r2   r  %  s   
5

z,ParallelStatNode.propagate_var_privatizationc                 C   s   | j r
| j ||S |j| jv r|jS |j|jd}| j|j | j| | j	||jf |
d||jf  ||_dS )zo
        Helper function that allocate a temporary for a closure variable that
        is assigned to.
        Tr  N)r  _allocate_closure_tempr  r  r  r  rN  r   modified_entriesr  rM   )r   rR   r  r  r1   r1   r2   r  @&  s   
z'ParallelStatNode._allocate_closure_tempc                 C   s0   | j }|jj}||j_|| ||j_| S r|   )1begin_of_parallel_control_block_point_after_declsr  ownerr
  r   )r   rR   rr  r   r  r1   r1   r2   evaluate_before_blockV&  s   
z&ParallelStatNode.evaluate_before_blockc                 C   s*   | j dur|d| || j   dS dS )zS
        Write self.num_threads if set as the num_threads OpenMP directive
        Nz num_threads(%s))r  r.  r  r   r1   r1   r2   put_num_threadsb&  s   
z ParallelStatNode.put_num_threadsc                 C   s2   g | _ t| jD ]}|js|jr| || qdS )a  
        If a variable is in a scope object, we need to allocate a temp and
        assign the value from the temp to the variable in the scope object
        after the parallel section. This kind of copying should be done only
        in the outermost parallel section.
        N)r  sortedr  from_closurer2  r  )r   rR   r  r1   r1   r2   declare_closure_privatesj&  s   z)ParallelStatNode.declare_closure_privatesc                 C   s<   | j D ]\}}|d||jf  |j|j ||_qdS )z
        Release any temps used for variables in scope objects. As this is the
        outermost parallel block, we don't need to delete the cnames from
        self.seen_closure_vars.
        r  N)r  rM   r  r  r  )r   rR   r  r  r1   r1   r2   release_closure_privatesw&  s
   z)ParallelStatNode.release_closure_privatesr1   c           
      C   s  | j }d| _ | jr|j  | _}g g }}t|D ]\}}|js$|jr*|| q|| q|r<|	dd
|  |rH|	dd
|  | jrtjg}	| jrt|	| j |jtdd |	dtj d |	d	| j  |	d
d
|	  dS dS dS )z
        Make any used temporaries private. Before the relevant code block
        code.start_collecting_temps() should have been called.
        Nz private(%s)r    firstprivate(%s)SharedInFreeThreadingr4  z' __Pyx_shared_in_cpython_freethreading(r  z private(%s, %s, %s)z shared(%s))privatization_insertion_pointr  r  stop_collecting_tempsr   r  r]  r  r  r.  r   breaking_label_usedr   parallel_whyerror_label_usedr  parallel_excr   rN  r   r%  parallel_freethreading_mutexpos_info)
r   rR   exclude_tempsr   r   r  firstprivatesr  rN  shared_varsr1   r1   r2   privatize_temps&  s8   
z ParallelStatNode.privatize_tempsc                 C   sF   | j r| js|d t| jD ]\}}|j||dd qd S d S d S )Nz/* Clean up any temporaries */Tr  )r  is_nested_prangerM   r  r   rf  )r   rR   r  rN  r1   r1   r2   cleanup_temps&  s   
zParallelStatNode.cleanup_tempsc                 C   sT   |  | _| | _|j| _|jdd|_|  | | _	| | _
| | dS )a  
        Sets up a block that surrounds the parallel block to determine
        how the parallel section was exited. Any kind of return is
        trapped (break, continue, return, exceptions). This is the idea:

        {
            int why = 0;

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

            new_return_label:
                why = 3;
                goto end_parallel;

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

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

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

        It uses the same mechanism as try/finally:
            1 continue
            2 break
            3 return
            4 error
        FTz%s = %d;r   #pragma omp flush(%s)N)r(  any_label_usedr  r  parallel_private_tempsr  r[  r  r]  r  r_  r\  fetch_parallel_exceptionrM   r   r  r  )	r   rR   should_flushsave_lastprivates_labeldont_return_label
all_labelsrp  r  is_continue_labelr1   r1   r2   trap_parallel_exit&  sB   








z#ParallelStatNode.trap_parallel_exitc                 C   s   |   |jdd |  |dtj  |dtj  |d| j  tt	| j
| j }d|j_|dt|  |tjt |d |  |  |  dS )	a^  
        As each OpenMP thread may raise an exception, we need to fetch that
        exception from the threadstate and save it for after the parallel
        section where it can be re-raised in the master thread.

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

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

                deallocate threadstate  deallocate threadstate
        Tr  r  r  z'__Pyx_ErrFetchWithState(&%s, &%s, &%s);r  r  N)r!  r
  put_acquire_freethreading_lockr  r   parallel_exc_typerM   r  r   r  parallel_pos_infor  r  uses_error_indicatorr  r  r
   put_release_freethreading_lockr  r$  r   rR   r  r1   r1   r2   r  6'  s$   z)ParallelStatNode.fetch_parallel_exceptionc                 C   sz   |   |jdd |  |tjt |d| j  t	t
| j| j }|dt|  |  |  |  dS )zRe-raise a parallel exceptionTr  r  r  N)r!  r
  r  r  r   r  r
   rM   r  r   r  r  r  r  r  r  r$  r  r1   r1   r2   restore_parallel_exceptionf'  s   z+ParallelStatNode.restore_parallel_exceptionc                 C   s   | | j| j| jf  dS )z
        Restore all old labels. Call this before the 'else' clause to for
        loops and always before ending the parallel control flow block.
        N)r  r)  r  r  r   r1   r1   r2   restore_labelsu'  s   zParallelStatNode.restore_labelsc           
      C   s  | j }d| _ d| _| jdur| j| | j| | r#|d | jrd|d| j  |d| j	  |d |dt
j d |d |d	t
j  |d
 |dt
j  |d |rj| j}n| j}|r|dt
j  |dt
j  |d	t
j  | jD ]\}}}	|	jrd| }|d||f  q|dt
j  |r|d ||j |r|d ||j |r|d ||j | jr|jt |d | | ||j |d |d |  | | dS )a  
        This ends the parallel control flow block and based on how the parallel
        section was exited, takes the corresponding action. The break_ and
        continue_ parameters indicate whether these should be propagated
        outwards:

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

        Here break should be trapped in the parallel block, and propagated to
        the for loop.
        N$__Pyx_TurnOffSysMonitoringInParallelz*const char *%s = NULL; int %s = 0, %s = 0;z,PyObject *%s = NULL, *%s = NULL, *%s = NULL;z-#if CYTHON_COMPILING_IN_CPYTHON_FREETHREADINGzPyMutex z = {0};r  r  zg/* This may have been overridden by a continue, break or return in another thread. Prefer the error. */z%s = 4;r  zint %s;r  r  r  r,  z    case 1: z    case 2: z    case 3: z    case 4:)r  r  r  r  r  r$  rM   r  r  r  r   r  r  r  r  r  r  rq  r.  r]  r  r  r^  r   rN  rb  r  r\  r$  "redef_builtin_expect_apple_gcc_bug)
r   rR   break_	continue_return_r   r  
temp_cnameprivate_cnamer  r1   r1   r2   end_parallel_control_flow_block}'  sp   










z0ParallelStatNode.end_parallel_control_flow_blockz((defined(__APPLE__) || defined(__OSX__))zQ(defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))))z
(%s && %s)c                 C   s   | j s|| j dS dS )z]
        A bug on OS X Lion disallows __builtin_expect macros. This code avoids them
        N)r  undef_builtin_expectredef_conditionr   r1   r1   r2   r  '  s   z3ParallelStatNode.undef_builtin_expect_apple_gcc_bugc                 C   s   | j s|| j d S d S r|   )r  redef_builtin_expectr  r   r1   r1   r2   r  '  r  z3ParallelStatNode.redef_builtin_expect_apple_gcc_bugc                 C   s8   t ||D ]\}}|d ur|jjrt|jd|  qd S )Nz6%s may not be a Python object as we don't have the GIL)r  rN  r]  r   r6   )r   r   r8  nodesrf   rQ   r1   r1   r2   _parameters_nogil_check'  s   z(ParallelStatNode._parameters_nogil_check)r1   r'  )FFF)5r+   r,   r-   rx   r   r   r  r  r  r  r  r  r   r  parallel_exc_valueparallel_exc_tbr  parallel_filenameparallel_linenoparallel_clinenor  r  r
  r  r  critical_section_counterr   r   ro   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  buggy_platform_macro_conditionhave_expect_conditionr  r  r  r  rl   r1   r1   rk   r2   r  F%  sd    *E
#%
!90	
[r  c                       s@   e Zd ZdZddgZdZdZ fddZdd Zd	d
 Z	  Z
S )ParallelWithBlockNodezI
    This node represents a 'with cython.parallel.parallel():' block
    r  r  Nc                    s&   t  | | jrt| jd d S d S )Nz=cython.parallel.parallel() does not take positional arguments)rc   r   rO   r   r6   r   rk   r1   r2   r   '  r&  z*ParallelWithBlockNode.analyse_declarationsc                 C   s|  | j d ur| j | | | | | |d |d | j d ur.|d| j    | jrKdd | jD }|rKdt	|}|d| d |
 | _| | |d	 |d
 |  | | |j  | j| | | | | | | |  ||j}||j}||j}| | | j||||d | j d ur| j | | j | | | d S )Nr  z#pragma omp parallel zif(%s) c                 S   s   g | ]	}|j js|jqS r1   )rN  r]  r  )r   rM  r1   r1   r2   r   (  s    zAParallelWithBlockNode.generate_execution_code.<locals>.<listcomp>r   zfirstprivate(r  r   r  )r  r  r  ) r  r
  r  r  rM   r.  r   r  r   r  rI   r  r  r!  r  r  start_collecting_tempsr   r   r  r  r  r$  r[  r  r  r^  r  r  r  r  r  )r   rR   r  joined_privatesr  r  r  r1   r1   r2   r    (  sJ   
















z-ParallelWithBlockNode.generate_execution_codec                 C   s   |  |dg| jg d S )Nr  )r  r  r   r1   r1   r2   r   6(  r  z!ParallelWithBlockNode.nogil_check)r+   r,   r-   rx   r  r  r  r   r   r   rl   r1   r1   rk   r2   r  '  s    6r  c                       s   e Zd ZdZg dZd Z Z ZZd Z	 Z
ZdZdZdZg dZG dd deZ fdd	Z fd
dZ fddZdd Zdd Zdd Z  ZS )ParallelRangeNodez
    This node represents a 'for i in cython.parallel.prange():' construct.

    target       NameNode       the target iteration variable
    else_clause  Node or None   the else clause of this loop
    )r   r  r  rO   r  r  r  NT)scheduler  r  r  r  c                   @   r'  )z#ParallelRangeNode.DummyIteratorNoderO   Nr(  r1   r1   r1   r2   DummyIteratorNodeP(  s    
r  c                    s*   t  j|fi | | j|| jd| _d S )Nr  )rc   r   r  rO   rM  )r   r6   rP   rk   r1   r2   r   S(  s   zParallelRangeNode.__init__c                    s   t  | | j| | jd ur| j| | jr!t| jdkr)t| jd d S t| jdkr6| j\| _	nt| jdkrE| j\| _
| _	n	| j\| _
| _	| _| jdvr_t| jd| jf  d S d S )Nr   z0Invalid number of positional arguments to pranger   r%   )Nstaticdynamicguidedruntimez'Invalid schedule argument to prange: %s)rc   r   r  r  r  rO   rE   r   r6   re  rT   rd  r  r   rk   r1   r2   r   Y(  s   

z&ParallelRangeNode.analyse_declarationsc                    sH  |j }| j r	d|_ | jd u rt| jd | S | j|| _| jjjs7| jjjs2t| jjd| jj  tj	| _
n| jj| _
d| _| j| j| jf}t|| jD ]1\}}|d ur~|| |jjsgt|jd|  qM|jsu||}t| || t| j
|j| _
qM| jd ur| j|| _t| jdd }|r| jjd f| j| jj< t |}|jr|jst|jjd n%|jdkrt|jjd	 n|jjjr|jjr|j|d
krt|jjd |jtj |||_|j r||_ |j!o|j!j"|_#|j#r"|}|j!r|j!j"r|j!}|j!r|j!j"s|j$|j |j%$|j% |j&'|j& |S )NTz/prange() can only be used as part of a for loopzMust be of numeric type, not %s)rT   re  rd  z%s argument must be numericr  z$Must provide schedule with chunksizer  z,Chunksize not valid for the schedule runtimer   zChunksize must not be negative)(r  r  r   r6   rp   rN  r6  r]  r	   r  
index_typer8  rT   re  rd  r  rn   r   rq  r   ri  r  ro   r   r  r  rc   r  r  ry  rX  r  r  r  r  r  r   r  r  r  )r   r   r  start_stop_steprQ   rf   r  r  rk   r1   r2   ro   m(  s   










z%ParallelRangeNode.analyse_expressionsc                 C   s.   d}| j | j| j| j| jf}| ||| d S )N)rT   re  rd  r  r  )rT   re  rd  r  r  r  )r   r   r8  r  r1   r1   r2   r   (  s   zParallelRangeNode.nogil_checkc                 C   s.  |  | | jjj}|| jj d}| j| j| jf}d}t	|| j
|D ]!\}}}|du r0|}	n|jr8| }	n	|| | }	|	||< q$| jdurQ| j| |j| jd|d< |j| jd|d< | jdur|| j r|| jjdkr|t|jd n|d	  rt|d	 dkr|d
|  | | |jtdd |d|  |d|  |  |  || |!  | "| | j#r| j$r|%dt&j'  |  |d | j#(| |!  | )| || j*| jf D ]}
|
dur|
+| |
,| q|j-|d  |j-|d  | .| dS )a,  
        Generate code in the following steps

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

            2)  allocate temps for start, stop and step

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

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

                becomes

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

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

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

                Also, you can't do this

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

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

            4) release our temps and write back any private closure variables
        )r  rn  )r  r  rp  NFr  nstepsr   z!Iteration with step 0 is invalid.rd  zif (((%(step)s) == 0)) abort();IncludeStdlibHr  zS%(nsteps)s = (%(stop)s - %(start)s + %(step)s - %(step)s/abs(%(step)s)) / %(step)s;zif (%(nsteps)s > 0)if (%s < 2)z
/* else */)/r  r  r  r  rN  r  rT   re  rd  r  r8  r   r}  r
  r   r  r  r  r  r  r{  r   r6   isdigitr|  rM   r  r   rN  r   r%  r!  generate_loopr$  r  r  r  r.  r   r  r   r  r  r  r  r  r  )r   rR   target_index_cnamefmt_dictr  defaultsrQ   rf   r=  r   r  r1   r1   r2   r   (  s^   
(





 





z)ParallelRangeNode.generate_execution_codec                 C   sf  | j r	|d n|d | js |d | | _| jj}nB|d | jd ur4|d| j   | | _| j}|d |d |	  | 
| | j rX|d n|d |d t| j D ]:\}}|r|dv r|| jjkr|jjrt| jd	 qi|d
||jf  qi|jjs|d|j  |d|j  qi| jr| jrd| || j }nd}|d| j|f  | | |d |d |d|  |	  | }|	  |d|  | jr| j s|j  | j| | j|dd | jr| j s| | | jr|dt j!  |"  |"  | jr1| #| |"  d S d S )Nz#if 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)z, %sz schedule(%s%s)z,for (%(i)s = 0; %(i)s < %(nsteps)s; %(i)s++)z=%(target)s = (%(target_type)s)(%(start)s + %(step)s * %(i)s);T)r  r  )$r  rM   r  r.  rI   r  r  r  r   r!  r  r  r  rb   r  r  rN  r]  r   r6   r  r  r  r  r  r  r  r   r   r  r  r  r   r  r$  r  )r   rR   r  reduction_codepointr  rv  r  guard_around_body_codepointr1   r1   r2   r  B)  st   

















zParallelRangeNode.generate_loop)r+   r,   r-   rx   r   r   r  r  rO   rT   re  rd  r  r  r  r  r   r  r   r   ro   r   r   r  rl   r1   r1   rk   r2   r  :(  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
    rQ   c                 C   sJ  | j | | j }t|tr|jjd }t|ttf| _t|t	t
f}|j}| jrI| j|_| j|_d|_|jrEd|jv rG| |j|_d S d S d S |rU| j |_|j_d S |j}| j|_| jd |j_tj| j |j_| jd |j_|jj|jj_|jj|j_| jd |_|j D ]\}}|jr| |j|_|jr| |j|_qd S )Nr   Tr  _obj_typerv  )rQ   r   rF   r   r   r  r  r#  is_functionr  r  r  r  r  r  rt  r  rN  r  r  r   typeobj_prefixr  rC  r  r  rr  r  rb   )r   r   rQ   is_struct_or_enumrM  r  rf   r  r1   r1   r2   r   )  s>   
z'CnameDecoratorNode.analyse_declarationsc                 C   s$   d|v r| dd }d| j|f S )Nr  r   z%s_%s)r  r  )r   r  r1   r1   r2   r  )  s   zCnameDecoratorNode.manglec                 C   r-  r|   )rQ   ro   r   r1   r1   r2   ro   )  r/  z&CnameDecoratorNode.analyse_expressionsc                 C   s   | j r:|jr:|jd }t| jtr| jj|ddd nddlm} | jj	}|j
}|j|_
|j|| |dd ||_
| j|| dS )	z=Ensure a prototype for every @cname method in the right placeutility_code_protoFTr  r   )
ModuleNode)
definitionN)r	  r  r   rF   rQ   r  r-  r   r	  r  r  r  generate_cfunction_declarationr  r   )r   r   rR   h_coder	  r  r  r1   r1   r2   r   )  s$   
z0CnameDecoratorNode.generate_function_definitionsc                 C   r3  r|   )rQ   r   r   r1   r1   r2   r   )  r5  z*CnameDecoratorNode.generate_execution_codeN)
r+   r,   r-   rx   r   r   r  ro   r   r   r1   r1   r1   r2   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-   rx   r   r1   r1   r1   r2   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)
Printz
Printing.cPrintOner  r  RaiseExceptionGetExceptionSwapExceptionSaveResetExceptionAddTracebackr1   )rm  r  r)  r   	itertoolsr   enumr   r   Errorsr   r   r   r   r   r   r	   r   r
   r   r  r   r   r   r   r   r   r   r   r   r   r   r`   r   StringEncodingr   r   r    r!   Pythranr"   r#   r$   Utilsr&   r'   r:  IntEnumr*   r7   r@   rZ   rN  r[   rm   r{   r   r   r   r   r
  r  r!  r8  r<  rU  ra  rc  ri  rk  r  r  r  r$  r  r(  r=  rR  r  ru  rx  r|  r  r#  r  r  r  r  r  r  r  r&  r  r  rA  r>  rL  rO  rQ  rS  r  r  r  r  r.  r0  r6  r=  rw  rI  rS  r  rO  r  r  r  r  rB  r  r  r  r  r  r  r  r
  r  r  r  r$  r%  r*  rI  rR  rS  rP  rO  rQ  r  r  r  r  r  r  r  r  r'  r(  r-  r  r@  rJ  r`  rV  rW  rh  r{  r  r  r  r  r	  r	  gcc_branch_hintsbranch_prediction_macrosr%  r  r  rb  r  r  r	  r  traceback_utility_coder1   r1   r1   r2   <module>   s  4 05%(#
2 u 1	g% 's-][+!     s   G    R       [; Q~ v    l&@%  Mk2GC)8
o 20)$/<\<
c
 qi! , Y  	X	qL-T      /J  i]