U
    e,	                 0   @   s  d dl mZ d dlZejeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeejd$ d dlZd dlZd dlZd dl	Z
d dlZddlmZmZmZmZmZmZmZmZ ddl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mZ ddlmZ ddlm Z m!Z!m"Z"m#Z# ddlm$Z$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z3m4Z4 ddlm%Z% ddlm5Z5 ddlm6Z6 ddl7m8Z8 ddlm9Z9 ddl:m;Z; ddl<m=Z=m>Z> ddl?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZN ddlmOZO zd dlPmQZQ W n" eRk
rJ   eSZQeTeSfZUY n
X eTeVfZUejWd  dkrndZXeYZZndZXeYe[fZZG dd deZ\e\ Z]e Z^e+e,fde+e-fd e+ej_fd!e+ej`fd!e+ejafd!e+ejbfd!e-e+fd"e-e,fd#e-e/fd$e-ejcfd%e-ejdfd%e/e-fd&e,e+fd'e,e-fd(e,ej_fd)e,ej`fd)e,ejafd)e,ejbfd)e,ejcfd*e,ejdfd*ej_e+fd+ej`e+fd+ejae+fd+ejbe+fd+iZed,d- Zfd.d/ Zgd0d1 Zhdd2d3Zid4d5 Zjd6d7 Zkd8d9 Zld:d; Zmd<d= Znd>d? ZoG d@dA dAeZpG dBdC dCepZqG dDdE dEeqZrG dFdG dGerZsG dHdI dIerZtG dJdK dKeqZuG dLdM dMeuZvG dNdO dOeuZwG dPdQ dQeuZxG dRdS dSeuZyG dTdU dUeuZzdVdW Z{G dXdY dYeuZ|G dZd[ d[euZ}G d\d] d]erZ~G d^d_ d_e~ZG d`da daeqZG dbdc dceqZG ddde deeqZG dfdg dgepZG dhdi diepZG djdk dkepZG dldm dmeZG dndo doepZG dpdq dqeqZG drds dseZG dtdu dueqZG dvdw dwepZG dxdy dyeqZG dzd{ d{epZG d|d} d}eZG d~d depZG dd depZG dd depZG dd deqZG dd deqZG dd depZG dd deZG dd deZG dd deZG dd deZG dd depZG dd deZG dd deZG dd depZG dd depZG dd deZG dd depZG dd deZG dd depZG dd deZG dd deZG dd depZG dd deZG dd deZG dd deZG dd depZG dd depZG dd depZG dd depZG dd depZG dd deZG dd deZG dd deZG dd deZG ddÄ deZG ddń depZG ddǄ depZG ddɄ depZG dd˄ depZG dd̈́ depZG ddτ depZG ddф deZG ddӄ depeZG ddՄ depZG ddׄ depZG ddل depeZG ddۄ depZG dd݄ depZG dd߄ depeZG dd deZG dd depZG dd depZG dd depZG dd deZG dd deZG dd deZG dd deƃZG dd depZG dd deȃZG dd deɃZG dd deɃZG dd de˃ZG dd deqZG dd deZG dd deZG d d deqZАdd ZejejejejՐdZG dd depZG dd de׃ZG d	d
 d
e׃ZG dd de׃ZG dd de׃ZG dd de׃ZG dd de܃ZG dd de܃Zސdd ZG dd de܃ZeeeېdZdd ZG dd depZdZdZd Zd!Zd"ZG d#d$ d$epZG d%d& d&epZG d'd( d(eZG d)d* d*eZG d+d, d,epZG d-d. d.epZz
ejZW n" ek
r   d/d0 ZY nX ejejejejejejejejejejejejejejej ejejejejejed1d2 d3d2 d4Zd5d6 ZG d7d8 d8epZG d9d: d:eZ	d;d< Z
G d=d> d>eZG d?d@ d@eZG dAdB dBeZG dCdD dDeZG dEdF dFeZG dGdH dHeZG dIdJ dJeZedKjZedLdMdNdOdPdQdRdSdTdUdVdWdXdYdZhZG d[d\ d\eZG d]d^ d^eZG d_d` d`epZG dadb dbepZG dcdd ddepZdedfdgdhdhdidjdgdhdk	ZG dldm dmeZG dndo doepeZG dpdq dqeeZeeeeeeeeeeeeeeedrZ ddsdtZ!G dudv dvepZ"G dwdx dxe"Z#G dydz dze"Z$G d{d| d|e"Z%G d}d~ d~e"Z&G dd de"Z'G dd de'Z(G dd de"Z)G dd de"Z*G dd de"Z+dd Z,G dd de"Z-G dd de"Z.G dd de"Z/G dd de"Z0G dd de/Z1G dd depZ2G dd depZ3G dd depZ4G dd depZ5dS (      )absolute_importN)$errorwarningZ	warn_onceInternalErrorCompileErrorUtilityCodeTempitaUtilityCodeStringEncodingoperatorlocal_errorsreport_errorNamingNodes
PyrexTypespy_object_type	list_type
tuple_typeset_type	dict_typeunicode_typestr_type
bytes_type	type_typeBuiltinSymtabUtilsfind_coercion_errordebug_disposal_codeZdebug_temp_allocdebug_coercionbytearray_type
slice_typememoryview_typebuiltin_sequence_types_py_int_types
IS_PYTHON3   )r   r   r   r   r   r   CannotSpecializeperformance_hint)r   r   )r	   )r   )r   )Nodeutility_code_for_importsSingleAssignmentNode)r   )r   typecast
error_typeunspecified_type)	TypeSlots)r   r   r   r   r   r   r   r   r   basestring_typer    	long_typesequence_typesr!   )r   )r      )r   )AnnotationItem)Future)print_call_chain)r   r   )
to_pythranis_pythran_supported_type#is_pythran_supported_operation_typeis_pythran_exprpythran_func_typepythran_binop_typepythran_unaryop_typehas_np_pythranpythran_indexing_codepythran_indexing_type!is_pythran_supported_node_or_nonepythran_typepythran_is_numpy_func_supportedpythran_get_func_include_filepythran_functor)PythranExpr)
basestring   TFc                       s(   e Zd ZdZ fddZdd Z  ZS )NotConstantNc                    s"   t jd krtt | | t _t jS N)rH   _objsuper__new__)cls	__class__ =/tmp/pip-unpacked-wheel-7k3cqui1/Cython/Compiler/ExprNodes.pyrL   O   s    
zNotConstant.__new__c                 C   s   dS )Nz<NOT CONSTANT>rP   selfrP   rP   rQ   __repr__U   s    zNotConstant.__repr__)__name__
__module____qualname__rJ   rL   rT   __classcell__rP   rP   rN   rQ   rH   L   s   rH   zgCannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding.zGCannot convert Unicode string to 'bytes' implicitly, encoding required.z5Unicode objects only support coercion to Py_UNICODE*.zFCannot convert 'bytes' object to unicode implicitly, decoding requiredzMCannot convert 'bytes' object to str implicitly. This is not portable to Py3.zTCannot convert 'bytes' object to basestring implicitly. This is not portable to Py3.z<Cannot convert 'bytes' object to Py_UNICODE*, use 'unicode'.zMCannot convert 'basestring' object to bytes implicitly. This is not portable.zZstr objects do not support coercion to unicode, use a unicode string literal instead (u'')zACannot convert 'str' to 'bytes' implicitly. This is not portable.z@'str' objects do not support coercion to C types (use 'bytes'?).zB'str' objects do not support coercion to C types (use 'unicode'?).z?Cannot convert 'char*' to unicode implicitly, decoding requiredc                    s~   t  }|d kr|S |jd rvt fddtjtjtjtjfD rv d j	rT|S |jd dkrf|S d d j
 S n|S d S )Nc_string_encodingc                 3   s   | ]}| kV  qd S rI   rP   .0t
type_tuplerP   rQ   	<genexpr>   s     z&find_coercion_error.<locals>.<genexpr>r%   )asciidefaultz_'%s' objects do not support coercion to C types with non-ascii or non-default c_string_encodingr   )coercion_error_dictget
directivesanyr   c_char_ptr_typec_uchar_ptr_typec_const_char_ptr_typec_const_uchar_ptr_typeis_pyobjectname)r^   ra   enverrrP   r]   rQ   r      s    

 
r   c                 C   s   t tttd| jd S )N)bytes	bytearraystrunicodeZc_string_type)r   r   r   r   rc   rd   rl   rP   rP   rQ   default_str_type   s    rs   c                  G   sJ   | D ]@}|dkst |jts*t |jts*q|jdk rt|jddd qdS )z
    Raise a warning on nodes that are known to have negative numeric values.
    Used to find (potential) bugs inside of "wraparound=False" sections.
    Nr   zfthe result of using negative indices inside of code sections marked as 'wraparound=False' is undefinedr%   level)
isinstanceconstant_resultr#   floatr   pos)nodesnoderP   rP   rQ   check_negative_indices   s    


r|   c              
      s   |j sZ|d kr| }|tkrZ|jrZt|jdkrZz|jd j}W n tk
rX   Y nX |d k	r|j r|d k	r| rz|j|j	 }W n t
ttfk
r   Y nX | S  fdd|jD }t|dkr| S d S )Nr%   r   c                    s   h | ]}|  qS rP   
infer_typer[   itemrr   rP   rQ   	<setcomp>   s     z+infer_sequence_item_type.<locals>.<setcomp>)is_sequence_constructorr~   r   cf_statelenrhsAttributeErrorhas_constant_resultargsrw   
ValueError	TypeError
IndexErrorpop)rl   Zseq_node
index_nodeseq_typer   
item_typesrP   rr   rQ   infer_sequence_item_type   s(    

r   c                 C   s&   dd |D }d|krdS | t |fS )a  
    Recursively generate a deduplication key from a sequence of values.
    Includes Cython node types to work around the fact that (1, 2.0) == (1.0, 2), for example.

    @param outer_type: The type of the outer container.
    @param item_nodes: A sequence of constant nodes that will be traversed recursively.
    @return: A tuple that can be used as a dict key for deduplication.
    c                 S   s   g | ]}|d krt d td fn|jrDt|j|jr6|jnd g|j nf|jrbt|j|j|j	|j
fnH| r|j|j|jt krt|jnd fnt|tr|j|j|jdfnd qS )NIdentifierStringNode)r   typer   make_dedup_key
is_literalmult_factorr   is_slicestartstopstepr   rw   rv   r   valueunicode_valuer[   r{   rP   rP   rQ   
<listcomp>   s   &
z"make_dedup_key.<locals>.<listcomp>N)tuple)Z
outer_typeZ
item_nodesZ	item_keysrP   rP   rQ   r      s    	r   c                 C   sZ   | d krdS | j tjkr&| jdkr&dS | j jrFd| jj| jjf dfS d| jj dfS d S )N)__Pyx_CppExn2PyErr();F*)r   Tzttry { throw; } catch(const std::exception& exn) {PyErr_SetString(%s, exn.what());} catch(...) { PyErr_SetNone(%s); }Fzc%s(); if (!PyErr_Occurred())PyErr_SetString(PyExc_RuntimeError, "Error converting c++ exception.");)r   r   c_char_typer   rj   entrycname)exception_valuerP   rP   rQ   get_exception_handler   s&    	r   c                 C   sF   |rB|r0| j tdd | | d| n| | d| d S )NErrOccurredWithGILExceptions.c__Pyx_ErrOccurredWithGIL()PyErr_Occurred())globalstateuse_utility_coder   load_cachedputlnerror_goto_if)codecheck_py_exceptionry   nogilrP   rP   rQ   maybe_check_py_error   s    
r   c                 C   s   t |\}}| d | d|  |r:| | || t| ||| | d |rb| jdd | | |rx|   | | | | d d S )Ntry {z%s} catch(...) {TZdeclare_gilstate})r   r   error_goto_if_nullr   put_ensure_gilput_release_ensured_gil
error_goto)r   ry   Zinside	py_resultr   r   Zraise_py_exceptionr   rP   rP   rQ   translate_cpp_exception  s    


r   c                 C   sH   | j dkst| jd krdS | jjr(dS t| jtrD| jjdkrDdS dS )N+TFr   )exception_checkAssertionErrorr   is_namerv   CharNoder   )r{   rP   rP   rQ   needs_cpp_exception_conversion  s    
r   c                 C   s  t |\}}	t |\}
}| d | |d|  t| |	|| | d | d|  t| ||| | d |r| jdd | |
 |r|   | | | | d | d |r| jdd | | |r|   | | | | d d S )Nr   z__pyx_local_lvalue = %s;r   Tr   r   )r   r   declaration_coder   r   r   r   )r   ry   lhs_typeZlhs_coderhs_codeZlhs_exc_valZassign_exc_valr   Zhandle_lhs_excZlhc_check_py_excZhandle_assignment_excZassignment_check_py_excrP   rP   rQ   translate_double_cpp_exception&  s0    






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ZdZdZdZdZdZdZdZdZdZdZdZeZe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(dddZ)dd Z*dd Z+dddZ,dd Z-dddZ.d d! Z/d"d# Z0d$d% Z1d&d' Z2d(d) Z3d*d+ Z4d,d- Z5d.d/ Z6d0d1 Z7d2d3 Z8d4d5 Z9d6d7 Z:d8d9 Z;d:d; Z<d<d= Z=d>d? Z>d@dA Z?ddCdDZ@dEdF ZAdGdH ZBdIdJ ZCdKdL ZDdMdN ZEdOdP ZFdQdR ZGdSdT ZHdUdV ZIdWdX ZJdYdZ ZKd[d\ ZLd]d^ ZMd_d` ZNdadb ZOdcdd ZPdedf ZQdgdh ZRdidj ZSdkdl ZTdmdn ZUdodp ZVdqdr ZWdsdt ZXdudv ZYddwdxZZddydzZ[d{d| Z\d}d~ Z]dd Z^dd Z_dd Z`dddZadd Zbdd Zcdd Zddd Zedd Zfdd ZgdddZhdd Zidd Zjdd Zkdd Zldd Zmdd Zndd Zodd ZpdddZqerdd Zsdd ZtdS )ExprNodeNTFsubexprs)fgetc                 C   s   d S rI   rP   rS   rl   rP   rP   rQ   analyse_annotations  s    zExprNode.analyse_annotationsc                 C   s"   t |d td| jj|f d S )Nznot implementedz%s.%s not implemented)r5   r   rO   rU   )rS   method_namerP   rP   rQ   not_implemented  s    
zExprNode.not_implementedc                 C   s   dS Nr   rP   rR   rP   rP   rQ   	is_lvalue  s    zExprNode.is_lvaluec                 C   s   |   o| jj S rI   )r   r   is_memoryviewslicerR   rP   rP   rQ   is_addressable  s    zExprNode.is_addressablec                 C   s   | j jo| jS rI   )r   rj   is_temprR   rP   rP   rQ   is_ephemeral  s    zExprNode.is_ephemeralc                 C   sH   g }| j D ]8}t| |}|d k	r
t|tkr8|| q
|| q
|S rI   )r   getattrr   listextendappend)rS   rz   rk   r   rP   rP   rQ   subexpr_nodes  s    

zExprNode.subexpr_nodesc                 C   s   | j r| jS |  S d S rI   )r   	temp_codecalculate_result_coderR   rP   rP   rQ   result	  s    zExprNode.resultc                 C   s8   |r| j r| jjr| jjr|S d| _d|r0dnd|S )NTz{}({})Z__PYX_STD_MOVE_IF_SUPPORTEDz	std::move)r   r   is_cpp_classis_referencehas_temp_movedformatrS   r   optionalrP   rP   rQ   _make_move_result_rhs  s    zExprNode._make_move_result_rhsc                 C   s   | j |  ddS )NTr   )r   r   rR   rP   rP   rQ   move_result_rhs  s    zExprNode.move_result_rhsc                 C   s6   |  |}|js2|js2|jo | j}| j|| d}|S )Nr   )	result_asr   Zneeds_refcountingZis_rvalue_referencer   r   )rS   r   r   Zrequires_moverP   rP   rQ   move_result_rhs_as  s
    
zExprNode.move_result_rhs_asc                 C   s&   t | rt| S |d k	stt| |S rI   )r@   r6   r   )rS   type_rP   rP   rQ   pythran_result#  s    zExprNode.pythran_resultc                 C   s   dS )zZ
        Subtypes may return False here if result temp allocation can be skipped.
        TrP   rR   rP   rP   rQ   is_c_result_required*  s    zExprNode.is_c_result_requiredc                 C   s:   | j r&| jjr&|tkr&t|t|  S t||  |  S rI   )r   r   rj   r   r+   r   ctyperS   r   rP   rP   rQ   r   0  s
    zExprNode.result_asc                 C   s
   |  tS rI   )r   r   rR   rP   rP   rQ   r   9  s    zExprNode.py_resultc                 C   s   | j p
| jS rI   )result_ctyper   rR   rP   rP   rQ   r   =  s    zExprNode.ctypec                 C   s   d S rI   rP   rR   rP   rP   rQ   get_constant_c_result_codeB  s    	z#ExprNode.get_constant_c_result_codec                 C   s   d S rI   rP   rR   rP   rP   rQ   calculate_constant_resultM  s    
z"ExprNode.calculate_constant_resultc                 C   s   | j tk	o| j tk	S rI   rw   constant_value_not_setnot_a_constantrR   rP   rP   rQ   r   Y  s    
zExprNode.has_constant_resultc                 C   s   t | jd d S )NzInvalid compile-time expressionr   ry   rS   denvrP   rP   rQ   compile_time_value]  s    zExprNode.compile_time_valuec                 C   s   t | jd|jj|f  d S )Nz(Error in compile-time expression: %s: %s)r   ry   rO   rU   )rS   erP   rP   rQ   compile_time_value_errora  s     z!ExprNode.compile_time_value_errorc                 C   s   t | jd d S )NzCannot assign to or delete thisr   r   rP   rP   rQ   analyse_target_declarationg  s    z#ExprNode.analyse_target_declarationc                 C   s   t | jd d S )Nz=Cannot use anything except a name in an assignment expressionr   r   rP   rP   rQ   0analyse_assignment_expression_target_declarationj  s    z9ExprNode.analyse_assignment_expression_target_declarationc                 C   s   |  |}|  |S rI   )analyse_typescheck_constrS   rl   r{   rP   rP   rQ   analyse_const_expressiono  s    
z!ExprNode.analyse_const_expressionc                 C   s
   |  |S rI   r   r   rP   rP   rQ   analyse_expressionsx  s    zExprNode.analyse_expressionsc                 C   s
   |  |S rI   )analyse_target_types)rS   rl   r   rP   rP   rQ   analyse_target_expression~  s    z"ExprNode.analyse_target_expressionc                 C   s   |  |}||}|S rI   )r   coerce_to_boolean)rS   rl   r{   boolrP   rP   rQ   analyse_boolean_expression  s    

z#ExprNode.analyse_boolean_expressionc                 C   s   |  |}|||S rI   )r   r  coerce_to_simpler   rP   rP   rQ   analyse_temp_boolean_expression  s    
z(ExprNode.analyse_temp_boolean_expressionc                    s0   t | dd d k	rdS t fdd|  D dS )Nr   rP   c                    s   g | ]}|  qS rP   )type_dependenciesr   rr   rP   rQ   r     s     z.ExprNode.type_dependencies.<locals>.<listcomp>)r   sumr   r   rP   rr   rQ   r    s    zExprNode.type_dependenciesc                 C   s@   t | dd }|d k	r|S t | dd }|d k	r2|jS | d d S )Nr   r   r~   )r   r   r   rS   rl   r   r   rP   rP   rQ   r~     s    zExprNode.infer_typec                 C   s   | j p| jp| jjp| jjS rI   )r   r   r   is_arrayis_cfunctionrR   rP   rP   rQ   nonlocally_immutable  s    zExprNode.nonlocally_immutabler   c              	   C   s$   t | j| t| jt||tjddS )z
        Return a node that represents the (type) result of an indexing operation,
        e.g. for tuple unpacking or iteration.
        r   rw   r   baseindex)	IndexNodery   IntNoderp   r   c_py_ssize_t_typerS   r  rP   rP   rQ   inferable_item_node  s    
   zExprNode.inferable_item_nodec                 C   s   d S rI   rP   r   rP   rP   rQ   analyse_as_module  s    zExprNode.analyse_as_modulec                 C   s   d S rI   rP   r   rP   rP   rQ   analyse_as_type  s    zExprNode.analyse_as_typec                 C   sX   |  |}|r>|jr>|jr>z||jW S  tk
r<   Y nX |rT|jrTt| jd |S )NzType is not specific)r  is_fusedfused_to_specific
specializeKeyErrorr   ry   )rS   rl   r   rP   rP   rQ   analyse_as_specialized_type  s    

z$ExprNode.analyse_as_specialized_typec                 C   s   d S rI   rP   r   rP   rP   rQ   analyse_as_extension_type  s    z"ExprNode.analyse_as_extension_typec                 C   s   |  d d S )Nr   r   r   rP   rP   rQ   r     s    zExprNode.analyse_typesc                 C   s
   |  |S rI   r   r   rP   rP   rQ   r     s    zExprNode.analyse_target_typesc                 C   s   | j r| j jr|   d S rI   )r   rj   	gil_errorr   rP   rP   rQ   nogil_check  s    zExprNode.nogil_checkc                 C   s   |j r| jjrt| jd d S )Nz3Assignment of Python object not allowed without gil)r   r   rj   r   ry   r   rP   rP   rQ   gil_assignment_check  s    zExprNode.gil_assignment_checkc                 C   s   |    dS NF)	not_constrR   rP   rP   rQ   r     s    zExprNode.check_constc                 C   s   t | jd d S )Nz$Not allowed in a constant expressionr   rR   rP   rP   rQ   r#    s    zExprNode.not_constc                 C   s   |    dS r"  )addr_not_constrR   rP   rP   rQ   check_const_addr  s    zExprNode.check_const_addrc                 C   s   t | jd d S )NzAddress is not constantr   rR   rP   rP   rQ   r$    s    zExprNode.addr_not_constc                 C   s   | j S rI   r   rR   rP   rP   rQ   result_in_temp  s    zExprNode.result_in_tempc                 C   s   |   S rI   r   rR   rP   rP   rQ   target_code  s    zExprNode.target_codec                 C   s   |  d d S )Nr   r  rR   rP   rP   rQ   r     s    zExprNode.calculate_result_codec                 C   st   | j rtd| jj| jf | j}|jsj|jr6tj	}n| j
sT|jsT|  sTd | _ d S |jj|| jd| _ nd | _ d S )Nz'Temp allocated multiple times in %r: %r
manage_ref)r   RuntimeErrorrO   rU   ry   r   is_voidrj   r   r   result_is_usedr   r   	funcstateallocate_tempuse_managed_ref)rS   r   r   rP   rP   rQ   allocate_temp_result	  s     
zExprNode.allocate_temp_resultc                 C   s   | j st| jsd S | jr<tj| jd  f| jdd   nd}| jr`td| j| j	j
|f ntd| j	j
|f |j| j  | j | _d | _ d S )Nr   r%   z(?)z+temp %s released multiple times in %s at %rz*no temp, but release requested in %s at %r)r   r.  ry   ospathbasenameget_descriptionold_tempr,  rO   rU   r/  release_temp)rS   r   ry   rP   rP   rQ   release_temp_result  s"    0  
 zExprNode.release_temp_resultc                 C   s    |   s||  |   dS )z|
        Make sure we own a reference to result.
        If the result is in a temp, it is already a new reference.
        N)r'  
put_increfr   r   rS   r   rP   rP   rQ   make_owned_reference*  s    zExprNode.make_owned_referencec                 C   s&   |   s"|j|  | j| j d dS )zJ
        Make sure we own the reference to this memoryview slice.
        have_gilN)r'  put_incref_memoryviewslicer   r   in_nogil_contextr;  rP   rP   rQ   make_owned_memoryviewslice2  s    z#ExprNode.make_owned_memoryviewslicec                 C   s^   |  | || j | jr&| | | | | jrZ| jjsZ| jjsZ| 	| | 
| d S rI   ) generate_subexpr_evaluation_codemark_posry   r   r2  generate_result_coder   	is_stringis_pyunicode_ptrgenerate_subexpr_disposal_codefree_subexpr_tempsr;  rP   rP   rQ   generate_evaluation_code;  s    



z!ExprNode.generate_evaluation_codec                 C   s   |   D ]}|| qd S rI   )r   rI  rS   r   r{   rP   rP   rQ   rB  L  s    z)ExprNode.generate_subexpr_evaluation_codec                 C   s   |  d d S )NrD  r  r;  rP   rP   rQ   rD  P  s    zExprNode.generate_result_codec                 C   sx   | j r|jtdd | jrj| jjs0| jjrD| 	| | 
| |  rt|j|  |  | j d n
| 	| d S )NMoveIfSupportedCppSupport.cppr=  )r   r   r   r   r   r   r   rE  rF  rG  rH  r   put_decref_clearr   r@  r;  rP   rP   rQ   generate_disposal_codeS  s    


zExprNode.generate_disposal_codec                 C   s   |   D ]}|| qd S rI   )r   rN  rJ  rP   rP   rQ   rG  c  s    z'ExprNode.generate_subexpr_disposal_codec                 C   s   | j r| jjs| jjr,| | | | nH| jjrH|d|    n,| jj	rt|d|    |d|    | j
r|jtdd n
| | d S )N%s = 0;z%s.memview = NULL;z%s.data = NULL;rK  rL  )r   r   rE  rF  rG  rH  rj   r   r   r   r   r   r   r   r   r;  rP   rP   rQ   generate_post_assignment_codei  s    

z&ExprNode.generate_post_assignment_codec                 C   s   d S rI   rP   )rS   r   r   overloaded_assignmentr   r   rP   rP   rQ   generate_assignment_code{  s    z!ExprNode.generate_assignment_codec                 C   s   d S rI   rP   rS   r   ignore_nonexistingrP   rP   rQ   generate_deletion_code  s    zExprNode.generate_deletion_codec                 C   s(   | j r| jjs$| | n
| | d S rI   )r   r   r-  r9  rH  r;  rP   rP   rQ   
free_temps  s    zExprNode.free_tempsc                 C   s   |   D ]}|| qd S rI   )r   rV  )rS   r   subrP   rP   rQ   rH    s    zExprNode.free_subexpr_tempsc                 C   s   d S rI   rP   rS   rl   r   rP   rP   rQ   generate_function_definitions  s    z&ExprNode.generate_function_definitionsc                 C   s   | |  |  | d S rI   )put_decref_setr   r   rS   r   r   rP   rP   rQ   generate_decref_set  s    zExprNode.generate_decref_setc                 C   s   | |  |  | d S rI   )Zput_xdecref_setr   r   r[  rP   rP   rQ   generate_xdecref_set  s    zExprNode.generate_xdecref_setc                 C   s<   |r
| j s8|r$| jr$|r$| | n||  |   d S rI   )
cf_is_nullcf_maybe_nullgenerate_xgotref
put_gotrefr   r   )rS   r   handle_nullmaybe_null_extra_checkrP   rP   rQ   generate_gotref  s    

zExprNode.generate_gotrefc                 C   s   | |  |   d S rI   )put_xgotrefr   r   r;  rP   rP   rQ   r`    s    zExprNode.generate_xgotrefc                 C   s   | |  |   d S rI   )put_giverefr   r   r;  rP   rP   rQ   generate_giveref  s    zExprNode.generate_giverefc                 C   s   | |  |   d S rI   )put_xgiverefr   r   r;  rP   rP   rQ   generate_xgiveref  s    zExprNode.generate_xgiverefc                 C   s   |   D ]}|| qd S rI   )r   annotaterJ  rP   rP   rQ   rj    s    zExprNode.annotatec                 C   s~  | }| j }| ||r| S |j}|r0|js0|j}|jr<|j}|jsH|jr|jr|js|jr|j	jr|j	}|
 D ].}||rp||_ |j j|_d|j_|   S qp|jrt| jd n|jr|jr| S t| jd t| _ | S | jd k	rt| jd| jd}||| |jrddlm} |j jsv|j jr:t|||}n:|j jrZt||||}n|jst| jd|f  nl|j jrd|_|j j|| j | j!d	sz|j j"|j"rd
}	|j |f}
nd}	|j j"|j"f}
t| j|	|
  n|jrn|j#rnr|j$d krt%|j||}nR|j jsP|t&krB|j j'rBt(||}nt)|||d}|j *|szt+|||}nt,|rt-|j r|S t,|j rt-|r|S t)|||d}n|j jr|r|j.rt/| jd|  t0|||}n|j1r||kr|2|rt3|||}nf|t4j5krD||krD|2|sDt6|||}n6|j |kszt7|j t7|ksz|2|sz| 8| |S )NTzType is not specializedz/Cannot coerce to a type that is not specialized )rk   r   r%   
MemoryViewz&Cannot convert '%s' to memoryviewslice)	broadcastcopyingz3Memoryview '%s' not conformable to memoryview '%s'.z-Different base types for memoryviews (%s, %s)r   zTCannot pass Python object as C++ data structure reference (%s &), will pass by copy.)9r   check_for_coercion_errorr   ref_base_typeZis_cv_qualifiedZcv_base_typer  r  is_ptr	base_type"get_all_specialized_function_typessame_asr   usedr   ry   Zis_null_ptrr,   coercion_typeNameNode	coerce_tor   rk  rm  rj   CoerceToMemViewSliceNoder
  CythonArrayNodefrom_carrayis_errorwritable_neededZconforms_tois_memview_broadcastis_memview_copy_assignmentdtypeis_nonerw   NoneNoder   is_intCoerceIntToBytesNodeCoerceToPyTypeNode
subtype_ofPyTypeTestNoder9   r7   r   r   CoerceFromPyTypeNode
is_complexassignable_fromCoerceToComplexNoder   soft_complex_typecoerce_from_soft_complexrp   fail_assignment)rS   dst_typerl   srcZsrc_typeZused_as_reference	signaturer{   rm  msgtuprP   rP   rQ   rz    s    










,
zExprNode.coerce_toc                 C   s4   | | j}|rd| }t| jd| j||f  d S )Nz. z!Cannot assign type '%s' to '%s'%s)Zassignment_failure_extra_infor   r   ry   )rS   r  Zextra_diagnosticsrP   rP   rQ   r  @  s      zExprNode.fail_assignmentc                 C   sX   |r|sd}t | j|f||}|d k	rBt| j|| j|d  dS |rT| | dS dS )Nz)Cannot assign type '%(FROM)s' to '%(TO)s')ZFROMZTOTF)r   r   r   ry   r  )rS   r  rl   failra   messagerP   rP   rQ   rq  G  s    
z!ExprNode.check_for_coercion_errorc                 C   s   |  tj|S rI   )rz  r   r   r   rP   rP   rQ   coerce_to_pyobjectS  s    zExprNode.coerce_to_pyobjectc                 C   s   |   r"t| j}t| j||dS | j}|js4|jr8| S |tj	krF| S |j
s^|js^|js^|jrht| |S |jr|jr|jdrt| jt| j| tddg d|S |jrt|jdk}t| j||dS t| jd|  | S d S )Nr   rw   zoperator bool)obj	attributefunctionr   r   z%Type '%s' not acceptable as a boolean)r   r  rw   BoolNodery   r   is_enumr~  r   c_bint_typerj   r  rs  is_floatCoerceToBooleanNoder   scopelookupSimpleCallNodeAttributeNoder	   EncodedStringr   	is_ctupler   
componentsr   )rS   rl   
bool_valuer   rP   rP   rQ   r  V  s>    


  zExprNode.coerce_to_booleanc                 C   s   | j jr| S | tj|S d S rI   )r   r  rz  r   c_long_typer   rP   rP   rQ   coerce_to_integeru  s    zExprNode.coerce_to_integerc                 C   s   |   r| S t| |S d S rI   )r'  CoerceToTempNoder   rP   rP   rQ   coerce_to_temp|  s    zExprNode.coerce_to_tempc                 C   s   |   r| S | |S d S rI   )	is_simpler  r   rP   rP   rQ   r    s    zExprNode.coerce_to_simplec                 C   s   |   S rI   )r'  rR   rP   rP   rQ   r    s    zExprNode.is_simplec                 C   s0   | j r| j js| j jsdS |  r,| jd k	S dS NFT)r   rj   r   r   rw   rR   rP   rP   rQ   may_be_none  s    
zExprNode.may_be_nonec                 C   s   d S rI   rP   rR   rP   rP   rQ   as_cython_attribute  s    zExprNode.as_cython_attributePyExc_TypeErrorrP   c                 C   s   |   rt| |||S | S d S rI   )r  NoneCheckNode)rS   r  r   format_argsrP   rP   rQ   as_none_safe_node  s    zExprNode.as_none_safe_nodec              	   K   sV   d  }|D ]:}||krqzt||}W n tk
r<   Y qX |||< q| |jf|S )zInstantiate this node class from another node, properly
        copying over all attributes that one would forget otherwise.
        z1cf_state cf_maybe_null cf_is_null constant_result)splitr   r   ry   )rM   r{   kwargs
attributes	attr_namer   rP   rP   rQ   	from_node  s    
zExprNode.from_nodec                 C   s   dS )z
        Gets the module.path that this node was imported from.

        Many nodes do not have one, or it is ambiguous, in which case
        this function returns a false value.
        NrP   rR   rP   rP   rQ   !get_known_standard_library_import  s    z*ExprNode.get_known_standard_library_import)F)N)N)r   )FNN)F)FT)FN)r  rP   )urU   rV   rW   r   r   
annotationr   r7  r1  r.  is_numpy_attributeZgenerator_arg_tagr   is_dict_literalis_set_literalis_string_literalis_attributeis_subscriptr   is_buffer_accessis_memview_indexis_memview_slicer  r  r   r   	is_target
is_starredr   rw   propertyr
   
attrgetterchild_attrsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r~   r  r  r  r  r  r  r   r   r   r!  r   r#  r%  r$  r'  r)  r   r2  r9  r<  rA  rI  rB  rD  rN  rG  rP  rR  rU  rV  rH  rY  r\  r]  rd  r`  rg  ri  rj  rz  r  rq  r  r  r  r  r  r  r  r  r  classmethodr  r  rP   rP   rP   rQ   r   C  s   s



		

	    

  
	 	


r   c                   @   s    e Zd Zg Zdd Zdd ZdS )AtomicExprNodec                 C   s   d S rI   rP   r;  rP   rP   rQ   rB    s    z/AtomicExprNode.generate_subexpr_evaluation_codec                 C   s   d S rI   rP   r;  rP   rP   rQ   rG    s    z-AtomicExprNode.generate_subexpr_disposal_codeN)rU   rV   rW   r   rB  rG  rP   rP   rP   rQ   r    s   r  c                   @   s@   e Zd ZdZeZdZdd Zdd Zdd Z	d	d
 Z
dd ZdS )PyConstNoder%   Nc                 C   s   dS Nr%   rP   rR   rP   rP   rQ   r    s    zPyConstNode.is_simplec                 C   s   dS r"  rP   rR   rP   rP   rQ   r    s    zPyConstNode.may_be_nonec                 C   s   | S rI   rP   r   rP   rP   rQ   r     s    zPyConstNode.analyse_typesc                 C   s   | j S rI   r   rR   rP   rP   rQ   r     s    z!PyConstNode.calculate_result_codec                 C   s   d S rI   rP   r;  rP   rP   rQ   rD    s    z PyConstNode.generate_result_code)rU   rV   rW   r   r   r   r   r  r  r   r   rD  rP   rP   rP   rQ   r    s   r  c                       s8   e Zd ZdZdZdZdd Zdd Z fdd	Z  Z	S )
r  r%   Py_NoneNc                 C   s   d S rI   rP   r   rP   rP   rQ   r     s    zNoneNode.compile_time_valuec                 C   s   dS NTrP   rR   rP   rP   rQ   r    s    zNoneNode.may_be_nonec                    s4   |j s"|js"|js"t| jd|  tt| ||S )NzCannot assign None to %s)rj   r   r~  r   ry   rK   r  rz  rS   r  rl   rN   rP   rQ   rz    s    zNoneNode.coerce_to)
rU   rV   rW   r  r   rw   r   r  rz  rX   rP   rP   rN   rQ   r    s   r  c                   @   s   e Zd ZdZeZdd ZdS )EllipsisNodeZPy_Ellipsisc                 C   s   t S rI   )Ellipsisr   rP   rP   rQ   r     s    zEllipsisNode.compile_time_valueN)rU   rV   rW   r   r  rw   r   rP   rP   rP   rQ   r    s   r  c                   @   sT   e 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S )	ConstNoder%   Nc                 C   s   dS r  rP   rR   rP   rP   rQ   r  
  s    zConstNode.is_simplec                 C   s   dS r  rP   rR   rP   rP   rQ   r    s    zConstNode.nonlocally_immutablec                 C   s   dS r"  rP   rR   rP   rP   rQ   r    s    zConstNode.may_be_nonec                 C   s   | S rI   rP   r   rP   rP   rQ   r     s    zConstNode.analyse_typesc                 C   s   dS r  rP   rR   rP   rP   rQ   r     s    zConstNode.check_constc                 C   s   |   S rI   r(  rR   rP   rP   rQ   r     s    z$ConstNode.get_constant_c_result_codec                 C   s
   t | jS rI   )rp   r   rR   rP   rP   rQ   r     s    zConstNode.calculate_result_codec                 C   s   d S rI   rP   r;  rP   rP   rQ   rD    s    zConstNode.generate_result_code)rU   rV   rW   r   r   r  r  r  r   r   r   r   rD  rP   rP   rP   rQ   r    s   r  c                   @   s2   e Zd ZejZdd Zdd Zdd Zdd Z	d	S )
r  c                 C   s   | j | _d S rI   r  rR   rP   rP   rQ   r   '  s    z"BoolNode.calculate_constant_resultc                 C   s   | j S rI   r  r   rP   rP   rQ   r   *  s    zBoolNode.compile_time_valuec                 C   s(   | j jr| jrdS dS tt| jS d S )NZPy_TrueZPy_False)r   rj   r   rp   intrR   rP   rP   rQ   r   -  s    zBoolNode.calculate_result_codec                 C   s   || j kr| S |tkr&| j tjkr&| S |jrL| j jrLt| j| j| j	tjdS |jrr| j jrrt| j| j| j	t
jdS t| ||S Nr  )r   r   r   Z	bool_typerj   r  r  ry   r   rw   r   r  r  rz  r  rP   rP   rQ   rz  3  s&    
  zBoolNode.coerce_toN)
rU   rV   rW   r   r  r   r   r   r   rz  rP   rP   rP   rQ   r  #  s
   r  c                   @   s"   e Zd ZejZdZdZdd ZdS )NullNodeNULLr   c                 C   s   | j S rI   r  rR   rP   rP   rQ   r   J  s    z#NullNode.get_constant_c_result_codeN)	rU   rV   rW   r   Zc_null_ptr_typer   r   rw   r   rP   rP   rP   rQ   r  E  s   r  c                   @   s*   e Zd ZejZdd Zdd Zdd ZdS )r   c                 C   s   t | j| _d S rI   )ordr   rw   rR   rP   rP   rQ   r   Q  s    z"CharNode.calculate_constant_resultc                 C   s
   t | jS rI   )r  r   r   rP   rP   rQ   r   T  s    zCharNode.compile_time_valuec                 C   s   dt | j S )Nz'%s')r	   Zescape_charr   rR   rP   rP   rQ   r   W  s    zCharNode.calculate_result_codeN)	rU   rV   rW   r   r   r   r   r   r   rP   rP   rP   rQ   r   N  s   r   c                   @   s   e Zd ZdZdZd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d Zdd Zdd Zdd Zdd ZdS )r  rk  Nc                 C   s   t tt | jS rI   )r   strip_py2_long_suffixhexstr_to_numberr   rR   rP   rP   rQ   	hex_valueg  s    zIntNode.hex_valuec                 C   s   t t| jS rI   )rp   r   r  r   rR   rP   rP   rQ   base_10_valuek  s    zIntNode.base_10_valuec                 K   s&   t j| |f| d|kr"|  | _d S )Nr   )r   __init__find_suitable_type_for_valuer   )rS   ry   kwdsrP   rP   rQ   r  o  s    zIntNode.__init__c                 C   s   | j tkr,z|   W n tk
r*   Y nX | jsJ|  rJ| jsJ| jdkr| jdkrXdpZd}tj	| j |df }| j
rt|| j
}n>d| j   krdk rn n| j
r| j
jr| j
}qtj}ntj}|S )NLLr2   r%   r  i   l        )rw   r   r   r   is_c_literalr   unsignedlongnessr   Zmodifiers_and_name_to_typer   widest_numeric_typer  r  r   )rS   rankZsuitable_typerP   rP   rQ   r  t  s,    
z$IntNode.find_suitable_type_for_valuec              	   C   s   | j |kr| S |jrR|  r>t| jdt| j |t| jdS t| j| j|t	dS |j
r|jst| j| j| j|d| j| jd}|S |jrt| j| j| jtjd| j| jd}nt| j| j| j| j| jd}t|||S )Nz%d.0)r   r   rw   T)r   rw   r   r  r  r  F)r   rw   r  r  )r   r  r   	FloatNodery   r  rw   rx   r   r   
is_numericr  r  r  r  rj   r   r   r  rz  rS   r  rl   r{   rP   rP   rQ   rz    s<    
     zIntNode.coerce_toc                 C   s    t | j| j| jtj| j| jdS )N)r   rw   r   r  r  )r  ry   r   rw   r   r  r  r  r   rP   rP   rQ   r    s      zIntNode.coerce_to_booleanc                 C   sV   | j jrHt| j}|dkr tnt}||}t|}||| j	| _
n
|  | _
d S )Nl     a$)r   rj   r   r  r   r  rp   r  Z
get_py_intr  result_coder   )rS   r   r   	formatterZplain_integer_stringrP   rP   rQ   rI    s    
z IntNode.generate_evaluation_codec                 C   st   | j | j }}|  }|sh|sh| jjrh|d dkrh|d dkrh| jjtjjkrTd}n| jjtjjkrhd}|| | S )Nr   -r%   0r  L)	r  r  value_as_c_integer_stringr   r  r  r   Zc_longlong_typer  )rS   r  r  literalrP   rP   rQ   r     s    (z"IntNode.get_constant_c_result_codec                 C   s   | j }t|dkr|S d}|d dkr6d}|dd  }|d dkr|d }|rv|dkrv|dd   rvtt|}q|dkrd|dd   }q|d	krtt|dd  d}n$| r| js| js|sd
t| }|| S )Nr2   rk  r   r  r%   r  ZoOxX0123456789ZoOZbBz0x%X)	r   r   isdigitrp   r   r  r  r  r  )rS   r   Zneg_signZliteral_typerP   rP   rQ   r    s&    z!IntNode.value_as_c_integer_stringc                 C   s   | j S rI   r  rR   rP   rP   rQ   r     s    zIntNode.calculate_result_codec                 C   s   t | j| _d S rI   )r   r  r   rw   rR   rP   rP   rQ   r     s    z!IntNode.calculate_constant_resultc                 C   s   t | jS rI   )r   r  r   r   rP   rP   rQ   r     s    zIntNode.compile_time_value)rU   rV   rW   r  r  r  r  r  r  r  r  rz  r  rI  r   r  r   r   r   rP   rP   rP   rQ   r  [  s"   

r  c                   @   sB   e Zd ZejZdd Zdd Zdd Zdd Z	d	d
 Z
dd ZdS )r  c                 C   s   t | j| _d S rI   )rx   r   rw   rR   rP   rP   rQ   r     s    z#FloatNode.calculate_constant_resultc                 C   sN   t | j}d| d}t| j}||t|dfkrJt| jd|  |S )Nz%.330fr  zEUsing this floating point value with DEF may lose precision, using %r)	rx   r   stripr   Znormalise_float_reprreprlstripr   ry   )rS   r   Zfloat_valueZstr_float_valueZ	str_valuerP   rP   rQ   r     s    
zFloatNode.compile_time_valuec                 C   sX   |j r&| jjr&t| j| j| jtjdS |jrJ| jj rJt| j| j| j|dS t	
| ||S r  )rj   r   r  r  ry   r   rw   r   Z
float_typer  rz  r  rP   rP   rQ   rz    s      zFloatNode.coerce_toc                 C   s   | j S rI   r  rR   rP   rP   rQ   r     s    zFloatNode.calculate_result_codec                 C   sL   | j }t|tsttt|}|dkr,dS |dkr8dS |dkrDdS |S d S )Nnanz(Py_HUGE_VAL * 0)infZPy_HUGE_VALz-infz(-Py_HUGE_VAL))r   rv   rF   r   r  rx   )rS   strvalZcmpvalrP   rP   rQ   r     s    z$FloatNode.get_constant_c_result_codec                 C   s,   |   }| jjr"|| j|| _n|| _d S rI   )r   r   rj   Zget_py_floatr   r  )rS   r   Zc_valuerP   rP   rQ   rI    s    z"FloatNode.generate_evaluation_codeN)rU   rV   rW   r   c_double_typer   r   r   rz  r   r   rI  rP   rP   rP   rQ   r    s   r  c           
   
   C   sR  t | }|d k	r|jr|S | }|| }|rz|jrz|j}|js^|tjkr^|j	j
dkr^t}|rr|jsn|jrr|S |px|}ddlm} tdd |d |d |d d f}z|d|  |d j|d	}W n tk
r   Y nhX |jjd j}	t|	trD|	|}	t|	trD|	j}|r:|js*|jr:|W  5 Q R  S |pB|}W 5 Q R X |S )
Nr2   r%   )TreeFragmentTignorer      
sizeof(%s))rk   Zinitial_pos)r   parse_basic_typein_c_type_contextglobal_scoper  is_typer   r   int_typecontextlanguage_levelr   rj   r  r   filenamer   rootstatsexprrv   SizeofTypeNoder   arg_type)
rk   ry   rl   r   r  Zglobal_entryr   r  ZdeclarationZsizeof_noderP   rP   rQ   _analyse_name_as_type$  s@    




r  c                   @   sf   e Zd ZdZe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S )	BytesNodeTc                 C   s   | j | _d S rI   r  rR   rP   rP   rQ   r   U  s    z#BytesNode.calculate_constant_resultNc                 C   s,   t | j||| | jj}t| j||dS Nr  )r	   bytes_literalr   encodingr  ry   )rS   r   r   r   r   rP   rP   rQ   as_sliced_nodeX  s    zBytesNode.as_sliced_nodec                 C   s
   | j  S rI   )r   
byteencoder   rP   rP   rQ   r   \  s    zBytesNode.compile_time_valuec                 C   s   t | jd| j|S Nz	ISO8859-1)r  r   decodery   r   rP   rP   rQ   r  _  s    zBytesNode.analyse_as_typec                 C   s   t | jdkS r  r   r   rR   rP   rP   rQ   can_coerce_to_char_literalb  s    z$BytesNode.can_coerce_to_char_literalc                 C   s   t | j}t| j||dS r  r  r   r  ry   rS   rl   r  rP   rP   rQ   r  e  s    
zBytesNode.coerce_to_booleanc                 C   s&  | j |kr| S |jrZ|  s,t| jd | S |jrBt| jd | S t| j| jt| jdS t	| j| j| j
d}|jr|ttjfkrtj|_ n| j||dd |S |tjtjfkr||_ |S |tjtjtjfkr|tjkrtjntj|_ t||S |tjr|jr|jr||_ |S t|||S )Nz?Only single-character string literals can be coerced into ints.zRBytes literals cannot coerce to Py_UNICODE/Py_UCS4, use a unicode literal instead.r  Tr  )r   r  r  r   ry   is_unicode_charr   r   r  r  rw   rj   r   r   r   rq  r   rf   rh   rg   ri   c_void_ptr_typeCastNoder  r   is_constr  rz  r  rP   rP   rQ   rz  k  s>    



zBytesNode.coerce_toc                 C   sP   | j jr|| j}n0| j jr,|| j}n| j }t| j tj	|}|| _
d S rI   )r   rj   get_py_string_constr   r   get_string_constZas_c_string_literalr+   r   r  r  )rS   r   r   r  rP   rP   rQ   rI    s    
z"BytesNode.generate_evaluation_codec                 C   s   d S rI   rP   rR   rP   rP   rQ   r     s    z$BytesNode.get_constant_c_result_codec                 C   s   | j S rI   r  rR   rP   rP   rQ   r     s    zBytesNode.calculate_result_code)N)rU   rV   rW   r  r   r   r   r  r   r  r  r  rz  rI  r   r   rP   rP   rP   rQ   r  L  s   
&r  c                   @   sj   e Zd ZdZdZe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S )UnicodeNodeTNc                 C   s   | j | _d S rI   r  rR   rP   rP   rQ   r     s    z%UnicodeNode.calculate_constant_resultc                 C   s   t | j| j|S rI   )r  r   ry   r   rP   rP   rQ   r    s    zUnicodeNode.analyse_as_typec                 C   sv   t | jd | rd S t | j||| }| jj|_| jd k	r`t | j||| | jj}nd }t| j|||dS )N)r   bytes_valuerw   )	r	   string_contains_surrogatesr   r  r  r$  r  r#  ry   )rS   r   r   r   r   r$  rP   rP   rQ   r    s     

   zUnicodeNode.as_sliced_nodec                 C   s   || j krn|jrJ|  s*t| jd | S t| j}t| j|t||dS |j	s|j
rx| jd k	rxt| j| jd||S |jrt| j| j|dS t| jd n|ttjfkr| j||dd | S )NzhOnly single-character Unicode string literals or surrogate pairs can be coerced into Py_UCS4/Py_UNICODE.r   r   rw   r  r   r   zUnicode literals do not support coercion to C types other than Py_UNICODE/Py_UCS4 (for characters) or Py_UNICODE* (for strings).Tr  )r   r  r  r   ry   r  r   r  rp   rj   rE  r$  r  rz  rF  r#  r   r   r/   rq  )rS   r  rl   Z	int_valuerP   rP   rQ   rz    s.    

zUnicodeNode.coerce_toc                 C   s   t | jdkS r  r  rR   rP   rP   rQ   r    s    z&UnicodeNode.can_coerce_to_char_literalc                 C   s   t | j}t| j||dS r  r  r  rP   rP   rQ   r    s    
zUnicodeNode.coerce_to_booleanc                 C   s   t | jS rI   )r	   r%  r   rR   rP   rP   rQ   contains_surrogates  s    zUnicodeNode.contains_surrogatesc              
   C   s   | j jrt| jr|td| _|t	| j
d}|| j}|d krRd S || j |d| j|||| j| jf  || jd| j  q|| j| _n|| j| _d S )NZustringZunicode_escapez@%s = PyUnicode_DecodeUnicodeEscape(%s, sizeof(%s) - 1, NULL); %sz__Pyx_PyUnicode_READY(%s))r   rj   r	   Zstring_contains_lone_surrogatesr   get_py_constr   r  r"  ZBytesLiteralencodeget_cached_constants_writerrC  ry   r   r   put_error_if_negr!  Zget_pyunicode_ptr_const)rS   r   Z
data_cname
const_coderP   rP   rQ   rI    s0     z$UnicodeNode.generate_evaluation_codec                 C   s   | j S rI   r  rR   rP   rP   rQ   r     s    z!UnicodeNode.calculate_result_codec                 C   s   | j S rI   r  r   rP   rP   rQ   r     s    zUnicodeNode.compile_time_value)N)rU   rV   rW   r  r$  r   r   r   r  r  rz  r  r  r(  rI  r   r   rP   rP   rP   rQ   r#    s   
r#  c                   @   sf   e Zd ZeZdZdZ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S )
StringNodeTNc                 C   s   | j d k	r| j | _d S rI   )r   rw   rR   rP   rP   rQ   r     s    
z$StringNode.calculate_constant_resultc                 C   s   t | jp| jd| j|S r  )r  r   r   r  ry   r   rP   rP   rQ   r  $  s    zStringNode.analyse_as_typec                 C   sx   t | j| j||| }| jj|_| jd k	r^t| jd | rFd S t| j||| }nd }t| j|||| j	dS )N)r   r   rw   is_identifier)
r   r   r  r   r	   r%  r  r.  ry   r/  )rS   r   r   r   r   r   rP   rP   rQ   r  '  s     

   zStringNode.as_sliced_nodec                 C   sN   |t k	rJt|sJ|js0t| j| jd||S |tj	k	rJ| j
||dd | S )Nr  Tr  )r   r   r  rj   r  ry   r   rz  r   r/   rq  r  rP   rP   rQ   rz  6  s    
zStringNode.coerce_toc                 C   s   | j  ot| jdkS r  )r/  r   r   rR   rP   rP   rQ   r  A  s    z%StringNode.can_coerce_to_char_literalc                 C   s   |j | j| jd| jd| _d S )NT
identifieris_strr   )r!  r   r/  r   r  r;  rP   rP   rQ   rI  D  s      z#StringNode.generate_evaluation_codec                 C   s   d S rI   rP   rR   rP   rP   rQ   r   I  s    z%StringNode.get_constant_c_result_codec                 C   s   | j S rI   r  rR   rP   rP   rQ   r   L  s    z StringNode.calculate_result_codec                 C   s8   | j jr| j S ts| j  S | jd k	r,| jS | j dS )N	iso8859-1)r   Z
is_unicoder$   r  r   r  r   rP   rP   rQ   r   O  s    

zStringNode.compile_time_value)N)rU   rV   rW   r   r   r  r/  r   r   r  r  rz  r  rI  r   r   r   rP   rP   rP   rQ   r.    s   
r.  c                   @   s   e Zd ZdZdS )r   TN)rU   rV   rW   r/  rP   rP   rP   rQ   r   [  s   r   c                   @   sN   e Zd ZejZdd Zdd Zdd Zdd Z	d	d
 Z
dZdd Zdd ZdS )ImagNodec                 C   s   t dt| j| _d S Ng        )complexrx   r   rw   rR   rP   rP   rQ   r   h  s    z"ImagNode.calculate_constant_resultc                 C   s   t dt| jS r5  )r6  rx   r   r   rP   rP   rQ   r   k  s    zImagNode.compile_time_valuec                 C   s   | j | | S rI   )r   create_declaration_utility_coder   rP   rP   rQ   r   n  s    zImagNode.analyse_typesc                 C   s   dS r"  rP   rR   rP   rP   rQ   r  r  s    zImagNode.may_be_nonec                 C   s@   | j |kr| S t| j| jd}|jr2d|_tj|_ t	|||S )Nr  r%   )
r   r4  ry   r   rj   r   r   complex_typer  rz  r  rP   rP   rQ   rz  u  s    
zImagNode.coerce_tozConstructing complex numberc                 C   s*   | j jr|  S d| j jt| jf S d S )Nz	%s(0, %r))r   rj   r   
from_partsrx   r   rR   rP   rP   rQ   r     s    zImagNode.calculate_result_codec              	   C   sB   | j jr>|d|  t| j||  | jf  | | d S )Nz'%s = PyComplex_FromDoubles(0.0, %r); %s)	r   rj   r   r   rx   r   r   ry   rd  r;  rP   rP   rQ   rD    s    zImagNode.generate_result_codeN)rU   rV   rW   r   Zc_double_complex_typer   r   r   r   r  rz  gil_messager   rD  rP   rP   rP   rQ   r4  a  s   r4  c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )NewExprNodeNc                 C   s`   | j |}|d ks|js0t| jd t| _d S | | || j}|| _	|| _
|j| _| jS )Nz/new operator can only be applied to a C++ class)Zcppclassr  r   r   ry   r,   r   	cpp_checkZget_constructor
class_typer   )rS   rl   r   constructorrP   rP   rQ   r~     s    
zNewExprNode.infer_typec                 C   s   | j d kr| | | S rI   )r   r~   r   rP   rP   rQ   r     s    

zNewExprNode.analyse_typesc                 C   s   dS r"  rP   rR   rP   rP   rQ   r    s    zNewExprNode.may_be_nonec                 C   s   d S rI   rP   r;  rP   rP   rQ   rD    s    z NewExprNode.generate_result_codec                 C   s   d| j   S )Nznew )r=  empty_declaration_coderR   rP   rP   rQ   r     s    z!NewExprNode.calculate_result_code)	rU   rV   rW   r   r~   r   r  rD  r   rP   rP   rP   rQ   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dZdZdd Zdd Zd	d
 Zdd Zdd Z fddZdPd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'Z dQd(d)Z!d*d+ Z"d,d- Z#d.d/ Z$ fd0d1Z%d2d3 Z&d4d5 Z'd6d7 Z(d8d9 Z)d:d; Z*d<d= Z+d>d? Z,d@dA Z-dBdC Z.dRdDdEZ/dFdG Z0dHdI Z1dSdJdKZ2dLdM Z3dNdO Z4  Z5S )Try  TFNr   c                 C   s   | j S rI   )cython_attributerR   rP   rP   rQ   r    s    zNameNode.as_cython_attributec                 C   s:   | j d kr|| j| _ | j d k	r2| j jjr2| fS dS d S NrP   )r   r  rk   r   is_unspecifiedr   rP   rP   rQ   r    s
    
zNameNode.type_dependenciesc                 C   s   | j d kr|| j| _ | j d ks.| j jtkrB| jd k	r>| jS tS | j jjsV| j jjrj| j| j jjkrjt	S | j jj
r| j jjrtS t| j jS n.| j jjr| jr| jjr| j js| jS | j jS d S rI   )r   r  rk   r   r-   inferred_typer   is_extension_typeis_builtin_typer   r  r  Zis_builtin_scoper   CPtrTyperj   r  Zmight_overflowr   rP   rP   rQ   r~     s$    



zNameNode.infer_typec                 C   s:   z| | jW S  tk
r4   t| jd| j  Y nX d S )Nz"Compile-time name '%s' not defined)r  rk   r  r   ry   r   rP   rP   rQ   r     s    zNameNode.compile_time_valuec                 C   s   | j r| j jjrd S | j jS rI   )r   r   rj   r   rR   rP   rP   rQ   r     s    z#NameNode.get_constant_c_result_codec                    st   |t krb| j}|rb|jrb|j}|rb|jr>|jr>||j| j}t	| j| jd}||_|
| |S tt	| ||S )Nrk   )r   r   r  as_variable
is_builtinr   declare_builtinrk   ry   ry  analyse_rvalue_entryrK   rz  )rS   r  rl   r   Z	var_entryr{   rN   rP   rQ   rz    s    

zNameNode.coerce_toc           
      C   sf  | j }| j}| jp||}|sN|jr,dS d}|jjsB|jd sHd}n|jrTt	}n|
|\}}|dkr|r|jd dkrtnt	}nH|jr|jrz||j}W n* tk
r   t| jd| j   t}Y nX d}|jr|jdk}	|js||r|	rd	nd
}|r.|jr.|js.|js.t	}t|jdd |j||| j| ||d }| _|rb|jsb||_dS )as  Implements PEP 526 annotation typing in a fairly relaxed way.

        Annotations are ignored for global variables.
        All other annotations are stored on the entry in the symbol table.
        String literals are allowed and not evaluated.
        The ambiguous Python types 'int' and 'long' are not evaluated - the 'cython.int' form must be used instead.
        NrP   Zannotation_typinginfer_typesFzR'%s' cannot be specialized since its type is not a fused argument to this functionprivatefrozenreadonlypubliczxAnnotation ignored since class-level attributes must be Python objects. Were you trying to set up an instance attribute?r2   )Zis_cdef
visibilityZpytyping_modifiers)rk   r  r   lookup_hereis_module_scoper  r  rd   is_py_class_scoper   analyse_type_annotationr-   r  r  r  r&   r   ry   r,   is_c_dataclass_scoperj   can_coerce_to_pyobjectis_c_class_scoper~  r   declare_var)
rS   rl   	as_targetrk   r  r   	modifiersatyperQ  	is_frozenrP   rP   rQ   declare_from_annotation  s^    

    z NameNode.declare_from_annotationc                 C   sN   | j }|s|| j}|r&|jr&|jS |rJ|jrJt|j}|rJ|jrJ|S d S rI   )r   r  rk   	as_moduleknown_standard_library_importr   Z'get_known_standard_library_module_scoperS  )rS   rl   r   r  rP   rP   rQ   r  T  s    


zNameNode.analyse_as_modulec                 C   s  d }| j rt| j }n|jr*t| j}|r2|S | j}|sH|| j}|rd|jsd|jrdt	
|j}|r|jr|j}|js|t	jkrt| jd t}n2|jr|jr|j}n|t	jkr| jjdkrt}|S | jdkrtS |jst| jrt| jd| j| jf  d S )NzWFound Python 2.x type 'long' in a Python annotation. Did you mean to use 'cython.long'?r2   objectzJFound C type '%s' in a Python annotation. Did you mean to use 'cython.%s'?)r@  r   r  r  rk   r   r  r  r`  r   Z get_known_standard_library_entryr   r0   r   ry   r   rj   equivalent_typer  r  r  r  r	  rP   rP   rQ   r  b  s6    

zNameNode.analyse_as_typec                 C   s:   | j }|s|| j}|r6|jr6|jjs0|jjr6|jS d S rI   )r   r  rk   r  r   rD  rE  rS   rl   r   rP   rP   rQ   r    s    
z"NameNode.analyse_as_extension_typec                 C   s   | j |ddS )NFis_assignment_expression_analyse_target_declarationr   rP   rP   rQ   r     s    z#NameNode.analyse_target_declarationc                 C   s   | j |ddS )NTrd  rf  r   rP   rP   rQ   r     s    z9NameNode.analyse_assignment_expression_target_declarationc                 C   s  d| _ | js.|r || j| _n|| j| _| jr<d| j_| jsd| jd k	rd|j}| j|| d n&| jr| jj	r| jr|jrt
| jd | js|jd rt| jd| j d |jd d	krt}nt}|r|| j|| j| _n|| j|| j| _| jjrt| _| jjrd| j_d S )
NTrk  )rZ  z7Cannot redeclare inherited fields in Cython dataclasseszwarn.undeclaredzimplicit declaration of '%s'r%   rL  F)r  r   Z#lookup_assignment_expression_targetrk   rR  r`  r  rV  r^  Zis_inheritedr   ry   rd   r   r-   r   Z$declare_assignment_expression_targetrY  is_declared_genericr   r_  is_variable)rS   rl   re  Zis_dataclassr   rP   rP   rQ   rg    s:    


z$NameNode._analyse_target_declarationc                 C   s   |j d | _| j}|d krf|| j}|sP|| j| j}|rP|jrP|jrPd| _	|s`t
j| _| S || _d|_|jjrddlm} || | | | S )NinitializedcheckTr%   Buffer)rd   initialized_checkr   r  rk   rJ  ry   rI  r   r   r   r,   r   rw  	is_bufferrk  rl  used_buffer_aux_varsrK  rS   rl   r   rl  rP   rP   rQ   r     s$    

zNameNode.analyse_typesc                 C   s   | j |dd | j}|jrP|jrP|js<|jjs<|  sP|jrP|j }| _|j| _| jjrjt	| j
d| j  |  st	| j
d| j  tj| _d|_|jjrddlm} || | S )NTr  zAssignment to const '%s'zAssignment to non-lvalue '%s'r%   rk  )analyse_entryr   r  rH  is_overridabler   r   fused_cfunctionr   r   ry   rk   r   r,   rw  rn  rk  rl  ro  rp  rP   rP   rQ   r     s     
zNameNode.analyse_target_typesc                 C   sh   |  | | j}|jrt| _|js(|jrJ|jr<|jr<d| _nd| _d| _	n|j
jrdd| _d| _	d| _| S )Nr   r%   FT)rr  r   rh  r   r   is_pyglobalrI  r   r   is_used_as_rvaluer   r   r1  rc  rP   rP   rQ   rK    s    
zNameNode.analyse_rvalue_entryc                 C   s:   d| _ | jr6| j}|jr(|js6|   n|jr6|   d S r  )r   rv  r   rI  r   r  ru  rc  rP   rP   rQ   r     s    
zNameNode.nogil_checkz"Accessing Python global or builtinc                 C   s<   |    | j}|j}|s2|jr2| jr2| jjr2| j}|| _d S rI   )check_identifier_kindr   r   rj   rC  rE  )rS   rl   r  r   r   rP   rP   rQ   rr  		  s    zNameNode.analyse_entryc                 C   s   | j }|jr|jjr|| _|jrX|jjs0|jjrXt| j	d t
}d|_| j j|_|| _ nJ|js|js|js|js|js| j jr| j j| _ n| jst| jd| j	  d S )NTz7'%s' is not a constant, variable or function identifier)r   r  r   rD  
type_entryr  is_cpp_enumr   Entryrk   r   ru  r  r   ri  rI  r  r   rH  is_cython_moduler   ry   )rS   r   Zpy_entryrP   rP   rQ   rw  	  s&    
zNameNode.check_identifier_kindc                 C   s0   | j s| jrdS | jp || j}|jo.|j S r"  )r{  r@  r   r  rk   r_  ri  rc  rP   rP   rQ   "is_cimported_module_without_shadow(	  s    z+NameNode.is_cimported_module_without_shadowc                 C   s   dS r  rP   rR   rP   rP   rQ   r  .	  s    zNameNode.is_simplec                    sj   | j r\| jr\| jjs| jjr\t| ddr,dS d| _d}| j D ]}|j r<d} qTq<| `|S tt	|  S )N_none_checkingFT)
r   r   rj   r   r   r}  r   r  rK   ry  )rS   r  
assignmentrN   rP   rQ   r  2	  s    

zNameNode.may_be_nonec                 C   s:   t | rdS | j}|r|jr"dS |jp8|jp8|jp8|jS NTF)r   r  r   
in_closureis_localZis_argrI  is_readonlyrS   r   rP   rP   rQ   r  G	  s    

zNameNode.nonlocally_immutablec                 C   s   d S rI   rP   r   rP   rP   rQ   calculate_target_resultsO	  s    z!NameNode.calculate_target_resultsc                 C   s8   | j }|d k	r4|js4|js4|js4|jjs4|   dS dS r  )r   r   r  rI  r   r#  r  rP   rP   rQ   r   R	  s    zNameNode.check_constc                 C   s(   | j }|js$|js$|js$|   dS dS r  )r   
is_cglobalr  rI  r$  r  rP   rP   rQ   r%  ]	  s
    zNameNode.check_const_addrc                 C   s"   | j jr| j j p | j jo | j jS rI   )r   ri  r  r  rs  rR   rP   rP   rQ   r   d	  s    zNameNode.is_lvaluec                 C   s   | j jo| jj S rI   )r   ri  r   r   rR   rP   rP   rQ   r   m	  s    zNameNode.is_addressablec                 C   s   dS r   rP   rR   rP   rP   rQ   r   p	  s    zNameNode.is_ephemeralc                 C   s,   | j }|sdS | j jr&| js&d|j S |jS )N<error>(*%s))r   is_cpp_optionalr  r   r  rP   rP   rQ   r   u	  s    
zNameNode.calculate_result_codec           	   
   C   sD  | j }|d krd S |jr&|j|j |jr6|jr6d S |jr|jjsNt	d|
| j j}|jrjtj}n|jj}| js|d|  ||f  |d|    |d |jtdd |d|  |f  | js|d |||  | j | | n4|jr|jjs|jjs0t	d|
| j j}|jtd	d |d
|  |||  | jf  | | n|js|jrR|jjrR|jjst	d|
| j j}|jjr|jtdd |d|  |||  | jf  n@|jtdd |d|  |jj|||  | jf  | | n|jst|jst|jst|jjr| js| jo| j }|jjo| j }|j!o| j }|r|j"|j#}n|j$|j#}|r@|r@|jjs|s|r@|j%| j|| j&|d n8|j'r@|j!r@| j r@|j"|j#}|j%| j||d d S )N,Python global or builtin not a Python objectz%s = PyObject_GetItem(%s, %s);if (unlikely(!%s)) {PyErr_Clear();ZGetModuleGlobalNameObjectHandling.cz"__Pyx_GetModuleGlobalName(%s, %s);r   ZGetBuiltinNamez!%s = __Pyx_GetBuiltinName(%s); %sz%__Pyx_GetModuleGlobalName(%s, %s); %sZGetNameInClassz$__Pyx_GetNameInClass(%s, %s, %s); %sunbound_check_code)(r   utility_coder   r   rI  r   is_pyclass_attrr   rj   r   intern_identifierrk   r   Zbuiltins_cnamer  namespace_cnamer^  r   r   r   r   r   ry   rd  rS  ru  r  r  from_closurer   r_  
allow_nullrm  r   cpp_optional_check_for_null_coder   Zcheck_for_null_codeput_error_if_unboundr@  r  )	rS   r   r   interned_cname	namespaceZraise_unboundZmemslice_checkZoptional_cpp_checkr  rP   rP   rQ   rD  }	  s    






""zNameNode.generate_result_codec              	   C   sN  | j }|d krd S | j jjr>t|tr>| js>|js>t| jd |j	r@|jj
sVtd|| j j}| j jj}|jrzd}	nZ|jjrd}	tj}nF|jr| jdkrdnd}
|jt|
d d	|
 }	nd
stt||| jd|	||| f  trtd td|  || || |jrJ| d|jj!j"  n
| jj#rX| $|| n| jj%rn| &|| d
}| jj
r4| j'r4|(| |j)p| j j*p| j j+}|r| j,|dd d}|j)r| -||.| /  nD| j0s | j1r| 2||.| /  n| -||.| /  nd
}|r4|3| | jj#s,|s|r|4 }|dkrt5|| jd| 6 |f | jj
r| 6 nd || j7 n| d| 6 |f  n\|8| / }t9| jr| d| 6 | 6 |f  n$|| 6 kr| d| 6 |f  tr td td|  |:| n|; r@|:| || d S )Nz?Literal list must be assigned to pointer at time of declarationr  Z__Pyx_SetItemOnTypeDictPyDict_SetItemrL   ZSetNewInClassZSetNameInClassr  Z__Pyx_Fz%s(%s, %s, %s)z"NameNode.generate_assignment_code:z"...generating disposal code for %szPyType_Modified(%s);T)rb  r   %s = %s;new (&%s) decltype(%s){%s};z)...generating post-assignment code for %s)<r   r   rs  rv   ListNodelhs_of_first_assignmentin_module_scoper   ry   ru  rj   r   r  rk   r  r  	is_memberrS  r   moddict_cnamer  r   r   r   r   r  r,  r   r   printrN  rV  r   Zparent_typeZtypeptr_cnamer    generate_acquire_memoryviewslicern  generate_acquire_bufferr1  r<  r  r  r  rd  r\  r   r   r^  r_  r]  rg  r   r   r   r@  r   r9   rP  r'  )rS   r   r   rQ  r   r   r   r  r  setternassignedZis_external_refr   rP   rP   rQ   rR  	  s    











  

z!NameNode.generate_assignment_codec              	   C   s6   ddl m} |j|  | j| j||| j | jd dS )z
        Slices, coercions from objects, return values etc are new references.
        We have a borrowed reference in case of dst = src
        r%   rl  )Z	lhs_cnamer   Zlhs_posr   r   r>  Zfirst_assignmentN)rk  rm  Zput_acquire_memoryviewslicer   r   ry   r@  r^  )rS   r   r   rm  rP   rP   rQ   r  H
  s    z)NameNode.generate_acquire_memoryviewslicec                 C   s   t |tp|j}|r$||  }n0|jj| jjdd}|	d|||  f  ddl
m} |j|  || j| j | j|d |s|	d|  |j| d S )NFr*  r  r%   rk  )Zis_initializedry   r   rO  )rv   ry  r   r   r   r/  r0  r   r   r   rk  rl  Zput_assign_to_bufferr   r  ry   r8  )rS   r   r   Z
pretty_rhsZrhstmprl  rP   rP   rQ   r  X
  s     z NameNode.generate_acquire_bufferc              	   C   s~  | j d krd S | j jrf| j jj}|| j j}|r8d}nd| j j }|d||||| jf  n| j j	r|j
tdd || j j}dtj|f }|r|d||| jf  n|| j| n| j jjs| j jjrn| jsz| jr
|s
|| j| j  | j jr$| j|d|d	 |rP| jrP|j|  |  | j d
 n|j|  |  | j d
 nt| jd d S )NzPyErr_Clear(); elsezT{ PyErr_Clear(); PyErr_Format(PyExc_NameError, "name '%%s' is not defined", "%s"); }ziif (unlikely(PyObject_DelItem(%s, %s) < 0)) { if (likely(PyErr_ExceptionMatches(PyExc_KeyError))) %s %s }PyObjectSetAttrStrr  !__Pyx_PyObject_DelAttrStr(%s, %s)zjif (unlikely(%s < 0)) { if (likely(PyErr_ExceptionMatches(PyExc_AttributeError))) PyErr_Clear(); else %s }T)rb  rc  r=  z!Deletion of C names not supported)r   r  r  r  r  rk   r   r   ry   ru  r   r   r   r   r   module_cnamer,  r   rj   r   r^  r_  r  r  rd  put_xdecref_clearr   r   r   rM  r   )rS   r   rT  r  r  Zkey_error_codeZdel_coderP   rP   rQ   rU  l
  sb    



 
zNameNode.generate_deletion_codec                 C   sv   t | ddrr| jd | jd | jd t| j d f}| jjrHd\}}nd\}}||t||| j t| jd d S )	N	is_calledFr   r%   r2   )Zpy_callzpython function (%s))Zc_callzc function (%s)size)r   ry   r   rk   r   rj   rj  r3   )rS   r   ry   styletextrP   rP   rQ   rj  
  s    *
zNameNode.annotatec                 C   s   | j r| j jS d S rI   )r   r`  rR   rP   rP   rQ   r  
  s    z*NameNode.get_known_standard_library_import)F)F)FNN)F)6rU   rV   rW   r   r{  r@  r  rv  r   rx  r_  r^  r  r   rC  r  r  r~   r   r   rz  r^  r  r  r  r   r   rg  r   r   rK  r   r:  rr  rw  r|  r  r  r  r  r   r%  r   r   r   r   rD  rR  r  r  rU  rj  r  rX   rP   rP   rN   rQ   ry    sj   
@'#

	[    
p
2	ry  c                   @   s2   e Zd ZeZdgZdd ZdZdd Zdd Z	d	S )
BackquoteNodeargc                 C   s&   | j || _ | j || _ d| _| S r  )r  r   r  r   r   rP   rP   rQ   r   
  s    zBackquoteNode.analyse_typeszBackquote expressionc                 C   s   t | jj| _d S rI   )r  r  rw   rR   rP   rP   rQ   r   
  s    z'BackquoteNode.calculate_constant_resultc              	   C   s:   | d|  | j ||  | jf  | | d S )Nz%s = PyObject_Repr(%s); %s)r   r   r  r   r   ry   rd  r;  rP   rP   rQ   rD  
  s    z"BackquoteNode.generate_result_codeN)
rU   rV   rW   r   r   r   r   r:  r   rD  rP   rP   rP   rQ   r  
  s   r  c                   @   sB   e Zd ZeZdZdZdZdddgZdd Z	d	Z
d
d Zdd ZdS )
ImportNodeNFTmodule_name	name_listmodule_namesc                    s    j d kr>| jr8|jd s0tj| jjkr8d _ nd _  j	|}|
| _ jjsbt jr j	|}|
| _nDd jjkrt jj fddttj jjdD d	| _ S )NZ
py2_importr   .c                    s   g | ]}t  jj||d qS )r  )r   r  ry   )r[   partrR   rP   rQ   r   
  s   z,ImportNode.analyse_types.<locals>.<listcomp>r   )ru   r  parent_modulerd   r4   r   r  Zfuture_directivesr  r   r  r  r   r  r   	TupleNodery   mapr	   r  r  r  )rS   rl   r  r  rP   rR   rQ   r   
  s*    


zImportNode.analyse_typeszPython importc              	   C   sL  | j jst| j j}| jdkr| js| js| jr<| jjs<t| jdkrXt	
dd}d}nt	
dd}d}|j| d|| j  | jr| j ndf }n:|jt	
d	d d
| j  | jr| j nd| jf }| jdkr|tkrt| \}}}|jt	
|| d||f }|d|  |||  | jf  | | d S )Nr   ZImportDottedModulezImportExport.cZ__Pyx_ImportDottedModuleZImportDottedModuleRelFirstZ __Pyx_ImportDottedModuleRelFirst
%s(%s, %s)r  ZImportz__Pyx_Import(%s, %s, %d)r  %s(%s)%s = %s; %s)r  r  r   r   ru   r  get_top_level_moduler  r   r   r   r   r   r   r)   r   r   r   ry   rd  )rS   r   r  r  Zhelper_funcZimport_codeZ	code_nameZ	code_filerP   rP   rQ   rD  
  s@    
zImportNode.generate_result_codec                 C   s   | j jS rI   )r  r   rR   rP   rP   rQ   r     s    z,ImportNode.get_known_standard_library_import)rU   rV   rW   r   r   r  r  r   r   r   r:  rD  r  rP   rP   rP   rQ   r  
  s   
%r  c                       sZ   e Zd Zg ZdZdZdddZdd Zdd Zd	d
 Z	dd Z
 fddZdd Z  ZS )ScopedExprNodeNTc                 C   s4   |d k	r|| _ n | jr$t|| _ n| j s0d | _ d S rI   )
expr_scopehas_local_scoper   ZComprehensionScope)rS   outer_scoper  rP   rP   rQ   
init_scope3  s    zScopedExprNode.init_scopec                 C   s   |  | d S rI   )r  r   rP   rP   rQ   analyse_declarations;  s    z#ScopedExprNode.analyse_declarationsc                 C   s   d S rI   rP   r   rP   rP   rQ   analyse_scoped_declarations>  s    z*ScopedExprNode.analyse_scoped_declarationsc                 C   s   | S rI   rP   r   rP   rP   rQ   r   B  s    zScopedExprNode.analyse_typesc                 C   s   | S rI   rP   r   rP   rP   rQ   analyse_scoped_expressionsF  s    z)ScopedExprNode.analyse_scoped_expressionsc                    sB  t t| j}| jr| jjs&|| d S |d g }tdd | jj	 D D ]&\}}|j
sN|jjrN|jrN|| qN|s|| |d d S | }| }|| | || |d}|| |j|fgtt| | D ]2\}	}
||	r||	 | || ||
 q|| |d || ||_d S )Nz{ /* enter inner scope */c                 s   s   | ]}|d  r|V  qdS )r   NrP   r   rP   rP   rQ   r_   T  s      z:ScopedExprNode.generate_evaluation_code.<locals>.<genexpr>z} /* exit inner scope */
exit_scope)rK   r  rI  r  r  var_entriesr   sortedentriesitemsr  r   rj   rw  r   Znew_loop_labelsZnew_error_label_generate_vars_cleanup	new_labelput_gotoerror_labelr   zipZget_loop_labelsZ
label_used	put_labelZset_loop_labels)rS   r   Zgenerate_inner_evaluation_code
py_entries_r   Zold_loop_labelsZold_error_labelr  labelZ	old_labelrN   rP   rQ   rI  J  s>    
"








z'ScopedExprNode.generate_evaluation_codec                 C   s6   |D ],}|j r&|| ||d q|| qd S )Nr  )r  Zput_var_gotrefZput_var_decref_setZput_var_xdecref_clear)rS   r   r  r   rP   rP   rQ   r  v  s
    
z%ScopedExprNode._generate_vars_cleanup)N)rU   rV   rW   r   r  r  r  r  r  r   r  rI  r  rX   rP   rP   rN   rQ   r  $  s   
,r  c                
   @   s   e Zd ZeZdZdZdZdZdZ	dgZ
dd ZdZeeejedejdgZdd	 Zd
d Zdd Zdd Zdd Zdd Zdd ZdS )IteratorNodeNFsequencec                 C   s   | j r| j }| j|| _| jjjs.| jjjrD| jjjsD| jj| _nz| jjjrdt| j	| jd|S | 
 r| jjjd j}t| j	|dd|S | j|| _| jjttfkr| jd| _d| _| S )N)r  r   T)r  reversed!'NoneType' object is not iterabler%   )r  r  r   r   r
  rs  rE  r   CppIteratorNodery   is_reversed_cpp_iteration	arg_tupler   r  r  r   r   r  r   )rS   rl   r  rP   rP   rQ   r     s"    
zIteratorNode.analyse_typeszIterating over Python objectitc                 C   s   t | jtr&| jjr&t| jjjdks*dS | jj}|jr~|jdkr~|j	j
sNdS | jjjd }t |tr~|jjr~|jj	}|jjS dS )z
        Returns True if the 'reversed' function is applied to a C++ iterable.

        This supports C++ classes with reverse_iterator implemented.
        r%   Fr  r   )rv   r  r  r  r   r   r  r   rk   r   rI  CoercionNoder  r   r   )rS   funcr  rP   rP   rQ   r    s    z&IteratorNode.is_reversed_cpp_iterationc                 C   s   | j | jp|S rI   )r  r  r  r   rP   rP   rQ   r    s    zIteratorNode.type_dependenciesc                 C   sN   | j |}|js|jr|S |jr@|jd}|d k	rJ|jjS n
|j	rJ|S t
S )Nbegin)r  r~   r
  rs  r   r  r  r   return_typerj   r   )rS   rl   sequence_typer  rP   rP   rQ   r~     s    
zIteratorNode.infer_typec              	   C   s  | j j}|jrdstd|js&|jr.td|ttfk}|sL| j	rLtd|j
 | _| jrz|d| j  | j  f  |s| jr<|d|  | j  |  f  |jjtjdd| _| j	r,|tkrd}nd	}|d
| j||  f  |d ||| j| j |d |d| j  n|d| j  |s|jj| jdd| _| jr|d| j  |d |d| j  |d|  | j  ||  | jf  | | |d| j|  || j| jf  | jr|d d S )NFz+Should have been changed to CppIteratorNodez#for in carray slice not transformedzBinternal error: reversed() only implemented for list/tuple objectsz>if (likely(PyList_CheckExact(%s)) || PyTuple_CheckExact(%s)) {z%s = %s; __Pyx_INCREF(%s);r*  Z__Pyx_PyList_GET_SIZEZ__Pyx_PyTuple_GET_SIZE%s = %s(%s);#if !CYTHON_ASSUME_SAFE_MACROS#endifz--%s;rO  
%s = NULL;} else {z	%s = -1; %s = PyObject_GetIter(%s); %sz+%s = __Pyx_PyObject_GetIterNextFunc(%s); %sr   )r  r   r   r   r
  rs  r   r   r   r  rE  may_be_a_sequencer   r   r   r/  r0  r   r  counter_cnameerror_goto_if_negry   _func_iternext_typeiter_func_ptrputr   rd  )rS   r   r  Zis_builtin_sequenceZlen_funcrP   rP   rQ   rD    sn    
 



 z!IteratorNode.generate_result_codec                 C   s  | j std|dkstd||  f }d}| jjrzt| jj}| jjd krX|}d}n"t| jjj	t
rz|| jjj	 }d}|r|d| j |f  nh|d |dtj|f  |d	 ||tj| j |d
 |d| j tjf  |d | jr
d}nd}|d |d|||  | j || j ||d| jf  |d |d||  | j | j |||| jf  ||t |d
 d S )Nz/internal error: counter_cname temp not prepared)ListTuplez__Pyx_Py%s_GET_SIZE(%s)FTzif (%s >= %s) break;{zPy_ssize_t %s = %s;r  r  r   z--++<#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFSz6%s = Py%s_GET_ITEM(%s, %s); __Pyx_INCREF(%s); %s%s; %sr  #elsez,%s = __Pyx_PySequence_ITEM(%s, %s); %s%s; %s)r  r   r   r  r   r   r   r   rv   rw   r#   r   r   quick_temp_cnamer  ry   r  r   ra  r   )rS   Z	test_nameresult_namer   Z
final_sizeZsize_is_safeZ
item_countZinc_decrP   rP   rQ   generate_next_sequence_item	  sd    





z(IteratorNode.generate_next_sequence_itemc                 C   sR  | j j}| jr|d| j  |tkr8| d|| d S |tkrR| d|| d S | jr|d| j	  |d| 
   | d|| |d | d|| |d |d |d	 |d
|| j	| 
 f  |d|  |d |d |d |d|| j  |d |d |d ||t |d d S )Nzif (%s < 0) break;r  r  zif (likely(!%s)) {z$if (likely(PyList_CheckExact(%s))) {r  r   z} else r  r  r  z&PyObject* exc_type = PyErr_Occurred();if (exc_type) {z\if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();else %sbreak;)r  r   r  r   r  r   r  r   r  r  r   r  r   ry   ra  r   )rS   r  r   r  rP   rP   rQ   generate_iter_next_result_code@  sF    









z+IteratorNode.generate_iter_next_result_codec                 C   s>   | j r|j| j  | jr.|j| j d | _t| | d S rI   )r  r/  r8  r  r   rV  r;  rP   rP   rQ   rV  e  s    zIteratorNode.free_temps)rU   rV   rW   r   r   r  r  r  is_asyncr  r   r   r:  r   rF  	CFuncTypeCFuncTypeArgr  r  r  r~   rD  r  r  rV  rP   rP   rP   rQ   r    s*   =7%r  c                   @   sf   e Zd ZdZdZdZdZdZdg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 )r  Nr  rk  TFr  c                 C   s   | j s
dS dS )N)r  end)ZrbeginZrend)r  rR   rP   rP   rQ   get_iterator_func_namesy  s    z'CppIteratorNode.get_iterator_func_namesc                 C   s  | j j}|jr|j}|  \}}|j|}|j|}|d ksP|jjrP|jjrrt	| j
d|| j jf  t| _| S |d ks|jjr|jjrt	| j
d|| j jf  t| _| S |jj}|jr|jd rd| _|| j
d||jjgd krt	| j
d|| j jf  t| _| S || j
d|gd krFt	| j
d|| j jf  t| _| S || j
d|gd krt	| j
d|| j jf  t| _| S || _nP|jr||jjkst	| j
d	||f  || _nt	| j
d
|| j jf  t| _| S )Nzmissing %s() on %s
cpp_localsr   !=z*missing operator!= on result of %s() on %sr  z*missing operator++ on result of %s() on %sz)missing operator* on result of %s() on %sz$incompatible types for %s() and %s()z8result type of %s() on %s must be a C++ class or pointer)r  r   rs  rt  r  r  r  r  r   r   ry   r,   r  r   rd   extra_dereferencelookup_operator_for_types)rS   rl   r  
begin_nameend_namer  r   Z	iter_typerP   rP   rQ   r   |  sh    

zCppIteratorNode.analyse_typesc                 C   s   | j j}|  \}}| j  rB|d|  | j  | j|f  n|}|jrXt	|j
}|jsj|jjd rpd| _|jj|dd| _|d| j|jrdnd| j  f  |d|  | j| j|f  d S )	Nz%s = %s%s%s();r  ->Fr*  z
%s = %s%s;&rk  )r  r   r  r  r   r   cpp_attribute_opr   r   rF  rr  rs  r   rd   r/  r0  cpp_sequence_cnamer   )rS   r   r  r  r  Z	temp_typerP   rP   rQ   rD    s2    


z$CppIteratorNode.generate_result_codec                 C   sn   |   \}}|d| j|  | jp*| j | j|f  |d|| j|  f  |d| j|  f  d S )Nzif (!(%s%s != %s%s%s())) break;z%s = *%s%s;z++%s%s;)r  r   r  r   r  r  r
  )rS   r  r   r  r  rP   rP   rQ   r    s    z.CppIteratorNode.generate_iter_next_result_codec                 C   s   | j s
d S t| | d S rI   )r  r   rG  r;  rP   rP   rQ   rG    s    z.CppIteratorNode.generate_subexpr_disposal_codec                 C   s   | j s
d S t| | d S rI   )r  r   rH  r;  rP   rP   rQ   rH    s    z"CppIteratorNode.free_subexpr_tempsc                 C   s.   | j st| | t| | t| | d S rI   )r  r   rG  rH  rN  r;  rP   rP   rQ   rN    s    z&CppIteratorNode.generate_disposal_codec                 C   s$   | j r|j| j  t| | d S rI   )r  r/  r8  r   rV  r;  rP   rP   rQ   rV    s    zCppIteratorNode.free_temps)rU   rV   rW   r  r
  r  r   r  r   r  r   rD  r  rG  rH  rN  rV  rP   rP   rP   rQ   r  n  s   0$r  c                   @   s>   e Zd Zdd Zdd Zdd Zddd	Zd
d Zdd ZdS )NextNodec                 C   s   t | |j || _d S rI   r  r  ry   iteratorrS   r  rP   rP   rQ   r    s    zNextNode.__init__c                 C   s   d S rI   rP   r   rP   rP   rQ   r   	  s    zNextNode.nogil_checkc                 C   s   | j |S rI   )r  r  r   rP   rP   rQ   r    s    zNextNode.type_dependenciesNc                 C   s   |d kr| j |}|js |jr&|jS |jrT|| jd|gjj	}t
j|dd}|S t| j| j jt| jdt
jdd}||S d S )Nr   T)Zremove_fakerefPY_SSIZE_T_MAXr'  r  )r  r~   rs  r
  rt  r   r  ry   r   r  r   Zremove_cv_refr  r  r  r  )rS   rl   Ziterator_type	item_typeZfake_index_noderP   rP   rQ   r~     s     zNextNode.infer_typec                 C   s   |  || jj| _d| _| S r  )r~   r  r   r   r   rP   rP   rQ   r   "  s    zNextNode.analyse_typesc                 C   s   | j |  | d S rI   )r  r  r   r;  rP   rP   rQ   rD  '  s    zNextNode.generate_result_code)N)	rU   rV   rW   r  r   r  r~   r   rD  rP   rP   rP   rQ   r    s   
r  c                   @   s:   e Zd ZdgZdZeZdZdZdd Z	dd Z
d	d
 ZdS )AsyncIteratorNoder  Tr%   Fc                 C   s   t S rI   r   r   rP   rP   rQ   r~   9  s    zAsyncIteratorNode.infer_typec                 C   sB   | j r| j }| j|| _| jjjs>t| jd | j|| _| S )Nz*async for loops not allowed on C/C++ types)r  r  r   r   rj   r   ry   r  r   rP   rP   rQ   r   <  s    
zAsyncIteratorNode.analyse_typesc              	   C   sN   |j tdd |d|  | j ||  | j	f  | 
| d S )N	AsyncIterCoroutine.cz)%s = __Pyx_Coroutine_GetAsyncIter(%s); %s)r   r   r   r   r   r   r  r   r   ry   rd  r;  rP   rP   rQ   rD  E  s    z&AsyncIteratorNode.generate_result_codeN)rU   rV   rW   r   r  r   r   r   r  r~   r   rD  rP   rP   rP   rQ   r  +  s   	r  c                   @   s4   e Zd ZeZdZdd Zdd Zdd Zdd	 Z	d
S )AsyncNextNoder%   c                 C   s   t | |j || _d S rI   r  r  rP   rP   rQ   r  Y  s    zAsyncNextNode.__init__c                 C   s   t S rI   r  r   rP   rP   rQ   r~   ]  s    zAsyncNextNode.infer_typec                 C   s   | S rI   rP   r   rP   rP   rQ   r   `  s    zAsyncNextNode.analyse_typesc              	   C   sN   |j tdd |d|  | j ||  | j	f  | 
| d S )Nr  r  z*%s = __Pyx_Coroutine_AsyncIterNext(%s); %s)r   r   r   r   r   r   r  r   r   ry   rd  r;  rP   rP   rQ   rD  c  s    z"AsyncNextNode.generate_result_codeN)
rU   rV   rW   r   r   r   r  r~   r   rD  rP   rP   rP   rQ   r  N  s   r  c                   @   s,   e Zd ZddgZdZdZdd Zdd ZdS )	WithExitCallNoder   
await_exprTNc                 C   s4   | j || _ | jr"| j|| _tj| _d| _| S r  )r   r   r  r   r  r   r   r   rP   rP   rQ   r   x  s    zWithExitCallNode.analyse_typesc                 C   sx  | j r|d| jj  | j| |jjtdd}|	| j
 |jtdd |d|| jj| j f  |j| jjtd | j| | j| |||| j
 ||t | jr| jj||dd	 |d
|| j f  | j| | j| | jr.| | |d|  |f  |j|td | jrV|| j
|   |j| | j rt|d d S )N	if (%s) {Fr*  PyObjectCallr  z'%s = __Pyx_PyObject_Call(%s, %s, NULL);rp  T)source_cnamedecref_sourcer  z%s = __Pyx_PyObject_IsTrue(%s);r   )test_if_runr   Z	with_statZexit_varr   rI  r/  r0  r   rC  ry   r   r   r   r   r   rM  rN  rV  r   ra  r  r   rP  r.  r2  r,  r8  )rS   r   Z
result_varrP   rP   rQ   rI    sB    
 
z)WithExitCallNode.generate_evaluation_code)rU   rV   rW   r   r  r  r   rI  rP   rP   rP   rQ   r  l  s
   r  c                   @   s8   e Zd ZeZdd Zdd Zdd Zdd Zd	d
 Z	dS )ExcValueNodec                 C   s   t | | d S rI   r   r  )rS   ry   rP   rP   rQ   r    s    zExcValueNode.__init__c                 C   s
   || _ d S rI   var)rS   r!  rP   rP   rQ   set_var  s    zExcValueNode.set_varc                 C   s   | j S rI   r   rR   rP   rP   rQ   r     s    z"ExcValueNode.calculate_result_codec                 C   s   d S rI   rP   r;  rP   rP   rQ   rD    s    z!ExcValueNode.generate_result_codec                 C   s   | S rI   rP   r   rP   rP   rQ   r     s    zExcValueNode.analyse_typesN)
rU   rV   rW   r   r   r  r"  r   rD  r   rP   rP   rP   rQ   r    s   r  c                   @   sZ   e Zd Zg 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S )TempNodeNc                 C   s(   t | | || _|jrt| _d| _d S r  )r   r  r   rj   r   r   r   )rS   ry   r   rl   rP   rP   rQ   r    s
    zTempNode.__init__c                 C   s   | S rI   rP   r   rP   rP   rQ   r     s    zTempNode.analyse_typesc                 C   s
   d| _ d S r  rq  r   rP   rP   rQ   r     s    z#TempNode.analyse_target_declarationc                 C   s   d S rI   rP   r;  rP   rP   rQ   rD    s    zTempNode.generate_result_codec                 C   s   |j j| jdd| _d S )NTr*  )r/  r0  r   
temp_cnamer;  rP   rP   rQ   allocate  s    zTempNode.allocatec                 C   s   |j | j d | _d S rI   )r/  r8  r$  r;  rP   rP   rQ   release  s    zTempNode.releasec                 C   s(   z| j W S    dstd Y nX d S )NFz-Remember to call allocate/release on TempNode)r$  r   rR   rP   rP   rQ   r     s
    zTempNode.resultc                 C   s   d S rI   rP   r;  rP   rP   rQ   r2    s    zTempNode.allocate_temp_resultc                 C   s   d S rI   rP   r;  rP   rP   rQ   r9    s    zTempNode.release_temp_result)N)rU   rV   rW   r   r  r   r   rD  r%  r&  r   r2  r9  rP   rP   rP   rQ   r#    s   	
r#  c                   @   s   e Zd Zdd ZdS )
PyTempNodec                 C   s   t | |tj| d S rI   )r#  r  r   r   )rS   ry   rl   rP   rP   rQ   r    s    zPyTempNode.__init__NrU   rV   rW   r  rP   rP   rP   rQ   r'    s   r'  c                   @   s:   e Zd Zg ZdddZdd Zdd Zdd	 Zd
d ZdS )RawCNameExprNodeNc                 C   s"   t j| ||d |d k	r|| _d S )Nrp  )r   r  r   )rS   ry   r   r   rP   rP   rQ   r    s    zRawCNameExprNode.__init__c                 C   s   | S rI   rP   r   rP   rP   rQ   r     s    zRawCNameExprNode.analyse_typesc                 C   s
   || _ d S rI   r   )rS   r   rP   rP   rQ   	set_cname   s    zRawCNameExprNode.set_cnamec                 C   s   | j S rI   r*  rR   rP   rP   rQ   r     s    zRawCNameExprNode.resultc                 C   s   d S rI   rP   r;  rP   rP   rQ   rD    s    z%RawCNameExprNode.generate_result_code)NN)	rU   rV   rW   r   r  r   r+  r   rD  rP   rP   rP   rQ   r)    s   
r)  c                   @   s6   e Zd ZeZdZdZdgZdd Zdd Z	dd	 Z
d
S )JoinedStrNodeTzString concatenationvaluesc                    s    fdd| j D | _ | S )Nc                    s   g | ]}|   qS rP   )r   r  )r[   vrr   rP   rQ   r     s     z/JoinedStrNode.analyse_types.<locals>.<listcomp>)r-  r   rP   rr   rQ   r     s    zJoinedStrNode.analyse_typesc                 C   s   dS r"  rP   rR   rP   rP   rQ   r     s    zJoinedStrNode.may_be_nonec                 C   s  | | j t| j}|jjtdd}|jjtjdd}|jjtj	dd}|
d||||| jf  ||t |
d|  |
d|  t| jD ]h\}}|| || d|  }d|  }	d}
t|trz$|jd	 d
}	|jd d}
W nl tk
rp   |	d
krlttt|j}|dk rNd}	tt|j}n|dkrld}	tt|j}n Y nX tt|j}nt|tr|jjjrd}
|
s|
d||	||	|f  |
d||f  || |
d||| f  || || q| | j |  | |j!"t#$dd |
d| % ||||||  | jf  | &| |'|t |j(| |j(| |j(| d S )NTr*  Fz%s = PyTuple_New(%s); %srO  z	%s = 127;z__Pyx_PyUnicode_GET_LENGTH(%s)z"__Pyx_PyUnicode_MAX_CHAR_VALUE(%s)r3  Z255zus-asciii   Z65535i   Z1114111z%s = (%s > %s) ? %s : %s;z	%s += %s;zPyTuple_SET_ITEM(%s, %s, %s);ZJoinPyUnicodeStringTools.cz-%s = __Pyx_PyUnicode_Join(%s, %d, %s, %s); %s))rC  ry   r   r-  r/  r0  r   r   r  c_py_ucs4_typer   r   ra  	enumeraterI  r<  r   rv   r#  r   r*  UnicodeEncodeErrormaxr  r  rp   FormattedValueNoder   r  rg  rP  rV  r2  r   r   r   r   r   rd  rM  r8  )rS   r   Z	num_itemsZlist_varZulength_varZmax_char_varir{   ZulengthZmax_char_valueZis_asciiZmax_charrP   rP   rQ   rI  $  s    





    



z&JoinedStrNode.generate_evaluation_codeN)rU   rV   rW   r   r   r   r:  r   r   r  rI  rP   rP   rP   rQ   r,    s   r,  c                   @   sL   e Zd ZddgZeZdZdZdZdddd	d
j	Z
dd Zdd Zdd ZdS )r4  r   format_specTNzString formattingZPyObject_UnicodeZPyObject_ReprZPyObject_ASCIIZ__Pyx_PyNumber_IntOrLong)sradc                 C   s   dS r"  rP   rR   rP   rP   rQ   r    s    zFormattedValueNode.may_be_nonec                 C   s   | j || _ | jr| jjrL| jr*| jj n| j jj}| j jj||drL|| _| jrf| j||| _| jd kr| j || _ | js| j	r| j	dkr| j jt
kr| j  s| j S | S )N)r6  r7  )r   r   r6  r  r   Zdefault_format_specZcan_coerce_to_pystringc_format_specr  conversion_charr   r  )rS   rl   r;  rP   rP   rQ   r     s    
z FormattedValueNode.analyse_typesc           	      C   sr  | j d k	rb| jjjsb| jj| j || j }|d|  |||  | jf  | 	| d S | j
 }| jjtko| j  }| jrd}| j
 }n
d}tj}| j}|dkr|rd }|r| |}|d k	std| d||f }|jtdd |d	7 }n2| jr&|jtd
d n|jtdd |d|  |||||  | jf  | 	| d S )Nr  Z__Pyx_PyObject_FormatZ__Pyx_PyObject_FormatSimpler7  z(invalid conversion character found: '%s'r  ZPyObjectFormatAndDecrefr/  Z	AndDecrefZPyObjectFormatZPyObjectFormatSimple%s = %s(%s, %s); %s)r;  r   r   rj   Zconvert_to_pystringr   r   r   ry   rd  r   r   r  r6  r   Zempty_unicoder<  find_conversion_funcr   r   r   r   r   )	rS   r   Zconvert_func_callZvalue_resultZvalue_is_unicodeZformat_funcr6  r<  fnrP   rP   rQ   rD    s\      






z'FormattedValueNode.generate_result_code)rU   rV   rW   r   r   r   r   r;  r:  rc   r>  r  r   rD  rP   rP   rP   rQ   r4  r  s   r4  c                   @   s.   e Zd ZdZejZdd Zdd Zdd Z	dS )	ParallelThreadsAvailableNodea*  
    Note: this is disabled and not a valid directive at this moment

    Implements cython.parallel.threadsavailable(). If we are called from the
    sequential part of the application, we need to call omp_get_max_threads(),
    and in the parallel part we can just call omp_get_num_threads()
    c                 C   s
   d| _ | S r  r&  r   rP   rP   rQ   r     s    z*ParallelThreadsAvailableNode.analyse_typesc                 C   sR   | d | d| j  | d| j  | d | d| j  | d d S )N#ifdef _OPENMPz2if (omp_in_parallel()) %s = omp_get_max_threads();z else %s = omp_get_num_threads();r  %s = 1;r  r   r   r;  rP   rP   rQ   rD    s    

z1ParallelThreadsAvailableNode.generate_result_codec                 C   s   | j S rI   r   rR   rP   rP   rQ   r     s    z#ParallelThreadsAvailableNode.resultN
rU   rV   rW   __doc__r   
c_int_typer   r   rD  r   rP   rP   rP   rQ   r@    s
   	r@  c                   @   s.   e Zd ZdZejZdd Zdd Zdd Z	dS )	ParallelThreadIdNodez/
    Implements cython.parallel.threadid()
    c                 C   s
   d| _ | S r  r&  r   rP   rP   rQ   r     s    z"ParallelThreadIdNode.analyse_typesc                 C   sB   | d | d| j  | d | d| j  | d d S )NrA  z%s = omp_get_thread_num();r  rO  r  rC  r;  rP   rP   rQ   rD    s
    

z)ParallelThreadIdNode.generate_result_codec                 C   s   | j S rI   rD  rR   rP   rP   rQ   r     s    zParallelThreadIdNode.resultNrE  rP   rP   rP   rQ   rH    s
   rH  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )_IndexingBaseNodec                 C   s    | j  p| j jtttttfkS rI   )r  r   r   r/   r   r   r   r   rR   rP   rP   rQ   r     s        z_IndexingBaseNode.is_ephemeralc                 C   s   | j  o| j S rI   )r  r%  r  r   rR   rP   rP   rQ   r%    s    z"_IndexingBaseNode.check_const_addrc                 C   s(   | j jr| j jjr$dS n| j jr$dS dS r  )r   r   rr  r
  rs  rR   rP   rP   rQ   r     s    
z_IndexingBaseNode.is_lvalueN)rU   rV   rW   r   r%  r   rP   rP   rP   rQ   rI    s   rI  c                   @   s  e Zd ZddgZdZdZdZdd Zdd	 Zd
d Z	dd Z
dd Zdd Zd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,d-Zd.d/ Zd0Zd1d2 Zd3d4 Zd5d6 Zd7d8 Z dAd9d:Z!d;d< Z"dBd=d>Z#dS )Cr  r  r  NTFc                 C   s   | j j| jj | _d S rI   )r  rw   r  rR   rP   rP   rQ   r   >  s    z#IndexNode.calculate_constant_resultc              
   C   sT   | j |}| j|}z
|| W S  tk
rN } z| | W 5 d }~X Y nX d S rI   )r  r   r  	Exceptionr   )rS   r   r  r  r   rP   rP   rQ   r   A  s    
zIndexNode.compile_time_valuec                 C   s.   | j }| o,| j o,|jo,|jjp,|jjS rI   )r  r  r  r   rs  r
  rS   r  rP   rP   rQ   r  I  s    zIndexNode.is_simplec                 C   sF   | j j}|r<|jrdS t| jtr<|tttt	t
ttfkr<dS t| S r"  )r  r   rE  rv   r  	SliceNoder   r   r   r   r/   r   r   r   r  rS   rt  rP   rP   rQ   r  N  s    
  zIndexNode.may_be_nonec                 C   s   d S rI   rP   r   rP   rP   rQ   r   Z  s    z$IndexNode.analyse_target_declarationc              	   C   s  | j |}|r|js|jrX| jjr0| jj}n| jg}tj| j	|d d}|j
||dS | jjsh| jjrddlm} ||j | jjr| jgn
t| jj}t||||S |js| j|}|d k	r zt|}W n ttfk
r   Y nX t||S t| j	d d S )N)ry   positional_argskeyword_args)rt  r%   rl  z*Array size must be a compile time constant)r  r  r   python_type_constructor_namer  r   r   r   ZTemplatedTypeNodery   analyser   rk  rm  r   view_utility_coder   r   MemoryViewSliceTypeget_axes_specsrj   r   r  r   r   
CArrayTyper   )rS   rl   rt  Ztemplate_valuesZ	type_noderm  axesr  rP   rP   rQ   r  ]  s6    

zIndexNode.analyse_as_typec                 C   sB   g }| }|j r>|j|}|r6|jr6|jr6||j |j}q|S rI   )r  r  r  rP  Zmodifier_namer   r  )rS   rl   r[  Zmodifier_nodeZmodifier_typerP   rP   rQ   analyse_pytyping_modifiers}  s    
z$IndexNode.analyse_pytyping_modifiersc                 C   s   | j || j| S rI   )r  r  r  r   rP   rP   rQ   r    s    zIndexNode.type_dependenciesc                 C   s  | j |}| jjrN|jrtS |jr(tS |tttt	t
tfkr@|S |jrJ|S tS | j|}|rd|jsrt| jtr|tkrtjS |tkr|S |t	krtjS t| j trtS |tt
fkrt|| j | j|d}|d k	r|S n|js|j r|jS |jrTt| jtrT| j r| jj}|dk r*||j7 }d|  krD|jk rn n
|j| S n>|jr|jdkrh|jdkrz|jS t |j|j!dd  S | jj"r|jr|}| jj#D ]6}|js qt$| j%t&| j j%|d|d|}q|S |j'r<G dd d}|| j%|d|| j%|dg}	|(d	|	}
|
d k	r<|
j)j*S t+|rjt+|rj| j|f}t,t-||gS |ttfkr||S tS d S )
Nr   r   r%   rp  r  c                   @   s   e Zd Zdd ZdS )z)IndexNode.infer_type.<locals>.FakeOperandc                 [   s   | j | d S rI   )__dict__update)rS   r  rP   rP   rQ   r    s    z2IndexNode.infer_type.<locals>.FakeOperand.__init__Nr(  rP   rP   rP   rQ   FakeOperand  s   r[  )ry   r   []).r  r~   r  r   rE  r   rF  r   r   r   r   r   r   r   r  rv   r  r   r0  c_uchar_typer  r   rs  r
  rt  r  r   rw   r  r  ndimr  rS  rV  r   r   r  ry   r   r   lookup_operatorr   r  r9   rE   r?   )rS   rl   rt  
index_typer  r  rC  r9  r[  operandsZ
index_funcZindex_with_typerP   rP   rQ   r~     s         



zIndexNode.infer_typec                 C   s   | j |ddS )NTgetting)analyse_base_and_index_typesr   rP   rP   rQ   r     s    zIndexNode.analyse_typesc                 C   sH   | j |dd}|jjr"t| jd || krD| sDt| jd|j  |S )NT)settingzAssignment to const dereference%Assignment to non-lvalue of type '%s')rd  r   r   r   ry   r   r   rP   rP   rQ   r     s    zIndexNode.analyse_target_typesc           	      C   s  |r| j || _ | j jjr(tj| _| S | jj}|jd s\|rRt	| jj
| jj n
t	| j |st| jtrt| jjr| j|| _| j jj}|st| j ts|r| j jjs| j jjs| j jjs| j || _ | ||}|d k	r|S |j| _| j j}|jsx| j|| _| jj| _| jjr.| jj| _|jrx|rNt| jddd n| jj dkrb| j S | j || _ | j j}|j!r| "||||S |js|jr| #||S |j$r| %||S |jr| &|S |j'r| (|||S t)| jd|  tj| _| S d S )N
wraparoundz%cannot assign to Unicode string indexr%   rt   )r   r  z'Attempting to index non-array type '%s')*r  r   r   r~  r   r,   r  r   rd   r|   r   r   rv   r  r   Zlong_literalr   r  r   r  rE  rs  r
  analyse_as_buffer_operationr   r  original_index_typer   rr  r  r   ry   rw   rj   analyse_as_pyobjectanalyse_as_c_arrayr   analyse_as_cppanalyse_as_c_functionr  analyse_as_c_tupler   )	rS   rl   rc  re  analyse_baser   Zis_memslicereplacement_nodert  rP   rP   rQ   rd    sd    







z&IndexNode.analyse_base_and_index_typesc                 C   s  | j j}| jjjr@|tk	r@t| jddd | j|| _d| _n| jjj	r|tk	r|r|j
d s|tttfkr| jjjr|j
d rt| jtr| j r| jjdkrd| _nd| _| jtj||| _| j| n| j|| _d| _| jjj	r|tkrtj| _n| jjj	r<|tkr<|r2tj| _ntj| _n|r`|ttttttfkr`|| _npd }|ttfkr| jjj	rt|| j | j|d}|tttfkr| j  d| _ |d ks|j!st"| _n|| _| #|| | S )	NzItem lookup of unicode character codes now always converts to a Unicode string. Use an explicit C integer cast to get back the previous integer lookup behaviour.r%   rt   boundscheckrg  r   rX  &'NoneType' object is not subscriptable)$r  r   r  r  r   r   ry   r  r   r  rd   r   r   r   signedrv   r  r   rw   rz  r   r  r  ri  create_to_py_utility_coder   r0  r]  rG  r   r   r   r  rj   r   wrap_in_nonecheck_node)rS   rl   r   rc  re  rt  r  rP   rP   rQ   rj  D  sj    




   zIndexNode.analyse_as_pyobjectc                 C   sr   | j j}|j| _| jjr&t| j| _|r2|| _n<| jjjrP| jtj	|| _n| jjj
snt| jd| jj  | S )NzInvalid index type '%s')r  r   rt  r   r   CReferenceTyper  rj   rz  r  r  r   ry   )rS   rl   r   rt  rP   rP   rQ   rk  ~  s    

zIndexNode.analyse_as_c_arrayc                 C   s   | j j}|d| j | jg}|d krNt| jd|| jjf  tj| _d| _| S |j}|j	r`|j
}|j| _|j| _| jr|sd| _t| r|tdd | j|jd j|| _|j| _|r|jjst| jd| j  | S )	Nr\  z/Indexing '%s' not supported for index type '%s'r  TCppExceptionConversionrL  r   z#Can't set non-reference result '%s')r  r   r_  r  r   ry   r   r,   r  rs  rt  r   r   r   r   r   r   r   rz  r   r  r   )rS   rl   re  rt  r  	func_typerP   rP   rQ   rl    s,    zIndexNode.analyse_as_cppc                 C   s   | j j}|jr| | n| || _d | _|jd krJt| j	d t
| _nh| jd kr\t
| _nVt|jt| jkrt| j	dt|jt| jf  t
| _n|tt|j| j| _| S )Nz)Can only parameterize template functions.z7Wrong number of template arguments: expected %s, got %s)r  r   r  parse_indexed_fused_cdefparse_index_as_typestype_indicesr  Z	templatesr   ry   r,   r   r  dictr  rS   rl   rt  rP   rP   rQ   rm    s"    

zIndexNode.analyse_as_c_functionc                 C   s   | j j}t| jtr| j r| jj}|j |  kr@|jk rdn n |dk rV||j7 }|j| | _nt	| j
d||f  tj| _| S | j || _ | j|||ddS d S )Nr   zIndex %s out of bounds for '%s'Frc  re  ro  )r  r   rv   r  r  r   rw   r  r  r   ry   r   r,   r  rd  )rS   rl   rc  re  rt  r  rP   rP   rQ   rn    s     
zIndexNode.analyse_as_c_tuplec                    s  t | jtr| jj}n| jg}| j}|j}d}|jrddlm} |j	rh|
|}|dk	rh|j}|j}|}|||j\}	}}
|	rt| j||d}nt| j||d}n|js|jr|jst||jkrd} fdd|D }|jrFtdd	 |D }|rXt|D ]<\}}|jrt|j|j|j|jd
}| }|||< qntdd	 |D }|rt| j||d}t | jtrt|dk	r| |}|S )zI
        Analyse buffer indexing and memoryview indexing/slicing
        Nr%   rl  )indicesr  Tc                    s   g | ]}|  qS rP   r   r[   r  rr   rP   rQ   r     s     z9IndexNode.analyse_as_buffer_operation.<locals>.<listcomp>c                 s   s$   | ]}|j jp|jp|j jV  qd S rI   )r   r  r   r9   r  rP   rP   rQ   r_     s   z8IndexNode.analyse_as_buffer_operation.<locals>.<genexpr>r   r   r   c                 s   s   | ]}|j jV  qd S rI   r   r  r  rP   rP   rQ   r_     s     )rv   r  r  r   r  r   r   rk  rm  r  merged_indicesunellipsifyr^  MemoryViewSliceNodery   MemoryViewIndexNodern  r9   r   allr1  r   SliceIntNoder   r   r   r   BufferIndexNode	CloneNoder   )rS   rl   rc  r  r  rt  rp  rm  r  have_slicesnewaxesr  Zdo_replacementr5  r  rP   rr   rQ   rh    sN    



z%IndexNode.analyse_as_buffer_operationc                 C   s*   |j d r| j sd S | jd| _d S )N	nonecheckrr  )rd   r  r  r  rS   rl   rc  rP   rP   rQ   ru     s    z IndexNode.wrap_in_nonecheck_nodec                 C   sb   t | jtr| jj}n| jg}g }|D ]6}||| |d d kr&|rVt|jd  d S q&|S )Nr  znot parsable as a type)rv   r  r  r   r   r  r   ry   )rS   rl   requiredr  r{  r  rP   rP   rQ   rz    s    
zIndexNode.parse_index_as_typesc                    sT  t j| _d| _| jj}g }| jjs*| jjr:|| jj	 n&t
| jtr`| jjD ]}||j	 qN| j|dd}|dkr| j|| _| jjjst| j	d n<| jjj | j_| _| jj | j_| _d| j_d| _d| j_d| _dS t|D ]\}}||||< q| }t|t|kr(t| j	dS t|t|k rV|t| }	t| j	d|	 S t|||D ]L\}
 }t fdd	|jD st|
d
  S  dks jrb dS qbtt||}||}|jrt| j	d nr| jj D ]\}| |r|| _| jjr"|j| _d| _| jj!| _!d| jj_|| j_|j| j_ qPqt"ddS )aK  
        Interpret fused_cdef_func[specific_type1, ...]

        Note that if this method is called, we are an indexed cdef function
        with fused argument types, and this IndexNode will be replaced by the
        NameNode with specific entry just after analysis of expressions by
        AnalyseExpressionsTransform.
        TF)r  Nz)Can only index fused functions with typeszToo many types specifiedzHNot enough types specified to specialize the function, %s is still fusedc                    s   g | ]}  |qS rP   )rv  rZ   Zspecific_typerP   rQ   r   K  s     z6IndexNode.parse_indexed_fused_cdef.<locals>.<listcomp>zType not in fused typez6Index operation makes function only partially specificz!Couldn't find the right signature)#r   r,   r   is_fused_indexr  r  r   r  r   ry   rv   r  r   rz  r   r   rH  r   r   rw  r1  Zspecialize_fusedZget_fused_typesr   r  re   typesr~  r|  r  r  ru  rv  r  r   )rS   rl   rt  Z	positionsr  Zspecific_typesr5  r   Zfused_typesr\   ry   Z
fused_typer  r  rP   r  rQ   ry    sr    	







z"IndexNode.parse_indexed_fused_cdefzIndexing Python objectc                 C   s  | j jtttfkr^| j jtkr$d}q| j jtkr6d}q| j jtkrHd}qdstd| j j n| j jjrd| j  ddd	 | j	D f S | j jj
r| jj}|d
k r|| j jj7 }d| j  |f S | jjs| jjr| j| j jkrt| jd d S d}|| j  | j f S )NzPyList_GET_ITEM(%s, %s)zPyTuple_GET_ITEM(%s, %s)z0((unsigned char)(PyByteArray_AS_STRING(%s)[%s]))Fz$unexpected base type in indexing: %sz%s<%s>,c                 S   s   g | ]}|  qS rP   )r?  )r[   paramrP   rP   rQ   r   }  s     z3IndexNode.calculate_result_code.<locals>.<listcomp>r   z%s.f%szInvalid use of pointer slicez(%s[%s]))r  r   r   r   r   r   r  r   joinr{  r  r  rw   r  rs  r
  r   ry   )rS   
index_coder  rP   rP   rQ   r   p  s.    

zIndexNode.calculate_result_codec                 C   s   | j jjr| jjtk}t|jjd oH| jj	oHt
| j jtoF| j jdk }t|jjd }d| j | jj	rpdprd| jj|||f S dS d S )Nrg  r   rq  z, %s, %d, %s, %d, %d, %dr%   rk  )r  r   r  r  r   r  r   rd   ri  rs  rv   rw   r#   r?  Zto_py_function)rS   r   Zis_listrg  rq  rP   rP   rQ   extra_index_params  s&    

  zIndexNode.extra_index_paramsc                 C   s~  | j s
d S d }d }| jjrd}| jjjr^| jjtkr:d}n| jjtkrLd}nd}t	dd}np| jjt
kr|d}t	dd}nR| jjtkr| jjttfkrd	}t	dd}n$d
}|jt	dd t	dd}n| jjr| jjtkr| jjjstd}d}t	dd}nv| jjtkrN| jjjs*t| jjs8td}d}t	dd}n4| jjjrb| jsdstd| j| jj| jf |d k	r|j| | jjjr| j }n
| j }| jjjr| jrt|| jd|  | j | j f | jjr|  nd | j| j nR|dkr"dnd| }|d|  || j || ||||   | jf  | jjrz| | d S )Nr  Z__Pyx_GetItemInt_ListZ__Pyx_GetItemInt_TupleZ__Pyx_GetItemIntZ
GetItemIntr  Z__Pyx_PyDict_GetItemZDictGetItemZ__Pyx_PyObject_Dict_GetItemZ__Pyx_PyObject_GetItemZObjectGetItemZ__Pyx_GetItemInt_Unicodez(Py_UCS4)-1ZGetItemIntUnicoder/  Z__Pyx_GetItemInt_ByteArray-1ZGetItemIntByteArrayFz5unexpected type %s and base type %s for indexing (%s)z%s = %s[%s];!%sz	%%s == %s%s = %s(%s, %s%s); %s) r   r   rj   r  r  r  r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   ry   r   r   r   r   r@  r   r  r   rd  )rS   r   r  Zerror_valuer  r  Zerror_checkrP   rP   rQ   rD    s    


  

 
zIndexNode.generate_result_codec                 C   s   | j jjrT| jjtkr0|jtdd d}n|jtdd d}| j 	 }n | j 
 }| jjtkrpd}nd}||d	|| j
 ||| |f | j d S )
NZSetItemIntByteArrayr/  Z__Pyx_SetItemInt_ByteArrayZ
SetItemIntr  Z__Pyx_SetItemIntr  ZPyObject_SetItemz%s(%s, %s, %s%s))r  r   r  r  r   r   r   r   r   r   r   r   r   r  r  ry   )rS   
value_coder   r  r  rP   rP   rQ   generate_setitem_code  s2    



	zIndexNode.generate_setitem_codec              	   C   s  |  | | jjr$| | | n| jjtkrJ| ||}| || n| jjjr| j	r| j	dkr|r|r| j
|krt|| j| j|  | | j
|| j qt|| jd|  | f | jjr|  nd | j
| j n|d|  | f  | | | | || || d S )Nr   r  )rB  r   rj   r  r   r  r   _check_byte_valuer   r   r   r   ry   r   r@  r   r   rG  rH  rN  rV  )rS   r   r   rQ  r   r   r  rP   rP   rQ   rR    s8    
    


z"IndexNode.generate_assignment_codec                 C   s  |j jstt|j | }| r`d|j  kr<dk rDn n|S d}t|jd|j dd n|j t	j
k}| jsg }|js|j jr|d|  |js|jr|j t	j
t	jt	jfks|d|  |r|d	d
|  |d|| j  |d |rd| }|S )Nr      Tz9value outside of range(0, 256) when assigning to byte: %sr%   rt   z%s < 0z%s > 255if (unlikely(%s)) {z || zFPyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)"); %sr   z((unsigned char)%s))r   r  r   r  r   r   rw   r   ry   r   r]  r   r   rs  r   r   r   c_schar_typer   r  r   )rS   r   r   r  Z
needs_castZ
conditionsrP   rP   rQ   r  %  sL     

zIndexNode._check_byte_valuec                 C   s   |  | | jjjr8d}| j }|jtdd n | j	 }| j
jtkrTd}nd}||d|| j
	 || |f | j | | | | d S )NZ__Pyx_DelItemIntZ
DelItemIntr  ZPyDict_DelItemZPyObject_DelItemz%s(%s, %s%s))rB  r  r   r  r   r   r   r   r   r   r  r   r   r  r  ry   rG  rH  )rS   r   rT  r  r  rP   rP   rQ   rU  I  s,    





z IndexNode.generate_deletion_code)FFT)T)FNN)F)$rU   rV   rW   r   r{  r  r  r   r   r  r  r   r  rW  r  r~   r   r   rd  rj  rk  rl  rm  rn  rh  ru  rz  ry  r:  r   r  rD  r  rR  r  rU  rP   rP   rP   rQ   r  .  sL   
 d  
H:5
[H!    
!$r  c                       s   e Zd ZdZddg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 Zdd Zdd Zd%ddZd&ddZd d! Z fd"d#Z  ZS )'r  z
    Indexing of buffers and memoryviews. This node is created during type
    analysis from IndexNode and replaces it.

    Attributes:
        base - base node being indexed
        indices - list of indexing expressions
    r  r  TFrP   c                 C   s   | j |dd d S NFrb  r   r   rP   rP   rQ   r   v  s    z$BufferIndexNode.analyse_target_typesc                 C   s   | j js*t| j js*t| jd t| _| S |sd| j jjjsHt| jd nd| _	| j jj
rdd| j jj_	d| _| || | | | S )zz
        Analyse types for buffer indexing only. Overridden by memoryview
        indexing and slicing subclasses
        zCan only index buffer variableszWriting to readonly bufferTrr  )r  r   r9   r   r   ry   r,   r   writabler  rn  Z
buffer_auxnone_error_messageanalyse_buffer_indexru  r  rP   rP   rQ   r   y  s    

zBufferIndexNode.analyse_typesc                 C   st   t | jjr2dd | jD }tt| jj|| _n| j|| _| jjj| _| jj| _|rp| jj	sj| jj rpd| _
d S )Nc                 S   s   g | ]}||j fqS rP   rp  )r[   idxrP   rP   rQ   r     s     z8BufferIndexNode.analyse_buffer_index.<locals>.<listcomp>T)r9   r  r   r  rE   r?   r  r  buffer_typerj   r   )rS   rl   rc  Zindex_with_type_listrP   rP   rQ   r    s    
z$BufferIndexNode.analyse_buffer_indexc                 C   s   dS )zk
        Called by IndexNode when this node is assigned to,
        with the rhs of the assignment
        NrP   rS   r   rP   rP   rQ   analyse_assignment  s    z"BufferIndexNode.analyse_assignmentc                 C   s,   |j d r| j sd S | j| j| _d S )Nr  )rd   r  r  r  r  r   rP   rP   rQ   ru    s    z&BufferIndexNode.wrap_in_nonecheck_nodec                 C   s*   | j s| jr&| jjr&t| jd t| _d S )Nz2Cannot access buffer with object dtype without gil)r  r  r   rj   r   ry   r,   r   rP   rP   rQ   r     s    zBufferIndexNode.nogil_checkc                 C   s
   d| j  S Nr  )buffer_ptr_coderR   rP   rP   rQ   r     s    z%BufferIndexNode.calculate_result_codec                 C   s    | j }| j jr|j}|j|S rI   )r  is_nonecheckr  r   Z	get_entryrK  rP   rP   rQ   buffer_entry  s    zBufferIndexNode.buffer_entryc                 C   sD   |j jt|j|jjrtjntjdd}|d||	 f  |S )NFr*  r  )
r/  r0  r   r  r   rs  Zc_ssize_t_typec_size_t_typer   r   )rS   r   ivarretrP   rP   rQ   get_index_in_temp  s    z!BufferIndexNode.get_index_in_tempc                    s   j r.jsjr. jjd r.tjddd  fddjD  _}ddl	m
}  }|jjrp|jj}n
|jd }||j|d	d jD | jjj |j d
fS )z8
        ndarray[1, 2, 3] and memslice[1, 2, 3]
        rq  z(Use boundscheck(False) for faster accessr%   rt   c                    s   g | ]}  |qS rP   )r  r[   r  r   rS   rP   rQ   r     s     z6BufferIndexNode.buffer_lookup_code.<locals>.<listcomp>rk  negative_indicesc                 S   s   g | ]}|j jqS rP   )r   rs  r  rP   rP   rQ   r     s     )r   Zindex_signedsZindex_cnamesrd   ry   r   r  r@  )r@  r  r  r   rd   r   ry   r  index_tempsrk  rl  r  r   rn  r  Zbuffer_defaultsZput_buffer_lookup_code)rS   r   r  rl  r  r  rP   r  rQ   buffer_lookup_code  s(    

 z"BufferIndexNode.buffer_lookup_codec                 C   sB   |  | | || | | | | || || d S rI   )rB  generate_buffer_setitem_coderG  rH  rN  rV  rS   r   r   rQ  rP   rP   rQ   rR    s    



z(BufferIndexNode.generate_assignment_coderk  c           
      C   sL  | j j}t|rt|jr|jjtt| j jdd}|d|  |d||| j 	 f  |d|t
| j||	 f  |j| d S | |\}}| jjjr0|jj|jdd}| }	|d||f  |d| | jj |d|	|f  |d	|||	f  |d| | jj |j| n|d	||| f  d S )
NFr*  __Pyx_call_destructor(%s);r  z%s%s %s= %s;r  z*%sz%__Pyx_INCREF(%s); __Pyx_XDECREF(*%s);z*%s %s= %s;)r  r   r9   r7   r/  r0  rE   rA   r   r   r>   r  r8  r  r  r  rj   Zbuf_ptr_typer   re  rh  )
rS   r   r   oprt  r  r  Zptrexprptrr   rP   rP   rQ   r    s:    	
 z,BufferIndexNode.generate_buffer_setitem_codec                 C   s   t | jjrH|  }|d|  |d||| j t| jf  d S | |\}| _	| jj
r|  }|d|| j	f  |d||f  |d|  d S )Nr  new (&%s) decltype(%s){%s%s};z%s = (PyObject *) *%s;z'if (unlikely(%s == NULL)) %s = Py_None;z__Pyx_INCREF((PyObject*)%s);)r9   r  r   r   r   r   r>   r  r  r  rj   )rS   r   resr  rP   rP   rQ   rD    s     z$BufferIndexNode.generate_result_codec                    s2   | j D ]}|j| qd| _ tt| | d S rA  )r  r/  r8  rK   r  rH  )rS   r   temprN   rP   rQ   rH  $  s    
z"BufferIndexNode.free_subexpr_temps)T)F)rk  )rU   rV   rW   rF  r   r  r  r  r   r   r  r  ru  r   r   r  r  r  rR  r  rD  rH  rX   rP   rP   rN   rQ   r  b  s&   	
	

*r  c                   @   s6   e Zd ZdZdZdddZdd Zdd Zd	d
 ZdS )r  TFc                 C   sX  ddl m} t|| _| j}||| jjj\}}}|sZd| _	| jj
sN| jjrZd| jjj_	| opt|| jjjk| _g }tj}g }	t|t| | jjjkrt| _t|| jjj jd| jj  | S d}
t|d d  D ]:\}}||}|jrd| _|	| |d q| jjj|
 \}}|
d7 }
|jrd| _|jjrR|||f n||df dD ]:}t||}|jsd|||}t||| |	| qdq|jjs|jj r|jj rt!|jd	| d| _"|||}|||< |	| qt| _t|jd
|j  |   S q| j"o$| j | _"|	| _|| _#|j$| _$| %||| | &| | S )Nr%   rl  Tz&Too many indices specified for type %sr   )directstridedr  r  z/Index should be typed for more efficient accessz/Invalid index for memoryview specified, type %s)'rk  rm  r=   Zis_pythran_moder  r  r  r   r^  r  r   r  r   r   Zmemslice_indexr   r  r,   r   ry   r1  r   r  r  r   rV  r   r   r   rz  setattrr  rj   r'   r  original_indicesr   analyse_operationru  )rS   rl   rc  rm  r  r  r  rV  r`  new_indicesZaxis_idxr5  r  accesspackingattrr   rP   rP   rQ   r   0  sp    









z!MemoryViewIndexNode.analyse_typesc                 C   s   d| _ | || d S )Nz"Cannot index None memoryview slice)r  r  )rS   rl   rc  rV  rP   rP   rQ   r    s    z%MemoryViewIndexNode.analyse_operationc                 C   s(   | j jr$| }|js|jr$d|_d|_dS )z
        Support broadcasting for slice assignment.
        E.g.
            m_2d[...] = m_1d  # or,
            m_1d[...] = m_2d  # if the leading dimension has extent 1
        TN)r   r   r  rS   r   lhsrP   rP   rQ   analyse_broadcast_operation  s
    z/MemoryViewIndexNode.analyse_broadcast_operationc                 C   s   |  |}|r|j|_|S | S rI   )r  r  r  rP   rP   rQ   $analyse_as_memview_scalar_assignment  s
    
z8MemoryViewIndexNode.analyse_as_memview_scalar_assignmentN)T)	rU   rV   rW   r  r  r   r  r  r  rP   rP   rP   rQ   r  +  s   
Or  c                   @   sb   e 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dZdS )r  TFc                 C   s*   t dd | jD | _| jr&| jj| _dS )z@Slicing operations needing no evaluation, i.e. m[...] or m[:, :]c                 s   s,   | ]$}|j o"|jjo"|jjo"|jjV  qd S rI   )r   r   r  r   r   r  rP   rP   rQ   r_     s   z<MemoryViewSliceNode.analyse_ellipsis_noop.<locals>.<genexpr>N)r  r  is_ellipsis_noopr  r   r  rP   rP   rQ   analyse_ellipsis_noop  s
    
z)MemoryViewSliceNode.analyse_ellipsis_noopc                 C   s   ddl m} |sd| _d| _nd| _| || | jr:d S d | _d| _d| _|	| j
|sdt| _d S t| jjj|| _| j s| j s| j|| _d S )Nr%   rl  Tz&Cannot assign to None memoryview slicez"Cannot slice None memoryview slice)rk  rm  r  r  r  r  r  r   r1  Zvalidate_axesry   r,   r   r   rS  r  r  r  r'  r  )rS   rl   rc  rV  rm  rP   rP   rQ   r    s"    z%MemoryViewSliceNode.analyse_operationc                 C   s<   |j js,| j j|j s |j jr,t| j| S t| j| S d S rI   )r   r   r  r  rj   MemoryCopyScalarry   MemoryCopySlicer  rP   rP   rQ   r    s    z&MemoryViewSliceNode.analyse_assignmentc                 C   s   |sdS | j dd }|dd }t| j D ]`\}}|jr~|jjrv|jjrv|jjrv|d ||< |d |s||  S q dS q,|jj	s, dS q,|rt
|t
| | jjjkrdS ||7 }|S )a  Return a new list of indices/slices with 'indices' merged into the current ones
        according to slicing rules.
        Is used to implement "view[i][j]" => "view[i, j]".
        Return None if the indices cannot (easily) be merged at compile time.
        Nr   )r  r1  r   r   r  r   r   r   r   r  r   r  r^  )rS   r  r  r5  r7  rP   rP   rQ   r    s&    

z"MemoryViewSliceNode.merged_indicesc                 C   s"   | j r| j p| j S |  S rI   )r  r  r  r'  rR   rP   rP   rQ   r    s    zMemoryViewSliceNode.is_simplec                 C   s
   | j  S )z3This is called in case this is a no-op slicing node)r  r   rR   rP   rP   rQ   r     s    z)MemoryViewSliceNode.calculate_result_codec              	   C   s   | j r
d S |  }| j }d}t| j}| jD ]N}|jrtd}|jjsNt	||_|j
js`t	||_
|jjs|t	||_q.t	| q.t|rt|j|| j|  | j|||jjd d S )NFT)r>  r  rd   )r  r  r@  iterr  r  r   r   r  nextr   r   r   r   Zgenerate_buffer_slice_coder   r   r   rd   )rS   r   r  r>  r  r  r  rP   rP   rQ   rD    s4    




    z(MemoryViewSliceNode.generate_result_codec                 C   sp   | j r| | n
| | | jr0| || n| || | j rN| | n
| | || || d S rI   )	r  rB  rI  is_memview_scalar_assignmentZ+generate_memoryviewslice_assign_scalar_codeZ&generate_memoryviewslice_setslice_coderG  rN  rV  r  rP   rP   rQ   rR    s    


z,MemoryViewSliceNode.generate_assignment_codeN)F)rU   rV   rW   r  r  r  r  r  r  r  r  r  r  r   rD  rR  rP   rP   rP   rQ   r    s   
	r  c                       s0   e Zd ZdZdgZ fddZdddZ  ZS )	MemoryCopyNodeze
    Wraps a memoryview slice for slice assignment.

        dst: destination mememoryview slice
    dstc                    s"   t t| | || _|j| _d S rI   )rK   r  r  r  r   rS   ry   r  rN   rP   rQ   r  2  s    zMemoryCopyNode.__init__Fc                 C   sH   | j | | || | j | | j | || || d S rI   )r  rI  _generate_assignment_coderN  rV  r  rP   rP   rQ   rR  7  s    
z'MemoryCopyNode.generate_assignment_code)F)rU   rV   rW   rF  r   r  rR  rX   rP   rP   rN   rQ   r  )  s   r  c                   @   s    e Zd ZdZdZdZdd ZdS )r  z
    Copy the contents of slice src to slice dst. Does not support indirect
    slices.

        memslice1[...] = memslice2
        memslice1[:] = memslice2
    TZ__pyx_memoryview_copy_contentsc                 C   sb   | j }|j|j |j|j ||d| j| | |jj|jj|jj	j
f |j d S )Nz%s(%s, %s, %d, %d, %d))r  r   assert_direct_dimsry   r   r  copy_slice_cnamer   r^  r  rj   )rS   r  r   r  rP   rP   rQ   r  L  s      z)MemoryCopySlice._generate_assignment_codeN)rU   rV   rW   rF  r  r  r  rP   rP   rP   rQ   r  @  s   r  c                       s(   e Zd ZdZ fddZdd Z  ZS )r  z
    Assign a scalar to a slice. dst must be simple, scalar will be assigned
    to a correct type and not just something assignable.

        memslice1[...] = 0.0
        memslice1[:] = 0.0
    c                    s    t t| || |jj| _d S rI   )rK   r  r  r   r  r  rN   rP   rQ   r  c  s    zMemoryCopyScalar.__init__c                 C   sJ  ddl m} | jj| jj | jjj}|d}| jjd}|  |	d||
 f  | j sr| j r~| j
 }n|	d|| j
 f  d}d}| jj}	|	D ]*}
t|
tr|
jjr|
jjr|
jjsd}q|j| jj|| jjj||d	}| }|jr|	d
|  |	d||f  |jr6|	d |  |  d S )Nr%   rl  rk  z%s __pyx_temp_scalar = %s;z%s __pyx_temp_slice = %s;Z__pyx_temp_sliceFT)force_stridedzPy_DECREF(*(PyObject **) %s);z!*((%s *) %s) = __pyx_temp_scalar;zPy_INCREF(__pyx_temp_scalar);)rk  rm  r  r   r  ry   r  r   Zbegin_blockr   r   r'  r  r  rv   rL  r   r  r   r   Z
slice_iterr^  Zstart_loopsrj   Z	end_loopsZ	end_block)rS   Zscalarr   rm  r  Z	type_declZ
slice_declZdst_tempr  r  r  Zslice_iter_objprP   rP   rQ   r  g  sB    

 
z*MemoryCopyScalar._generate_assignment_code)rU   rV   rW   rF  r  r  rX   rP   rP   rN   rQ   r  Z  s   r  c                       s   e Zd ZddddgZdZdZdd Zd6d
dZdd Zdd Z	dd Z
dd Zdd Zd7ddZdd Z fddZdZejddd d!id"Zejddd d#id"Z fd$d%Zd&d' Zd8d(d)Zd9d*d+Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Z  ZS ):SliceIndexNoder  r   r   sliceFNc                 C   s^   | j |}|js|jrtS |jr&tS |ttttt	t
tfkr@|S |jsL|jrZt|jd S tS rI   )r  r~   rE  r   r   rF  r   r   r   r/   r   r   rs  r
  r   Zc_array_typert  r   r}  rP   rP   rQ   r~     s    
  zSliceIndexNode.infer_typer   c                 C   s6   |t k	r*| jr*| j r&|| jj7 }nt }| j|S rI   )r   r   r   rw   r  r  r  rP   rP   rQ   r    s
    
z"SliceIndexNode.inferable_item_nodec                 C   s8   | j j}|r.|jrdS |ttttttfkr.dS t	
| S r"  )r  r   rE  r   r   r   r/   r   r   r   r  rM  rP   rP   rQ   r    s      zSliceIndexNode.may_be_nonec                 C   sF   | j d krd }n| j j}| jd kr(d }n| jj}| jj|| | _d S rI   )r   rw   r   r  )rS   r   r   rP   rP   rQ   r     s    

z(SliceIndexNode.calculate_constant_resultc              
   C   s   | j |}| jd krd}n| j|}| jd kr8d }n| j|}z||| W S  tk
r~ } z| | W 5 d }~X Y nX d S r   )r  r   r   r   rJ  r   )rS   r   r  r   r   r   rP   rP   rQ   r     s    

z!SliceIndexNode.compile_time_valuec                 C   s   d S rI   rP   r   rP   rP   rQ   r     s    z)SliceIndexNode.analyse_target_declarationc                 C   s    | j |dd}|jjrt|_|S r  )r   r   rj   r   r   rP   rP   rQ   r     s    z#SliceIndexNode.analyse_target_typesTc                    sh  | j || _ | j jjs,| j jjs,| j jjrzt| j}t| j| j	pD|| j
pL||d}t| j|| j d}|j||| ddS | j	r| j	|| _	| j
r| j
|| _
|jd st| j	| j
 | j j}|jr|s| j	s| j
s|| _nt|j| _nf|js|jr
t|| _nL|jrt| _n<|jr*|| _n,|jrBt|j| _n| j || _ t| _|jrr|| _| j d| _ | jtkr| j	r| j	jr^| j
r| j
jr^t| j}t| jt| j	p|t| j
p||d|| _ nztj!  fdd}| j	r*| j	jj"r|| j	d	|| _	| j	# || _	| j
r^| j
jj"rN|| j
d
|| _
| j
# || _
d| _$| S )Nr  )r  r  Fr~  rg  rr  c              
      sz   ddl m}m} || }t| jt| j || r8t|ntd|	 |t
| j|dt| jd|d|}|||S )Nr%   EvalWithTempExprNodeResultRefNoder&  is)operand1r
   operand2)true_val	false_valtest)	UtilNodesr  r  CondExprNodery   r  r  r  r   rz  PrimaryCmpNoder  r   analyse_result_type)r{   default_valuerl   r  r  Znode_refZnew_exprc_intrP   rQ   
allow_none!  s.    
z0SliceIndexNode.analyse_types.<locals>.allow_noner  r  r%   )%r  r   r   rn  r9   r   r  ry   rL  r   r   r  rd  rd   r|   r
  r   rF  rt  rE  is_cpp_stringrs   rF  r   rs  r  r   rE  r  r   copydeepcopyr  r  rj   rz  r   )rS   rl   rc  	none_noder  r   rt  r  rP   r  rQ   r     s    
  


zSliceIndexNode.analyse_typesc                 C   sj   | j |}|rf| jsf| jsfddlm} ||j t| j	}t
| j	|||d}t||||gS d S )Nr%   rl  r  )r  r  r   r   rk  rm  r   rR  r  ry   rL  r   rS  rT  )rS   rl   rt  rm  r  Z
slice_noderP   rP   rQ   r  C  s"    
 zSliceIndexNode.analyse_as_typec                    s   |j | _ tt| |S rI   )r   rK   r  r   r   rN   rP   rQ   r   U  s    zSliceIndexNode.nogil_checkzSlicing Python objectZSliceObjectr  r  ZGet)r  Setc                    s   | j jjs| j jjrX|ttttfkrX|ttfkrR|jd sRt	| j
d| j j|f  || _|jr| j jjr| js| js| j ||S tt| ||S )NrY   :default encoding required for conversion from '%s' to '%s')r  r   rE  r  r   r   r   r   rd   r   ry   r
  r   r   rz  rK   r  r  rN   rP   rQ   rz  a  s     
zSliceIndexNode.coerce_toc                 C   s  | j jst| jd| j   d S | j }|  }|  }|  }| jj jr| j }| jj t	j
t	jfkrpd| }| j tkrd}n| j j }| jd kr|d||||||| jf  n&|d||||||||| jf  n| jj jrh| j }| jj t	jkrd| }| jd kr@|d|||||| jf  n$|d|||||||| jf  n6| jj tkr|jtd	d
 |d||||||| jf  n| j tkr |j| j |  \}}}	}
}}}|d|| j |	|
|||||t|jjd ||| jf  n~| jj tkrH|jt dd d}n,| jj t!krp|jt dd d}nd}|d||| j ||||| jf  | "| d S )Nz,Slicing is not currently supported for '%s'.z((const char*)%s)Z	ByteArrayz'%s = __Pyx_Py%s_FromString(%s + %s); %sz7%s = __Pyx_Py%s_FromStringAndSize(%s + %s, %s - %s); %sz((const Py_UNICODE*)%s)z-%s = __Pyx_PyUnicode_FromUnicode(%s + %s); %sz?%s = __Pyx_PyUnicode_FromUnicodeAndLength(%s + %s, %s - %s); %sZPyUnicode_Substringr/  z.%s = __Pyx_PyUnicode_Substring(%s, %s, %s); %szD%s = __Pyx_PyObject_GetSlice(%s, %s, %s, %s, %s, %s, %d, %d, %d); %srg  ZSliceTupleAndListr  Z__Pyx_PyList_GetSliceZ__Pyx_PyTuple_GetSliceZPySequence_GetSlicez%s = %s(%s, %s, %s); %s)#r   rj   r   ry   r  r   
start_code	stop_coderE  r   rf   rh   r   rk   titler   r   r   rF  c_py_unicode_ptr_typer   r   r   r   r   r   get_slice_utility_codeget_slice_configr   r  rd   r   r   r   rd  )rS   r   Zbase_resultr   r  r  	type_namehas_c_start
has_c_stopc_startc_stoppy_startpy_stoppy_slicecfuncrP   rP   rQ   rD  q  s    




	
	

      


z#SliceIndexNode.generate_result_codec                 C   s  |  | | jjrt|j| j |  \}}}}	}
}}|| jd| j	
 |
 ||	|
||||t|jjd f
  n|| jr|  nd}|jjr|jj}| || nd|  |f }|jtdd |d| j	 || | j	 |f  | | | | || || d S )Nz?__Pyx_PyObject_SetSlice(%s, %s, %s, %s, %s, %s, %s, %d, %d, %d)rg  r  z%s - %sIncludeStringHr/  z,memcpy(&(%s[%s]), %s, sizeof(%s[0]) * (%s));)rB  r   rj   r   r   set_slice_utility_coder  r,  ry   r  r   r  rd   r   r  r
  r  generate_slice_guard_coder  r   r   r   r   rG  rH  rN  rV  )rS   r   r   rQ  r   r   r  r  r  r  r  r  r   Zstart_offsetarray_lengthrP   rP   rQ   rR    sF    
    	  


z'SliceIndexNode.generate_assignment_codec           
      C   s   | j jjs t| jd| j  d S | | |j| j | 	 \}}}}}}}	|
| jd| j  |||||	||t|jjd f	  | | | | d S )Nz=Deleting slices is only supported for Python types, not '%s'.z;__Pyx_PyObject_DelSlice(%s, %s, %s, %s, %s, %s, %d, %d, %d)rg  )r  r   rj   r   ry   rB  r   r   r  r  r,  r   r  rd   rG  rH  )
rS   r   rT  r  r  r  r  r  r  r   rP   rP   rQ   rU    s6    


      
z%SliceIndexNode.generate_deletion_codec                 C   s   d\}}}| j r:| j jj }|r,| j  }nd| j   }d\}}}| jrt| jjj }|rf| j }nd| j  }| jrd| j  pd}|||||||fS )N)Fr  r  &%sr  )r   r   rj   r   r   r   r  )rS   r  r  r  r  r  r  r   rP   rP   rQ   r    s$    

  zSliceIndexNode.get_slice_configc           
      C   st  | j jjsd S | j jj}zt| }}W n tk
r@   d }Y nX d  }}| jr| j }z<t|}|dk r|d krd||f }q||7 }n|}d }W n tk
r   Y nX | jr4| j }z^t|}|dk r|d krd| j jj|f }n||7 }t	|t
r
||8 }nd||f }d }W n tk
r2   Y nX d }d}zt|}	W n tk
rb   d }	Y nX t	|t
}|r|dk r|	dkr
t| jd nt|r|d kr|d kr|	|kr
t| jd||f  n:|d k	r|d kr|}d||f }n|d k	r|}n|}|rp|d||f  | jr2|  |d	||f  | jrT|  ||| j |d
 d S )Nr   z%s + %dz	%s - (%s)FzAssignment to empty slice.z8Assignment to slice of wrong length, expected %s, got %sz	(%s)-(%s)zif (unlikely((%s) != (%s))) {zPyErr_Format(PyExc_ValueError, "Assignment to slice of wrong length, expected %%" CYTHON_FORMAT_SSIZE_T "d, got %%" CYTHON_FORMAT_SSIZE_T "d", (Py_ssize_t)(%s), (Py_ssize_t)(%s));r   )r  r   r
  r  r  r   r   r   r   rv   r#   r   ry   r   r   r   r   r   )
rS   r   Ztarget_sizeZ
slice_sizetotal_lengthr   r   Zruntime_checkZcompile_time_checkZint_target_sizerP   rP   rQ   r    s    










 



 z(SliceIndexNode.generate_slice_guard_codec                 C   s   | j r| j  S dS d S )Nr  )r   r   rR   rP   rP   rQ   r  p  s    
zSliceIndexNode.start_codec                 C   s,   | j r| j  S | jjjr$| jjjS dS d S )Nr  )r   r   r  r   r
  r  rR   rP   rP   rQ   r  v  s
    


zSliceIndexNode.stop_codec                 C   s   dS )Nz<unused>rP   rR   rP   rP   rQ   r   ~  s    z$SliceIndexNode.calculate_result_code)r   )T)FNN)F)rU   rV   rW   r   r   r  r~   r  r  r   r   r   r   r   r  r   r:  r   loadr  r  rz  rD  rR  rU  r  r  r  r  r   rX   rP   rP   rN   rQ   r    sH   	
	

`    e    
"
Rr  c                   @   sV   e Zd ZdddgZdZeZdZdd Zdd	 Z	d
d Z
dd ZdZdd Zdd ZdS )rL  r   r   r   Tr%   c                 C   s   t | jj| jj| jj| _d S rI   r  r   rw   r   r   rR   rP   rP   rQ   r     s
    z#SliceNode.calculate_constant_resultc              
   C   sd   | j |}| j|}| j|}zt|||W S  tk
r^ } z| | W 5 d }~X Y nX d S rI   r   r   r   r   r  rJ  r   rS   r   r   r   r   r   rP   rP   rQ   r     s    zSliceNode.compile_time_valuec                 C   s   dS r"  rP   rR   rP   rP   rQ   r    s    zSliceNode.may_be_nonec                 C   sp   | j |}| j|}| j|}||| _ ||| _||| _| j jrl| jjrl| jjrld| _d| _| S r  )r   r   r   r   r  r   r   )rS   rl   r   r   r   rP   rP   rQ   r     s    zSliceNode.analyse_typesz Constructing Python slice objectc                 C   s   | j S rI   r  rR   rP   rP   rQ   r     s    zSliceNode.calculate_result_codec                 C   s   | j rLt| j| f}|jtdd|d| _|| j}|d kr@d S || j |	d| 
 | j | j | j || 
 | jf  | | | j r| | d S )Nr  r2   cleanup_level	dedup_keyz %s = PySlice_New(%s, %s, %s); %s)r   r   r   r)  r   r  r+  rC  ry   r   r   r   r   r   r   r   rd  rg  )rS   r   r  rP   rP   rQ   rD    s&    
zSliceNode.generate_result_codeN)rU   rV   rW   r   r   r    r   r   r   r   r  r   r:  r   rD  rP   rP   rP   rQ   rL    s   
	rL  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 )r  r   c                 C   s   t | jj| jj| jj| _d S rI   r	  rR   rP   rP   rQ   r     s
    z&SliceIntNode.calculate_constant_resultc              
   C   sd   | j |}| j|}| j|}zt|||W S  tk
r^ } z| | W 5 d }~X Y nX d S rI   r
  r  rP   rP   rQ   r     s    zSliceIntNode.compile_time_valuec                 C   s   dS r"  rP   rR   rP   rP   rQ   r    s    zSliceIntNode.may_be_nonec                 C   s   | j || _ | j|| _| j|| _| j js@| j || _ | jjsV| j|| _| jjsl| j|| _| j jr| jjr| jjrd| _d| _| S r  )r   r   r   r   r  r  r   r   r   rP   rP   rQ   r     s    zSliceIntNode.analyse_typesc                 C   s   d S rI   rP   rR   rP   rP   rQ   r     s    z"SliceIntNode.calculate_result_codec                 C   s.   | j | j| jfD ]}t|tr|j  qd S rI   )r   r   r   rv   r  r  r   )rS   r   r9  rP   rP   rQ   rD    s    
z!SliceIntNode.generate_result_codeN)
rU   rV   rW   r   r   r   r  r   r   rD  rP   rP   rP   rQ   r    s   		r  c                   @   sV   e Zd Z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ZdS )CallNodeNc           	         sT  | j }| }t|tr&t|jS |tkrLt|dd }|d k	rL|j	pJ|}|j
rX|j}|jrt| j dd rt| dr| j j } fdd| jD }t||}|r|j	}|j
r|j}|jS |jS |tkr*|jr*|jr*|jj	r*|jj	}|jr|S |jr*|jjdkrtjS |jjtjkr*|S | j  }|rP|jsL|jrP|S tS )Nr   r   c                    s   g | ]}|  qS rP   r}   r[   r  rr   rP   rQ   r     s     z'CallNode.infer_type.<locals>.<listcomp>rx   )r  r~   rv   r;  r   rF  r=  r   r   r   rs  rt  r  hasattrr   all_alternativesr   
best_matchr  r   r   rD  rE  rk   r  r   #types_that_construct_their_instancer  is_struct_or_unionr   )	rS   rl   r  rx  r   alternatives	arg_types
func_entryresult_typerP   rr   rQ   r~     sF    



zCallNode.infer_typec                 C   s   | j |S rI   )r  r  r   rP   rP   rQ   r  *  s    zCallNode.type_dependenciesc                 C   s   dS r"  rP   rR   rP   rP   rQ   r  /  s    zCallNode.is_simplec                 C   s^   | j d k	r| j S | jj}|tkrT| jjrT| jj}|jjr<dS |jjrT|jt	j
krTdS t| S r"  )may_return_noner  r   r   r   r   rD  rE  rk   r   r  r   r  )rS   rx  r   rP   rP   rQ   r  6  s    

zCallNode.may_be_nonec                 C   s   |d kr|j }|tjkrv|jrv|jrv|jjrv|jjtjkrv|jjdkrXtj	| _ tj	| _
ntj|jj | _ t| _
d| _n*|jr|jr|jj | _ t| _
d| _nt| _ d S )Nrx   F)r   r   r   r   r   rI  rk   r  r   r  r   Zbuiltin_typesr   r  rx  )rS   r  rx  rP   rP   rQ   set_py_result_typeC  s,    


zCallNode.set_py_result_typec           	   	      s*  | j  }|r|jr|  \}}g }t||jjD ]*\}}|t|j	t
|j	|jd|d q4|rn||j7 }|| _t| _|   | |  dS |r&|jr& fdd| jD | _|jd}|st| j j	d| j j  t| _| S t| j j	|j| _ || j _| j |  |   || _dS d S )N)ry   r   )ry   keyr   Tc                    s   g | ]}|  qS rP   r   r  rr   rP   rQ   r   l  s     z8CallNode.analyse_as_type_constructor.<locals>.<listcomp>z<init>z'no constructor found for C++  type '%s')r  r  r  explicit_args_kwdsr  r  r  r   DictItemNodery   r.  rk   key_value_pairsDictNoderO   r   rz  r   r   r  r   r,   r   r)  r   r+  r?  analyse_c_function_call)	rS   rl   r   r   r  r  r  memberr>  rP   rr   rQ   analyse_as_type_constructor]  s4    
$


z$CallNode.analyse_as_type_constructorc                 C   s   | j jS rI   )r   r   rR   rP   rP   rQ   r   y  s    zCallNode.is_lvaluec                 C   s6   |   }|jr|   n|js2t|dds2|   d S )Nr   F)function_typerj   r  r~  r   )rS   rl   rx  rP   rP   rQ   r   |  s
    
zCallNode.nogil_checkzCalling gil-requiring function)N)rU   rV   rW   r  r~   r  r  r  r  r#  r   r   r:  rP   rP   rP   rQ   r    s   (
r  c                       s   e Zd ZdddddgZdZdZdZdZdZdZ	dZ
dZd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dd Z fddZdd Z  ZS ) r  rS   coerced_selfr  r   r  NFc              
      s\   | j  } fdd| jD }z
|| W S  tk
rV } z| | W 5 d }~X Y nX d S )Nc                    s   g | ]}|  qS rP   r   r  r   rP   rQ   r     s     z5SimpleCallNode.compile_time_value.<locals>.<listcomp>)r  r   r   rJ  r   )rS   r   r  r   r   rP   r'  rQ   r     s    
z!SimpleCallNode.compile_time_valuec                 C   sP   |j }||j}|s(td||jf t||j||jd}| |||gd}|S )Nz Getter not found in scope %s: %s)rk   r   r   r  )r  rR  rk   r   r  ry  r   )rM   ry   r  r   Zproperty_scopeZgetter_entryr  r{   rP   rP   rQ   for_cproperty  s    zSimpleCallNode.for_cpropertyc                 C   s   | j  }|dkrdt| jdkr0t| jjd q| jd |}|sXt| jd jd qt|S n:|dkrt| jdkrt| jjd | jd 	|}|j
S d S )Npointerr%   zonly one type allowed.r   zUnknown typeZtypeof)r  r  r   r   r   ry   r  r   rF  r   r   )rS   rl   r  r   operandrP   rP   rQ   r    s    
zSimpleCallNode.analyse_as_typec                 C   s
   | j d fS rI   r  rR   rP   rP   rQ   r    s    z!SimpleCallNode.explicit_args_kwdsc                    s  | j r
| S d| _ |  r| S d| j_| j | _| j}|jrb|jrb|jjrb|j| _	t
| j	|_|  }d| _t r|jrt|rd}t| j| jd| _| j | _| jjD ]}|t|M }qt|| _| jr
 t| tj| t|| jtt|| jjdS |jrRt| j| jd| _| j  | _d | _| || d| _ n2 fdd| jD | _| !  |j"dkrd| _ | S )	NTr%   Fr  )function_cnamer  r   c                    s   g | ]}|  qS rP   r   r  rr   rP   rQ   r     s     z0SimpleCallNode.analyse_types.<locals>.<listcomp>r   )#analysedr#  r  r  r   r  r   
is_cmethodr  rS   r  r$  Zis_numpy_call_with_exprsr=   r  rB   r  ry   r   r  r@   r  Zadd_include_filerC   NumPyMethodCallNoder  rD   rE   r:   rj   r  r  r   r!  r   )rS   rl   r  rx  Zhas_pythran_argsr  rP   rr   rQ   r     sR    


zSimpleCallNode.analyse_typesc                 C   s   | j j}|jr|j}|S rI   )r  r   rs  rt  rS   rx  rP   rP   rQ   r$    s    zSimpleCallNode.function_typec                 C   s  | j j}|tkrt| _d S |jrJ|jrJ| jrB| jjjrBt| jd | j	}n| jr`| jg| j	 }n| j	}|j
r| j jjd}|d krtj| _d| _d S n6t| j dr| j j}n | j jr| j jr| j jj}nd }|rb| j jjr| j j }dd |D }n| }tdd |D || j||}|s8tj| _d| _d S d|_|j
sN|| j _|j| j _|  }n6d }|  }|jst| jd	|  tj| _d| _d S t|j	}||j }	t|}
|jr|	|
krd
| _d
| _|r|jr|j	r|js|j	d }|d }|jr^| jrF| jjd t|j!dkr0dndd|j!gd| _n|jd|j!|jj!gd}| jr|j"rzt#| j}n
t$| j}|%|j| }| _&n4|jj'r|%|j|}|jj'rt(|t)rd|_*||d< d}t+t,||
D ]}|j	| }|j}|| %||}|jr|d}|jr6|dkrd}nN|jj-r|j.s|dkr`| jd k	r`n$|/ rln|dkrzd}|0|}|||< qt+||
D ]}|| }|jj-r|jt1krtj2}n
|j3 }|d krt| j	|d
  jd n|%|| ||< }|jr|dkrd}q|rt+|
d
 D ]}|dkrN| jd k	rNq0|| }|/ rbnT|jj
rnnH|j.r|jj-rn4|dks|d
kr0| jd k	r0t4|jdd  qq0|| j	d d < t(| j t5rt6| j j7| _n|j8| _| j j9s| j j:r(| j j}|r(|j;s"|j<r(d
| _| jj-r@t=| _>d
| _n,|j?d k	sT|j@r\d
| _n| jjArld
| _| jr| jjBrtC| jjD| _|j@dkrtE|r|FtGHdd |jId | _Jd S )Nz4Cannot call a static method on an instance variable.z
operator()r  r   c                 S   s   g | ]
}|j qS rP   )r   )r[   frP   rP   rQ   r      s     z:SimpleCallNode.analyse_c_function_call.<locals>.<listcomp>c                 S   s   g | ]
}|j qS rP   rp  r  rP   rP   rQ   r   $  s     TzCalling non-function type '%s'r%   r   *'NoneType' object has no attribute '%{0}s'   .30rk  PyExc_AttributeError)r   r  z@descriptor '%s' requires a '%s' object but received a 'NoneType'r  FzGcannot pass None into a C function argument that is declared 'not None'z5Python object cannot be passed as a varargs parameterTArgument evaluation order in C function call is undefined and may not be as expectedr   rw  rL  overflowcheck)Kr  r   r,   r  is_static_methodrS   rD  r   ry   r   r   r  r  r   r  r  r   r  r  r  ru  r  r  rw  r$  r   optional_arg_counthas_optional_argsr   r-  Znot_noner  r   rk   Zaccept_builtin_subtypesCMethodSelfCloneNoder  rz  r%  rE  rv   r  exact_builtin_typerangeminrj   r   r  r  r   rf   Zdefault_coerced_ctyper   r;  rF  r=  r  r   r  r  Zutility_code_definitionr   r   r   r   r   r   CFakeReferenceTyperr  r   r   r   r   rd   r7  )rS   rl   rx  r   Zoverloaded_entryZ	functypesr  r   	max_nargsexpected_nargsactual_nargs
formal_argr  some_args_in_tempsr5  formal_typeZ	arg_ctyper  rP   rP   rQ   r!    s(   

   

















 



z&SimpleCallNode.analyse_c_function_callc                 C   s   |   S rI   )c_call_coderR   rP   rP   rQ   r     s    z$SimpleCallNode.calculate_result_codec                 C   s  |   }| jtjks|jsdS |j}g }tt|| j}t|j}||j	 }t| j}|d | D ]\}}	|	
|j}
||
 qb|jr|tt| jp| jjj |j	r||krd}n
d| j }|| | jt|d  D ]}	||	  qd| j d|f }|S )Nr  r  r  r  , )r$  r   r   r,   r  r   r   r  r   r9  r   r   rs  rp   r  wrapper_callr  r   is_unbound_cmethodopt_arg_structr   r   r  )rS   rx  Zformal_argsZarg_list_coder   r@  rA  rB  rC  
actual_argarg_codeZoptional_argsr   rP   rP   rQ   rF    s.    




zSimpleCallNode.c_call_codec                 C   s    |   }|jr|jdkrdS dS )Nr   FT)r$  r   r   r/  rP   rP   rQ   r     s    z#SimpleCallNode.is_c_result_requiredc              
      s  | j }|js|jr |j|j d}| jjo2| jj}| j	r|r|
 |kr|jtdd |d| jd 
 | jd j || jf  |jjrt| jjdks| jjr| jjrtt| | d S | jjr| jjd nd }| j| j||f}|D ]}|d k	r|| q|| j | js(t| | |d kr||jtdd |d	| 
 |  |!| 
 | jf  nD|jtd
d |d| 
 |  |  |!| 
 | jf  | "| |D ]$}|d k	r|#| |$| qd S )N)absZlabsZ__Pyx_abs_longlongZCommon
Overflow.czif (unlikely(%s == __PYX_MIN(%s))) {                PyErr_SetString(PyExc_OverflowError,                                "Trying to take the absolute value of the most negative integer is not defined."); %s; }r   r%   ZPyObjectCallNoArgr  z%%s = __Pyx_PyObject_CallNoArg(%s); %sPyObjectCallOneArgz*%s = __Pyx_PyObject_CallOneArg(%s, %s); %s)%r  r   r  r   use_entry_utility_coder   r   r  rs  r7  r   r   r   r   r   r   r?  r   ry   rj   r   r  r   rK   r  rI  rS   r%  rC  r   r   r2  r   r   rd  rN  rV  )rS   r   r  Zabs_function_cnamesZis_signed_intr  r   ZsubexprrN   rP   rQ   rI    sr    



 
 


z'SimpleCallNode.generate_evaluation_codec              
   C   s.  |   }|jrh| j }|jtdd |d| 	 | j
 ||| 	 | jf  | | n|jr*|jj }| jr&t| j}t|j|j }|jj|jjdd| _|d| jtjd t| j| f  tt|j| j}||| D ].\}}	|d| j||j|	|j f  qg }
| j jrP| j!rP|
"d| 	   n| j j#r~| j!sft$|
"| j %| 	  n|j&d	kr2|j'}|j&}|d k	r|
"d
| 	 |j()|f  |r2|r(|
st*| j
dd }t+j,| j|jj-|r|jnd | j j.dd |jtdd |
"d n
|
"d | j!s@|
r| / }| 	 rd| 	  }| j!r| j jrt0t1| j |}nd}|j&d	krt2|| jd||f | j jr| 	 nd |j'| n4|
r|3d4|
| j}nd}|d|||f  | j jr| 	 r| | | jr*|j5| j d S )Nr  r  z*%s = __Pyx_PyObject_Call(%s, %s, NULL); %sTr*  %s.%s = %s;r  r  r   z%s == %sr   )function_nameZvoid_returnZis_callr   r   r   r   z%s = rk  z%s%s;z && z%s%s; %s)6r$  rj   r  r   r   r   r   r   r   r   r  r   ry   rd  r  r/  	gil_ownedr:  r   r   r9  r0  op_arg_structrt  rJ  r   Zpyrex_prefixr   r  Zopt_arg_cnamerk   r   r   r   r   r   r   Zerror_conditionr   r   r  	cast_coder   r   Zwrite_noexcept_performance_hintr  r-  rF  r+   r   r   r   r  r8  )rS   r   rx  rL  r   rB  rA  r   rC  rK  Z
exc_checksexc_valZ	exc_checkZperf_hint_entryr   r  Z
goto_errorrP   rP   rQ   rD  )  s    

 

 




  


 
z#SimpleCallNode.generate_result_code)rU   rV   rW   r   rS   r%  r  rH  r:  r   r,  r7  r   r  r(  r  r  r   r$  r!  r   rF  r   rI  rD  rX   rP   rP   rN   rQ   r    s.   
	0 L9r  c                   @   s"   e Zd ZdgZdZdZdd ZdS )r.  r  Tc              
   C   s   | | j | | | jjd ks&t| jj}|D ]}|| q2|d |d| 	   |d| 	 | 	 | j
ddd |D f  d S )Nz.// function evaluation code for numpy functionr  z!new (&%s) decltype(%s){%s{}(%s)};rG  c                 s   s   | ]}|  V  qd S rI   )r   )r[   r9  rP   rP   rQ   r_     s     z?NumPyMethodCallNode.generate_evaluation_code.<locals>.<genexpr>)rC  ry   r2  r  r   r   r   rI  r   r   r+  r  )rS   r   r   r  rP   rP   rQ   rI    s    

z,NumPyMethodCallNode.generate_evaluation_codeN)rU   rV   rW   r   r   r  rI  rP   rP   rP   rQ   r.  z  s   r.  c                   @   s    e Zd ZddgZdZdd ZdS )PyMethodCallNoder  r  Tc              	   C   sJ  | | j | | | j| | jjd ks2t| jj}|D ]}|| q>| jj	}|rf| j
 }nL|jjtdd}| j| |d|| j f  | j| | j| |jjtdd}|d|  |jjtjdd}|d|  dd }| jjr|| jrd	nd
}	nl| jjr| jjr| jjD ]D}
|
j}|r4|jr4|jjr4|jjjr4||r4d	}	 qq4d
}	nd
}	|d |d|	|f  |d||f  |d|  |d|  ||t |dt ||td |d|  |d |d |d |j t!"dd |d |d|rVt#|d nd||rtd$dd |D ndf  |d| 
 ||t#||f  |%|t |j&| |j&| |D ]}|| || q||'| 
 | j | (| |r$| j| | j| n|)|t |j&| |d d S )NTr*  	%s = %s; r  FrO  c                 S   s   | j }|jr|jjrdS dS r  )r  r   r   ru  )r  r  rP   rP   rQ   attribute_is_likely_method  s    zMPyMethodCallNode.generate_evaluation_code.<locals>.attribute_is_likely_methodZlikelyZunlikelyz#if CYTHON_UNPACK_METHODSzif (%s(PyMethod_Check(%s))) {z%s = PyMethod_GET_SELF(%s);if (likely(%s)) {z/PyObject* function = PyMethod_GET_FUNCTION(%s);r  rB  r   r  ZPyObjectFastCallr  r  z(PyObject *__pyx_callargs[%d] = {%s, %s};r%   r2   rG  c                 s   s   | ]}|  V  qd S rI   r   r  rP   rP   rQ   r_     s     z<PyMethodCallNode.generate_evaluation_code.<locals>.<genexpr>r  z=%s = __Pyx_PyObject_FastCall(%s, __pyx_callargs+1-%s, %d+%s);)*rC  ry   r2  r  rI  r  r   r   r   r   r   r/  r0  r   r<  r  r   rN  rV  r   r   rG  r  r   r   r   r  r   rj   r:  rZ  r   r   r   r   r   r  r  r8  r   rd  rM  )rS   r   r   r  Zreuse_function_tempr  Zself_argZarg_offset_cnamerY  Zlikely_methodr~  r   rP   rP   rQ   rI    s    

$









z)PyMethodCallNode.generate_evaluation_codeN)rU   rV   rW   r   r   rI  rP   rP   rP   rQ   rW    s   rW  c                   @   s<   e Zd ZddgZdZeZdZdZdd Z	dd Z
d	d
 ZdS )InlinedDefNodeCallNoder   rR  r%   Nc                 C   s>   | j j}|js|jrdS t|jt| jkr0dS |jr:dS dS r  )r  def_nodestar_argstarstar_argr   r   num_kwonly_argsr/  rP   rP   rQ   can_be_inlined  s    z%InlinedDefNodeCallNode.can_be_inlinedc                    s  | j  | _  fdd| jD | _| jj}t| j}d}t|D ]n}|j| j}| j| | }|j	rx|dkrd}n.|jj
r js| rn|dkrd}| }|| j|< qB|rt|d D ]N}| j| }| rq|jjrqĈ jr|jj
rq|dkrt|jdd  qq| S )Nc                    s   g | ]}|  qS rP   r   r  rr   rP   rQ   r      s     z8InlinedDefNodeCallNode.analyse_types.<locals>.<listcomp>Fr   Tr%   r6  )rR  r   r   r  r]  r   r=  r   rz  r   rj   r   r  r  r   r   ry   )rS   rl   rx  rB  rD  r5  rE  r  rP   rr   rQ   r     s>    


z$InlinedDefNodeCallNode.analyse_typesc              
   C   s   | j  g}| jj}t| j|jD ]2\}}|jjrF||	|j q"||
  q"d|}|d| 
 | jjjj||| 
 | jf  | | d S )NrG  %s = %s(%s); %s)rR  r   r  r]  r  r   r   rj   r   r   r   r  r   r   pyfunc_cnamer   ry   rd  )rS   r   rL  rx  r  Z	proto_argrP   rP   rQ   rD  V  s     

z+InlinedDefNodeCallNode.generate_result_code)rU   rV   rW   r   r   r   r   r  rR  ra  r   rD  rP   rP   rP   rQ   r\    s   
9r\  c                   @   s2   e Zd Zg Zd
ddZdd Zdd Zdd	 ZdS )PythonCapiFunctionNodeNc                 C   s   t j| |||||d d S )N)rk   r   r   r  r  )rS   ry   py_namer   rx  r  rP   rP   rQ   r  k  s     zPythonCapiFunctionNode.__init__c                 C   s   | S rI   rP   r   rP   rP   rQ   r   o  s    z$PythonCapiFunctionNode.analyse_typesc                 C   s   | j r|j| j  d S rI   )r  r   r   r;  rP   rP   rQ   rD  r  s    z+PythonCapiFunctionNode.generate_result_codec                 C   s   | j S rI   r*  rR   rP   rP   rQ   r   v  s    z,PythonCapiFunctionNode.calculate_result_code)N)rU   rV   rW   r   r  r   rD  r   rP   rP   rP   rQ   rd  h  s
   
rd  c                   @   s   e Zd ZdZdddZdS )PythonCapiCallNodeFNc                 K   s8   |j | _| j| _t|||||d| _tj| |f| d S )N)r  )r  r   r   rd  r  r  r  )rS   ry   rR  rx  r  re  r  rP   rP   rQ   r    s       zPythonCapiCallNode.__init__)NN)rU   rV   rW   r  r  rP   rP   rP   rQ   rf  z  s      rf  c                       s8   e Zd ZddgZdZ fddZdd Zdd	 Z  ZS )
CachedBuiltinMethodCallNoder  r   Tc                    s&   t t| j|j||||j|jd d S )N)r  r   r   r  r   )rK   rg  r  ry   r  r   )rS   Z	call_noder  r   r   rN   rP   rQ   r    s    
  z$CachedBuiltinMethodCallNode.__init__c                 C   s   | j d k	r| j S t| S rI   )r  r   r  rR   rP   rP   rQ   r    s    
z'CachedBuiltinMethodCallNode.may_be_nonec              	   C   sl   | j jj}| j  }dd | jD }|j||| j|}|d| 	 ||
| 	 | jf  | | d S )Nc                 S   s   g | ]}|  qS rP   r[  r  rP   rP   rQ   r     s     zDCachedBuiltinMethodCallNode.generate_result_code.<locals>.<listcomp>r  )r  r   r   r   r   r   Zcached_unbound_method_call_coder   r   r   r   ry   rd  )rS   r   Z
type_cnameZ	obj_cnamer   Z	call_coderP   rP   rQ   rD    s    

    z0CachedBuiltinMethodCallNode.generate_result_code)	rU   rV   rW   r   r   r  r  rD  rX   rP   rP   rN   rQ   rg    s
   rg  c                   @   sH   e Zd ZeZdddgZejZdd Z	dd Z
dd	 Zd
d Zdd ZdS )GeneralCallNoder  rN  rO  c              
   C   sb   | j |}| j|}| j|}z|||W S  tk
r\ } z| | W 5 d }~X Y nX d S rI   )r  r   rN  rO  rJ  r   )rS   r   r  rN  rO  r   rP   rP   rQ   r     s    z"GeneralCallNode.compile_time_valuec                 C   s0   | j r| j jr| jjs"t| jd| jj| j fS )Nz0Compile-time keyword arguments must be explicit.)rO  r  rN  r   r   ry   r   rR   rP   rP   rQ   r    s    z"GeneralCallNode.explicit_args_kwdsc                 C   s   |  |r| S | j|| _| jjjs| jjjr:t| _| S t| jdr|  }|d k	rh|| k	rh||S | jj	j
r| j|| _q|| krt| jd qn| j|| _| jr| j|| _| j|| _| j|| _| | j d| _| S )Nr   zRNon-trivial keyword arguments and starred arguments not allowed in cdef functions.r%   )r#  r  r   r   rj   r~  r,   r  map_to_simple_call_noder   rH  r  r   ry   rO  rN  r  r   r   rP   rP   rQ   r     s6    





zGeneralCallNode.analyse_typesc                    s  t | jts| S | jjs| S | j}t|dd}|s6| S |j}|jrH|j	}|j
sR| S | jj | j}|j}|jrx|dd }t t|krt| jdt|t f  dS dd |dt  D }|t d }d}t }	t|}
d}|jD ]4}|jj}||
krt|jd	|  d
}|
| qt||jD ]D\}}|jj}|j|krn|| |d7 }|	|j n qxq2ddlm}m} g }t|j|kr|t|	d }t fddt|jD }d}|D ]}|j}||kr|s|}qn,|r |jr
|   S t| jd|   dS || \}}|| |d7 }|j rX|	|j n0||j}| spt |	| |||f q|rg }g }|d d }|	D ]H}||kr q| r|| n||}|| || q|r|}	|dd t!|D  }|jD ],}|jj}||krd
}t|jd|  q|rRdS t"| j||	d}|ddd D ]}|||}qp|S )z
        Tries to map keyword arguments to declared positional arguments.
        Returns self to try a Python call, None to report an error
        or a SimpleCallNode if the mapping succeeds.
        r   Nr%   zDfunction call got too many positional arguments, expected %d, got %sc                 S   s   h | ]}|j r|j qS rP   rG  r  rP   rP   rQ   r     s   z:GeneralCallNode.map_to_simple_call_node.<locals>.<setcomp>r   Fzargument '%s' passed twiceT)r  
LetRefNodec                    s(   g | ] \}}|j j|t  |ffqS rP   )r  r   r   r[   r5  r  Zpos_argsrP   rQ   r   2  s   z;GeneralCallNode.map_to_simple_call_node.<locals>.<listcomp>z(C function call is missing argument '%s'r  c                 S   s   g | ]\}}|qS rP   rP   rk  rP   rP   rQ   r   b  s     z/C function got unexpected keyword argument '%s'r  )#rv   rN  r  rO  r  r  r   r   rs  rt  r  r   r-  r   r   ry   r   setr  r  r   addr  rk   r   r  r  rj  r|  r1  rH  r  r   r  r  )rS   r  r   r$  r  Zdeclared_argsZmatched_argsZunmatched_argsZmatched_kwargs_countr   seenZ
has_errorsr  rk   Zdecl_argr  rj  ZtempskeywordsZfirst_missing_keywordry   r  Z
final_argsZ	new_tempsZfirst_temp_arg	arg_valuer{   rP   rl  rQ   ri    s    












z'GeneralCallNode.map_to_simple_call_nodec                 C   sz   | j jrd S | jr| j }nd}|jtdd |d| 	 | j
 | j ||| 	 | jf  | | d S )Nr  r  r  z(%s = __Pyx_PyObject_Call(%s, %s, %s); %s)r   r~  rO  r   r   r   r   r   r   r   r  rN  r   ry   rd  )rS   r   r  rP   rP   rQ   rD  x  s&     
 z$GeneralCallNode.generate_result_codeN)rU   rV   rW   r   r   r   r(   r  r   r   r  r   ri  rD  rP   rP   rP   rQ   rh    s   
	  rh  c                   @   sH   e Zd ZdgZdZdd Zdd Zdd Zd	d
 Ze	j
ZdZdd ZdS )AsTupleNoder  r%   c                 C   s   t | jj| _d S rI   )r   r  rw   rR   rP   rP   rQ   r     s    z%AsTupleNode.calculate_constant_resultc              
   C   sH   | j |}z
t|W S  tk
rB } z| | W 5 d }~X Y nX d S rI   )r  r   r   rJ  r   )rS   r   r  r   rP   rP   rQ   r     s
    
zAsTupleNode.compile_time_valuec                 C   s6   | j ||| _ | j jtkr,| j dS t| _| S Nr  )r  r   r  r   r   r  r   rP   rP   rQ   r     s
    zAsTupleNode.analyse_typesc                 C   s   dS r"  rP   rR   rP   rP   rQ   r    s    zAsTupleNode.may_be_noneConstructing Python tuplec              
   C   sT   | j jttfkrdnd}|d|  || j  ||  | jf  | 	| d S )NZ__Pyx_PySequence_TupleZPySequence_Tuplerb  )
r  r   r   r   r   r   r   r   ry   rd  )rS   r   r  rP   rP   rQ   rD    s     z AsTupleNode.generate_result_codeN)rU   rV   rW   r   r   r   r   r   r  r(   r  r   r:  rD  rP   rP   rP   rQ   rr    s   rr  c                   @   sb   e Zd ZdgZdZeZdZdd Zdd Z	dd	 Z
d
d Zdd Zdd ZdZdd Zdd ZdS )MergedDictNoderO  r%   Tc                 C   sp   i }| j }| jD ]T}|jr,dd |jD }n
|j }|D ](\}}|rZ||krZtd| |||< q:q|| _d S )Nc                 s   s   | ]\}}|j |j fV  qd S rI   rw   r[   r  r   rP   rP   rQ   r_     s   z;MergedDictNode.calculate_constant_result.<locals>.<genexpr>$duplicate keyword argument found: %s)reject_duplicatesrO  r  r  rw   	iteritemsr   )rS   r   ry  r   r  r  r   rP   rP   rQ   r     s    

z(MergedDictNode.calculate_constant_resultc           	         s   i }| j }| jD ]}|jr0 fdd|jD }n|  }z2|D ](\}}|rd||krdtd| |||< qDW q tk
r } z| | W 5 d }~X Y qX q|S )Nc                    s$   g | ]\}}|  |  fqS rP   r&  rw  r'  rP   rQ   r     s   z5MergedDictNode.compile_time_value.<locals>.<listcomp>rx  )	ry  rO  r  r  r   rz  r   rJ  r   )	rS   r   r   ry  r   r  r  r   r   rP   r'  rQ   r     s     

z!MergedDictNode.compile_time_valuec                 C   s   dS rA  rP   r   rP   rP   rQ   r    s    z MergedDictNode.type_dependenciesc                 C   s   t S rI   r   r   rP   rP   rQ   r~     s    zMergedDictNode.infer_typec                    s    fdd| j D | _ | S )Nc                    s"   g | ]}|   d qS )z1argument after ** must be a mapping, not NoneTyper   r  r  r  rr   rP   rQ   r     s   z0MergedDictNode.analyse_types.<locals>.<listcomp>)rO  r   rP   rr   rQ   r     s    
zMergedDictNode.analyse_typesc                 C   s   dS r"  rP   rR   rP   rP   rQ   r    s    zMergedDictNode.may_be_noneConstructing Python dictc              
   C   s  | | j | | t| j}t|}|| |jtk	rN|	d|
   |jr|| |	d|  |
 f  || n>|	d|  |
 ||  |jf  | | || |jtk	r4|	d |jtdd |	d|  |
 ||  | jf  | | || |	d || t }|D ]`}|jr|jD ]}|| | jr|	d	|  |j
 f  |d
 |	d|j
 || jf  |	d ||jjd|  |j
 |j
 f  || || q\n|| | jrB|d ||jd|  |
 f  nR|d |	d|  |
 f  |	d|
   |	||j |	d || || qHt|D ]}|jt|d qd S )Nz$if (likely(PyDict_CheckExact(%s))) {r  z%s = PyDict_Copy(%s); %sr  rO  r  z?%s = __Pyx_PyObject_CallOneArg((PyObject*)&PyDict_Type, %s); %sr   (if (unlikely(PyDict_Contains(%s, %s))) {RaiseDoubleKeywords2__Pyx_RaiseDoubleKeywordsError("function", %s); %sPyDict_SetItem(%s, %s, %s)ZMergeKeywordsz__Pyx_MergeKeywords(%s, %s)ZRaiseMappingExpectedz*if (unlikely(PyDict_Update(%s, %s) < 0)) {zVif (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseMappingExpectedError(%s);FunctionArguments.c) rC  ry   r2  r  rO  r  rI  r   r   r   r   r  r<  r   rP  r   rd  rN  r   r   r   r   rV  rm  r  ry  r  rn  r   r,  r   r  )rS   r   r   r   helpersr  helperrP   rP   rQ   rI    s    








 













 

 

z'MergedDictNode.generate_evaluation_codec                 C   s   | j D ]}|| qd S rI   )rO  rj  rS   r   r   rP   rP   rQ   rj  J  s    
zMergedDictNode.annotateN)rU   rV   rW   r   r   r   r   ry  r   r   r  r~   r   r  r:  rI  rj  rP   rP   rP   rQ   ru    s   
Qru  c                   @   sD  e Zd ZdZdg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dJd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dKd)d*ZdLd+d,Zd-d. Zd/d0 Zd1Z d2d3 Z!d4d5 Z"d6d7 Z#d8d9 Z$d:d; Z%d<d= Z&d>d? Z'd@dA Z(dMdBdCZ)dNdDdEZ*dFdG Z+dHdI Z,dS )Or  r%   r  Nr   TFc                 C   sD   t | jtr$| jjr$| jdks$| jS | j }|r@d|| jf S d S )Nparallel%s.%s)rv   r  ry  r{  r  r  )rS   cyrP   rP   rQ   r  h  s    
z!AttributeNode.as_cython_attributec              	   C   s  |t kr| j}|r:|jr:|jr:d| _|j| _| | | S |r|jr| jjtj	k	rddl
m}m} || j| jjd}| jj|_|| _t| ||}tdd}ttj tdtj d tdtj d g}	t| jd|	||g|d	}
|||
}||S t| ||S )
Nr%   r  rp  ZPyMethodNew2Argr  r  rS   Z__Pyx_PyMethod_New2Arg)rR  rx  r   r  )r   r   r  rH  r   analyse_as_python_attributer  r   r   r   r  r  r  r   r   rz  r   r   r   r  r  rf  ry   r   )rS   r  rl   r   r  r  Zobj_nodeZunbound_noder  rx  Zbinding_callZcomplete_callrP   rP   rQ   rz  s  sB    

 

zAttributeNode.coerce_toc                 C   s2   | j }|dr|drd S t| jj|| _d S )N__)r  
startswithendswithr   r  rw   )rS   r  rP   rP   rQ   r     s    z'AttributeNode.calculate_constant_resultc              
   C   sx   | j }|dr.|dr.t| jd|  d S | j|}zt||W S  tk
rr } z| 	| W 5 d }~X Y nX d S )Nr  z6Invalid attribute name '%s' in compile-time expression)
r  r  r  r   ry   r  r   r   rJ  r   )rS   r   r  r  r   rP   rP   rQ   r     s    z AttributeNode.compile_time_valuec                 C   s   | j |S rI   )r  r  r   rP   rP   rQ   r    s    zAttributeNode.type_dependenciesc                 C   s   | j |dd}|d k	r>|jjr6|jjjr6t|jjS |jjS | |}|d k	rX|jjS | j|}| j	||d |j
r| jjrtS | jr| jjrtS | jS )NFtarget)obj_type)#analyse_as_cimported_attribute_noder   r   r  r   rF  analyse_as_type_attributer  r~   analyse_attributerE  r   r-  )rS   rl   r{   r  rP   rP   rQ   r~     s    
zAttributeNode.infer_typec                 C   s
   d| _ d S r  rq  r   rP   rP   rQ   r     s    z(AttributeNode.analyse_target_declarationc                 C   sF   | j |dd}|jjr(t| jd| j  | sBt| jd| j  |S )Nr%   r  z"Assignment to const attribute '%s'rf  )r   r   r   r   ry   r  r   r   rP   rP   rQ   r     s    z"AttributeNode.analyse_target_typesc                 C   s   | j stj| _ |jd | _| ||}|d kr<|s<| |}|d kr\| ||}|d k	s\t|j	sh|j
rv|jrvd|j_|j	r|| |S )Nrj  T)r   r   r,   rd   rm  r  r  "analyse_as_ordinary_attribute_noder   r  r   r   rw  wrap_obj_in_nonecheck)rS   rl   r  r{   rP   rP   rQ   r     s    

zAttributeNode.analyse_typesc                 C   sp   | j |}|rl|| j}|rL|jsL|js>|js>|js>|jrL| 	|||S | 
|rlt| jd| j  | S d S )Nz&cimported module has no attribute '%s')r  r  rR  r  r`  r  r  r  r   as_name_noder|  r   ry   )rS   rl   r  module_scoper   rP   rP   rQ   r    s"    

z1AttributeNode.analyse_as_cimported_attribute_nodec                    s"  j jrd S j  rjs0js0jrjj}|r|j	sVjr|j
jrjrljsfd S |}n(| } fdd|jD |_j |ddS nxjsjrjjkrjjD ]$}|jjkrʈj |dd  S qtjdjf  ntjdjf  d S )Nc                    s   g | ]} | qS rP   )_create_unbound_cmethod_entry)r[   Zoverloaded_alternativerl   rS   r   rP   rQ   r     s   z;AttributeNode.analyse_as_type_attribute.<locals>.<listcomp>Fr  z%s not a known value of %s)r  r  r  rD  rE  r   r  rR  r  r-  r   r  r  r  Zoverloaded_alternativesr  r  ry  r-  r   Zenum_valuesrk   r   ry   )rS   rl   r   
ubcm_entryrP   r  rQ   r    s0    z'AttributeNode.analyse_as_type_attributec                 C   s   |j r|jjd kr|j }|jjs.|jr6|jjr6|j}q|jrZt| jd|j	|f  t
j}qt|j}|jd d  |_t
d|dd |jd< nd|j|jf }|j}t|j	||}d|_|j |_ d|_|j|_|S )Nz%s not a static member of %srS   r   %s->%sr%   )Z
func_cnamer   rT  r8  parent_scopeZis_cpp_class_scoper   r   ry   rk   r   r,   r  r   r  Zvtabptr_cnamer   r   rz  r  rI  r  )rS   r   r   rl   r   r   r  rP   rP   rQ   r    s,    z+AttributeNode._create_unbound_cmethod_entryc                 C   sV   | j |}|r|| jS | j jsR| j |}|rRt|dd d k	rR|j| jS d S )Nr  )r  r  lookup_typer  r  r  r   r  )rS   rl   r  rt  rP   rP   rQ   r  5  s    zAttributeNode.analyse_as_typec                 C   s@   | j |}|r<|| j}|r<|jr<|jjs6|jjr<|jS d S rI   )r  r  rR  r  r  r   rD  rE  rS   rl   r  r   rP   rP   rQ   r  ?  s    
z'AttributeNode.analyse_as_extension_typec                 C   s0   | j |}|r,|| j}|r,|jr,|jS d S rI   )r  r  rR  r  r_  r  rP   rP   rQ   r  J  s    
zAttributeNode.analyse_as_modulec                 C   s8   t j| | j|d}|r"||}n
||}d|j_|S )N)rk   r   r%   )ry  r  r  r   rK  r   rw  )rS   rl   r   r  r{   rP   rP   rQ   r  T  s    
zAttributeNode.as_name_nodec                 C   s   | j || _ | | | jr,| jjr,| js,| jrD|sd| _t| _	nT|r`| j j
jr`t| jd n8| jr| jjr|st| j| j | j|S t| jd | S )Nr%   z'Assignment to an immutable object fieldz"Assignment to a read-only property)r  r   r  r   r-  r  
is_py_attrr   r   r   r   rE  r   ry   is_cpropertyr  r(  )rS   rl   r  rP   rP   rQ   r  _  s    
z0AttributeNode.analyse_as_ordinary_attribute_nodec                 C   s  |d k	}d| _ | j| _|d krJ| jjjs2| jjjr@| j|| _| jj}n|jsV|jrZt}|j	sf|j
rt|j}d| _n.|js|jrd| _n|jr|jrd| _nd| _|jr| r8|j| j}|jr$|s$| jdkrd| _d| _d| _| jj| j| _d S || j|| j |j| j}|rT|jrTd }nt| jd|  tj| _d S || _ |r|jr|j!dkrt| jd |j"r|j| _d S |j#r|j$r|j%r|j| _|j&| _d S | '||| d S )	Nr   r  r  TTz/Cannot select attribute of incomplete type '%s'__weakref__z,Illegal use of special attribute __weakref__)(r  r  r"  r  r   rE  rF  r  r   rs  r
  rt  r  rD  rE  r   Zis_fake_referenceZhas_attributesZattributes_knownr  rR  r   is_memslice_transposer   r1  Z	transposery   Zdeclare_attributer  r   r   r,   r   rk   r  ri  rt  r-  r   r  )rS   rl   r  immutable_objr   rP   rP   rQ   r  w  sd    


zAttributeNode.analyse_attributec                 C   s   |d kr| j j}|| j| _| j| _t| _d| _|js|js|j	s||j
s||js||js||js||jrl||s||jr||r|s| j || _ nX|jr| j js| j jr| j jjr| j jjjjr|s| j || _ nt| jd|| jf  d S )Nr%   z)Object of type '%s' has no attribute '%s')r  r   Zmangle_class_private_namer  r"  r   r  rj   r~  rE  r  rn  r   r  r  rW  	is_structr  r  r   r  r   rH  r   ry   )rS   rl   r  r  rP   rP   rQ   r    sH    z)AttributeNode.analyse_as_python_attributec                 C   s   |j d sd S d }d}| jjjrR| jrR| jsRdt| jdkrBdnd}| jf}n8| jjj	r| j
rhd}n"| jjj| j}|rd}|jf}|r| jj|d	|d
| _d S )Nr  rP   r1  r2  r3  rk  z&Cannot transpose None memoryview slicez5Cannot access '%s' attribute of None memoryview slicer4  r5  )rd   r  r   rD  needs_none_checkr  r   r   r  r   r  r  rR  rk   r  )rS   rl   r  r  r   rP   rP   rQ   r    s(    



z#AttributeNode.wrap_obj_in_nonecheckc                 C   s   | j r|   d S rI   )r  r  r   rP   rP   rQ   r     s    zAttributeNode.nogil_checkzAccessing Python attributec                 C   s   | j |S rI   )r  r|  r   rP   rP   rQ   r|    s    z0AttributeNode.is_cimported_module_without_shadowc                 C   s&   | j r|  p| j  S t| S d S rI   )r  r'  r  ry  rR   rP   rP   rQ   r    s    zAttributeNode.is_simplec                 C   s   | j r
dS t| S d S r  )r  ry  r   rR   rP   rP   rQ   r     s    zAttributeNode.is_lvaluec                 C   s   | j r| j  S t| S d S rI   )r  r   ry  rR   rP   rP   rQ   r     s    
zAttributeNode.is_ephemeralc                 C   s(   |   }| jr$| jjr$| js$d| }|S r  )calculate_access_coder   r  r  )rS   r   rP   rP   rQ   r     s    z#AttributeNode.calculate_result_codec                 C   s   | j }||j}| jr| jjr|jjrp| jjsp| jjr@| jjS | jjrR| jj	| _
d|jj|| j|jj| j
f S | jr|| j
S d S |jjrd| j
 |f S |jjr| jr| jjr|jj| dd}d|| j| j
f S d S )Nz((struct %s *)%s%s%s)->%sz__Pyx_C%s(%s)T)Zto_object_structz%s%s%s)r  r   r   r   r-  rD  Zis_builtin_cmethodZfinal_func_cnameZ
from_fusedr   r"  Zvtabstruct_cnamer  Zvtabslot_cnamer.  r  upperrE  ri  rU  r   )rS   r  Zobj_coderP   rP   rQ   r    s.    
   z#AttributeNode.calculate_access_codec                 C   s  | j r| jr&|jtdd d}n|jtdd d}|d|  || j	 |
| j||  | jf  | | nL| jjr>| jr| jjD ]"\}}|dkrt| jd  d S q|d	|  | j f  |j|  | jd
d d|   }|||| j n&| jr|d|  || jf  n| jjr| jr| jrb|  }n| jrnt|  }| j|}|j| j| j|d n8| jjr| jjj rn | jr| jj!r|j"| j d S )NZPyObjectLookupSpecialr  Z__Pyx_PyObject_LookupSpecialZPyObjectGetAttrStrZ__Pyx_PyObject_GetAttrStrr=  r  z=Transposing not supported for slices with indirect dimensionsr  Tr=  z__pyx_memslice_transpose(&%s)zeif (unlikely(!%s.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");%s}r  )#r  is_special_lookupr   r   r   r   r   r   r  r   r  r  r   ry   rd  r   r   r  rV  r   r?  r  rm  r   r   r  r  r   r   r  r  r  rD  r-  rP  )rS   r   Zlookup_func_namer  r  r  Zundereferenced_resultr  rP   rP   rQ   rD  7  sb    




z"AttributeNode.generate_result_codec                 C   s<   | j r,| jjr,| jr,|j|  | jdd nt| | d S )NTr=  )r   r   r   r  r  r   r   rN  r;  rP   rP   rQ   rN  p  s    z$AttributeNode.generate_disposal_codec              
   C   s  | j | | jrh|jtdd || jd| j 	 |
| j|	 f  || || n| j jjr|d| j | j jj| j | j j||  f  || || n|  }| jjr| jr|| || ||| j |||   n.| jjr<ddlm} | ||| | j| | jjsb|d||!|  f  |"| || | j | | j | d S )Nr  r  z%__Pyx_PyObject_SetAttrStr(%s, %s, %s)z__Pyx_SET_C%s%s(%s, %s);r%   rl  r  )#r  rI  r  r   r   r   r   r,  ry   r   r  r  rN  rV  r   r  r   r"  r  Zimplementation_suffixr   r   r   rj   r1  r<  rg  ra  
put_decrefr   rk  rm  Zput_assign_to_memviewslicer   rP  )rS   r   r   rQ  r   r   Zselect_coderm  rP   rP   rQ   rR  w  sb    







    


z&AttributeNode.generate_assignment_codec                 C   s   | j | | js*| jjjrdd| jjjkrd|jt	
dd || jd| j  || jf  nt| jd | j | | j | d S )N__del__r  r  r  z+Cannot delete C attribute of extension type)r  rI  r  r   r  Zis_property_scoper  r   r   r   r   r,  ry   r   r  r  r   rN  rV  rS  rP   rP   rQ   rU    s     

z$AttributeNode.generate_deletion_codec                 C   s@   | j rd\}}nd\}}|| jt||| j t| jd d S )N)Zpy_attrzpython attribute (%s))Zc_attrzc attribute (%s)r  )r  rj  ry   r3   r   r   r  )rS   r   r  r  rP   rP   rQ   rj    s    
zAttributeNode.annotatec                 C   s&   | j  }|r"td|| jf S d S )Nr  )r  r  r	   r  r  )rS   r  rP   rP   rQ   r    s    
z/AttributeNode.get_known_standard_library_import)r   )N)NF)FNN)F)-rU   rV   rW   r  r   r   r  r  r  r  r  r  rz  r   r   r  r~   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r   r:  r|  r  r   r   r   r  rD  rN  rR  rU  rj  r  rP   rP   rP   rQ   r  O  sZ   *
#


F
$9    
,
r  c                   @   sb   e Zd ZdgZdZ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d Zdd ZdS )StarredUnpackingNoder  r%   Fc                 C   s   t j| ||d d S )Nr  r  )rS   ry   r  rP   rP   rQ   r    s    zStarredUnpackingNode.__init__c                 C   s"   | j st| jd | j| d S Nz&starred expression is not allowed here)starred_expr_allowed_herer   ry   r  r  r   rP   rP   rQ   r    s    z)StarredUnpackingNode.analyse_declarationsc                 C   s   | j |S rI   )r  r~   r   rP   rP   rQ   r~     s    zStarredUnpackingNode.infer_typec                 C   s.   | j st| jd | j|| _| jj| _| S r  )r  r   ry   r  r   r   r   rP   rP   rQ   r     s
    
z"StarredUnpackingNode.analyse_typesc                 C   s   | j | d S rI   )r  r   r   rP   rP   rQ   r     s    z/StarredUnpackingNode.analyse_target_declarationc                 C   s   | j || _ | j j| _| S rI   )r  r   r   r   rP   rP   rQ   r     s    
z)StarredUnpackingNode.analyse_target_typesc                 C   s   dS Nrk  rP   rR   rP   rP   rQ   r     s    z*StarredUnpackingNode.calculate_result_codec                 C   s   d S rI   rP   r;  rP   rP   rQ   rD    s    z)StarredUnpackingNode.generate_result_codeN)rU   rV   rW   r   r  r   r   r   r  r  r  r~   r   r   r   r   rD  rP   rP   rP   rQ   r    s   r  c                
       s   e Zd ZddgZdZdZdZ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dZ fddZd.ddZeeejed ejdgZd!d" Zd#d$ Zd/d&d'Zd(d) Zd*d+ Z  Z S )0SequenceNoder   r   r%   NFc                    s    fdd| j D S )Nc                    s   g | ]}|  qS rP   r&  r  r'  rP   rQ   r   
  s     z8SequenceNode.compile_time_value_list.<locals>.<listcomp>r  r   rP   r'  rQ   compile_time_value_list	  s    z$SequenceNode.compile_time_value_listc                 C   sT   d| _ g }| jD ]8}|jr>| j r,t|jd d| _ |j}d|_|| q|| _d S )NFz,more than 1 starred expression in assignmentT)starred_assignmentr   r  r   ry   r  r   rS   r   r  rP   rP   rQ   replace_starred_target_node  s    
z(SequenceNode.replace_starred_target_nodec                 C   s"   |    | jD ]}|| qd S rI   )r  r   r   rS   rl   r  rP   rP   rQ   r     s    
z'SequenceNode.analyse_target_declarationc                 C   sl   t | jD ]&\}}|s ||}||| j|< q
| jrb| j|}|jjsV||}||| _d| _| S r  )	r1  r   r   r  r   r   r  r  r   )rS   rl   skip_childrenr5  r  r   rP   rP   rQ   r     s    

zSequenceNode.analyse_typesc                    sr   | j |kr| S | jrtt| j|jkrDt| jd|jt| jf   fddt| j|j	D }t
| j||ddS )NzHtrying to coerce sequence to ctuple of wrong length, expected %d, got %dc                    s   g | ]\}}| | qS rP   )rz  )r[   r  r   rr   rP   rQ   r   4  s     z1SequenceNode.coerce_to_ctuple.<locals>.<listcomp>T)r   r   r   )r   r   r   r   r   r  r   ry   r  r  r  rS   r  rl   Zcoerced_argsrP   rr   rQ   coerce_to_ctuple-  s    

 zSequenceNode.coerce_to_ctuplec              	   C   s   |    tdd | jD s | S g }g }| jD ]L}|jrp|rb|t|d j|dj|dd g }||j q.|| q.|r|t|d j|dj|dd t	| j|| j
}| jrt| jd|| j|d| j
dd}|S )	Nc                 s   s   | ]}|j V  qd S rI   )r  r  rP   rP   rQ   r_   9  s     z?SequenceNode._create_merge_node_if_necessary.<locals>.<genexpr>r   r  Tr  r   )inplacer   r   )_flatten_starred_argsre   r   r  r   r  ry   r   r  MergedSequenceNoder   r   
binop_noder  )rS   rl   r   r-  r  r{   rP   rP   rQ   _create_merge_node_if_necessary7  s4    
""   
  z,SequenceNode._create_merge_node_if_necessaryc                 C   sR   g }| j D ]4}|jr4|jjr4|jjs4||jj  q
|| q
|| j d d < d S rI   )r   r  r  r   r   r   r   r  rP   rP   rQ   r  O  s    
z"SequenceNode._flatten_starred_argsc                 C   s   dS r"  rP   rR   rP   rP   rQ   r  X  s    zSequenceNode.may_be_nonec                 C   s   | j rt| jd g | _g | _d| _t| jD ]\}}|| }| j|< |j	rx|j
tsht|jd |j
tkrxt|_
t| j|}||j
|}||k	rd| _| j| | j| q.t| _
| S )Nz#can't assign to multiplied sequenceFz2starred target must have Python object (list) typeT)r   r   ry   unpacked_itemscoerced_unpacked_itemsZany_coerced_itemsr1  r   r   r  r   r  r   r   r'  rz  r   )rS   rl   r5  r  Zunpacked_itemZcoerced_unpacked_itemrP   rP   rQ   r   [  s,    
z!SequenceNode.analyse_target_typesc                 C   s   |  | d S rI   generate_operation_coder;  rP   rP   rQ   rD  r  s    z!SequenceNode.generate_result_codec                 C   s  |d kr|   }d }}d }| jr~|s~| j}|jjr~|  }t|jtr^|jdkr^d|j }n |jjrtd||f }n
d|f }| jtkr| j	s| j
r|s|d|t| jddd	 | jD ||| jf  ||t n| jjrt| jD ] \}}|d
|||  f  qnj| jtkr0d\}	}
n$| jtkrFd\}	}
ntd| j t| j}|d||	||||| jf  ||t |rtj}|d|  |dkr|}nd||f }|d||||f  nd}t|D ]}| j| }|s| s||  |  || |d|
||rF|rFd||f pN|pN|| || jf  q|r|d |d |d k	r|jj r|dtj|| |tj| jf  |tjt |!|t |d|tjf  |d d S )Nrk  r   z * %sz * ((%s<0) ? 0:%s)z * (%s)z%s = PyTuple_Pack(%d, %s); %srG  c                 s   s   | ]}|  V  qd S rI   r[  r  rP   rP   rQ   r_     s     z>SequenceNode.generate_sequence_packing_code.<locals>.<genexpr>z%s.f%s = %s;)Z
PyList_NewZ__Pyx_PyList_SET_ITEM)ZPyTuple_NewZ__Pyx_PyTuple_SET_ITEMz'sequence packing for unexpected type %sz%s = %s(%s%s); %sz{ Py_ssize_t %s;r%   z%s * %szfor (%s=0; %s < %s; %s++) {zif (%s(%s, %s, %s)) %s;z%s + %sr   z5{ PyObject* %s = PyNumber_InPlaceMultiply(%s, %s); %sr  )"r   r   r   r  rv   rw   r#   rs  r   r   slowr   r   r   r  r   ry   ra  r   r  r1  r   r   r   r  r=  r'  r:  r   rg  r   r   rj   r  )rS   r   r  plainZsize_factorZc_multr   r5  r  Zcreate_funcZset_item_func	arg_countcounteroffsetrP   rP   rQ   generate_sequence_packing_codeu  s    


  


   
   


"


  z+SequenceNode.generate_sequence_packing_codec                    sv   | j r"| j jjr"tt| | nP| jtkrJ| js8| jrJtt| | n(| j	D ]}|
| qP| j rr| j | d S rI   )r   r   r  rK   r  rG  r   r   r  r   rP  rN  rS   r   r  rN   rP   rQ   rG    s    
z+SequenceNode.generate_subexpr_disposal_codec                 C   sD   | j r| || n| || | jD ]}|| q&|| d S rI   )r   generate_starred_assignment_code!generate_parallel_assignment_coder  r&  rV  )rS   r   r   rQ  r   r   r   rP   rP   rQ   rR    s    
z%SequenceNode.generate_assignment_coder  c                 C   s   | j D ]}|| q|jtkp6|jttfkp6|jj }t| j dk}|r\| j|||d n(|	d | j
||| j |d |	d | jD ]}|| qtt| jD ]}| j| | j| | qd S )NrG   use_loopr  r   )r  r%  r   r   r   r   rE  r   (generate_special_parallel_unpacking_coder   (generate_generic_parallel_unpacking_coder  rI  r=  r   rR  )rS   r   r   r   Zspecial_unpackZlong_enough_for_a_loop
value_noder5  rP   rP   rQ   r    s:    

  
   


 z.SequenceNode.generate_parallel_assignment_codec              
   C   s  d}d|   }|jtkr.dg}| rx|}nJ|jtkrLdg}| rx|}n,ddg}d|   }d|   }d||f }|d|  |d	|    |d
 |dt| j  |j	t
dd |dt| jt| jf  |j	t
dd |d ||| j |d |d t|dkrL|d|d   t| jD ]&\}	}
|d|
 |d |	f  qVt|dkr|d t| jD ]&\}	}
|d|
 |d |	f  q|d | jD ]}
||
 |
  q|d |sTt| jD ]B\}	}
|d|
 |	||
 | jf  ||
 |
j qn|d |d |dt| jddd  | jD f  |d!t| j  |d"|d#| j  |d#t |d$ |d |d |d% || |dkr|d nr||kr\|d |j	t
d&d |d'|| j  |d n(|d | j||| j|d( |d d S ))N1zlikely(%s != Py_None)r  r  zlikely(PyTuple_CheckExact(%s))zPyList_CheckExact(%s)z(%s) || (%s)r  zPyObject* sequence = %s;z2Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);zif (unlikely(size != %d)) {ZRaiseTooManyValuesToUnpackr  z1if (size > %d) __Pyx_RaiseTooManyValuesError(%d);RaiseNeedMoreValuesToUnpackz9else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);r   r  r2   z(if (likely(Py%s_CheckExact(sequence))) {r   z"%s = Py%s_GET_ITEM(sequence, %d); r  r%   r  z&%s = PySequence_ITEM(sequence, %d); %sr  zPy_ssize_t i;PyObject** temps[%s] = {%s};r  c                 S   s   g | ]}d |   qS r  r   r   rP   rP   rQ   r   G   s     zISequenceNode.generate_special_parallel_unpacking_code.<locals>.<listcomp>zfor (i=0; i < %s; i++) {z1PyObject* item = PySequence_ITEM(sequence, i); %sr   z*(temps[i]) = item;r  ZRaiseNoneIterErrorz%__Pyx_RaiseNoneNotIterableError(); %sr  )r   r   r   r  r   r   r   r   r   r   r   r   r   ry   r1  r  r   r:  r   r   ra  r  r   rN  r  )rS   r   r   r  Zsequence_type_testZ
none_checkr1   Ztuple_checkZ
list_checkr5  r   rP   rP   rQ   r     s    



 



  
  


 











   z5SequenceNode.generate_special_parallel_unpacking_codeTc              	   C   sJ  |j tdd |j tdd |d |r^|dt| jddd |D f  |jj	t
d	d
}|d|| ||| jf  ||t
 || |jj	| jdd
}|d||f  |d}d||f }	|r2|dt|  |d|	  || |dt
 |d |d nFt|D ]<\}
}|d|
| |	| f  || || q:|r|j tdd || jd|	t|f  |d|  ||t
 |d}|| || ||t
 |d|  |d ||| j || |j| |rF|j| d }|S )Nr  r  Z
IterFinishzPy_ssize_t index = -1;r  r  c                 S   s   g | ]}d |   qS r  r  r   rP   rP   rQ   r   l   s     zISequenceNode.generate_generic_parallel_unpacking_code.<locals>.<listcomp>Tr*  r  Fz(%s = __Pyx_PyObject_GetIterNextFunc(%s);Zunpacking_failedr  z$for (index=0; index < %s; index++) {z*PyObject* item = %s; if (unlikely(!item)) r   z*(temps[index]) = item;r   z(index = %d; %s = %s; if (unlikely(!%s)) ZUnpackItemEndCheckz$__Pyx_IternextUnpackEndCheck(%s, %d)r  Zunpacking_donezCif (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);)r   r   r   r   r   r   r  r  r/  r0  r   r   r   ry   ra  rN  r  r  r  r  r1  r   rd  r,  rM  r  r   r8  )rS   r   r   r  r  	terminateiterator_tempZiternext_funcZunpacking_error_labelZunpack_coder5  r   Zunpacking_done_labelrP   rP   rQ   r  b   s    



 










z5SequenceNode.generate_generic_parallel_unpacking_codec                 C   sd  t | jD ]<\}}|jr
| j| }| jd | }| j|d d  } qPq
dsPtd }|r|D ]}	|	| q\|d | j|||ddd}t |D ]\}}	| j| }
|
	| q|d || |
 }|d||s|jr|jttfkrdnd	|p| ||| jf  || |r:||t |j| n
|| |r8|jtd
d |jjtjdd}|d||f  |d|t|f  |dt|||| jf  |d |d d d D ]}	|	| qt t |d d d | jd d d D ]\}\}	}|d |d|	 |||d f  |d|  |d |d|	 |||d f  |d |	| |	| q|d |jjtdd}|d|||t|||| jf  |!|t |j| |"|t |d|||f  |d |d|  |j| |d t | jD ]\}}|#| j| | qBd S )Nr%   Fr  T)r  r  r   rb  __Pyx_PySequence_ListKeepNewPySequence_Listr  r  r*  z%s = PyList_GET_SIZE(%s);zif (unlikely(%s < %d)) {z)__Pyx_RaiseNeedMoreValuesError(%d+%s); %sr  z#if CYTHON_COMPILING_IN_CPYTHONz!%s = PyList_GET_ITEM(%s, %s-%d); z((PyVarObject*)%s)->ob_size--;r  z!%s = PySequence_ITEM(%s, %s-%d); r  z #if !CYTHON_COMPILING_IN_CPYTHONz*%s = PySequence_GetSlice(%s, 0, %s-%d); %sz%s = %s; %s = NULL;zCYTHON_UNUSED_VAR(%s);)$r1  r   r  r  r   r%  r   r  r  rI  r   r   r   r   r   r   r   ry   rd  rM  r/  r8  rN  r   r   r   r   r0  r   r  r   r   r  ra  r  rR  )rS   r   r   r5  r  Zstarred_targetZunpacked_fixed_items_leftZunpacked_fixed_items_rightr  r   r  Ztarget_listZlength_tempZcoerced_argZsublist_temprP   rP   rQ   r     s    

   






 


   
   


   

z-SequenceNode.generate_starred_assignment_codec                 C   sL   | j D ]}|| q| jrH| jD ]}|| q"| jD ]}|| q8d S rI   )r   rj  r  r  r  rP   rP   rQ   rj     s    


zSequenceNode.annotate)F)NF)FNN)T)!rU   rV   rW   r   r   r  r   r  r  r  r   r   r  r  r  r  r   rD  r  rG  rR  r   rF  r  r   r  r  r  r  r  r  rj  rX   rP   rP   rN   rQ   r    s>   	

	
Y    
Z
GTr  c                   @   sr   e Zd Ze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 Zdd Zdd Zdd ZdS )r  Frt  c                    sJ   | j s| jstS  fdd| jD }tdd |D r:tS  | j|jS )Nc                    s   g | ]}|  qS rP   r}   r  rr   rP   rQ   r   !  s     z(TupleNode.infer_type.<locals>.<listcomp>c                 s   s&   | ]}|j p|jp|jp|jV  qd S rI   )rj   r   rB  r  )r[   r   rP   rP   rQ   r_   !  s   z'TupleNode.infer_type.<locals>.<genexpr>)r   r   r   re   declare_tuple_typery   r   )rS   rl   r  rP   rr   rQ   r~   !  s    zTupleNode.infer_typec                 C   sN  | j rd| _ | jrd| _t| jdkr6d| _d| _ | S |sjt| jD ]$\}}|jrXd|_||| j|< qD| j	st
dd | jD s|| jdd | jD j| _d| _| S tj| |dd}||}|js|S td	d |jD s|S |j	r
|j	j rt|j	jtrd|_d|_ n2|j	jjs>|j	jjs>|j	||_	d|_d|_|S )
NFr   Tc                 s   s,   | ]$}|j p"|jjp"|jjp"|jjV  qd S rI   )r  r   rj   r   r  r  rP   rP   rQ   r_   *!  s   z*TupleNode.analyse_types.<locals>.<genexpr>c                 s   s   | ]}|j V  qd S rI   rp  r  rP   rP   rQ   r_   ,!  s     r%   r  c                 s   s   | ]}|j V  qd S rI   )r   )r[   childrP   rP   rQ   r_   5!  s     )r   is_partly_literalr   r   r   r1  r  r  r   r   re   r  ry   r   r  r  r   r  rv   rw   r#   rj   r  r  )rS   rl   r  r5  r  r{   rP   rP   rQ   r   !  sN    
zTupleNode.analyse_typesc                    sH   | j s
d S  fdd| j D }tdd |D r4d S  | j|}|jS )Nc                    s   g | ]}|  qS rP   )r  r  rr   rP   rQ   r   G!  s     z-TupleNode.analyse_as_type.<locals>.<listcomp>c                 s   s   | ]}|d kV  qd S rI   rP   rZ   rP   rP   rQ   r_   H!  s     z,TupleNode.analyse_as_type.<locals>.<genexpr>)r   re   r  ry   r   )rS   rl   r   r   rP   rr   rQ   r  C!  s    zTupleNode.analyse_as_typec                    s   | j jr|jr(| j j|jkr(| | S |tks8|tkrl fdd| jD }t| j|t| j	ddj
 ddS |  | S n&|jr| j	s| | S t| | S d S )Nc                    s   g | ]}|  qS rP   )r  r  rr   rP   rQ   r   R!  s     z'TupleNode.coerce_to.<locals>.<listcomp>r%   )r   r   r   r   Tr  )r   r  r  r  r   r   r   r  ry   r   r   r  rz  r  r  rP   rr   rQ   rz  M!  s&     zTupleNode.coerce_toc                 C   s0   t | j| j| jd}t| jtr,t| j|_|S N)r   r   )r  ry   r   r   rv   rw   r   r   rS   r\   rP   rP   rQ   as_lista!  s    zTupleNode.as_listc                 C   s   dS r  rP   rR   rP   rP   rQ   r  g!  s    zTupleNode.is_simplec                 C   s   dS r  rP   rR   rP   rP   rQ   r  k!  s    zTupleNode.nonlocally_immutablec                 C   s   t | jdkr| jS tjS d S r   )r   r   r  r   empty_tuplerR   rP   rP   rQ   r   o!  s    zTupleNode.calculate_result_codec                 C   s   t dd | jD | _d S )Nc                 S   s   g | ]
}|j qS rP   rv  r  rP   rP   rQ   r   v!  s    z7TupleNode.calculate_constant_result.<locals>.<listcomp>)r   r   rw   rR   rP   rP   rQ   r   u!  s    z#TupleNode.calculate_constant_resultc              
   C   sF   |  |}z
t|W S  tk
r@ } z| | W 5 d }~X Y nX d S rI   )r  r   rJ  r   rS   r   r-  r   rP   rP   rQ   r   y!  s
    

zTupleNode.compile_time_valuec              
   C   sH  t | jdkrd S | js | jr0t| j| jr2| jnd g| j }|jtdd|d}|	|}|d k	r|
| j | j||| j d ||t | jr|| _n| jjjr|jtdd |d|  || j ||  | jf  | | n8|d	|  || j ||  | jf  | | nd
| jj_| | d S )Nr   r   r2   r  )r  PySequenceMultiplyr  z*%s = __Pyx_PySequence_Multiply(%s, %s); %sz"%s = PyNumber_Multiply(%s, %s); %sT)r   r   r   r  r   r   r   r)  r   r+  rC  ry   r  rf  r  r  r   r   r   r   r   r   r   rd  r   r   rw  )rS   r   r  Ztuple_targetr-  rP   rP   rQ   r  !  s@     


    
z!TupleNode.generate_operation_codeN)F)rU   rV   rW   r   r   r  r:  r~   r   r  rz  r  r  r  r   r   r   r  rP   rP   rP   rQ   r  !  s   	
+
r  c                   @   st   e Zd Zg Z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d Zdd Zdd Zdd Zdd ZdS )r  FzConstructing Python listc                 C   s   dS rA  rP   r   rP   rP   rQ   r  !  s    zListNode.type_dependenciesc                 C   s   t S rI   )r   r   rP   rP   rQ   r~   !  s    zListNode.infer_typec                 C   s.   | j D ]}|jrd|_qt| |}||S r  )r   r  r  r  r   r  )rS   rl   r  r{   rP   rP   rQ   r   !  s
    
zListNode.analyse_expressionsc              	   C   sN   t dd}t| j| _t| |}W 5 Q R X ||_|jr@d| _|	|}|S )NTr  )
r   r   r   original_argsr  r   obj_conversion_errorsrS  r  r  )rS   rl   errorsr{   rP   rP   rQ   r   !  s    
zListNode.analyse_typesc           	      C   s&  |j r@| jD ]}t| qg | _| j|s<t| jd|  n|jsN|jr|j	t
jk	rt| j}| jrt| jjtr| jjdkrt| jd|  q|| jj9 }nt| jd|  |j	}t
||| _tt| jD ]0}| j| }t|tr|j}|||| j|< qؐn|jr0t| j| t
jd||S | jrJt| jd|  n|jrt| jt|jjkr|t| jd|  ntt| jt|jjk rt| jd| d	 tt | j|jjD ]4\}\}}t|tr|j}||j|| j|< q|| _n*|j!r| "||S t#| _t| jd|  | S )
NzCannot coerce list to type '%s'r   z4Cannot coerce non-positively multiplied list to '%s'z1Cannot coerce dynamically multiplied list to '%s')r*  r   z%Cannot coerce multiplied list to '%s'zToo many members for '%s'zToo few members for '%s'r%   )$rj   r  r   r   r  r   ry   r
  rs  rt  r   Zc_void_typer   r   r   rv   rw   r#   rU  r=  r  r  r  rz  r   TypecastNoder   r  r  r  r   r1  r  r  r  r,   )	rS   r  rl   rm   r  rt  r5  r  r"  rP   rP   rQ   rz  !  sP    




 zListNode.coerce_toc                 C   s   | S rI   rP   rR   rP   rP   rQ   r  !  s    zListNode.as_listc                 C   s0   t | j| j| jd}t| jtr,t| j|_|S r  )r  ry   r   r   rv   rw   r   r   r  rP   rP   rQ   as_tuple!  s    zListNode.as_tuplec                 C   sP   | j jr@| jr(|jj| j dddd| _qL|jj| j ddd| _nt| | d S )NFT)r+  Zstaticreusable)r+  r  )r   r
  r  r/  r0  r   r  r2  r;  rP   rP   rQ   r2  "  s       
  
zListNode.allocate_temp_resultc                 C   s"   | j rt dd | jD | _d S )Nc                 S   s   g | ]
}|j qS rP   rv  r  rP   rP   rQ   r   "  s    z6ListNode.calculate_constant_result.<locals>.<listcomp>)r   r   r   rw   rR   rP   rP   rQ   r   "  s
    z"ListNode.calculate_constant_resultc                 C   s$   |  |}| jr || j|9 }|S rI   )r  r   r   )rS   r   lrP   rP   rQ   r   "  s    
zListNode.compile_time_valuec              
   C   sp  | j jr*| jD ]}t| q| | nB| j jr| jr|d |dtj	  |dj
tj	| j d dt| jtj	f }nd}t| jD ]h\}}|j jr|jtdd |d	|  ||| |  f  q|d
|  ||| f  q| jrl|d |d nP| j jrdt| j| j jjD ](\}}|d|  |j| f  q8ntdd S )Nr  zPy_ssize_t %s;z&for ({i} = 0; {i} < {count}; {i}++) {{)r5  countz+ (%d * %s)rk  r  r/  z'memcpy(&(%s[%s%s]), %s, sizeof(%s[0]));z%s[%s%s] = %s;r   rQ  zList type never specified)r   rj   r  r   r  r
  r   r   r   r  r   r   r   r   r1  r   r   r   r   r  r  r  r  r   r   )rS   r   rm   r  r5  r  r"  rP   rP   rQ   r  "  sR    



    



z ListNode.generate_operation_codeN)rU   rV   rW   r  r   r   r  r:  r  r~   r   r   rz  r  r  r2  r   r   r  rP   rP   rP   rQ   r  !  s   
/r  c                   @   sb   e Zd ZdgZdZe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 )ComprehensionNodeloopTc                 C   s   | j S rI   rp  r   rP   rP   rQ   r~   K"  s    zComprehensionNode.infer_typec                 C   sh   | | j _| | t| jtjrLt| jjts:t	| jj| jjd | nt| jtj
sdt	| jd S rI   )r   r  r  rv   r  r   _ForInStatNoder  r  r   ForFromStatNoder   rP   rP   rQ   r  N"  s    
z&ComprehensionNode.analyse_declarationsc                 C   s   | j | d S rI   )r  r  r   rP   rP   rQ   r  X"  s    z-ComprehensionNode.analyse_scoped_declarationsc                 C   s   | j s| j|| _| S rI   r  r  r   r   rP   rP   rQ   r   ["  s    zComprehensionNode.analyse_typesc                 C   s   | j r| j|| _| S rI   r  r   rP   rP   rQ   r  `"  s    z,ComprehensionNode.analyse_scoped_expressionsc                 C   s   dS r"  rP   rR   rP   rP   rQ   r  e"  s    zComprehensionNode.may_be_nonec                 C   s   |  | d S rI   r  r;  rP   rP   rQ   rD  h"  s    z&ComprehensionNode.generate_result_codec              	   C   s   | j tjkrd}n2| j tjkr$d}n | j tjkr6d}ntd| j  |d|  |||  | j	f  | 
| | j| d S )NzPyList_New(0)zPySet_New(NULL)zPyDict_New()z"illegal type for comprehension: %sr  )r   r   r   r   r   r   r   r   r   ry   rd  r  generate_execution_code)rS   r   Zcreate_coderP   rP   rQ   r  k"  s     
z)ComprehensionNode.generate_operation_codec                 C   s   | j | d S rI   )r  rj  r;  rP   rP   rQ   rj  {"  s    zComprehensionNode.annotateN)rU   rV   rW   r  r   r   rw   r~   r  r  r   r  r  rD  r  rj  rP   rP   rP   rQ   r  C"  s   
r  c                   @   s<   e Zd ZdgZdZejZdd Zdd Z	dd Z
d	d
 ZdS )ComprehensionAppendNoder  Nc                 C   s*   | j || _ | j jjs&| j || _ | S rI   )r  r   r   rj   r  r   rP   rP   rQ   r   "  s    
z+ComprehensionAppendNode.analyse_expressionsc              	   C   s   | j jtkr&|jtdd d}n"| j jtkr8d}ntd| j j | j	
| ||d|| j  | j	 f | j | j	| | j	| d S )NListCompAppend
Optimize.c__Pyx_ListComp_Append	PySet_Addz'Invalid type for comprehension node: %sz%s(%s, (PyObject*)%s))r  r   r   r   r   r   r   r   r   r  rI  r   r   r   ry   rN  rV  rS   r   r  rP   rP   rQ   r  "  s(    


z/ComprehensionAppendNode.generate_execution_codec                 C   s   | j || d S rI   )r  rY  rX  rP   rP   rQ   rY  "  s    z5ComprehensionAppendNode.generate_function_definitionsc                 C   s   | j | d S rI   )r  rj  r;  rP   rP   rQ   rj  "  s    z ComprehensionAppendNode.annotate)rU   rV   rW   r  r  r   rG  r   r   r  rY  rj  rP   rP   rP   rQ   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 )DictComprehensionAppendNodekey_expr
value_exprc                 C   sP   | j || _ | j jjs&| j || _ | j|| _| jjjsL| j|| _| S rI   )r  r   r   rj   r  r  r   rP   rP   rQ   r   "  s    

z/DictComprehensionAppendNode.analyse_expressionsc              	   C   s|   | j | | j| ||d| j | j  | j f | j | j | | j 	| | j| | j	| d S )Nz0PyDict_SetItem(%s, (PyObject*)%s, (PyObject*)%s))
r  rI  r  r   r   r  r   ry   rN  rV  r;  rP   rP   rQ   r  "  s    
z3DictComprehensionAppendNode.generate_execution_codec                 C   s    | j || | j|| d S rI   )r  rY  r  rX  rP   rP   rQ   rY  "  s    z9DictComprehensionAppendNode.generate_function_definitionsc                 C   s   | j | | j| d S rI   )r  rj  r  r;  rP   rP   rQ   rj  "  s    z$DictComprehensionAppendNode.annotateN)rU   rV   rW   r  r   r  rY  rj  rP   rP   rP   rQ   r  "  s
   	r  c                       sT   e Zd ZdgZdZdZdZeZd fdd	Z	dd Z
dd	 Zd
d Zdd Z  ZS )InlinedGeneratorExpressionNodegenNTc                    sj   |j j}d|_|d k	rJ|tttfks,t|||_|jt	||t
j|d tt| j|fd|i| d S )NT)r  r   r  )r]  gbodyZ
is_inlinedr   r   r   r   Zinlined_comprehension_typerZ  r)  r   retval_cnamerK   r  r  )rS   ry   r  Zcomprehension_typer  r  rN   rP   rQ   r  "  s    z'InlinedGeneratorExpressionNode.__init__c                 C   s
   | j dkS )N)re   r  r  )	orig_funcrR   rP   rP   rQ   r  "  s    z*InlinedGeneratorExpressionNode.may_be_nonec                 C   s   | j S rI   rp  r   rP   rP   rQ   r~   "  s    z)InlinedGeneratorExpressionNode.infer_typec                 C   s   | j || _ | S rI   )r  r   r   rP   rP   rQ   r   "  s    z,InlinedGeneratorExpressionNode.analyse_typesc              	   C   s:   | d|  | j ||  | jf  | | d S )Nz!%s = __Pyx_Generator_Next(%s); %s)r   r   r  r   ry   rd  r;  rP   rP   rQ   rD  "  s     z3InlinedGeneratorExpressionNode.generate_result_code)N)rU   rV   rW   r   r  r  r   r   r   r  r  r~   r   rD  rX   rP   rP   rN   rQ   r  "  s   r  c                   @   sf   e Zd ZdZdgZdZdZdd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )r  z
    Merge a sequence of iterables into a set/list/tuple.

    The target collection is determined by self.type, which must be set externally.

    args    [ExprNode]
    r   TzConstructing Python collectionc                 C   sd   |t tfkrN|rN|d jrN|d jt k	rNt|d j|d jd|d jd|d< tj	| |||d d S )Nr   T)r   r   r   )r   r   )
r   r   r   r   r  ry   r   r   r   r  )rS   ry   r   r   rP   rP   rQ   r  #  s    &zMergedSequenceNode.__init__c                 C   s   g }| j D ]L}|jr(|jr(|jjdkr(q
|js4|jrFdd |j D }n|j}|| q
| jtkrlt|}n"| jt	krt
|}n| jtkst|| _d S )Nr   c                 s   s   | ]}|j V  qd S rI   rv  r  rP   rP   rQ   r_   #  s     z?MergedSequenceNode.calculate_constant_result.<locals>.<genexpr>)r   r   r   rw   r  r   r   r   rm  r   r   r   r   )rS   r   r   r  rP   rP   rQ   r   #  s    




z,MergedSequenceNode.calculate_constant_resultc              
      s   g }| j D ]X}|jr,|jr,|j dkr,q
|js8|jrN fdd|j D }n
| }|| q
| jtkrzt|}W q t	k
r } z| 
| W 5 d }~X Y qX n"| jtkrt|}n| jtkst|S )Nr   c                 3   s   | ]}|  V  qd S rI   r&  r  r'  rP   rQ   r_   (#  s     z8MergedSequenceNode.compile_time_value.<locals>.<genexpr>)r   r   r   r   r  r   r   r   rm  rJ  r   r   r   r   r   )rS   r   r   r   r  r   rP   r'  rQ   r    #  s$    




z%MergedSequenceNode.compile_time_valuec                 C   s   dS rA  rP   r   rP   rP   rQ   r  7#  s    z$MergedSequenceNode.type_dependenciesc                 C   s   | j S rI   rp  r   rP   rP   rQ   r~   :#  s    zMergedSequenceNode.infer_typec                    sV    fdd| j D }t|dkr8|d j| jkr8|d S | jtttfksLt|| _ | S )Nc                    s"   g | ]}|   d qS )z2argument after * must be an iterable, not NoneTyper|  r  rr   rP   rQ   r   >#  s   z4MergedSequenceNode.analyse_types.<locals>.<listcomp>r%   r   )r   r   r   r   r   r   r   )rS   rl   r   rP   rr   rQ   r   =#  s    
z MergedSequenceNode.analyse_typesc                 C   s   dS r"  rP   rR   rP   rP   rQ   r  N#  s    zMergedSequenceNode.may_be_nonec           
   
   C   s  | | j | | | jtk}t| j}t|}|| |rF|j	sZ|s|j
r|jtkr|d|  | f  || n`|d|  |rdn|jr|jttfkrdnd| ||  | jf  | | || || t }|rd}d}nd}d	}|D ]}|r$|j	s4|j
s4|j
r|js|sL|jrL|d
 |jD ]D}|| ||jd||  | f  || || qRq
|r|d n
|d || ||jd||  | f  || || q
| jtkrt|d |dtj|  f  ||  t |d|  tj||  | jf  | | |d t|D ]}	|j t!j"|	  q|d S )Nr  rb  Z	PySet_Newr  r  r  Z__Pyx_PySet_Updater  Z__Pyx_PyList_Extend)r  r  r  )ZPySet_Updatez
Builtins.c)Z
ListExtendr  r  z"PyObject *%s = PyList_AsTuple(%s);r  r   )#rC  ry   r2  r   r   r  r   r  rI  r  r   r   r   r   r   rP  r   r   r   rd  rN  rV  rm  r   rn  r,  r   r   r  r  r  r   r   r   r   )
rS   r   is_setr   r   r  Zadd_funcZextend_funcr  r  rP   rP   rQ   rI  Q#  s    



















z+MergedSequenceNode.generate_evaluation_codec                 C   s   | j D ]}|| qd S rI   )r   rj  r  rP   rP   rQ   rj  #  s    
zMergedSequenceNode.annotateN)rU   rV   rW   rF  r   r   r:  r  r   r   r  r~   r   r  rI  rj  rP   rP   rP   rQ   r  "  s   Mr  c                   @   sJ   e Zd ZdZdgZeZdZdZdd Z	dd Z
d	d
 Zdd Zdd ZdS )SetNodez
    Set constructor.
    r   TzConstructing Python setc                 C   sH   t t| jD ](}| j| }||}||| j|< qt| _d| _| S r  )r=  r   r   r   r  r   r   r   )rS   rl   r5  r  rP   rP   rQ   r   #  s    

zSetNode.analyse_typesc                 C   s   dS r"  rP   rR   rP   rP   rQ   r  #  s    zSetNode.may_be_nonec                 C   s   dd | j D | _d S )Nc                 S   s   h | ]
}|j qS rP   rv  r  rP   rP   rQ   r   #  s     z4SetNode.calculate_constant_result.<locals>.<setcomp>)r   rw   rR   rP   rP   rQ   r   #  s    z!SetNode.calculate_constant_resultc              
      sP    fdd| j D }z
t|W S  tk
rJ } z| | W 5 d }~X Y nX d S )Nc                    s   g | ]}|  qS rP   r&  r  r'  rP   rQ   r   #  s     z.SetNode.compile_time_value.<locals>.<listcomp>)r   rm  rJ  r   r  rP   r'  rQ   r   #  s
    
zSetNode.compile_time_valuec                 C   s   | j D ]}|| q| | |d|  ||  | jf  | | | j D ]6}|| jd|  |	 f  |
| || qTd S )Nz%s = PySet_New(0); %szPySet_Add(%s, %s))r   rI  r2  r   r   r   ry   rd  r,  r   rN  rV  r  rP   rP   rQ   rI  #  s"    




z SetNode.generate_evaluation_codeN)rU   rV   rW   rF  r   r   r   r  r:  r   r  r   r   rI  rP   rP   rP   rQ   r  #  s   	r  c                       s   e Zd ZdgZdZdZeZdZdZ	g Z
edd Zdd Zd	d
 Zdd Zdd Zdd Zdd Z fddZdd ZdZdd Zdd Zdd Z  ZS )r   r  r%   FTc                    s   |   fdd|D dS )Nc                    s   g | ]\}}t  ||d qS r  r   )r  )r[   kr.  ry   rP   rQ   r   #  s    z'DictNode.from_pairs.<locals>.<listcomp>r  rP   )rM   ry   pairsrP   r  rQ   
from_pairs#  s    zDictNode.from_pairsc                 C   s   t dd | jD | _d S )Nc                 S   s   g | ]
}|j qS rP   rv  r   rP   rP   rQ   r   #  s    z6DictNode.calculate_constant_result.<locals>.<listcomp>)r|  r  rw   rR   rP   rP   rQ   r   #  s    z"DictNode.calculate_constant_resultc              
      sP    fdd| j D }z
t|W S  tk
rJ } z| | W 5 d }~X Y nX d S )Nc                    s$   g | ]}|j  |j fqS rP   )r  r   r   r   r'  rP   rQ   r   #  s   z/DictNode.compile_time_value.<locals>.<listcomp>)r  r|  rJ  r   )rS   r   r  r   rP   r'  rQ   r   #  s    

zDictNode.compile_time_valuec                 C   s   dS rA  rP   r   rP   rP   rQ   r  #  s    zDictNode.type_dependenciesc                 C   s   t S rI   r{  r   rP   rP   rQ   r~   #  s    zDictNode.infer_typec              	      s6   t dd} fdd| jD | _W 5 Q R X || _| S )NTr  c                    s   g | ]}|  qS rP   r   r   rr   rP   rQ   r   #  s   z*DictNode.analyse_types.<locals>.<listcomp>)r   r  r  )rS   rl   r  rP   rr   rQ   r   #  s    
zDictNode.analyse_typesc                 C   s   dS r"  rP   rR   rP   rP   rQ   r  $  s    zDictNode.may_be_nonec                    s  |j rn|   | jjrNt|s0t| jd|  t| j fdd| j	D dS | j|sjt| jd|  n"|jr~|| _|j
st| j	dkrt| jd|  n.|j
rt| j	t|jjk rt| jd| d | j	D ]}t|jtr|jj|_|jjst|jjd	 t|jjd
d|_qt|jj}|j|}|sRt|jjd||f  q|j}t|trj|j}||j |_qntt| | S | S )Nz-Cannot interpret struct as non-dict type '%s'c                    s,   g | ]$}t |j|j |j d qS r   )r  ry   r  r  r   r   rr   rP   rQ   r   $  s   
z&DictNode.coerce_to.<locals>.<listcomp>r  z"Cannot interpret dict as type '%s'r%   z<Exactly one field must be specified to convert to union '%s'z%Not all members given for struct '%s'zInvalid struct field identifierr  r  zstruct '%s' has no field '%s')rj   release_errorsr   r  r   r  r   ry   r   r  r  r   r  r  r   rv   r  r  r  r  r.  rp   r   rR  rz  rK   )rS   r  rl   r   r  r"  r   rN   rr   rQ   rz  $  s@    




zDictNode.coerce_toc                 C   s   | j D ]}t| qg | _ d S rI   )r  r   )rS   rm   rP   rP   rQ   r  .$  s    

zDictNode.release_errorsr}  c              	   C   sR  | | j | | | jj}|r`|   |d|  t| j	|
|  | jf  | | t }d }d}| j	D ]}|| |r| jr|d|j   |j}| jrl|d k	r|jsd }nT|j|krd }nD|t|jk	r|d kr
t|j}||j nd }n||j |d krl|d|  | f  d}|d| ||jf  |d || jd|  |j |j f  | jr|d kr|d	 | jr|d	 nZ|jjjr|d
|  |jj|j |j f  n"|d|  |jj|j f  || || qt|rN|jtdd d S )Nz%%s = __Pyx_PyDict_NewPresized(%d); %sFr  r~  Tr  r  r  r   zmemcpy(%s.%s, %s, sizeof(%s));rQ  r  r  )rC  ry   r2  r   rj   r  r   r   r   r  r   rd  rm  rI  exclude_null_valuesr   r   r  ry  r  rn  r   r,  r
  rN  rV  r   r   r   r   )rS   r   Zis_dictZ	keys_seenZkey_typeZneeds_error_helperr   r  rP   rP   rQ   rI  5$  s    







 






z!DictNode.generate_evaluation_codec                 C   s   | j D ]}|| qd S rI   )r  rj  r  rP   rP   rQ   rj  $  s    
zDictNode.annotatec                 C   s   t dd | jD S )Nc                 S   s   g | ]\}}|j |fqS rP   r  rw  rP   rP   rQ   r   $  s     z+DictNode.as_python_dict.<locals>.<listcomp>)r|  r  rR   rP   rP   rQ   as_python_dict$  s    zDictNode.as_python_dict)rU   rV   rW   r   r   r  r   r   r  ry  r  r  r  r   r   r  r~   r   r  rz  r  r:  rI  rj  r	  rX   rP   rP   rN   rQ   r   #  s*   
	&Qr   c                   @   sH   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d Z
dS )r  r  r   Nc                 C   s   | j j| jjf| _d S rI   )r  rw   r   rR   rP   rP   rQ   r   $  s     z&DictItemNode.calculate_constant_resultc                 C   s<   | j || _ | j|| _| j || _ | j|| _| S rI   )r  r   r   r  r   rP   rP   rQ   r   $  s
    zDictItemNode.analyse_typesc                 C   s   | j | | j| d S rI   )r  rI  r   r;  rP   rP   rQ   rI  $  s    z%DictItemNode.generate_evaluation_codec                 C   s   | j | | j| d S rI   )r  rN  r   r;  rP   rP   rQ   rN  $  s    z#DictItemNode.generate_disposal_codec                 C   s   | j | | j| d S rI   )r  rV  r   r;  rP   rP   rQ   rV  $  s    zDictItemNode.free_tempsc                 C   s   t | j| jgS rI   )r  r  r   rR   rP   rP   rQ   __iter__$  s    zDictItemNode.__iter__)rU   rV   rW   r   r   r   r   rI  rN  rV  r
  rP   rP   rP   rQ   r  $  s   r  c                   @   s6   e Zd ZdgZdZdd Zdd Zdd Zd	d
 ZdS )SortedDictKeysNoder  Tc                 C   s   t j| |j|d tj| _d S )N)r  )r   r  ry   r   r   r   rS   r  rP   rP   rQ   r  $  s    zSortedDictKeysNode.__init__c                 C   s,   | j |}|jtjkr"|d}|| _ | S rs  )r  r   r   r   r   r  r  rP   rP   rQ   r   $  s    z SortedDictKeysNode.analyse_typesc                 C   s   dS r"  rP   rR   rP   rP   rQ   r  $  s    zSortedDictKeysNode.may_be_nonec              
   C   s  | j  }| j jtjkrJ|d|  |||  | jf  | 	| n|j
tdd |td}|d|  ||||  | jf  | 	| |d|    | |d|    |||  | j | 	| |d || jd	|    d S )
Nz%s = PyDict_Keys(%s); %sZPyObjectCallMethod0r  keysz+%s = __Pyx_PyObject_CallMethod0(%s, %s); %sz"if (unlikely(!PyList_Check(%s))) {zPySequence_List(%s)r   zPyList_Sort(%s))r  r   r   r   r   r   r   r   ry   rd  r   r   r   r   r  r	   r  r\  r,  )rS   r   Zdict_resultZ
keys_cnamerP   rP   rQ   rD  $  s:    
 
   


 
z'SortedDictKeysNode.generate_result_codeN)	rU   rV   rW   r   r   r  r   r  rD  rP   rP   rP   rQ   r  $  s   r  c                   @   s   e Zd Zdd Zdd ZdS )ModuleNameMixinc                 C   s   |j | jddS NT)r1  )r!  r  r;  rP   rP   rQ   get_py_mod_name$  s     zModuleNameMixin.get_py_mod_namec                 C   s   |j | jddS r  )r!  qualnamer;  rP   rP   rQ   get_py_qualified_name$  s     z%ModuleNameMixin.get_py_qualified_nameN)rU   rV   rW   r  r  rP   rP   rP   rQ   r  $  s   r  c                   @   sF   e Zd ZdgZeZdZdd Zdd Zdd Z	d	d
 Z
dZdd ZdS )	ClassNodedocTc                 C   s   d S rI   rP   r   rP   rP   rQ   r   $  s    zClassNode.analyse_annotationsc                 C   s   t S rI   r  r   rP   rP   rQ   r~   $  s    zClassNode.infer_typec                 C   s8   | j r"| j || _ | j || _ |tdd | S )NZCreateClassr  )r  r   r  r   r   r   r   rP   rP   rQ   r   %  s
    zClassNode.analyse_typesc                 C   s   dS r  rP   rR   rP   rP   rQ   r  %  s    zClassNode.may_be_noneConstructing Python classc                 C   s   | j }|| j}| jrH|| jd|j |t	d| j f  | 
|}| |}|d|  |j |j |||||  | jf  | | d S )Nr  rF  z.%s = __Pyx_CreateClass(%s, %s, %s, %s, %s); %s)class_def_noder  rk   r  r,  ry   r|  r   r	   r  r  r  r   r   basesr   rd  )rS   r   r  r   py_mod_namer  rP   rP   rQ   rD  %  s4    

	zClassNode.generate_result_codeN)rU   rV   rW   r   r   r   r   r   r~   r   r  r:  rD  rP   rP   rP   rQ   r  $  s   
r  c                   @   sH   e Zd Zg ZeZdZdZdd Zdd Z	dd Z
d	Zd
d Zdd ZdS )Py3ClassNodeFTc                 C   s   t S rI   r  r   rP   rP   rQ   r~   7%  s    zPy3ClassNode.infer_typec                 C   s   | S rI   rP   r   rP   rP   rQ   r   ;%  s    zPy3ClassNode.analyse_typesc                 C   s   dS r  rP   rR   rP   rP   rQ   r  >%  s    zPy3ClassNode.may_be_noner  c                 C   s   ddl m} | jj}dd |j D }|rt||d}t|t	dd}|
|jpd||jt||_t|||d}|| | jjjd	| d S )
Nr%   AnnotationWriterc                 S   s2   g | ]*}|j rt|jt|j|jd |j jdqS r  r  )r  r  ry   r   rk   stringr[   r   rP   rP   rQ   r   F%  s    z4Py3ClassNode.analyse_annotations.<locals>.<listcomp>r  __annotations__rG  )r  r   r   )AutoDocTransformsr  r  ry   r  r-  r   ry  r	   r  rR  rk   rY  r   r   r*   r  bodyr  insert)rS   rl   r  position
dict_itemsannotations_dictr  r{   rP   rP   rQ   r   C%  s    	
z Py3ClassNode.analyse_annotationsc                 C   s   |j tdd || j}| j}|jr6|j nd}|j	rL|j	 }n| j
rXd}nd}|d|  |||j |j || j| j||  | jf	  | | d S )NZPy3ClassCreater  r  z((PyObject*)&PyType_Type)z$((PyObject*)&__Pyx_DefaultClassType)z9%s = __Pyx_Py3ClassCreate(%s, %s, %s, %s, %s, %d, %d); %s)r   r   r   r   r  rk   r  mkwr   	metaclass
force_typer   r   r  r|  Zcalculate_metaclassZallow_py2_metaclassr   ry   rd  )rS   r   r   r  r&  r'  rP   rP   rQ   rD  W%  s.    z!Py3ClassNode.generate_result_codeN)rU   rV   rW   r   r   r   r(  r   r~   r   r  r:  r   rD  rP   rP   rP   rQ   r  &%  s   r  c                   @   s(   e Zd Zg Zdd Zdd Zdd ZdS )PyClassMetaclassNodec                 C   s   t | _d| _| S r  )r   r   r   r   rP   rP   rQ   r   w%  s    z"PyClassMetaclassNode.analyse_typesc                 C   s   dS r  rP   rR   rP   rP   rQ   r  |%  s    z PyClassMetaclassNode.may_be_nonec              	   C   s   | j j}| j j}|r>|jtdd d| | f }n |jtdd d|  }|d|  ||	|  | j
f  | | d S )NZPy3MetaclassGetr  z__Pyx_Py3MetaclassGet(%s, %s)ZCalculateMetaclassz"__Pyx_CalculateMetaclass(NULL, %s)r  )r  r  r&  r   r   r   r   r   r   r   ry   rd  )rS   r   r  r&  callrP   rP   rQ   rD  %  s0    

 z)PyClassMetaclassNode.generate_result_codeNrU   rV   rW   r   r   r  rD  rP   rP   rP   rQ   r)  p%  s   r)  c                   @   s*   e Zd ZdgZdd Zdd Zdd ZdS )	PyClassNamespaceNoder  c                 C   s*   | j r| j ||| _ t| _d| _| S r  )r  r   r  r   r   r   r   rP   rP   rQ   r   %  s
    z"PyClassNamespaceNode.analyse_typesc                 C   s   dS r  rP   rR   rP   rP   rQ   r  %  s    z PyClassNamespaceNode.may_be_nonec           
      C   s   | | j}| |}| |}| j}d}| jr:| j n|}|jrN|j n|}|j	rb|j	 n|}	|
d|  |	|j |||||||  | jf	  | | d S )Nz(PyObject *) NULLz>%s = __Pyx_Py3MetaclassPrepare(%s, %s, %s, %s, %s, %s, %s); %s)r  rk   r  r  r  r  r   r&  r   r'  r   r  r   ry   rd  )
rS   r   r   r  r  r  nullZdoc_coder&  r'  rP   rP   rQ   rD  %  s,    

z)PyClassNamespaceNode.generate_result_codeNr+  rP   rP   rP   rQ   r,  %  s   r,  c                   @   s4   e Zd ZdZeZg ZdZdd Zdd Z	dd Z
d	S )
ClassCellInjectorNodeTFc                 C   s   | S rI   rP   r   rP   rP   rQ   r   %  s    z)ClassCellInjectorNode.analyse_expressionsc                 C   s<   | j s
t|d|  ||  | jf  | | d S )Nz%s = PyList_New(0); %s)	is_activer   r   r   r   ry   rd  r;  rP   rP   rQ   rD  %  s    
z*ClassCellInjectorNode.generate_result_codec                 C   s<   | j s
t|jtdd || jd|  |f  d S )NZCyFunctionClassCellCythonFunction.cz&__Pyx_CyFunction_InitClassCell(%s, %s))	r/  r   r   r   r   r   r,  ry   r   )rS   r   Zclassobj_cnamerP   rP   rQ   generate_injection_code%  s    


 z-ClassCellInjectorNode.generate_injection_codeN)rU   rV   rW   r   r   r   r   r/  r   rD  r1  rP   rP   rP   rQ   r.  %  s   r.  c                   @   s,   e Zd Zg ZdZdZeZdd Zdd Z	dS )ClassCellNodeTFc                 C   s   | S rI   rP   r   rP   rP   rQ   r   %  s    zClassCellNode.analyse_typesc                 C   sj   | j s |d|  tjf  n|d|  tjf  |d|  || jf  ||  t	 d S )Nz&%s = __Pyx_CyFunction_GetClassObj(%s);z%s =  %s->classobj;zTif (!%s) { PyErr_SetString(PyExc_SystemError, "super(): empty __class__ cell"); %s })
is_generatorr   r   r   
self_cnamegenerator_cnamer   ry   r:  r   r;  rP   rP   rQ   rD  %  s"    
 
z"ClassCellNode.generate_result_codeN)
rU   rV   rW   r   r   r3  r   r   r   rD  rP   rP   rP   rQ   r2  %  s   r2  c                   @   s   e Zd ZddddgZdZdZdZdZdZdZ	dZ
dZdZeZdZdZdZed	d
 Zdd Zdd Zdd ZdZdd Zdd Zdd Zdd ZdS )PyCFunctionNodecode_objectdefaults_tupledefaults_kwdictr%  NFr   r%   c                 C   s&   | |j ||jj|p|j|jt|dS )N)r]  pymethdef_cnamebindingspecialized_cpdefsr7  )ry   r   r:  r<  CodeObjectNode)rM   r{   r;  rP   rP   rQ   from_defnode&  s    zPyCFunctionNode.from_defnodec                 C   s   | j r| | | S rI   )r;  analyse_default_argsr   rP   rP   rQ   r   &  s    
zPyCFunctionNode.analyse_typesc                 C   s  g }g }g }g }g }|j p&| jjo&|j}| jjD ]}|jr|s|jjrrt|j|j|_|jj	r|j
|j	||_n$d|_|j	jr|| n
|| |jj	r|jj	|r|jr|| n
|| |jr0|j||_||j|j|jjf q0| jj| jjfD ]:}|r|jr|j||_||j|j|jjf q| jj}	|	rx|	|| j_||	jtd|	jf |s|r| }
|
tj}t|}g | _|D ]H}|j	}|j r|j!}|j"|j|dtj#|j dd}| j||f q|D ]8}|j"|j|j	dtj#|j ddd}| j||f q|
j$dd|dd|d	}|| _%t&|| _'| jD ]\}}d
tj(|j)f |_*q`| j%j| j_%|s|r| j%dkr|rt+| jdd |D d}||,|| _-|rt.| jdd |D d}||| _/n| j0s|rt1| j|| j%}n
t2| j}|r@t3| j|| j%}n
t2| j}t4j5| jg ddt4j6| jt7t+| j||gdddtdd}| }
|8|
 |9|
}|j:9|j;|_:d|_<d|_=|| j_>|rt.| jdd |D d}||| _?dS )zB
        Handle non-literal function's default arguments.
        TreturnN)allow_pyobjectF)rA  Zallow_memoryviewstructr%   r*  r  c                 S   s   g | ]
}|j qS rP   )ra   r  rP   rP   rQ   r   n&  s    z8PyCFunctionNode.analyse_default_args.<locals>.<listcomp>r  c                 S   s*   g | ]"}t |jt|j|jd |jdqS r  )r  ry   r   rk   ra   r  rP   rP   rQ   r   r&  s   r  )r  r   __defaults__)r   r^  r_  r!  Z
decoratorsrk   c                 S   s(   g | ] \}}}t |t||d |dqS r  )r  r   )r[   ry   rk   r   rP   rP   rQ   r   &  s    
)@rX  r]  Z
is_wrapperrS  r   ra   r   DefaultLiteralArgNodery   r   rz  Z
is_dynamicrj   r   rW  Zkw_onlyr  r   rk   r  r^  r_  Zreturn_type_annotationr	   r  r  next_idr   Zdefaults_struct_prefixr   ZStructOrUnionScopedefaultsrn  r  rY  Z
arg_prefixZdeclare_struct_or_uniondefaults_structr   defaults_pyobjectsZdynamic_args_cnamer   r  r  r  r8  r   r9  r<  DefaultsTupleNoder  DefaultsKwDictNoder   ZDefNodeZReturnStatNoder   r  r   r!  local_scopepy_wrapper_requiredpymethdef_requireddefaults_getterr%  )rS   rl   Znonliteral_objectsZnonliteral_otherZdefault_argsZdefault_kwargsannotationsZmust_use_constantsr  r  r  r   r  r   r   r8  r9  rN  r%  rP   rP   rQ   r?  &  s    




      
 

  
  
     	


z$PyCFunctionNode.analyse_default_argsc                 C   s   dS r"  rP   rR   rP   rP   rQ   r  &  s    zPyCFunctionNode.may_be_nonezConstructing Python functionc                 C   s   dS )Nr  rP   rR   rP   rP   rQ   closure_result_code&  s    z#PyCFunctionNode.closure_result_codec                 C   s    | j r| | n
| | d S rI   )r;  generate_cyfunction_codegenerate_pycfunction_coder;  rP   rP   rQ   rD  &  s    z$PyCFunctionNode.generate_result_codec                 C   sH   |  |}|d|  | j|  |||  | jf  | | d S )Nz'%s = PyCFunction_NewEx(&%s, %s, %s); %s)r  r   r   r:  rP  r   ry   rd  )rS   r   r  rP   rP   rQ   rR  &  s    
z)PyCFunctionNode.generate_pycfunction_codec           
      C   s  | j r| j d }n| j}| j s$| jr>|jtdd d}n|jtdd d}| jrh| j }nd}g }|j	r|
d n|jr|
d	 |jjjr|jjs|
d
 |jr|
d |rd|}nd}|d|  || j|| ||  | |tj|||  | jf
  | | |jr||js<t d|jd }|!|  t" |d|j# |  f  | $| | j%r|d|  | j&j'| j(|)| jf  d| j&j'|  f }| j%D ]"\}}	|j*|d||	j+f d q| j,r|d|  | j, f  | j s| j-r:|d|  | j- f  |j.r^|d|  |j.jj/f  | j0r|d|  | j0 f  d S )Nr   ZFusedFunctionr0  Z__pyx_FusedFunction_NewZCythonFunctionZ__Pyx_CyFunction_Newr  Z__Pyx_CYFUNCTION_STATICMETHODZ__Pyx_CYFUNCTION_CLASSMETHODZ__Pyx_CYFUNCTION_CCLASSZ__Pyx_CYFUNCTION_COROUTINEz | r  z(%s = %s(&%s, %s, %s, %s, %s, %s, %s); %szpyclass_stack is emptyr  zPyList_Append(%s, %s);z:if (!__Pyx_CyFunction_InitDefaults(%s, sizeof(%s), %d)) %sz!__Pyx_CyFunction_Defaults(%s, %s)r  r  z*__Pyx_CyFunction_SetDefaultsTuple(%s, %s);z+__Pyx_CyFunction_SetDefaultsKwDict(%s, %s);z+__Pyx_CyFunction_SetDefaultsGetter(%s, %s);z,__Pyx_CyFunction_SetAnnotationsDict(%s, %s);)1r<  r]  is_specializationr   r   r   r   r7  r   Zis_staticmethodr   Zis_classmethodrK  r  rX  r   Zis_anonymousis_coroutiner  r   r   r:  r  rP  r  r   r  r   ry   rd  Zrequires_classobjZpyclass_stackr   r:  r   Z
class_cellrg  rF  rG  rk   rH  r   rR  r   r8  r9  rN  rc  r%  )
rS   r   r]  r>  Zcode_object_resultflagsZ
class_noderF  r  r   rP   rP   rQ   rQ  &  s    







  
      z(PyCFunctionNode.generate_cyfunction_code)rU   rV   rW   r   r7  r;  r]  rF  rG  rH  r8  r9  r%  r   r   r   r<  rS  r  r>  r   r?  r  r:  rP  rD  rR  rQ  rP   rP   rP   rQ   r6  %  s6   
 r6  c                   @   s   e Zd ZdZdZdd ZdS )InnerFunctionNodeTc                 C   s   | j rdtj S dS )Nz((PyObject*)%s)r  )needs_closure_coder   cur_scope_cnamerR   rP   rP   rQ   rP  '  s    
z%InnerFunctionNode.closure_result_codeN)rU   rV   rW   r;  rW  rP  rP   rP   rP   rQ   rV  '  s   rV  c                   @   s<   e Zd ZdgZdZdZdd Zdd Zddd	Zd
d Z	dS )r=  varnamesFNc                 C   sT   t j| |j|d t|j}dd |jjD }t|jdd || D ddd| _d S )N)r]  c                 S   s   g | ]}|j r|qS rP   rG  r  rP   rP   rQ   r   .'  s      z+CodeObjectNode.__init__.<locals>.<listcomp>c                 S   s   g | ]}t |j|jd qS )r  )r   ry   rk   r  rP   rP   rQ   r   1'  s   r   r%   )r   r   r   )	r   r  ry   r   r   rK  r  r  rY  )rS   r]  r   
local_varsrP   rP   rQ   r  *'  s    
zCodeObjectNode.__init__c                 C   s   dS r"  rP   rR   rP   rP   rQ   r  6'  s    zCodeObjectNode.may_be_nonec                 C   s"   | j d kr|jtddd| _ | j S )Ncodeobjr2   r  )r  r)  r   r;  rP   rP   rQ   r   9'  s    
z$CodeObjectNode.calculate_result_codec                 C   sl  | j d kr|jtddd| _ || j }|d kr4d S || j | j}|j|jdd|jd}t	
|jd  dd}|j|ddd	}d
dg}| jjr|d | jjr|d | jjr|d n&| jjr|d n| jjr|d |d| j t|j|j |j|jt| jjd|p&dtjtjtj| j tjtj||| jd tj|| j | jf  d S )Nr[  r2   r\  TFr0  r   utf8)r1  r2  ZCO_OPTIMIZEDZCO_NEWLOCALS
CO_VARARGSCO_VARKEYWORDSCO_ASYNC_GENERATORCO_COROUTINECO_GENERATORzc%s = (PyObject*)__Pyx_PyCode_New(%d, %d, %d, %d, 0, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %s); %s|r  r%   )r  r)  r   r+  rC  ry   r]  r!  rk   r	   r  Zget_filenametable_entryr*  r^  r   r_  Zis_asyncgenrT  r3  r   r   r   r`  Znum_posonly_argsrY  r  r   Zempty_bytesr  r   r   )rS   r   r  	func_name	file_pathZfile_path_constrU  rP   rP   rQ   rD  >'  sZ    
   



z#CodeObjectNode.generate_result_code)N)
rU   rV   rW   r   r   r  r  r  r   rD  rP   rP   rP   rQ   r=   '  s   
r=  c                       sH   e Zd Zg ZdZdZ fddZdd Zdd Zd	d
 Z	dd Z
  ZS )rD  TFc                    s2   t t| | || _|j| _| jj| _d| _d S r"  )rK   rD  r  r  rw   r   	evaluated)rS   ry   r  rN   rP   rQ   r  y'  s
    
zDefaultLiteralArgNode.__init__c                 C   s   | S rI   rP   r   rP   rP   rQ   r   '  s    z#DefaultLiteralArgNode.analyse_typesc                 C   s   d S rI   rP   r;  rP   rP   rQ   rD  '  s    z*DefaultLiteralArgNode.generate_result_codec                 C   s   | j s| j| d| _ d S r  )rf  r  rI  r;  rP   rP   rQ   rI  '  s    z.DefaultLiteralArgNode.generate_evaluation_codec                 C   s   | j | j S rI   )r   rU  r  r   rR   rP   rP   rQ   r   '  s    zDefaultLiteralArgNode.result)rU   rV   rW   r   r   r   r  r   rD  rI  r   rX   rP   rP   rN   rQ   rD  p'  s   rD  c                       s8   e Zd Zg Z fddZdd Zdd Zdd Z  ZS )	DefaultNonLiteralArgNodec                    s    t t| | || _|| _d S rI   )rK   rg  r  r  rG  )rS   ry   r  rG  rN   rP   rQ   r  '  s    z!DefaultNonLiteralArgNode.__init__c                 C   s   | j j| _d| _| S r"  )r  r   r   r   rP   rP   rQ   r   '  s    
z&DefaultNonLiteralArgNode.analyse_typesc                 C   s   d S rI   rP   r;  rP   rP   rQ   rD  '  s    z-DefaultNonLiteralArgNode.generate_result_codec                 C   s"   d| j jtj| j | jjjf S )Nz%__Pyx_CyFunction_Defaults(%s, %s)->%s)rG  rk   r   r4  r  r  r   rR   rP   rP   rQ   r   '  s
     zDefaultNonLiteralArgNode.result)	rU   rV   rW   r   r  r   rD  r   rX   rP   rP   rN   rQ   rg  '  s
   rg  c                       s*   e Zd Z fddZd fdd	Z  ZS )rI  c                    sL   g }|D ]*}|j js"t|||}n|j }|| qtt| j||d d S )Nr  )ra   r   rg  r   rK   rI  r  )rS   ry   rF  rG  r   r  rN   rP   rQ   r  '  s    zDefaultsTupleNode.__init__Fc                    s   t t| |||S rI   )rK   rI  r   r  )rS   rl   r  rN   rP   rQ   r   '  s    zDefaultsTupleNode.analyse_types)FrU   rV   rW   r  r   rX   rP   rP   rN   rQ   rI  '  s   
rI  c                       s   e Zd Z fddZ  ZS )rJ  c                    sh   g }|D ]F}t |j|jd}|jjs2t|||}n|j}|t|j||d qtt	| j
||d d S )Nr  r  r  )r   ry   rk   ra   r   rg  r   r  rK   rJ  r  )rS   ry   rF  rG  r  r  rk   rN   rP   rQ   r  '  s    zDefaultsKwDictNode.__init__)rU   rV   rW   r  rX   rP   rP   rN   rQ   rJ  '  s   rJ  c                       s@   e Zd ZdgZedZdd Z fddZ fddZ	  Z
S )	
LambdaNoder]  <lambda>c                 C   sb   t | drd S |d | _| j_d| j_d| j_d| j_| j| | jjj	| _	|
| j d S )Nlambda_namelambdaT)r  rE  rk  r]  Zno_assignment_synthesisrM  is_cyfunctionr  r   r:  Zadd_lambda_defr   rP   rP   rQ   r  '  s    
zLambdaNode.analyse_declarationsc                    s   | j || _ tt| |S rI   )r]  r   rK   ri  r   r   rN   rP   rQ   r   '  s    zLambdaNode.analyse_typesc                    s    | j | tt| | d S rI   )r]  r  rK   ri  rD  r;  rN   rP   rQ   rD  '  s    zLambdaNode.generate_result_code)rU   rV   rW   r  r	   r  rk   r  r   rD  rX   rP   rP   rN   rQ   ri  '  s
   

ri  c                       sV   e Zd ZedZdZejdg Zej	dg Z	 fddZ
 fddZdd	 Z  ZS )
GeneratorExpressionNodegenexprFcall_parametersc                    s"   t t| j|f|| g | _d S rI   )rK   rn  r  rp  )rS   ry   r   r  rN   rP   rQ   r  '  s    z GeneratorExpressionNode.__init__c                    s   t | drd S |d| _tt| | d| j_d| j_d| j_	t
j| jj_t| jtjrt| jjtsnt| jjd | nt| jtjstd S )Ngenexpr_namero  F)r  rE  rq  rK   rn  r  r]  rM  rL  rm  r.   Zpyfunction_noargsr   r  rv   r  r   r  r  r  r   r  r  r   rN   rP   rQ   r  '  s    
z,GeneratorExpressionNode.analyse_declarationsc              
   C   s`   |   gdd | jD  }d|}|d|  | jjj|||  | j	f  | 
| d S )Nc                 S   s   g | ]}|  qS rP   r  )r[   cprP   rP   rQ   r   (  s     z@GeneratorExpressionNode.generate_result_code.<locals>.<listcomp>rG  rb  )rP  rp  r  r   r   r]  r   rc  r   ry   rd  )rS   r   Zargs_to_callrP   rP   rQ   rD  (  s    
z,GeneratorExpressionNode.generate_result_code)rU   rV   rW   r	   r  rk   r;  ri  r  r   r  r  rD  rX   rP   rP   rN   rQ   rn  '  s   	
rn  c                   @   sR   e Zd ZdgZe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S )YieldExprNoder  r   Fyieldc                 C   sZ   | j r| jr$| jr$t| jd| j  d| _| jd k	rV| j|| _| jj	j
sV| | | S )Nz'%s' not supported herer%   )	label_numis_yield_fromin_async_genr   ry   expr_keywordr   r  r   r   rj   coerce_yield_argumentr   rP   rP   rQ   r   ,(  s    


zYieldExprNode.analyse_typesc                 C   s   | j || _ d S rI   r  r  r   rP   rP   rQ   ry  6(  s    z#YieldExprNode.coerce_yield_argumentc                 C   sp   | j rT| j | | j | |dtj| j tf  | j | | j 	| n|
tjt | | d S Nr  )r  rI  r<  r   r   r  r   r   rP  rV  Zput_init_to_py_nonegenerate_yield_coder;  rP   rP   rQ   rI  9(  s    
z&YieldExprNode.generate_evaluation_codec                 C   sn  | | jdd\}}|| g }|jj  |j D ]n\}}}|jj|}|	|||f |j
r|jtdd d| }n||| |dtj||f  q<|tjt |jjd }	|jjd }
|	s|
r|jtj|jj d	 |  |jjd
k	r|dtj  n|dtj  |d| jr:dnd| jrHdndf  |dtj|f  | jr| js|dtj  n|dtj  || |D ]z\}}}dtj|f }|j
rd| }|d||f  |jr|d|  ||| n|j r|d||f  q| !|tj" | j#rj| $| |%d| & tj"f  |'| & t d
S )z
        Generate the code to return the argument in 'Naming.retval_cname'
        and to continue at the yield label.
         r  rK  rL  z__PYX_STD_MOVE_IF_SUPPORTED(%s)z%s->%s = %s;profile	linetrace)r   Nz"__Pyx_Coroutine_SwapException(%s);z+__Pyx_Coroutine_ResetAndClearException(%s);z*/* return from %sgenerator, %sing value */zasync rk  awaitrt  z%s->resume_label = %d;z,return __Pyx__PyAsyncGenValueWrapperNew(%s);z
return %s;r  r  rO  z"%s.memview = NULL; %s.data = NULL;rX  )(Znew_yield_labelrx  replaceZ	use_labelr/  Zclosure_tempsresetZtemps_in_user0  r   r   r   r   r   r   rh  r   r   rX  r  r   rd   Zput_trace_returnrS  Zput_finish_refcount_contextZcurrent_exceptr5  rw  is_awaitr  rj   re  r   !generate_sent_value_handling_codeZsent_value_cnamer.  r2  r  r   r:  )rS   r   ru  Z
label_nameZsavedr   r   r+  Z
save_cnamer~  r  rP   rP   rQ   r|  G(  sl    


 

z!YieldExprNode.generate_yield_codec                 C   s   | ||| j d S rI   )r   r   ry   rS   r   Zvalue_cnamerP   rP   rQ   r  (  s    z/YieldExprNode.generate_sent_value_handling_codeN)rU   rV   rW   r   r   r   ru  rv  r  rw  rx  r   ry  rI  r|  r  rP   rP   rP   rQ   rs  (  s   
Ars  c                   @   s.   e Zd Zdd ZdddZdd Zd	d
 ZdS )_YieldDelegationExprNodec                 C   s
   t  d S rI   )NotImplementedErrorr;  rP   rP   rQ   yield_from_func(  s    z(_YieldDelegationExprNode.yield_from_funcNFc                 C   s   |d kr| j | |dtj| |tj|d kr<| j  n|f  |d krh| j | | j 	| n|rx|
|t |tjt |dtj  | | |d | jr| | n
| | |d d S )Nz%s = %s(%s, %s);rZ  r  r   )r  rI  r   r   r  r  r5  r   rN  rV  rM  r   re  r|  r.  fetch_iteration_resulthandle_iteration_exception)rS   r   r  r  rP   rP   rQ   rI  (  s*    


z1_YieldDelegationExprNode.generate_evaluation_codec                 C   s6   | d|    || jd|    | | d S )Nr  z(__Pyx_PyGen_FetchStopIterationValue(&%s))r   r   r,  ry   rd  r;  rP   rP   rQ   r  (  s    z/_YieldDelegationExprNode.fetch_iteration_resultc                 C   sB   | d | d | d | d|| j  | d d S )N8PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();r  zif (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();r  r   )r   r   ry   r;  rP   rP   rQ   r  (  s
    


z3_YieldDelegationExprNode.handle_iteration_exception)NF)rU   rV   rW   r  rI  r  r  rP   rP   rP   rQ   r  (  s   
r  c                   @   s$   e Zd ZdZdZdd Zdd ZdS )YieldFromExprNodeTz
yield fromc                 C   s(   | j jjst| jd | j || _ d S )Nz-yielding from non-Python object not supported)r  r   rE  r   ry   r  r   rP   rP   rQ   ry  (  s    
z'YieldFromExprNode.coerce_yield_argumentc                 C   s   |j tdd dS )NZGeneratorYieldFromr  Z__Pyx_Generator_Yield_Fromr   r   r   r   r;  rP   rP   rQ   r  (  s    z!YieldFromExprNode.yield_from_funcN)rU   rV   rW   rv  rx  ry  r  rP   rP   rP   rQ   r  (  s   r  c                   @   s$   e Zd ZdZdZdd Zdd ZdS )AwaitExprNodeTr  c                 C   s   | j d k	r| j || _ d S rI   rz  r   rP   rP   rQ   ry  (  s    
z#AwaitExprNode.coerce_yield_argumentc                 C   s   |j tdd dS )NZCoroutineYieldFromr  Z__Pyx_Coroutine_Yield_Fromr  r;  rP   rP   rQ   r  (  s    zAwaitExprNode.yield_from_funcN)rU   rV   rW   r  rx  ry  r  rP   rP   rP   rQ   r  (  s   r  c                       s,   e Zd Zdd Z fddZdd Z  ZS )AwaitIterNextExprNodec                 C   sJ   |j tdd |d |d |d |d |d d S )NStopAsyncIterationr  r  zif (unlikely(exc_type && (exc_type == __Pyx_PyExc_StopAsyncIteration || ( exc_type != PyExc_StopIteration && exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, __Pyx_PyExc_StopAsyncIteration))))) {r  r  r   )r   r   r   r   r   r;  rP   rP   rQ   _generate_break(  s    



z%AwaitIterNextExprNode._generate_breakc                    s,   |j std| | tt| | d S )N1AwaitIterNextExprNode outside of 'async for' loop)break_labelr   r  rK   r  r  r;  rN   rP   rQ   r  (  s    
z,AwaitIterNextExprNode.fetch_iteration_resultc                 C   sF   |j std|d|  | | ||| j |d d S )Nr  r  r   )r  r   r   r  r   ry   r  rP   rP   rQ   r  (  s
    
z7AwaitIterNextExprNode.generate_sent_value_handling_code)rU   rV   rW   r  r  r  rX   rP   rP   rN   rQ   r  (  s   
r  c                   @   s0   e Zd ZeZdZdd ZdZdd Zdd Z	d	S )
GlobalsExprNoder%   c                 C   s   | tj | S rI   )r   r   Zglobals_utility_coder   rP   rP   rQ   r   (  s    zGlobalsExprNode.analyse_typeszConstructing globals dictc                 C   s   dS r"  rP   rR   rP   rP   rQ   r  )  s    zGlobalsExprNode.may_be_nonec                 C   s2   | d|  ||  | jf  | | d S )Nz%s = __Pyx_Globals(); %s)r   r   r   ry   rd  r;  rP   rP   rQ   rD  )  s
    z$GlobalsExprNode.generate_result_codeN)
rU   rV   rW   r   r   r   r   r:  r  rD  rP   rP   rP   rQ   r  (  s   r  c                   @   s   e Zd Zdd ZdS )LocalsDictItemNodec                 C   sR   | j || _ | j|| _| j || _ | jj|rH| j|| _nd | _| S rI   )r  r   r   r  r   rW  r   rP   rP   rQ   r   )  s    z LocalsDictItemNode.analyse_typesN)rU   rV   rW   r   rP   rP   rP   rQ   r  )  s   r  c                       s$   e Zd Zdd Z fddZ  ZS )FuncLocalsExprNodec                    s@   t dd |j D } fdd|D }tj|  |dd d S )Nc                 S   s   g | ]}|j r|j qS rP   rG  r  rP   rP   rQ   r   )  s     z/FuncLocalsExprNode.__init__.<locals>.<listcomp>c              
      s,   g | ]$}t  t |d t |dddqS )r  T)rk   r  r  )r  r   ry  )r[   r!  r  rP   rQ   r   )  s    
T)r  r  )r  r  r-  r   r  )rS   ry   rl   rZ  r  rP   r  rQ   r  )  s    

zFuncLocalsExprNode.__init__c                    s&   t t| |}dd |jD |_|S )Nc                 S   s   g | ]}|j d k	r|qS rI   r  )r[   r5  rP   rP   rQ   r   %)  s    
z4FuncLocalsExprNode.analyse_types.<locals>.<listcomp>)rK   r  r   r  r   rN   rP   rQ   r   #)  s    z FuncLocalsExprNode.analyse_typesrh  rP   rP   rN   rQ   r  )  s   
r  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )PyClassLocalsExprNodec                 C   s   t | | || _d S rI   )r  r  pyclass_dict)rS   ry   r  rP   rP   rQ   r  +)  s    zPyClassLocalsExprNode.__init__c                 C   s   | j j| _d| _| S r"  )r  r   r   r   rP   rP   rQ   r   /)  s    
z#PyClassLocalsExprNode.analyse_typesc                 C   s   dS r"  rP   rR   rP   rP   rQ   r  4)  s    z!PyClassLocalsExprNode.may_be_nonec                 C   s
   | j  S rI   )r  r   rR   rP   rP   rQ   r   7)  s    zPyClassLocalsExprNode.resultc                 C   s   d S rI   rP   r;  rP   rP   rQ   rD  :)  s    z*PyClassLocalsExprNode.generate_result_codeN)rU   rV   rW   r  r   r  r   rD  rP   rP   rP   rQ   r  *)  s
   r  c                 C   s*   |j rt| S |jr t| |jS t| |S rI   )rS  r  rT  r  r|  r  )ry   Z
scope_noderl   rP   rP   rQ   LocalsExprNode>)  s
    r  )not~r  r   c                   @   s   e Zd ZdgZdZdZdd Zdd Zdd	 Zd
d Z	dd Z
dd Zd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$S )&UnopNoder*  TFc                 C   s   t | j }|| jj| _d S rI   )compile_time_unary_operatorsr
   r*  rw   rS   r  rP   rP   rQ   r   c)  s    
z"UnopNode.calculate_constant_resultc              
   C   sj   t | j}|s"t| jd| j  | j|}z
||W S  tk
rd } z| | W 5 d }~X Y nX d S )Nz3Unary '%s' not supported in compile-time expression)	r  rc   r
   r   ry   r*  r   rJ  r   )rS   r   r  r*  r   rP   rP   rQ   r   g)  s    
zUnopNode.compile_time_valuec                 C   s<   | j |}|js|jr0|| j}|d k	r0|S | ||S rI   )r*  r~   r   rs  find_cpp_operation_typer
   infer_unop_type)rS   rl   operand_typecpp_typerP   rP   rQ   r~   s)  s    zUnopNode.infer_typec                 C   s   |j r
tS |S d S rI   )rj   r   rS   rl   r  rP   rP   rQ   r  {)  s    zUnopNode.infer_unop_typec                 C   s,   | j jr"| j jjr"| j jtk	r"dS t| S r"  )r*  r   rE  r   r   r  rR   rP   rP   rQ   r  )  s    zUnopNode.may_be_nonec                 C   sx   | j || _ | |r6tt| j| j j| _d| _n>|  rV| 	| t
| _d| _n|  rj| | n
| | | S r  )r*  r   is_pythran_operationrE   r<   r
   r   r   is_py_operationcoerce_operand_to_pyobjectr   is_cpp_operationanalyse_cpp_operationanalyse_c_operationr   rP   rP   rQ   r   )  s    


zUnopNode.analyse_typesc                 C   s
   | j  S rI   r*  r   rR   rP   rP   rQ   r   )  s    zUnopNode.check_constc                 C   s   | j jjp| j jjS rI   )r*  r   rj   r  rR   rP   rP   rQ   r  )  s    zUnopNode.is_py_operationc                 C   s    t |}| jj}|o|jp|jS rI   )r=   r*  r   rn  r9   )rS   rl   Z
np_pythranop_typerP   rP   rQ   r  )  s    zUnopNode.is_pythran_operationc                 C   s   |   r|   d S rI   r  r  r   rP   rP   rQ   r   )  s    zUnopNode.nogil_checkc                 C   s   | j j}|jS rI   )r*  r   r   r   rP   rP   rQ   r  )  s    zUnopNode.is_cpp_operationc                 C   s   | j || _ d S rI   )r*  r  r   rP   rP   rQ   r  )  s    z#UnopNode.coerce_operand_to_pyobjectc                 C   s   | j jrL|d |d|    |d|  |  | j| j f  n| jj jrb| | nx| j	r| 
 r| jdkrt|| jd|  | j| j f | j jr|  nd | j| j n |d|  | j| j f  d S )Nz// Pythran unaryopr  r  r   %s = %s %s;)r   r9   r   r   r
   r*  r   rj   generate_py_operation_coder   r  r   r   ry   r   r@  r;  rP   rP   rQ   rD  )  s(    


 zUnopNode.generate_result_codec              
   C   sF   |  |}|d|  || j ||  | jf  | | d S )Nrb  )py_operation_functionr   r   r*  r   r   ry   rd  r  rP   rP   rQ   r  )  s    
z#UnopNode.generate_py_operation_codec                 C   s0   | j jjs$t| jd| j| j jf  tj| _d S )Nz"Invalid operand type for '%s' (%s))r*  r   r~  r   ry   r
   r   r,   rR   rP   rP   rQ   
type_error)  s
    
zUnopNode.type_errorc                 C   s  | j jg}| jr"| js"|tj || j| j	|}|rH|sH| 
  d S |r|jj| _|jj| _| jdkrd| _t| r|tdd nd| _d| _| jr| js| j jj| j	tjd}n| j j| j	}|r|d krt| jd| j	tf  | 
  d S || _d S )Nr   Trw  rL  rk  )r  z '%s' operator not defined for %s)r*  r   is_inc_dec_op	is_prefixr   r   rG  r  ry   r
   r  r   r   r   r   r   r   r   r  r   )rS   rl   overload_checkZoperand_typesr   r  rP   rP   rQ   r  )  s<    



  zUnopNode.analyse_cpp_operationN)T)rU   rV   rW   r   infixr  r   r   r~   r  r  r   r   r  r  r   r  r  rD  r  r  r  rP   rP   rP   rQ   r  S)  s&   
r  c                   @   s>   e Zd ZdZejZdd Zdd Zdd Z	dd	 Z
d
d ZdS )NotNode!c                 C   s   | j j | _d S rI   )r*  rw   rR   rP   rP   rQ   r   )  s    z!NotNode.calculate_constant_resultc              
   C   sF   | j |}z| W S  tk
r@ } z| | W 5 d }~X Y nX d S rI   )r*  r   rJ  r   )rS   r   r*  r   rP   rP   rQ   r   )  s
    zNotNode.compile_time_valuec                 C   s   t jS rI   )r   r  r  rP   rP   rQ   r  *  s    zNotNode.infer_unop_typec                 C   s:   | j || _ | j j}|jr(| | n| j || _ | S rI   )r*  r   r   r   r  r  r  rP   rP   rQ   r   *  s    zNotNode.analyse_typesc                 C   s   d| j   S )Nz(!%s)r*  r   rR   rP   rP   rQ   r   *  s    zNotNode.calculate_result_codeN)rU   rV   rW   r
   r   r  r   r   r   r  r   r   rP   rP   rP   rQ   r  )  s   	r  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	UnaryPlusNoder   c                 C   s   t | jjt j| _d S rI   )r   r  r*  r   rG  r   rP   rP   rQ   r  *  s     z!UnaryPlusNode.analyse_c_operationc                 C   s   dS )NZPyNumber_PositiverP   r;  rP   rP   rQ   r  *  s    z#UnaryPlusNode.py_operation_functionc                 C   s$   |   rd| j  S | j S d S )Nz(+%s))r  r*  r   rR   rP   rP   rQ   r   *  s    z#UnaryPlusNode.calculate_result_codeN)rU   rV   rW   r
   r  r  r   rP   rP   rP   rQ   r  *  s   r  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )UnaryMinusNoder  c                 C   sN   | j jjr t| j jtj| _n| j jjr4tj| _n|   | jjrJd| _	d S r"  )
r*  r   r  r   r  rG  r  r  r  r  r   rP   rP   rQ   r  **  s    
 

z"UnaryMinusNode.analyse_c_operationc                 C   s   dS )NZPyNumber_NegativerP   r;  rP   rP   rQ   r  5*  s    z$UnaryMinusNode.py_operation_functionc                 C   s4   | j rd| j  S d| jjd| j f S d S )N(-%s)r  r  )r  r*  r   r   unary_oprR   rP   rP   rQ   r   8*  s    z$UnaryMinusNode.calculate_result_codec                 C   s   | j  }|rd| S d S )Nr  )r*  r   )rS   r   rP   rP   rQ   r   >*  s    
z)UnaryMinusNode.get_constant_c_result_codeN)rU   rV   rW   r
   r  r  r   r   rP   rP   rP   rQ   r  %*  s
   r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )	TildeNodec                 C   s@   | j jjr t| j jtj| _n| j jjr4tj| _n|   d S rI   )r*  r   r  r   r  rG  r  r  r   rP   rP   rQ   r  F*  s    
 

zTildeNode.analyse_c_operationc                 C   s   dS )NZPyNumber_InvertrP   r;  rP   rP   rQ   r  O*  s    zTildeNode.py_operation_functionc                 C   s   d| j   S )Nz(~%s)r  rR   rP   rP   rQ   r   R*  s    zTildeNode.calculate_result_codeN)rU   rV   rW   r  r  r   rP   rP   rP   rQ   r  C*  s   	r  c                   @   s   e Zd Zdd ZdS )	CUnopNodec                 C   s   dS r"  rP   rR   rP   rP   rQ   r  X*  s    zCUnopNode.is_py_operationN)rU   rV   rW   r  rP   rP   rP   rQ   r  V*  s   r  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	DereferenceNoder   c                 C   s   |j r|jS tjS d S rI   )rs  rt  r   r,   r  rP   rP   rQ   r  `*  s    zDereferenceNode.infer_unop_typec                 C   s>   | j jjr2|jr$t| j jj| _q:| j jj| _n|   d S rI   )r*  r   rs  Zis_cppr   rv  rt  r  r   rP   rP   rQ   r  f*  s
    
z#DereferenceNode.analyse_c_operationc                 C   s   d| j   S r  r  rR   rP   rP   rQ   r   o*  s    z%DereferenceNode.calculate_result_codeN)rU   rV   rW   r
   r  r  r   rP   rP   rP   rQ   r  [*  s   	r  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	DecrementIncrementNodeTc                 C   sV   | j jjsJ| jr,t| jd| j| j jf  nt| jd| j| j| j jf  tj| _d S )Nz0No match for 'operator%s' (operand type is '%s')zENo 'operator%s(int)' declared for postfix '%s' (operand type is '%s'))	r*  r   r~  r  r   ry   r
   r   r,   rR   rP   rP   rQ   r  w*  s    
z!DecrementIncrementNode.type_errorc                 C   sB   | j jjr t| j jtj| _n| j jjr6| j j| _n|   d S rI   )r*  r   r  r   r  rG  rs  r  r   rP   rP   rQ   r  *  s    
 
z*DecrementIncrementNode.analyse_c_operationc                 C   s2   | j rd| j| j f S d| j | jf S d S )Nz(%s%s))r  r
   r*  r   rR   rP   rP   rQ   r   *  s    z,DecrementIncrementNode.calculate_result_codeN)rU   rV   rW   r  r  r  r   rP   rP   rP   rQ   r  s*  s   
	r  c                    s    fddS )Nc                    s   t | f d|S )Nr  r
   )r  )ry   r  r  rP   rQ   <lambda>*      z%inc_dec_constructor.<locals>.<lambda>rP   r  rP   r  rQ   inc_dec_constructor*  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 )AmpersandNoder	  c                 C   s
   t |S rI   )r   
c_ptr_typer  rP   rP   rQ   r  *  s    zAmpersandNode.infer_unop_typec                 C   s   | j || _ | j j}|jr*| j|dd |jsd|jsd| j  sd|jrR| 	d n| 	d|  | S |j
r| 	d| j jrd| j j n| j jrd| j j nd  | S |jr| jst|| _| S )	NF)r  z'Cannot take address of memoryview slicez&Taking address of non-lvalue (type %s)z Cannot take address of Python %szvariable '%s'zobject attribute '%s'ra  )r*  r   r   r   r  r  r   r   r   r   rj   r   rk   r  r  r   r  )rS   rl   ZargtyperP   rP   rQ   r   *  s&    zAmpersandNode.analyse_typesc                 C   s
   | j  S rI   )r*  r%  rR   rP   rP   rQ   r   *  s    zAmpersandNode.check_constc                 C   s   t | j| tj| _d| _d S Nr  r   ry   r   r,   r   r  rS   ZmessrP   rP   rQ   r   *  s    zAmpersandNode.errorc                 C   s   d| j   S )Nz(&%s)r  rR   rP   rP   rQ   r   *  s    z#AmpersandNode.calculate_result_codec                 C   sV   | j jjrR| jdkrRt|| jd|  | j| j  f | jjrD|  nd | j	| j
 d S )Nr   r  )r*  r   r   r   r   ry   r   r
   rj   r   r@  r;  rP   rP   rQ   rD  *  s     z"AmpersandNode.generate_result_codeN)
rU   rV   rW   r
   r  r   r   r   r   rD  rP   rP   rP   rQ   r  *  s   r  )r   r  r  c                 C   s   t |tr6|dkr6t|jtt|j |j|jdS t |t	rp|j
|  krVdkrpn nt| d|fd  d t| | ||dS )Nr  )ry   r   r  r  z+-zAPython has no increment/decrement operator: %s%sx == %s(%sx) == x      )r
   r*  )rv   r  ry   rp   r   r  r   r  r  r  r
   r   unop_node_classes)ry   r
   r*  rP   rP   rQ   	unop_node*  s     $r  c                   @   s   e Zd ZdgZd Z Z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dZdd Zdd Zdd ZdS )r  r*  Nc                 C   s   dS rA  rP   r   rP   rP   rQ   r  *  s    zTypecastNode.type_dependenciesc                 C   s0   | j d kr*| j|}| j||\}| _ | j S rI   )r   rt  rQ  
declarator)rS   rl   rt  r  rP   rP   rQ   r~   *  s    
zTypecastNode.infer_typec                 C   s  | j d kr*| j|}| j||\}| _ | j r<|   | j jrXt| j	d t
j| _ | j|| _| j t
jkr~| j|S | j j}| jj j}|r|s| j r| j js| j jst| j	d |rv|sv| j tkr| jj jrt| j|S | jj |rt| _| j| j || _n^| jj jrJ| jj jjsd| jj jjsdt| j	d nt| j	d| jj | j f  | j|| _n|r|s| j |r| j| j || _nJ| j jr| j jjs| j jjst| j	d nt| j	d| j | jj f  n|r>|r>| j rt!| j| j |dd| _n t"| jt#r| j| j || _nD| j j$rd| jj j$rd| j|| _n| jj j%r| j| j || _| j jr| j jjr| j jj&r| jj }|jr|j}|jr|j&st| j	dd	 | S )
NzCannot cast to a function typez>Casting temporary Python object to non-numeric non-Python typez>Python objects cannot be cast from pointers of primitive typesz8No conversion from %s to %s, python object pointer used.z<Python objects cannot be cast to pointers of primitive typesT)notnonezQCasting a GIL-requiring function into a nogil function circumvents GIL validationr%   )'r   rt  rQ  r  r*  r   r   r  r   ry   r   r,   r   r  r  rj   r   r  r   r   r  r  rW  r   r   rz  rs  r-  r  r   r  create_from_py_utility_codeZ	typecheckr  rv   r  r  r  r   )rS   rl   rt  r  Zto_pyZfrom_pyr  rP   rP   rQ   r   *  sz    


 
 
" zTypecastNode.analyse_typesc                 C   s
   | j  S rI   )r*  r  rR   rP   rP   rQ   r  /+  s    zTypecastNode.is_simplec                 C   s
   | j  S rI   )r*  r   rR   rP   rP   rQ   r   3+  s    zTypecastNode.is_ephemeralc                 C   s   | j p| j S rI   )r   r*  r  rR   rP   rP   rQ   r  7+  s    z!TypecastNode.nonlocally_immutablec                 C   s    | j r| j jr| jr|   d S rI   )r   rj   r   r  r   rP   rP   rQ   r   :+  s    zTypecastNode.nogil_checkc                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r   >+  s    zTypecastNode.check_constc                 C   s   |  | jj| _d S rI   )r   r*  rw   rR   rP   rP   rQ   r   A+  s    z&TypecastNode.calculate_constant_resultc                 C   s   |d kr| j  }| jjr| j  }| j jjr`| jj| j j|}| jj| j j|}n| jj|}d}d| jj||f S | j|S d S Nr  r  )	r*  r   r   r  	real_typerU  	real_code	imag_coder9  )rS   operand_result	real_part	imag_partrP   rP   rQ   r   D+  s&    


z"TypecastNode.calculate_result_codec                 C   s   | j  }|r| j|S d S rI   )r*  r   r   rU  )rS   r  rP   rP   rQ   r   X+  s    
z'TypecastNode.get_constant_c_result_codec                 C   s*   | j jr| js| j|S t| |S d S rI   )r   rj   r   r*  r   r   r   rP   rP   rQ   r   ]+  s    zTypecastNode.result_asc                 C   s:   | j r6|d|  | j f  ||  |   d S )Nz%s = (PyObject *)%s;)r   r   r   r*  r:  r   r;  rP   rP   rQ   rD  d+  s    z!TypecastNode.generate_result_code)N)rU   rV   rW   r   rt  r  r   r  r~   r   r  r   r  r   r   r   r   r   r   rD  rP   rP   rP   rQ   r  *  s   @
r  zStart may not be givenz'Stop must be provided to indicate shapezVStrides may only be given to indicate contiguity. Consider slicing it after conversionz2Can only create cython.array from pointer or arrayz7Pointer base type does not match cython.array base typec                   @   sb   e Zd ZdZddgZdZdZdZdZe	j
Zdd Zd	d
 Zdd Zdd Zdd Zedd ZdS )r|  an  
    Used when a pointer of base_type is cast to a memoryviewslice with that
    base type. i.e.

        <int[:M:1, :N]> p

    creates a fortran-contiguous cython.array.

    We leave the type set to object so coercions to object are more efficient
    and less work. Acquiring a memoryviewslice from this will be just as
    efficient. ExprNode.coerce_to() will do the additional typecheck on
    self.compile_time_type

    This also handles <int[:, :]> my_c_array


    operand             ExprNode                 the thing we're casting
    base_type_node      MemoryViewSliceTypeNode  the cast expression node
    r*  shapesNTcc                 C   s(  ddl m} | j|| _| jr(| j}n| jj|}| jj}t| _	g | _
t|}| jj	}| jj	js| jj	jst| jjt | S g }|jr|jr||j |j}qn"|jr|j}nt| jd|  | S ||s|jst| jjt | S | jj	jr"t||kr"t| jjd|t|f  | S t|D ]t\}}	|	jjsTt|	jjt |   S |	jjr|r|| }
t| jt|
|
tjd|	_nt|	jt  |   S |	j||	_|	j!| j"|}|j#s|$| | j
| |d|d fk}|	j%jsx|rx|	j%||	_%|	j%j	j&s>|	j%j#r>|	j%j	j's>t|	j%jd |   S |	j%(|dkrft|	j%jt) |   S |dkrd| _*n&|	j%js*|s*t|	j%jt) |   S q*| jj+s| j$|| _d	gt| }| j*dkrd
|d< nd
|d< t,||| _-| j-.| j | /|| _	|0| |1|j2 | S )Nr%   rl  zunexpected base type %s foundz/Expected %d dimensions, array has %d dimensionsr  r   zExpected an integer literalZfortran)r  follow)r  Zcontigr  )3rk  rm  r*  r   array_dtypebase_type_noderQ  rV  r,   r   r  r   rs  r
  r   ry   ERR_NOT_POINTERr   r  rt  rv  r-  ERR_BASE_TYPEr1  r   r  	ERR_STARTr   r  rp   r   rG  ERR_NOT_STOPrz  
shape_typer   r  r   r  r~  r   	ERR_STEPSmoder   rS  rx  Zvalidate_memslice_dtypeget_cython_array_typeZuse_cython_array_utility_coder   Ztypeinfo_to_format_code)rS   rl   rm  r  rV  r^  rt  Zarray_dimension_sizesZaxis_noZaxisZdimsizeshapeZfirst_or_lastrP   rP   rQ   r   +  s    









zCythonArrayNode.analyse_typesc                 C   s$   | j rtd|j| jd| _ d S )Nztemp allocated multiple timesT)r   r,  r/  r0  r   r;  rP   rP   rQ   r2  +  s    z$CythonArrayNode.allocate_temp_resultc                 C   s
   |  |S rI   )r  r   rP   rP   rQ   r~   ,  s    zCythonArrayNode.infer_typec                 C   s"   |  jj}|  |jdjS )Narray)r  r  cython_scopeZload_cythonscopeZ	viewscoper  r   )rS   rl   r  rP   rP   rQ   r  ,  s    z%CythonArrayNode.get_cython_array_typec                    sj  ddl m} fddjD }jj} jtd} jtd}d|  }|	 |}j
jjr dj
    d   j
j  d	  d
|| |jf   |t dt| }	 d||	d| |jf   |t  d |||jj
   jf     fdd}
|
| |
| d S )Nr%   rk  c                    s   g | ]} j | qS rP   )r  rU  r   )r[   r  rR   rP   rQ   r   ,  s   z8CythonArrayNode.generate_result_code.<locals>.<listcomp>Tr  z
if (!%s) {zQPyErr_SetString(PyExc_ValueError,"Cannot create cython.array from NULL pointer");r   z(%s = __pyx_format_from_typeinfo(&%s); %sz __PYX_BUILD_PY_SSIZE_T z.%s = Py_BuildValue((char*) "(" %s ")", %s); %srG  zS%s = __pyx_array_new(%s, %s, PyBytes_AS_STRING(%s), (char *) "%s", (char *) %s); %sc                    s     | t  j|  d S rI   )rM  r   r/  r8  )r  )r   rP   rQ   dispose4,  s    z5CythonArrayNode.generate_result_code.<locals>.dispose)rk  rl  r  rx  r  r/  r0  r   r?  Zget_type_information_cnamer*  r   rs  r   r   r   ry   r   ra  r   r  r  rd  )rS   r   rl  r  r  Zshapes_tempZformat_tempitemsize	type_infoZbuildvalue_fmtr  rP   r  rQ   rD  	,  sR    



    
z$CythonArrayNode.generate_result_codec           	      C   s~   |j }|j}t|}g }|jr<|t||||d |j}qt|ddd|d _t	j
|||d}t||||d}||}|S )z@
        Given a C array type, return a CythonArrayNode
        r  r  T)r   r  r  )rV  r  )r  r*  r  )ry   r   r  r
  r   rL  rt  r  r   r   ZMemoryViewSliceTypeNoder|  r   )	rM   Zsrc_noderl   ry   rt  r  rV  Zmemslicenoder   rP   rP   rQ   r}  ;,  s&     
zCythonArrayNode.from_carray)rU   rV   rW   rF  r   r  r   r  r  r   r  r  r   r2  r~   r  rD  r  r}  rP   rP   rP   rQ   r|  u+  s   h2r|  c                   @   s"   e Zd ZejZdd Zdd ZdS )
SizeofNodec                 C   s   dS r  rP   rR   rP   rP   rQ   r   X,  s    zSizeofNode.check_constc                 C   s   d S rI   rP   r;  rP   rP   rQ   rD  [,  s    zSizeofNode.generate_result_codeN)rU   rV   rW   r   r  r   r   rD  rP   rP   rP   rQ   r  S,  s   r  c                   @   s,   e Zd Zg ZdZdd Zdd Zdd ZdS )r  Nc           
      C   s   dr| j jr| j j}||d }|jd krt| j|d d}|dd  D ]}t| j||d}qJt| j|| j jd}t| j|d	|}|S | j
d kr| j |}| j||\}}	|	| _
|   | S )Nr   )ry   rk   r%   )ry   r  r  r*  )rt  module_pathr  r_  ry  ry   r  rk   SizeofVarNoder   r  rQ  r  
check_type)
rS   rl   r4  r  r*  r  r{   rt  r  r  rP   rP   rQ   r   h,  s     

zSizeofTypeNode.analyse_typesc                 C   sX   | j }|sd S |jr(|js(t| jd n,|jr<t| jd n| sTt| jd|  d S )Nz Cannot take sizeof Python objectzCannot take sizeof voidz'Cannot take sizeof incomplete type '%s')r  rj   rD  r   ry   r-  is_complete)rS   r  rP   rP   rQ   r  |,  s    zSizeofTypeNode.check_typec                 C   s,   | j jr| j jddd}n
| j  }d| S )Nrk  r%   )Zderef(sizeof(%s)))r  rD  r   r?  )rS   rL  rP   rP   rQ   r   ,  s    
z$SizeofTypeNode.calculate_result_code)rU   rV   rW   r   r  r   r  r   rP   rP   rP   rQ   r  _,  s
   r  c                   @   s*   e Zd ZdgZdd Zdd Zdd ZdS )	r  r*  c                 C   sx   | j |}|rf|| _| jjrVz| j|j| _W n" tk
rT   t| j jd Y nX t	| _
|   n| j || _ | S )NzLType cannot be specialized since it is not a fused argument to this function)r*  r  r  r  r  r  r&   r   ry   r  rO   r  r   )rS   rl   Zoperand_as_typerP   rP   rQ   r   ,  s    

zSizeofVarNode.analyse_typesc                 C   s   d| j   S )Nr  r  rR   rP   rP   rQ   r   ,  s    z#SizeofVarNode.calculate_result_codec                 C   s   d S rI   rP   r;  rP   rP   rQ   rD  ,  s    z"SizeofVarNode.generate_result_codeN)rU   rV   rW   r   r   r   rD  rP   rP   rP   rQ   r  ,  s   r  c                   @   sR   e Zd ZdgZdZdZdZdd ZdZdd Z	d	d
 Z
dd Zdd Zdd ZdS )
TypeidNoder*  Nr%   c                 C   s<   |}|j s|j}q|d| j}|d}tt|jS )Nzlibcpp.typeinfor  )	rS  r  find_modulery   r  r   r?  Zc_const_typer   )rS   rl   Z
env_moduleZtypeinfo_moduleZtypeinfo_entryrP   rP   rQ   get_type_info_type,  s    
zTypeidNode.get_type_info_typeztypeid operatorc                 C   s   | j stj| _ | | | |}|s4| d | S | jd krB| S || _ | j|}|rl|| _d| _	d | _nl| j
|| _d| _	d | _| jj jr| d | S | jj jr| d | S | jj  s| d| jj   | S |tdd | S )	NzKThe 'libcpp.typeinfo' module must be cimported to use the typeid() operatorTFz$Cannot use typeid on a Python objectzCannot use typeid on voidz)Cannot use typeid on incomplete type '%s'rw  rL  )r   r   r,   r<  r  r   r*  r  r  r  r   rj   r-  r  r   r   r   )rS   rl   r  Zas_typerP   rP   rQ   r   ,  s:    







zTypeidNode.analyse_typesc                 C   s   t | j| tj| _d| _d S r  r  r  rP   rP   rQ   r   ,  s    zTypeidNode.errorc                 C   s   dS r  rP   rR   rP   rP   rQ   r   ,  s    zTypeidNode.check_constc                 C   s   | j S rI   rD  rR   rP   rP   rQ   r   ,  s    z TypeidNode.calculate_result_codec                 C   s@   | j r| j }n
| j }t|| jd| j|f d d | j d S )Nz%s = typeid(%s);)r  r  r?  r   r   ry   r   r@  )rS   r   rL  rP   rP   rQ   rD  ,  s    
  zTypeidNode.generate_result_code)rU   rV   rW   r   r  ri  r   r  Zcpp_messager   r   r   r   rD  rP   rP   rP   rQ   r  ,  s    r  c                   @   sB   e Zd ZdZeZdgZdd Zdd Zdd Z	d	d
 Z
dd ZdS )
TypeofNodeNr  c                 C   sH   | j || _ tt| j j}t| j|d}||}||| _	| S )Nr  )
r*  r   r	   r  rp   r   r.  ry   r  r  )rS   rl   r   r  rP   rP   rQ   r   -  s    
zTypeofNode.analyse_typesc                 C   s   | j || _ | j jS rI   )r*  r   r   r   rP   rP   rQ   r  -  s    zTypeofNode.analyse_as_typec                 C   s   dS r"  rP   rR   rP   rP   rQ   r  -  s    zTypeofNode.may_be_nonec                 C   s   | j | d S rI   )r  rI  r;  rP   rP   rQ   rI  -  s    z#TypeofNode.generate_evaluation_codec                 C   s
   | j  S rI   )r  r   rR   rP   rP   rQ   r   -  s    z TypeofNode.calculate_result_code)rU   rV   rW   r  r   r   r   r   r  r  rI  r   rP   rP   rP   rQ   r  ,  s   r  c                 C   s0   z
| j }W n tk
r$   |j}Y nX || |S rI   )
__matmul__r   __rmatmul__)r9  br  rP   rP   rQ   matmul_operator%-  s
    
r  c                 C   s   | |kS rI   rP   xseqrP   rP   rQ   r  B-  r  rj  c                 C   s   | |kS rI   rP   r  rP   rP   rQ   r  C-  r  )<<===r  >=>r  is_notr   r	  ///<<%r   rc  **>>r  ^@innot_inc                 C   s&   t | j}|s"t| jd| j  |S )Nz4Binary '%s' not supported in compile-time expression)compile_time_binary_operatorsrc   r
   r   ry   )r{   r  rP   rP   rQ   get_compile_time_binopF-  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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 fd$d%Zd&d' Zd(d) Z  ZS )*	BinopNoder  r  Fc                 C   s"   t | j }|| jj| jj| _d S rI   )r  r
   r  rw   r  r  rP   rP   rQ   r   _-  s
    
z#BinopNode.calculate_constant_resultc              
   C   s^   t | }| j|}| j|}z|||W S  tk
rX } z| | W 5 d }~X Y nX d S rI   )r  r  r   r  rJ  r   )rS   r   r  r  r  r   rP   rP   rQ   r   e-  s    zBinopNode.compile_time_valuec                 C   s   |  | j|| j||S rI   )r  r  r~   r  r   rP   rP   rQ   r~   n-  s    
 zBinopNode.infer_typec                 C   s*   | j || _ | j|| _| | | S rI   )r  r   r  r  r   rP   rP   rQ   r   r-  s    
zBinopNode.analyse_typesc                 C   s   |  |r6| | jj| jj|| _| jjs.td| _n\|  rt| 	| | | jj| jj|| _| jj
sltd| _n|  r| | n
| | d S r  )r  r  r  r   r  r9   r   r   r  coerce_operands_to_pyobjectsrj   r  r  r  r   rP   rP   rQ   r  x-  s$    

 

 zBinopNode.analyse_operationc                 C   s   |  | jj| jjS rI   )is_py_operation_typesr  r   r  rR   rP   rP   rQ   r  -  s    zBinopNode.is_py_operationc                 C   s   |j p|j p|jp|jS rI   )rj   r  rS   type1type2rP   rP   rQ   r  -  s    zBinopNode.is_py_operation_typesc                 C   s   |  | jj| jj|S rI   )is_pythran_operation_typesr  r   r  r   rP   rP   rQ   r  -  s    zBinopNode.is_pythran_operationc                 C   s(   t |o&t|o&t|o&t|p&t|S rI   )r=   r8   r9   )rS   r  r  rl   rP   rP   rQ   r  -  s
    z$BinopNode.is_pythran_operation_typesc                 C   s   | j jjp| jjjS rI   r  r   r   r  rR   rP   rP   rQ   r  -  s    
zBinopNode.is_cpp_operationc                 C   s   | | j| j| jg}|s&|   d S |j}|j| _|j| _| jdkrfd| _t	| rf|
tdd |jrr|j}t|jdkr| j|jd j|| _n0| j|jd j|| _| j|jd j|| _|j| _d S )Nr   r%   rw  rL  r   )r_  r
   r  r  r  r   r   r   r   r   r   r   r   rs  rt  r   r   rz  r  )rS   rl   r   rx  rP   rP   rQ   r  -  s$    
zBinopNode.analyse_cpp_operationc                 C   s   |  |||r tt| j||S | ||r|jr:tj}n|jrFtj	}|jrTtj}n|jr`tj	}|j
sl|j
r||kr| jdkr|S | ||}|d k	r|S tS |js|jrtjS | ||S d S )Nz**%+|&^)r  rE   r;   r
   r  rE  r   r   rF  r   rE  infer_builtin_types_operationr   r~  r   r,   compute_c_result_type)rS   r  r  rl   r  rP   rP   rQ   r  -  s*    zBinopNode.result_typec                 C   s   d S rI   rP   r  rP   rP   rQ   r  -  s    z'BinopNode.infer_builtin_types_operationc                 C   s   |   r|   d S rI   r  r   rP   rP   rQ   r   -  s    zBinopNode.nogil_checkc                 C   s    | j || _ | j|| _d S rI   )r  r  r  r   rP   rP   rQ   r  -  s    z&BinopNode.coerce_operands_to_pyobjectsc                 C   s   | j  o| j S rI   r  r   r  rR   rP   rP   rQ   r   -  s    zBinopNode.check_constc                    s"   t t|  p | j p | j S rI   )rK   r  r   r  r  rR   rN   rP   rQ   r   -  s
    zBinopNode.is_ephemeralc                 C   s  | j j}| jj}| jjr|d |d|    | jdkrj|d|  |  | j  | j f  n.|d|  |  | j  | j| j f  n
|js|jr2| 	|}| jdkrdnd}|jr| j 
 n| j  }|jr| j
 n| j }|d|  ||||||  | jf  | | nt| jr|  r| jd	krt|| jd
|  |  f | jjr||  nd | j| j n|d
|  |  f  d S )Nz// Pythran binopr  r  zBnew (&%s) decltype(%s){pythonic::numpy::functor::power{}(%s, %s)};z!new (&%s) decltype(%s){%s %s %s};z	, Py_Nonerk  r  r   r  )r  r   r  r9   r   r   r
   r   rj   r  r   r   ry   rd  r   r  r   r   r   r   r@  )rS   r   r  r  r  
extra_argsZ
op1_resultZ
op2_resultrP   rP   rQ   rD  -  sX    



 zBinopNode.generate_result_codec                 C   s@   | j jjs4| jjjs4t| jd| j| j j| jjf  tj| _d S )Nz'Invalid operand types for '%s' (%s; %s))	r  r   r~  r  r   ry   r
   r   r,   rR   rP   rP   rQ   r  
.  s    

zBinopNode.type_error)rU   rV   rW   r   r  r   r   r~   r   r  r  r  r  r  r  r  r  r  r   r  r   r   rD  r  rX   rP   rP   rN   rQ   r  O-  s*   	,r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )

CBinopNodec                 C   s    t | |}| rtj|_|S rI   )r  r   r  r   r,   r   r   rP   rP   rQ   r   .  s    zCBinopNode.analyse_typesc                 C   s   dS r  rP   r;  rP   rP   rQ   r  .  s    z CBinopNode.py_operation_functionc                 C   s   d| j  | j| j f S N
(%s %s %s))r  r   r
   r  rR   rP   rP   rQ   r   .  s
    z CBinopNode.calculate_result_codec                 C   sD   d }|j s|jr|| j|}|d kr@|j s2|jr@|| j|}|S rI   )r   rs  r  r
   )rS   r  r  r  rP   rP   rQ   r  $.  s    z CBinopNode.compute_c_result_typeN)rU   rV   rW   r   r  r   r  rP   rP   rP   rQ   r  .  s   r  c                    s    fdd}|S )Nc                    s   t | fd i|S )Nr
   )r  )ry   ra  r
   rP   rQ   make_binop_node/.  s    z,c_binop_constructor.<locals>.make_binop_noderP   )r
   r  rP   r  rQ   c_binop_constructor..  s    r  c                       s   e Zd ZdZdZdZdd Zdd Z fdd	Zd
d Z	dd Z
 fddZdd Zdd Zdd Zddddddddddd d!d"d#Zd$d%d&d'd(Z  ZS ))NumBinopNodeTFNc                 C   s   | j j}| jj}| ||| _| js0|   d S | jjr>d| _| jjr|jd r| j	| j
kr| j	dkr| j  r| j s| j| j  | _ | _d| _|jd | _| jj| j
| j	 || j d| _d| _| jr|jr|jr| j | j|| _ | j| j|| _d S )NFr7  )r   r   Tzoverflowcheck.fold)Z	const_rhs)r  r   r  r  r  r  r  r  rd   r
   overflow_op_namesr   overflow_checkZoverflow_foldZoverflow_check_binopr  r   r  rz  rS   rl   r  r  rP   rP   rQ   r  :.  s<    


z NumBinopNode.analyse_c_operationc                 C   sN   |  ||rFt||}|tjkr4| jdkrBtj}nt|tj}|S d S d S )Nz|^&)c_types_okayr   r  r  r
   rG  rS   r  r  Zwidest_typerP   rP   rQ   r  U.  s    

 z"NumBinopNode.compute_c_result_typec                    sH   | j r| j jrdS | jj }| jj }|r:|jr:|r:|jr:dS tt|  S r"  )r   rE  r  r  rK   r   r  r  rN   rP   rQ   r  c.  s    zNumBinopNode.may_be_nonec                 C   s4   | j  }| j }|r,|r,d|| j|f S d S d S r  )r  r   r  r
   )rS   Zvalue1Zvalue2rP   rP   rQ   r   p.  s
    

z'NumBinopNode.get_constant_c_result_codec                 C   s   |j s|jo|j p|jS rI   )r  r  r  rP   rP   rQ   r$  x.  s    
zNumBinopNode.c_types_okayc                    s   | j r0| | _|jjtjdd| _|d| j  tt	| 
| | j r|d| j  |d ||| j |d |j| j d S )NFr*  rO  r  z8PyErr_SetString(PyExc_OverflowError, "value too large");r   )r"  overflow_bit_noder/  r0  r   rG  overflow_bitr   rK   r   rI  r   ry   r8  r;  rN   rP   rQ   rI  }.  s    

z%NumBinopNode.generate_evaluation_codec                 C   s   | j d k	r,d| j| j | j | j jf S | jjs:| jrt	| jr\| j
 | j
  }}n| j | j  }}d|| j|f S | j| j}|d krt| jd| j| jf  d|| j | j f S d S )Nz%s(%s, %s, &%s)r  z'binary operator %s not supported for %sr  )r&  r  r  r   r  r'  r   r   r  r9   r   r
   	binary_opr   ry   )rS   result1result2r  rP   rP   rQ   r   .  s(    

z"NumBinopNode.calculate_result_codec                 C   s   |j p|j pt| ||S rI   )r  r  r  r  rP   rP   rQ   r  .  s
    z"NumBinopNode.is_py_operation_typesc                 C   s"   | j | j }| jr|dd}|S )NZ	PyNumber_ZPyNumber_InPlace)py_functionsr
   r  r  )rS   r   rR  rP   rP   rQ   r  .  s    z"NumBinopNode.py_operation_functionZPyNumber_OrZPyNumber_XorZPyNumber_AndZPyNumber_LshiftZPyNumber_RshiftZPyNumber_AddZPyNumber_SubtractZPyNumber_MultiplyZ__Pyx_PyNumber_MatrixMultiplyZ__Pyx_PyNumber_DivideZPyNumber_FloorDivideZPyNumber_RemainderZPyNumber_Power)rc  r  r	  r  r  r   r  r   r	  r  r  r  r  rn  rW  mullshift)r   r  r   r  )rU   rV   rW   r  r"  r&  r  r  r  r   r$  rI  r   r  r  r+  r!  rX   rP   rP   rN   rQ   r   3.  s>   r   c                   @   s   e Zd Zdd ZdS )IntBinopNodec                 C   s   |j s|jo|j p|jS rI   )r  r  r  rP   rP   rQ   r$  .  s    
zIntBinopNode.c_types_okayN)rU   rV   rW   r$  rP   rP   rP   rQ   r.  .  s   r.  c                       s4   e Zd Zdd Zdd Zdd Z fddZ  ZS )	AddNodec                 C   s.   |j r|j s|jr|jrdS t| ||S d S r  )rE  rF  r   r  r  rP   rP   rQ   r  .  s    zAddNode.is_py_operation_typesc                 C   s<   t ttttf}||kr8||kr8|t|||| S d S rI   )r   r   r   r/   r   r3  r  )rS   r  r  string_typesrP   rP   rQ   r  .  s    z%AddNode.infer_builtin_types_operationc                 C   sJ   |j s|jr|js|jr|S |j s(|jr8|js4|jr8|S t| ||S d S rI   )rs  r
  r  r  r   r  r  rP   rP   rQ   r  .  s      zAddNode.compute_c_result_typec                    s  | j j| jj }}d }|tks&|tkr|ttfkrD|ttfkrDd}n"t| j ts\t| jtrbd}nd}|r| jsx| j jr|j	
tdd d}n(|tkr|tkr|j	
tdd d}|r| js| j jr|d7 }| j  s| j r|d	7 }|S tt| |S )
NTFZUnicodeConcatInPlacer  Z__Pyx_PyUnicode_ConcatZStrConcatInPlaceZ__Pyx_PyStr_ConcatZInPlaceZSafe)r  r   r  r   r   rv   r4  r  r   r   r   r   r   r  rK   r/  r  )rS   r   r  r  r  Zis_unicode_concatrN   rP   rQ   r  .  s4    

zAddNode.py_operation_function)rU   rV   rW   r  r  r  r  rX   rP   rP   rN   rQ   r/  .  s   	
r/  c                   @   s   e Zd Zdd ZdS )SubNodec                 C   sL   |j s|jr|js|jr|S |j s(|jr:|j s4|jr:tjS t| ||S d S rI   )rs  r
  r  r  r   Zc_ptrdiff_t_typer   r  r  rP   rP   rQ   r  /  s      zSubNode.compute_c_result_typeN)rU   rV   rW   r  rP   rP   rP   rQ   r1  
/  s   r1  c                       sd   e Zd ZdZdd Zedd Zdd Zdd	 Z fd
dZ	 fddZ
 fddZdd Z  ZS )MulNodeFc                 C   s   | j || _ | j|| _|  | _| jrt| j }| j}|jrV|jd krV| |||S |jrt|jd krt| |||S | | | S rI   )	r  r   r  calculate_is_sequence_mulis_sequence_mulr   r   analyse_sequence_mulr  rS   rl   r  r  rP   rP   rQ   r   /  s    

zMulNode.analyse_typesc                 C   s   | j o| tko| tk	S rI   )rE  r"   r!   rp  rP   rP   rQ   is_builtin_seqmul_type,/  s    zMulNode.is_builtin_seqmul_typec                 C   sX   | j j}| jj}|tks|jr(|| }}|tks6|jrT|jsB|jrFdS | |rTdS dS r  )r  r   r  r0   r  rE  r  r7  r  rP   rP   rQ   r3  0/  s    

z!MulNode.calculate_is_sequence_mulc                 C   s(   |j d kst||}||_ ||S rI   )r   r   r  r   )rS   rl   r  ZmultrP   rP   rQ   r5  =/  s    
zMulNode.analyse_sequence_mulc                    sP   | j r<| jjjr | j|| _n| jjjr8| j|| _d S tt| | d S rI   )	r4  r  r   r  r  r  rK   r2  r  r   rN   rP   rQ   r  C/  s    

z$MulNode.coerce_operands_to_pyobjectsc                    s   | j ptt| ||S rI   )r4  rK   r2  r  r  rN   rP   rQ   r  M/  s    zMulNode.is_py_operation_typesc                    s<   | j r,|jtdd | jjjr(dS dS tt	| 
|S )Nr  r  Z__Pyx_PySequence_MultiplyZ__Pyx_PySequence_Multiply_Left)r4  r   r   r   r   r  r   rj   rK   r2  r  r;  rN   rP   rQ   r  P/  s    
zMulNode.py_operation_functionc                 C   s@   |j r(|j r(| |r|S | |r(|S |jr2|S |jr<|S d S rI   )rE  r7  r  r  rP   rP   rQ   r  W/  s    

z%MulNode.infer_builtin_types_operation)rU   rV   rW   r4  r   staticmethodr7  r3  r5  r  r  r  r  rX   rP   rP   rN   rQ   r2  /  s   

r2  c                       s$   e Zd Zdd Z fddZ  ZS )MatMultNodec                 C   s   dS r  rP   r  rP   rP   rQ   r  k/  s    z!MatMultNode.is_py_operation_typesc                    s(   |j tdd tt| | d S )NZMatrixMultiplyr  )r   r   r   r   rK   r9  rI  r;  rN   rP   rQ   rI  n/  s    z$MatMultNode.generate_evaluation_code)rU   rV   rW   r  rI  rX   rP   rP   rN   rQ   r9  h/  s   r9  c                   @   sx   e 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S )DivNodeNFc                 C   s>   t | j }| jdkr:| jd kr:t|tr:t|tr:t d }|S )Nr  r  )r  r
   truedivisionrv   r#   rS   op1op2r  rP   rP   rQ   !find_compile_time_binary_operator|/  s
    
z)DivNode.find_compile_time_binary_operatorc                 C   s4   | j j}| jj}| ||}|| j j| jj| _d S rI   )r  rw   r  r?  r<  rP   rP   rQ   r   /  s    z!DivNode.calculate_constant_resultc              
   C   sb   | j |}| j|}z| ||}|||W S  tk
r\ } z| | W 5 d }~X Y nX d S rI   )r  r   r  r?  rJ  r   )rS   r   r  r  r  r   rP   rP   rQ   r   /  s     zDivNode.compile_time_valuec                 C   s$   | j s|jd rd| _n| j| _d S )N	cdivisionF)r@  rd   ctruedivisionr;  r   rP   rP   rQ   _check_truedivision/  s    zDivNode._check_truedivisionc                 C   s(   |  | | | j|| j||S rI   )rB  r  r  r~   r  r   rP   rP   rQ   r~   /  s    


 zDivNode.infer_typec                 C   s   |  | t| | |  r$d| _| jjs| jd koX|jd  oX| j	  pX| jj
dk| _| jsl|jd r| j|| _| j|| _d S )NTr@  r   cdivision_warnings)rB  r   r  r  r@  r   rj   rd   r  r   rw   zerodivision_checkr  r  r   rP   rP   rQ   r  /  s    

zDivNode.analyse_operationc                 C   sT   | j dkrF| jrF|jsF|jsF|jsF|jsFt|tj}t||}|S t| ||S )Nr  )	r
   rA  r   r  r   r  r  r   r  r%  rP   rP   rQ   r  /  s    zDivNode.compute_c_result_typec                 C   s   | j jrdS dS d S )N"integer division or modulo by zerozfloat divisionr  rR   rP   rP   rQ   zero_division_message/  s    zDivNode.zero_division_messagec                 C   s   | j jsl| j jsl| jd krJ|jjd pF| j jpF| j js>| j joF| j j	 | _| jsl|j
tdd| j  t| | | | d S )Nr@  ZDivIntCMath.c)r   rj   r  r@  r   rd   r  r  r  rs  r   r   r   r  r   rI  generate_div_warning_coder;  rP   rP   rQ   rI  /  s    
z DivNode.generate_evaluation_codec                 C   sb  | j }| jjs^| jrp| js:d| jd| j f }nd| j  }|d|  |rb|	  |d| 
   |r|  ||| j |d | jjrp| jjrp| jdkrp|jtdd	 | jjjd
krd| j  }n | jj }d|| j |f }|d| j || j f  |r<|	  |d |rT|  ||| j |d |jjd r^| jdkr^|jtdd |d| j | j f  dtjtjd }|r d}|d|  |	  ||j| jdd |d||f  |  n|}||j| jdd |d|  ||j |d d S )Nr  Zzeroz%s == 0r  z/PyErr_SetString(PyExc_ZeroDivisionError, "%s");r   r  ZUnaryNegOverflowsrN  r2   zunlikely(%s == -1)z+(!(((%s)-1) > 0)) && unlikely(%s == (%s)-1)z]else if (sizeof(%s) == sizeof(long) && %s  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(%s))) {zLPyErr_SetString(PyExc_OverflowError, "value too large to perform division");rC  r  ZCDivisionWarningrG  z$if (unlikely((%s < 0) ^ (%s < 0))) {z1__Pyx_cdivision_warning(%(FILENAME)s, %(LINENO)s))ZFILENAMEZLINENOr   zint %s;T)rw  r  zif (unlikely(%s)) )r@  r   rj   rD  r  r  r  r   r   r   rF  r   r   ry   r  rs  r
   r   r   r   r   r?  r  rd   r   Zfilename_cnameZlineno_cnameZset_error_infor  r  r  )rS   r   Zin_nogilZ	zero_testZminus1_checkZtype_of_op2Zwarning_coder  rP   rP   rQ   rH  /  sz    

   



z!DivNode.generate_div_warning_codec                 C   s   | j js|  rt| S | j jrD| jdkrDd| j | j	 f S | j
sP| jr| j }| j	 }| j
r| j | jj kr| j |}| j | j	j kr| j |}d||f S d| j  | j | j	 f S d S )Nr  zfloor(%s / %s)z	(%s / %s)z__Pyx_div_%s(%s, %s))r   r  r  r   r   r  r
   r  r   r  r;  r@  rU  specialization_name)rS   r=  r>  rP   rP   rQ   r   0  s*    


zDivNode.calculate_result_code)rU   rV   rW   r@  r;  rA  rC  rD  r?  r   r   rB  r~   r  r  rF  rI  rH  r   rP   rP   rP   rQ   r:  s/  s    
?r:  s'   %(?:%|(?:\([^)]+\))?[-+#,0-9 ]*([a-z]))   d   i   o   u   x   X   e   E   f   F   g   G   c   b   ac                       sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Z fddZ	  Z
S )ModNodec                 C   s   |j p|j pt| ||S rI   )rE  r   r  r  rP   rP   rQ   r  40  s
    zModNode.is_py_operation_typesc                 C   s   |t kr|js| j s|S nn|tttfkr|t kr8|S |jrB|S | jjrv|tksZ|tkrrt	t
| jjtkrr|S tS |tkr|jsd S tS d S rI   )r   rE  r  r  r   r   r/   r  r  rm  _find_formatting_typesr   _safe_bytes_formatsr  rP   rP   rQ   r  90  s"    z%ModNode.infer_builtin_types_operationc                 C   s   | j jrdS dS d S )NrE  zfloat divmod()r  rR   rP   rP   rQ   rF  O0  s    zModNode.zero_division_messagec                 C   s`   t | | | jjs\| jd kr4|jd p0| jj | _| js\| jjs\| jjs\t	| j
d| j  d S )Nr@  z(mod operator not supported for type '%s')r:  r  r   rj   r@  rd   rs  r  r  r   ry   r   rP   rP   rQ   r  U0  s    
zModNode.analyse_operationc                 C   sr   | j jsX| jsX| j jr4|jtdd| j  n$|jtddj| j | j j	d t
| | | | d S )NZModIntrG  ZModFloat)math_h_modifier)r   rj   r@  r  r   r   r   r   r  r\  r   rI  rH  r;  rP   rP   rQ   rI  ]0  s     z ModNode.generate_evaluation_codec                 C   sj   | j rF| jjr,d| jj| j | j f S d| j | j f S n d| j | j | j f S d S )Nzfmod%s(%s, %s)z
(%s %% %s)z__Pyx_mod_%s(%s, %s))r@  r   r  r\  r  r   r  rI  rR   rP   rP   rQ   r   j0  s     zModNode.calculate_result_codec                    s   | j j| jj }}|tkrR| j  sH|jr4||sH|tkrLt| jt	sLdS dS n>|t
kr| j  s|jrt||s|tkrt| jt	sdS dS tt| |S )NZ__Pyx_PyUnicode_FormatSafeZPyUnicode_FormatZ__Pyx_PyString_FormatSafeZ__Pyx_PyString_Format)r  r   r  r   r  rD  r  r   rv   r  r   rK   rY  r  )rS   r   r  r  rN   rP   rQ   r  {0  s4    



zModNode.py_operation_function)rU   rV   rW   r  r  rF  r  rI  r   r  rX   rP   rP   rN   rQ   rY  10  s   rY  c                       sl   e Zd ZdZdZdd Z fddZ fddZd	d
 Z fddZ	dd Z
 fddZ fddZ  ZS )PowNodeNFc                 C   s   | j d k	rd S |jd | _ d S )NZcpow)is_cpowrd   r   rP   rP   rQ   _check_cpow0  s    
zPowNode._check_cpowc                    s   |  | tt| |S rI   )r_  rK   r]  r~   r   rN   rP   rQ   r~   0  s    
zPowNode.infer_typec                    s   |  | tt| |S rI   )r_  rK   r]  r   r   rN   rP   rQ   r   0  s    
zPowNode.analyse_typesc                 C   s   t | | | jjrf| jjjrR| j| j|| _| j| j|| _| j	d| _
qt| jd d| _
n| jjr~d| jj | _
nx| jjrd| j dd | _
|tdd	j| j
| j | jjrd
pdd n$| jjst| jd| jj| jjf  d S )Nr  z complex int powers not supportedr  powz__Pyx_pow_%sr}  r  ZIntPowrG  r%   r   )rd  r   rs  z1got unexpected types for C power operator: %s, %s)r   r  r   r  r  r  r  rz  r  r(  pow_funcr   ry   r\  r  r?  r  r   r   r   r  rs  r~  r   rP   rP   rQ   r  0  s.    
zPowNode.analyse_c_operationc                    s8  ddl m} d }| j r&| jjdkp4|jo4|jdk}|jpf| j oft| jj|oft	| jj| jjk}d}| j
rtt| ||}| j st| jjto| jjdk }nv|s|rtt| ||}| j s|jo|j}|rd| _nt| jjto| jjdk }n| ||r tj}d| _|r4t|tj}|S )Nr   )RealFT)Znumbersrb  r  r   rw   r  rs  r  rv   r  r^  rK   r]  r  r#   type_was_inferredr$  r   r  r  r  )rS   r  r  rb  Zc_result_typeZop1_is_definitely_positiveZtype2_is_intZneeds_wideningrN   rP   rQ   r  0  sB    





zPowNode.compute_c_result_typec                    s(    fdd}d j | j| jf S )Nc                    s(    j | j kr|  S  j |  S d S rI   )r   r   rU  r  rR   rP   rQ   r+   0  s    z/PowNode.calculate_result_code.<locals>.typecastr  )ra  r  r  )rS   r+   rP   rR   rQ   r   0  s    zPowNode.calculate_result_codec                    s`   | j jrP| jjdkrPt| jjtrP| jj tkrP|j	t
dd | jrLdS dS tt| |S )Nr2   ZPyNumberPow2r  Z__Pyx_PyNumber_InPlacePowerOf2Z__Pyx_PyNumber_PowerOf2)r   rj   r  rw   rv   r#   r  r   r   r   r   r   r  rK   r]  r  r;  rN   rP   rQ   r  0  s    

zPowNode.py_operation_functionc           	         s   || j kr| S | jd kr| jr|js*|jr| j tjkrJd	 fdd	 d}n|jr^dd  d}ndd   | j\}} | j\}}|r|rt	| j
d|  d| _|| _|| _| |}|j |kr|||}|S tt| ||S )
NTc                    s>   | j js| j jrd| fS |r:t| tr: | jdd| jfS dS )NTF)recurseFN)r   r  r  rv   r  r  )r*  rd  check_typesrP   rQ   rg  1  s
    z&PowNode.coerce_to.<locals>.check_typesza non-complex C numeric typec                 S   s   | j jrd| fS dS d S )NTre  r  r  rP   rP   rQ   rg  1  s    zan integer C numeric typec                 S   s   dS )Nre  rP   r  rP   rP   rQ   rg  1  s    zTreating '**' as if 'cython.cpow(True)' since it is directly assigned to a %s. This is likely to be fragile and we recommend setting 'cython.cpow' explicitly.)T)r   r^  rc  r  r  r   r  r  r  r   ry   r   rz  rK   r]  )	rS   r  rl   Z
msg_detailZ	check_op1r=  Z	check_op2r>  r   rN   rf  rQ   rz  0  s8    


zPowNode.coerce_to)rU   rV   rW   r^  rc  r_  r~   r   r  r  r   r  rz  rX   rP   rP   rN   rQ   r]  0  s   *r]  c                   @   s   e Zd ZdZddg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Zdd  Zd!d" Zd#d$ Zd%d& ZdS )'BoolBinopNodeag  
    Short-circuiting boolean operation.

    Note that this node provides the same code generation method as
    BoolBinopResultNode to simplify expression nesting.

    operator  string                              "and"/"or"
    operand1  BoolBinopNode/BoolBinopResultNode   left operand
    operand2  BoolBinopNode/BoolBinopResultNode   right operand
    r  r  TNc                 C   s$   | j |}| j|}t||S rI   )r  r~   r  r   independent_spanning_typer#  rP   rP   rQ   r~   :1  s    zBoolBinopNode.infer_typec                 C   s,   | j dkr| j S | j p&| j S d S )Nor)r
   r  r  r  rR   rP   rP   rQ   r  ?1  s    

zBoolBinopNode.may_be_nonec                 C   s4   | j j}| jj}| jdkr&|o || _n
|p,|| _d S Nand)r  rw   r  r
   )rS   r  r  rP   rP   rQ   r   E1  s
    
z'BoolBinopNode.calculate_constant_resultc                 C   s6   | j |}| j|}| jdkr*|o(|S |p0|S d S rk  )r  r   r  r
   )rS   r   r  r  rP   rP   rQ   r   M1  s
    
z BoolBinopNode.compile_time_valuec                 C   s   | j  p| j S rI   )r  r   r  rR   rP   rP   rQ   r   U1  s    zBoolBinopNode.is_ephemeralc                 C   sJ   | j |}| j|}t|j|j| _| ||| _ | ||| _| S rI   )r  r   r  r   ri  r   _wrap_operandr6  rP   rP   rQ   r   X1  s     zBoolBinopNode.analyse_typesc                 C   s    t |ttfst|| j|}|S rI   )rv   rh  BoolBinopResultNoder   )rS   r*  rl   rP   rP   rQ   rm  d1  s    zBoolBinopNode._wrap_operandc                 C   s$   |  | j|| _|  | j|| _dS )z
        Must get called by transforms that want to create a correct BoolBinopNode
        after the type analysis phase.
        N)rm  r  r  r   rP   rP   rQ   wrap_operandsi1  s    zBoolBinopNode.wrap_operandsc                 C   s   |  tj|S rI   rz  r   r  r   rP   rP   rQ   r  q1  s    zBoolBinopNode.coerce_to_booleanc                 C   s2   | j ||}| j||}tj| || j||dS )N)r   r
   r  r  )r  rz  r  rh  r  r
   )rS   r  rl   r  r  rP   rP   rQ   rz  t1  s      zBoolBinopNode.coerce_toc           
   	   C   s   | | j ||f}| jdkr.|d }	}n|d }	}| j|||||||	 |\}}||	 | j||||||| d S )Nrl  Znext_andZnext_or)rC  ry   r
   r  r  generate_bool_evaluation_coder  r  )
rS   r   final_result_tempfinal_result_type	and_labelor_label	end_labelfall_throughZouter_labelsZmy_labelrP   rP   rQ   rq  |1  s2    
      
      z+BoolBinopNode.generate_bool_evaluation_codec              	   C   sX   |  | | jjrtjn| j}d  }}|d}| ||  ||||| || d S )NZbool_binop_done)	r2  r   rj   r   r   r  rq  r   r  )rS   r   r  ru  rt  rv  rP   rP   rQ   rI  1  s    

z&BoolBinopNode.generate_evaluation_codeTruth-testing Python objectc                 C   s   | j  o| j S rI   r  rR   rP   rP   rQ   r   1  s    zBoolBinopNode.check_constc                 C   s   d S rI   rP   r;  rP   rP   rQ   rG  1  s    z,BoolBinopNode.generate_subexpr_disposal_codec                 C   s   d S rI   rP   r;  rP   rP   rQ   rH  1  s    z BoolBinopNode.free_subexpr_tempsc              	   C   sV   | j jr@|jjtjdd}|d|| j |	|| j
f  n
| j }|| j jfS NFr*  "%s = __Pyx_PyObject_IsTrue(%s); %s)r   rj   r/  r0  r   r  r   r  r   r  ry   r   rS   r   test_resultrP   rP   rQ   generate_operand1_test1  s     
z$BoolBinopNode.generate_operand1_test)rU   rV   rW   rF  r   r   r
   r  r  r~   r  r   r   r   r   rm  ro  r  rz  rq  rI  r:  r   rG  rH  r}  rP   rP   rP   rQ   rh  )1  s.   
rh  c                       sd   e Zd ZdZddgZdZd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  ZS )rn  a  
    Intermediate result of a short-circuiting and/or expression.
    Tests the result for 'truthiness' and takes care of coercing the final result
    of the overall expression to the target type.

    Note that this node provides the same code generation method as
    BoolBinopNode to simplify expression nesting.

    arg     ExprNode    the argument to test
    value   ExprNode    the coerced result value node
    r  r   TNc                    s<   | |}t|}tt| j|j||t|||d d S )N)r  r   r   )r  	ProxyNoderK   rn  r  ry   r  rz  )rS   r  r  rl   rN   rP   rQ   r  1  s    

  zBoolBinopResultNode.__init__c                 C   s   |  tj|S rI   rp  r   rP   rP   rQ   r  1  s    z%BoolBinopResultNode.coerce_to_booleanc                 C   s(   | j j }|tjkr||}t|||S rI   )r  r   r  r  rn  )rS   r  rl   r  rP   rP   rQ   rz  1  s    

zBoolBinopResultNode.coerce_toc                 C   s   d S rI   rP   r   rP   rP   rQ   r   1  s    zBoolBinopResultNode.nogil_checkc              	   C   sZ   | j jjrB|jjtjdd}|d|| j  |	|| j
f  n
| j  }|| j jjfS ry  )r  r   rj   r/  r0  r   r  r   r   r  ry   r   r{  rP   rP   rQ   generate_operand_test1  s    
 
z)BoolBinopResultNode.generate_operand_testc                 C   s  | | j | j| |s |r| |\}}	|	rF|rF|rF| j| |rNdnd}
|d|
|f  |	rt|j| |	r|r|s| j| |r||kr|	| |r|r|d |	s| j| ||kr|	| |r|s\|s|r|d | j
| | j
| |d|| j
|f  | j
| | j| | j
| ||kr\|	| |sh|rr|d | j| d S )Nr  rk  zif (%s%s) {r  r  r   )rC  ry   r  rI  r  rN  r   r/  r8  r  r   r<  r   rP  rV  )rS   r   rr  rs  rt  ru  rv  rw  r|  Z	uses_tempZsenserP   rP   rQ   rq  1  sF    







z1BoolBinopResultNode.generate_bool_evaluation_codec                 C   s   | S rI   rP   r   rP   rP   rQ   r   2  s    z!BoolBinopResultNode.analyse_types)rU   rV   rW   rF  r   r   r  r   r  r  rz  r   r  rq  r   rX   rP   rP   rN   rQ   rn  1  s   	7rn  c                       s   e Zd ZdZdZdZdddgZdd Zdd	 Zd
d Z	dd Z
dd Zdd Z fddZ fddZdd Zdd Zdd Zdd Zdd Zd d! Z  ZS )"r  NTr  r  r  c                 C   s   | j || j| S rI   )r  r  r  r   rP   rP   rQ   r  /2  s    zCondExprNode.type_dependenciesc                 C   s   t | j|| j|S rI   )r   ri  r  r~   r  r   rP   rP   rQ   r~   22  s    

zCondExprNode.infer_typec                 C   s"   | j jr| jj| _n
| jj| _d S rI   )r  rw   r  r  rR   rP   rP   rQ   r   72  s    z&CondExprNode.calculate_constant_resultc                 C   s   | j  p| j S rI   )r  r   r  rR   rP   rP   rQ   r   =2  s    zCondExprNode.is_ephemeralc                 C   s4   | j || _ | j|| _| j|| _| |S rI   )r  r  r  r   r  r  r   rP   rP   rQ   r   @2  s    zCondExprNode.analyse_typesc                 C   s   | j j}| jj}t||| _| jjr6t| jj| _| jjrFt	| _
n | j  sZ| j rft| jd |jsz|jsz| jjr|| jkr| j | j|| _ || jkr| j| j|| _| jjr|   | S )NzPUnsafe C derivative of temporary Python reference used in conditional expression)r  r   r  r   ri  r   r?  rr  rj   r   r   r   r   ry   rz  r~  r  )rS   rl   Ztrue_val_typeZfalse_val_typerP   rP   rQ   r  F2  s"    

z CondExprNode.analyse_result_typec                    sp   | j jjs| j || _ | jjjs0| j|| _d | _| |}|jjsl|| krbtt||}n
||}|S rI   )	r  r   r  r  r  r   r  rK   r  )rS   rl   outrN   rP   rQ   r  \2  s    



zCondExprNode.coerce_to_integerc                    s~   | j j|kr| j ||| _ | jj|kr8| j||| _d | _| |}|j|krz|| krntt|||}n|||}|S rI   )r  r   rz  r  r   r  rK   r  )rS   r  rl   r  rN   rP   rQ   rz  m2  s    

zCondExprNode.coerce_toc                 C   s<   | j jjs0| jjjs0t| jd| j j| jjf  tj| _d S )Nz5Incompatible types in conditional expression (%s; %s))r  r   r~  r  r   ry   r   r,   rR   rP   rP   rQ   r  ~2  s
    zCondExprNode.type_errorc                 C   s   | j  o| j o| j S rI   )r  r   r  r  rR   rP   rP   rQ   r   2  s
    
zCondExprNode.check_constc                 C   s   | | j | | | j| |d| j   | || j |d | || j	 |d | j
| | j| d S )Nr  r  r   )rC  ry   r2  r  rI  r   r   eval_and_getr  r  rN  rV  r;  rP   rP   rQ   rI  2  s    


z%CondExprNode.generate_evaluation_codec                 C   s`   | | | jjr|| n
|| |d|  ||  f  |	| |
| d S r{  )rI  r   r   rA  r<  r   r   r   r   rP  rV  )rS   r   r  rP   rP   rQ   r  2  s    

 
zCondExprNode.eval_and_getc                 C   s   d S rI   rP   r;  rP   rP   rQ   rG  2  s    z+CondExprNode.generate_subexpr_disposal_codec                 C   s   d S rI   rP   r;  rP   rP   rQ   rH  2  s    zCondExprNode.free_subexpr_temps)rU   rV   rW   r  r  r   r   r  r~   r   r   r   r  r  rz  r  r   rI  r  rG  rH  rX   rP   rP   rN   rQ   r  "2  s$   

r  ZPy_LTZPy_LEZPy_EQZPy_NEZPy_GTZPy_GE)	r  r  r  r  z<>r   r  r
  r  c                   @   s   e Zd ZdZdZg 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dZdd Zdd  ZdS )#CmpNodeNc                 C   s   t S rI   r  r   rP   rP   rQ   r~   2  s    zCmpNode.infer_typec                 C   s   t | j }| jj}t|tr:t|tr:t|t|kr:d S | jdkrt| jttt	fr| jj
sn| jdk| _d S t| jtr| js| j | _n$t| jtr| jjs| jdk| _d S |||| _d S )Nr
  r  r  )r  r
   r  rw   rv   any_string_typer   r  r  r  r   cascader  r   r  )rS   Zoperand1_resultr  Zoperand2_resultrP   rP   rQ   "calculate_cascaded_constant_result2  s(    


z*CmpNode.calculate_cascaded_constant_resultc              
   C   sv   t | }| j|}z|||}W n0 tk
rR } z| | d }W 5 d }~X Y nX |rr| j}|rr|op|||}|S rI   )r  r  r   rJ  r   r  cascaded_compile_time_value)rS   r  r   r  r  r   r   r  rP   rP   rQ   r  2  s    
z#CmpNode.cascaded_compile_time_valuec                 C   s   | j jjp| jjjS rI   r  rR   rP   rP   rQ   is_cpp_comparison2  s    zCmpNode.is_cpp_comparisonc           	      C   s~   |j }|j }d}d}|jr&| r&d}|jr8| r8d}|jrH|rz|S n2|jrX|rz|S n"|rz|rztj||fkrttjS tjS d S r  )	r   r  r  r  r   r   r   r0  r]  )	rS   rl   r  r  r  r  r  Ztype1_can_be_intZtype2_can_be_intrP   rP   rQ   find_common_int_type2  s(    zCmpNode.find_common_int_typec           	      C   s  | j }|j}|j}d }|tkr0|jsJ|ttfksJ|tkr\|jsJ|ttfkr\t| jd t}n|j	sh|j	r|dkr|j	s||j
r|j	s|j
rt| jd t}nH|jr|tjrtjnt}n*|jr|tjrtjnt}nt||}n<|j
r|j
rt||}n"|d ks|js | ||||}|d kr|js:|jr@t}n||krP|}n|js`|jr|j
sp|jr|||rt}nt}nZ|j
s|jr|||rt}nt}n0t|rt|rt}n| ||| t}n6||r|}n$||r
|}n| ||| t}|jr@t|ts<t|tr@t}|d ksR|jrX|}nt||}| jr| j|| j||}|S )NzFComparisons between bytes/unicode and str are not portable to Python 3r  r  zcomplex types are unordered)r  r   r   rE  r   r   r   ry   r,   r  r  rj   r  r   r8  r   r   r  r  r  rq  r  invalid_types_errorrv   r  r~  Zspanning_typer  find_common_typer
   )	rS   rl   r  r  common_typer  r  r  Znew_common_typerP   rP   rQ   r  3  s    


zCmpNode.find_common_typec                 C   s   t | jd||j|jf  d S )NInvalid types for '%s' (%s, %s))r   ry   r   )rS   r  r  r  rP   rP   rQ   r  Y3  s    zCmpNode.invalid_types_errorc                 C   s6   |    o4|   o4|  p4| jr,| j p4| jdkS Nr  )is_ptr_containsis_c_string_containshas_python_operandsr  is_python_comparisonr
   rR   rP   rP   rQ   r  ]3  s    
zCmpNode.is_python_comparisonc                 C   s6   | j }|j|kr|||| _ | jr2| j|| d S rI   )r  r   rz  r  coerce_operands_to)rS   r  rl   r  rP   rP   rQ   r  d3  s
    
zCmpNode.coerce_operands_toc                 C   s@   |   r0| jd kr0| jdkr0|   r0|   p>| jo>| j S )N)r  r  r
  r  )r  special_bool_cmp_functionr
   r  r  r  is_python_resultrR   rP   rP   rQ   r  k3  s    zCmpNode.is_python_resultc                 C   s@   | j dko>| jjjr*| jjjp>| jjtkp>| jjjo>| jjtkS r  )	r
   r  r   r  r  rE  r   r  r   rR   rP   rP   rQ   r  s3  s    



zCmpNode.is_c_string_containsc                 C   s*   | j dkr&| jj}|js|jo$|j S d S r  )r
   r  r   rs  r
  rE  )rS   Zcontainer_typerP   rP   rQ   r  z3  s
    
zCmpNode.is_ptr_containsFc           	      C   s  | j dkr4|j| jj }}|s0|jr|jr|tjksD|tjkr\tdd| _d| _	dS |tj
ksp|tj
krtdd| _d| _	dS |tjks|tjkrtdd| _d| _	dS |tjks|tjkrtdd| _d	| _	dS |rd
dlm} || j dkrdnd| tj|| j}|r|\| _	| _| _}dS n| j dkr| jjtjkrv| jd| _tdd| _d| _	dS | jjtjkr| jd| _tdd| _d| _	dS | jjtjkr| jd| _tdd| _d| _	dS | jjjs| j|| _tdd| _d| _	dS dS )Nr  ZUnicodeEqualsr/  Z__Pyx_PyUnicode_EqualsTZBytesEqualsZ__Pyx_PyBytes_EqualsZ	StrEqualsZ__Pyx_PyString_Equalsr%   )optimise_numeric_binopr  ZEqZNer  r  ZPyDictContainsr  Z__Pyx_PyDict_ContainsTFZPySetContainsZ__Pyx_PySet_ContainsTFZPyUnicodeContainsZ__Pyx_PyUnicode_ContainsTFZPySequenceContainsZ__Pyx_PySequence_ContainsTFF)r
   r   r  rE  r   r   r   r   special_bool_cmp_utility_coder  r   r/   r   ZOptimizer  r   r  special_bool_extra_argsr   r  r   rj   r  )	rS   rl   r  result_is_boolr  r  r  r   r  rP   rP   rQ   "find_special_bool_compare_function3  sr    z*CmpNode.find_special_bool_compare_functionc                 C   sr  | j jr<|j}d| }| jr6|jtdd d}qJd}n|j}d}d}| jr|j jrb|	 }	n|
 }	|j jr||	 }
n|
 }
ddd	 | jD }| jr|j| j |d
||| j|	|
| jr|nt| |||| jf  n|j jrl|dkrl|dkst|| j js*| j tjks*t|d|| j jr@dnd|	 |	 t| |||| jf  n|j jr|d|||dkrdpd|j d|
 |
 f  n|j }|j }|js|jr||st}n|jrt||}n|}||}||}d|||| ||f }|  rd| jdkrdt|| j|| j jrT|nd | j | j! n
|| d S )Nz__Pyx_XGOTREF(%s); ZPyBoolOrNullFromLongr  Z__Pyx_PyBoolOrNull_FromLongZ__Pyx_PyBool_FromLongrk  rG  c                 S   s   g | ]}|  qS rP   r  )r[   	extra_argrP   rP   rQ   r   3  s    z3CmpNode.generate_operation_code.<locals>.<listcomp>z%s = %s(%s(%s, %s, %s)); %s%s)r  r  r  z-%s = PyObject_RichCompare%s(%s, %s, %s); %s%sZBoolz%s = %s(%s%s(%s, %s));r  r  eqz%s = %s(%s %s %s);r   )"r   rj   r   r  r   r   r   r   r  r   r   r  r  r  r   richcmp_constantsry   r   r   r  r  r  rD  rv  r   r  r  r   
c_operatorr  r   r   r   r@  )rS   r   r  r  r  r  Zerror_clauseZgot_refZcoerce_resultr)  r*  Zspecial_bool_extra_args_resultr  r  r  code1code2Z	statementrP   rP   rQ   r  3  s    



 


	


	

zCmpNode.generate_operation_codec                 C   s    |dkrdS |dkrdS |S d S )Nr  r  r  r  rP   )rS   r  rP   rP   rQ   r  4  s
    zCmpNode.c_operator)N)F)rU   rV   rW   r  r  r  r~   r  r  r  r  r  r  r  r  r  r  r  r  r  r  rP   rP   rP   rQ   r  2  s$   
S
<Zr  c                   @   s   e Zd ZdddddgZdZdZdZdd	 Zd
d Zdd Z	dd Z
dd Zdd Zd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 )(r  r  r  coerced_operand2r  r  NFc                 C   sN   | j |}| j|}t|s(t|rJt|rJt|rJtt| j||S tS rI   )	r  r~   r  r9   r7   rE   r;   r
   r   r#  rP   rP   rQ   r~   34  s    zPrimaryCmpNode.infer_typec                 C   s   dS rA  rP   r   rP   rP   rQ   r  >4  s    z PrimaryCmpNode.type_dependenciesc                 C   s   | j r
t| | jj d S rI   )r  r   r  r  rw   rR   rP   rP   rQ   r   A4  s    
z(PrimaryCmpNode.calculate_constant_resultc                 C   s   | j |}| ||S rI   )r  r   r  )rS   r   r  rP   rP   rQ   r   E4  s    z!PrimaryCmpNode.compile_time_valuec                 C   s   | j }|r| j|_|j }qd S rI   )r  r   )rS   ZcdrrP   rP   rQ   unify_cascade_typeI4  s    z!PrimaryCmpNode.unify_cascade_typec                 C   s  | j || _ | j|| _|  rD| | | jr@t| jd | S | j j}| jj}t	|sdt	|rt
|rt
|rtt| j||| _d| _| S | |r| S | jr| j|| _| jdkr|  rnd| _d }| jrt| jd | S | jjtkr|tdd nR| j jtjkr.| j tj|| _ | jjtk	rL| jt|| _|tdd | jd| _nj|  r| jrt| jd	 tj| _| S | || j r| j jjs| j || _ d }d| _n
t }d
| _nP| || j r| j jjs| j || _ d }d| _n| !|| j| j }|j| _|d k	rf|j"sf| j j|krZ| j ||| _ | #|| | jr| j$|| _| j%| | j&| j|}|| jk	r|| _'| ( rtj | _ntj| _| )  | js| js| j*rd| _+| S )Nz5Cascading comparison not yet supported for cpp types.Fr  z?Cascading comparison not yet supported for 'int_val in string'.ZPyUCS4InUnicoder/  ZBytesContainsz+argument of type 'NoneType' is not iterablez?Cascading comparison not supported for 'val in sliced pointer'.Tr%   ),r  r   r  r  analyse_cpp_comparisonr  r   ry   r   r9   r7   rE   r;   r
   is_pycmp"analyse_memoryviewslice_comparisonr  r   r   r   r   r   r]  rz  r   r   r  r  r  r  rj   r  r   r  r~  r  r   coerce_cascaded_operands_to_tempoptimise_comparisonr  r  r  r  r   )rS   rl   r  r  r  r  rP   rP   rQ   r   O4  s    





zPrimaryCmpNode.analyse_typesc                 C   s  | j j}| jj}d| _|| j| j | jg}|d kr^t| jd| j||f  tj	| _d| _
d S |j}|jrp|j}|j| _|j| _| jdkrd| _t| r|tdd t|jdkr| j|jd	 j|| _n0| j |jd	 j|| _ | j|jd j|| _|j| _d S )
NFr  r  r   Trw  rL  r%   r   )r  r   r  r  r_  r
   r   ry   r   r,   r  rs  rt  r   r   r   r   r   r   r   r   r   rz  r  )rS   rl   r  r  r   rx  rP   rP   rQ   r  4  s2    

z%PrimaryCmpNode.analyse_cpp_comparisonc                 C   sV   | j jp| jj}| j jjp"| jjj}d}|rR|rR| j|krRd| _tj| _d| _	dS dS )N)r  r  r  r  FT)
r  r  r  r   r   r
   r  r   r  is_memslice_nonecheck)rS   rl   Z	have_noneZ
have_sliceopsrP   rP   rQ   r  4  s    
z1PrimaryCmpNode.analyse_memoryviewslice_comparisonc                 C   sn   | j rb| j|| jddrbd| _ tj| _d| _| jrV| jj| j	|dd}|| j	k	rV|| _
|   | S t| |S )NT)r  Fr%   )r  r  r  r   r  r   r   r  r  r  r  r  r   r  )rS   rl   r  rP   rP   rQ   r  4  s(        
z PrimaryCmpNode.coerce_to_booleanc                 C   s   | j jjp| jjjS rI   )r  r   rj   r  rR   rP   rP   rQ   r  4  s    
z"PrimaryCmpNode.has_python_operandsc                 C   s*   | j r|   dS | j o$| j S d S r"  )r  r#  r  r   r  rR   rP   rP   rQ   r   4  s    zPrimaryCmpNode.check_constc                 C   s   | j | j }}|jjrJ| jdkr&d}nd}d||jd| | f S |  r|jtkrbd}nd}| jdkrvd}nd}d||| | f S t	| jr|
 |
  }}n2| |  }}| jr|jjrd	| }nd	| }d
|| | j|f S d S )Nr  r  rk  z(%s%s(%s, %s))r  Z__Pyx_UnicodeContainsUCS4Z__Pyx_BytesContainsr  ((PyObject *) %s.memview)r  )r  r  r   r  r
   r(  r   r  r   r9   r   r  r   r  )rS   r  r  Znegationmethodr)  r*  rP   rP   rQ   r   4  sH    






z$PrimaryCmpNode.calculate_result_codec                 C   s   | j | | j| | jD ]}|| q| jr| | | ||  | j | j| j | j	r| j	j||  | j
px| j| j
d k	d | j | | j | | j| | j| d S )Nneeds_evaluation)r  rI  r  r  r   r2  r  r   r
   r  r  rN  rV  )rS   r   r  rP   rP   rQ   rI  5  s,    

    
z'PrimaryCmpNode.generate_evaluation_codec                 C   s   | j | | j| d S rI   )r  rN  r  r;  rP   rP   rQ   rG  $5  s    z-PrimaryCmpNode.generate_subexpr_disposal_codec                 C   s   | j | | j| d S rI   )r  rV  r  r;  rP   rP   rQ   rH  *5  s    z!PrimaryCmpNode.free_subexpr_tempsc                 C   s.   | j | | j| | jr*| j| d S rI   )r  rj  r  r  r;  rP   rP   rQ   rj  05  s    zPrimaryCmpNode.annotate)rU   rV   rW   r  r  r  r  r~   r  r   r   r  r   r  r  r  r  r   r   rI  rG  rH  rj  rP   rP   rP   rQ   r  4  s,   T*r  c                   @   s   e Zd ZddddgZdZdZe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dZdd ZdS )CascadedCmpNoder  r  r  r  Nc                 C   s   t S rI   r  r   rP   rP   rQ   r~   H5  s    zCascadedCmpNode.infer_typec                 C   s   dS rA  rP   r   rP   rP   rQ   r  L5  s    z!CascadedCmpNode.type_dependenciesc                 C   s   | j tk	o| j tk	S rI   r   rR   rP   rP   rQ   r   O5  s    
z#CascadedCmpNode.has_constant_resultc                 C   s&   | j || _ | jr"| j|| _| S rI   )r  r   r  r   rP   rP   rQ   r   S5  s    zCascadedCmpNode.analyse_typesc                 C   s
   | j jjS rI   )r  r   rj   rR   rP   rP   rQ   r  Y5  s    z#CascadedCmpNode.has_python_operandsc                 C   s   dS r"  rP   rR   rP   rP   rQ   r  \5  s    z!CascadedCmpNode.is_cpp_comparisonFc                 C   sZ   |  |||r.d| _tj| _|jjs.||}| jrV| j| j	||}|| j	k	rV|| _
|S r"  )r  r  r   r  r   rj   r  r  r  r  r  )rS   r  rl   r  r  rP   rP   rQ   r  `5  s    

z#CascadedCmpNode.optimise_comparisonc                 C   sH   | j || _ | j jtkr2| jdkr2| j d| _ | jrD| j| d S )Nr  r  )r  r  r   r   r
   r  r  r  r   rP   rP   rQ   r  l5  s
    z,CascadedCmpNode.coerce_operands_to_pyobjectsc                 C   s$   | j r | j|| _| j | d S rI   )r  r  r  r  r   rP   rP   rQ   r  s5  s    z0CascadedCmpNode.coerce_cascaded_operands_to_tempc                 C   s   | j jr&|d|  ||| j  n|d|  |rB|| | j| | jD ]}|| qT| |||| j| j | j	r| j	j||| j
p| j| j
d k	d |r|| || | j| | j| |d d S )Nz if (__Pyx_PyObject_IsTrue(%s)) {r  r  r   )r   rj   r   r  rI  r  r  r  r
   r  r  rN  rV  )rS   r   r   r  r  r  rP   rP   rQ   rI  y5  s6    

    


z(CascadedCmpNode.generate_evaluation_codec                 C   s"   | j | | jr| j| d S rI   )r  rj  r  r;  rP   rP   rQ   rj  5  s    zCascadedCmpNode.annotate)F)F)rU   rV   rW   r  r  r  r   rw   r~   r  r   r   r  r  r  r  r  rI  rj  rP   rP   rP   rQ   r  75  s"   


r  )rj  rl  rc  r  r	  r  r  r   r  r   r	  r  r  r  r  c                 K   s   t | | f||||d|S )N)r
   r  r  r  )binop_node_classes)ry   r
   r  r  r  r  rP   rP   rQ   r  5  s    r  c                       s>   e Zd ZdgZeZ fddZdd Zdd Zdd	 Z	  Z
S )
r  r  c                    s2   t t| |j || _tr.td| | jf  d S )Nz%s Coercing %s)rK   r  r  ry   r  r   r  r  rN   rP   rQ   r  5  s    zCoercionNode.__init__c                 C   s   d S rI   rP   rR   rP   rP   rQ   r   5  s    z&CoercionNode.calculate_constant_resultc              	   C   sX   | j | | j j| jkrT| j\}}}||||d ftddd| j j| jf d d S )Nr%   Zcoercez[%s] to [%s])r  tagr  )r  rj  r   ry   r3   )rS   r   filelinecolrP   rP   rQ   rj  5  s      zCoercionNode.annotatec                 C   s   | S rI   rP   r   rP   rP   rQ   r   5  s    zCoercionNode.analyse_types)rU   rV   rW   r   r   rw   r  r   rj  r   rX   rP   rP   rN   rQ   r  5  s   r  c                   @   s    e Zd ZdZdd Zdd ZdS )r{  zc
    Coerce an object to a memoryview slice. This holds a new reference in
    a managed temp.
    c                 C   sJ   |j s
t|jj rtt| | || _d| _d| _|| _| j| d S )Nr%   T)	r   r   r   r  r  r   r1  r  r  rS   r  r  rl   rP   rP   rQ   r  5  s    
z!CoerceToMemViewSliceNode.__init__c                 C   s(   | | j| j |  | j| d S rI   )r   r   from_py_call_coder  r   r   ry   r;  rP   rP   rQ   rD  5  s    
z-CoerceToMemViewSliceNode.generate_result_codeN)rU   rV   rW   rF  r  rD  rP   rP   rP   rQ   r{  5  s   
r{  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r  c                 C   s   t | | || _d S rI   )r  r  r   )rS   r  new_typerP   rP   rQ   r  5  s    zCastNode.__init__c                 C   s
   | j  S rI   r  r  rR   rP   rP   rQ   r  5  s    zCastNode.may_be_nonec                 C   s   | j | jS rI   )r  r   r   rR   rP   rP   rQ   r   6  s    zCastNode.calculate_result_codec                 C   s   | j | d S rI   r  rD  r;  rP   rP   rQ   rD  6  s    zCastNode.generate_result_codeN)rU   rV   rW   r  r  r   rD  rP   rP   rP   rQ   r  5  s   r  c                   @   s   e Zd ZdZd%ddZej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$S )&r  TFc                 C   sD   |j s|jstd|j|f t| | || _| | _|| _d S )Nz/PyTypeTest for %s against non extension type %s)	rD  rE  r   r   r  r  r   r   r  )rS   r  r  rl   r  rP   rP   rQ   r  6  s    
zPyTypeTestNode.__init__zPython type testc                 C   s   | S rI   rP   r   rP   rP   rQ   r   6  s    zPyTypeTestNode.analyse_typesc                 C   s   | j r
dS | j S r"  )r  r  r  rR   rP   rP   rQ   r   6  s    zPyTypeTestNode.may_be_nonec                 C   s
   | j  S rI   r  r  rR   rP   rP   rQ   r  %6  s    zPyTypeTestNode.is_simplec                 C   s
   | j  S rI   r  r'  rR   rP   rP   rQ   r'  (6  s    zPyTypeTestNode.result_in_tempc                 C   s
   | j  S rI   )r  r   rR   rP   rP   rQ   r   +6  s    zPyTypeTestNode.is_ephemeralc                 C   s
   | j  S rI   r  r  rR   rP   rP   rQ   r  .6  s    z#PyTypeTestNode.nonlocally_immutablec                 C   sR   | j | jj ks| jjs| S | j  s(| S | j rL| jrL| jd| j j S | jS )Nz!Cannot convert NoneType to %.200s)r   r  r   typeobj_is_availabler  r  r  rk   rR   rP   rP   rQ   	reanalyse16  s    
zPyTypeTestNode.reanalysec                 C   s   d S rI   rP   rR   rP   rP   rQ   r   :6  s    z(PyTypeTestNode.calculate_constant_resultc                 C   s
   | j  S rI   r  r   rR   rP   rP   rQ   r   >6  s    z$PyTypeTestNode.calculate_result_codec                 C   s   | j  r| j jrD| j j| j | j| jd}|j	t
dd n*| j | j | j}|j	t
dd |d||| jf  nt| jd d S )N)exactZRaiseUnexpectedTypeErrorr  ZExtTypeTestzif (!(%s)) %szICannot test type of extern C class without type object name specification)r   r  rE  Ztype_test_coder  r   r  r<  r   r   r   r   r   r   ry   r   )rS   r   Z	type_testrP   rP   rQ   rD  A6  s.    
 
  
 

z#PyTypeTestNode.generate_result_codec                 C   s   | j | d S rI   r  rP  r;  rP   rP   rQ   rP  T6  s    z,PyTypeTestNode.generate_post_assignment_codec                 C   s   d S rI   rP   r;  rP   rP   rQ   r2  W6  s    z#PyTypeTestNode.allocate_temp_resultc                 C   s   d S rI   rP   r;  rP   rP   rQ   r9  Z6  s    z"PyTypeTestNode.release_temp_resultc                 C   s   | j | d S rI   r  rV  r;  rP   rP   rQ   rV  ]6  s    zPyTypeTestNode.free_tempsc                 C   s   | j | d S rI   )r  rH  r;  rP   rP   rQ   rH  `6  s    z!PyTypeTestNode.free_subexpr_tempsN)F)rU   rV   rW   r<  r  r(   r  r   r:  r   r  r  r'  r   r  r  r   r   rD  rP  r2  r9  rV  rH  rP   rP   rP   rQ   r  	6  s&   

	r  c                   @   s   e 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ed#ddZed$ddZdd Zdd Zdd Zd d! ZdS )%r  TrP   c                 C   s<   t | | |j| _| | _|| _|| _t|p2d| _d S rA  )	r  r  r   r   r   exception_type_cnameexception_messager   exception_format_args)rS   r  r  r  r  rP   rP   rQ   r  k6  s    
zNoneCheckNode.__init__Nc                 C   s   | S rI   rP   r   rP   rP   rQ   r   v6  s    zNoneCheckNode.analyse_typesc                 C   s   dS r"  rP   rR   rP   rP   rQ   r  y6  s    zNoneCheckNode.may_be_nonec                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r  |6  s    zNoneCheckNode.is_simplec                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r'  6  s    zNoneCheckNode.result_in_tempc                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r  6  s    z"NoneCheckNode.nonlocally_immutablec                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r   6  s    z#NoneCheckNode.calculate_result_codec                 C   s4   | j jr| j S | j jr(d| j  S tdd S )Nr  zunsupported type)r   rj   r  r   r   r   rJ  rR   rP   rP   rQ   	condition6  s
    
zNoneCheckNode.conditionr  Fc                 C   s"   | ||||}||_ || d S rI   )r@  put_nonecheck)rM   r  r   r  r  r  r@  r{   rP   rP   rQ   generate6  s    zNoneCheckNode.generatec                 C   s    |  r| |||||| d S rI   )r  r  )rM   r  r   r  r  r  r@  rP   rP   rQ   generate_if_needed6  s    z NoneCheckNode.generate_if_neededc              
      s   | d|    | jr |  tj | jrh| d| jt| j	dd
 fdd| jD f  n | d| j | j	df  | jr|  | || j | d d S )	Nzif (unlikely(%s == Py_None)) {zPyErr_Format(%s, "%s", %s);UTF-8rG  c                    s"   g | ]}d  t |d qS )z"%s"r  )rp   r*  r  escaperP   rQ   r   6  s   z/NoneCheckNode.put_nonecheck.<locals>.<listcomp>zPyErr_SetString(%s, "%s");r   )r   r  r@  r   r	   Zescape_byte_stringr  r  r  r*  r  r   r   ry   r;  rP   r  rQ   r  6  s0    


zNoneCheckNode.put_nonecheckc                 C   s   |  | d S rI   )r  r;  rP   rP   rQ   rD  6  s    z"NoneCheckNode.generate_result_codec                 C   s   | j | d S rI   r  r;  rP   rP   rQ   rP  6  s    z+NoneCheckNode.generate_post_assignment_codec                 C   s   | j | d S rI   r  r;  rP   rP   rQ   rV  6  s    zNoneCheckNode.free_temps)rP   )r  rP   F)r  rP   F)rU   rV   rW   r  r  r   r   r  r  r'  r  r   r  r  r  r  r  rD  rP  rV  rP   rP   rP   rQ   r  d6  s2    
	          r  c                   @   sP   e Zd ZeZeZdZefddZdZdd Z	dd Z
d	d
 Zdd Zdd ZdS )r  r%   c                 C   s   |j |s t|jd|j   n|j jr2||}t| | |tkr|j j	sV|j j
rbt|| _ n(|j jsr|j jrzt| _ n|j jrtj| _ | j | _nP|j j	s|j j
r|ttfkr|jd st|jd|j |f  | | _ | _n|| _d S )Nz$Cannot convert '%s' to Python objectrY   r  )r   rt  r   ry   r  r  r  r  r   rE  r  rs   rF  r  r   r   r8  target_typer   r   rd   )rS   r  rl   r   rP   rP   rQ   r  6  s0    

zCoerceToPyTypeNode.__init__zConverting to Python objectc                 C   s   dS r"  rP   rR   rP   rP   rQ   r  6  s    zCoerceToPyTypeNode.may_be_nonec                 C   s<   | j j}|tjks"|jr.|jdkr.| j |S t| |S d S )Nr  )r  r   r   r  rj   rk   r  r  )rS   rl   r  rP   rP   rQ   r  6  s    
z$CoerceToPyTypeNode.coerce_to_booleanc                 C   s$   | j jjr| j S | j tj|S d S rI   )r  r   r  rz  r   r  r   rP   rP   rQ   r  6  s    
z$CoerceToPyTypeNode.coerce_to_integerc                 C   s   | S rI   rP   r   rP   rP   rQ   r   6  s    z CoerceToPyTypeNode.analyse_typesc                 C   sH   | d| jj| j |  | j||  | jf  | | d S )Nz%s; %s)	r   r  r   Zto_py_call_coder   r  r   ry   rd  r;  rP   rP   rQ   rD  6  s    z'CoerceToPyTypeNode.generate_result_codeN)rU   rV   rW   r   r   r  r   r  r:  r  r  r  r   rD  rP   rP   rP   rQ   r  6  s   r  c                   @   s    e Zd ZdZdd Zdd ZdS )r  r%   c                 C   s"   | |}t| | tj| _d S rI   )r  r  r  r   r   r   rS   r  rl   rP   rP   rQ   r  7  s    
zCoerceIntToBytesNode.__init__c              	   C   s   | j }| }|jtjtjtjfkrn|jjr@|d||f  n|d|  |d|	| j
  |d d }|jtjk	r|jjtjdd}|d||f  |}|d|  |||  | j
f  |d k	r|j| | | d S )	Nzif ((%s < 0) || (%s > 255)) {zif (%s > 255) {zOPyErr_SetString(PyExc_OverflowError, "value too large to pack into a byte"); %sr   Fr*  z%s = (char)%s;z*%s = PyBytes_FromStringAndSize(&%s, 1); %s)r  r   r   r   r   r]  r  rs  r   r   ry   r/  r0  r   r8  rd  )rS   r   r  Z
arg_resultr  rP   rP   rQ   rD  7  s:     


z)CoerceIntToBytesNode.generate_result_codeN)rU   rV   rW   r   r  rD  rP   rP   rP   rQ   r  
7  s   r  c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )r  Nc                 C   s   t | | || _d| _||s2t|jd|  | jjsB| jjr| j	j
rp| j	jrp| j	jjrpt|jd| dd | jjrt|jddd d S )Nr%   z$Cannot convert Python object to '%s'z=Obtaining '%s' from externally modifiable global Python valuert   a  Py_UNICODE* has been removed in Python 3.12. This conversion to a Py_UNICODE* will no longer compile in the latest Python versions. Use Python C API functions like PyUnicode_AsWideCharString if you need to obtain a wchar_t* on Windows (and free the string manually after use).)r  r  r   r   r  r   ry   rE  rF  r  r   r   ru  r   )rS   r  r  rl   rP   rP   rQ   r  97  s$    
zCoerceFromPyTypeNode.__init__c                 C   s   | S rI   rP   r   rP   rP   rQ   r   M7  s    z"CoerceFromPyTypeNode.analyse_typesc                 C   s   | j jo| j j o| j S rI   )r   rs  r
  r  r   rR   rP   rP   rQ   r   Q7  s    z!CoerceFromPyTypeNode.is_ephemeralc              
   C   s   d }| j jrN| jj tkrN| j jdrNd| j jtdd   }t| j|d |	| j j
| j |  | j||| jd | j jr| | d S )NZ__Pyx_PyObject_AsZ__Pyx_PyBytesZ__Pyx_PyObjectzexpected bytes, NoneType found)from_py_functionspecial_none_cvalue)r   rE  r  r   r  r  r   r  r  r   r  r   r   ry   r  rj   rd  )rS   r   r  rP   rP   rQ   rD  T7  s    
   z)CoerceFromPyTypeNode.generate_result_codec                 C   s   t | jd d S )Nz0Coercion from Python not allowed without the GILr   r   rP   rP   rQ   r   d7  s    z CoerceFromPyTypeNode.nogil_check)	rU   rV   rW   r  r  r   r   rD  r   rP   rP   rP   rQ   r  27  s   r  c                   @   st   e Zd ZejZejdejdej	dej
dejdejdejdiZdd Zd	d
 ZdZdd Zdd Zdd Zdd ZdS )r  ZPyList_GET_SIZEZPyTuple_GET_SIZEZPySet_GET_SIZEZPyBytes_GET_SIZEZPyByteArray_GET_SIZEZ__Pyx_PyUnicode_IS_TRUEc                 C   s   t | | |jjrd| _d S r  )r  r  r   rj   r   r  rP   rP   rQ   r  x7  s    zCoerceToBooleanNode.__init__c                 C   s*   | j jjr&| j| j jd kr&|   d S rI   )r  r   rj   _special_builtinsrc   r  r   rP   rP   rQ   r   }7  s    zCoerceToBooleanNode.nogil_checkrx  c                 C   s   | j r|   dS | j S r"  )r   r#  r  r   rR   rP   rP   rQ   r   7  s    zCoerceToBooleanNode.check_constc                 C   s   d| j   S )Nz	(%s != 0)r  rR   rP   rP   rQ   r   7  s    z)CoerceToBooleanNode.calculate_result_codec              	   C   s   | j s
d S | j| jj}|d k	rv| j r<d| j  gng }|d|| j f  |d| 	 d
|f  n,|d| 	 | j || 	 | jf  d S )Nz(%s != Py_None)z(%s(%s) != 0)r  z&&rz  )r   r  rc   r  r   r  r   r   r   r   r  r  ry   )rS   r   Z	test_funcZchecksrP   rP   rQ   rD  7  s    z(CoerceToBooleanNode.generate_result_codec                 C   s   | S rI   rP   r   rP   rP   rQ   r   7  s    z!CoerceToBooleanNode.analyse_typesN)rU   rV   rW   r   r  r   r   r   r   r   Zfrozenset_typer   r   r   r  r  r   r:  r   r   rD  r   rP   rP   rP   rQ   r  h7  s.          
r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r  c                 C   s2   |j jr||}|| _ t| | || d S rI   )r   r  r  r  r  r7  r  rP   rP   rQ   r  7  s
    
zCoerceToComplexNode.__init__c                 C   sT   | j jjr4| j j| j  }| j j| j  }n| j  }d}d| jj||f S r  )r  r   r  r  r   r  r9  )rS   r  r  rP   rP   rQ   r   7  s    

z)CoerceToComplexNode.calculate_result_codec                 C   s   d S rI   rP   r;  rP   rP   rQ   rD  7  s    z(CoerceToComplexNode.generate_result_codec                 C   s   | S rI   rP   r   rP   rP   rQ   r   7  s    z!CoerceToComplexNode.analyse_typesN)rU   rV   rW   r  r   rD  r   rP   rP   rP   rQ   r  7  s   r  c                 C   s   ddl m} tjtjtdtjd tdtjd gdddd}t| j	d|t
d	d
| || j	gd}||}|j|kr|||}|S )Nr%   )
HasGilNoder   r>  r  T)r   r   r   Z__Pyx_SoftComplexToDoubleZSoftComplexToDoublez	Complex.c)r  r   )r  r  r   r  r  r  r  r  rf  ry   r   r   r   r   rz  )r  r  rl   r  Z
cfunc_typer*  rP   rP   rQ   r  7  s*    


r  c                   @   s8   e Zd Zdd ZdZdd Zdd Zdd	 Zd
d ZdS )r  c                 C   s<   t | | | jj | _| jj| _d| _| jjr8t| _	d S r  )
r  r  r  r   Zas_argument_typerw   r   rj   r   r   r  rP   rP   rQ   r  7  s    
zCoerceToTempNode.__init__z#Creating temporary Python referencec                 C   s   | S rI   rP   r   rP   rP   rQ   r   7  s    zCoerceToTempNode.analyse_typesc                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r  7  s    zCoerceToTempNode.may_be_nonec                 C   s4   | j || _ | j  r| j S | j j| _| j| _| S rI   )r  r  r  r   r   r   rP   rP   rQ   r  7  s    

z"CoerceToTempNode.coerce_to_booleanc                 C   sd   | d|  | j|  f  | jr`| jjsF||  |   n|j	|  | j| j
 d d S )Nr  r=  )r   r   r  r   r   r1  r   r   r:  r?  r@  r;  rP   rP   rQ   rD  7  s     z%CoerceToTempNode.generate_result_codeN)	rU   rV   rW   r  r:  r   r  r  rD  rP   rP   rP   rQ   r  7  s   r  c                       st   e Zd Zd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dd Z  ZS )r~  z
    A node that should not be replaced by transforms or other means,
    and hence can be useful to wrap the argument to a clone node

    MyNode    -> ProxyNode -> ArgNode
    CloneNode -^
    Nc                    s$   t t| | |j| _|   d S rI   )rK   r~  r  rw   update_type_and_entryr  rN   rP   rQ   r  8  s    zProxyNode.__init__c                 C   s   | j || _ |   | S rI   )r  r   r  r   rP   rP   rQ   r   8  s    zProxyNode.analyse_typesc                 C   s   | j |S rI   r  r~   r   rP   rP   rQ   r~   8  s    zProxyNode.infer_typec                 C   s>   t | jdd }|r"|| _| jj| _t | jdd }|r:|| _d S Nr   r   )r   r  r   r   r   )rS   r   	arg_entryrP   rP   rQ   r  8  s    
zProxyNode.update_type_and_entryc                 C   s   | j | d S rI   r  r;  rP   rP   rQ   rD  8  s    zProxyNode.generate_result_codec                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r   !8  s    zProxyNode.resultc                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r  $8  s    zProxyNode.is_simplec                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r  '8  s    zProxyNode.may_be_nonec                 C   s   | j | d S rI   )r  rI  r;  rP   rP   rQ   rI  *8  s    z"ProxyNode.generate_evaluation_codec                 C   s   | j | d S rI   )r  rN  r;  rP   rP   rQ   rN  -8  s    z ProxyNode.generate_disposal_codec                 C   s   | j | d S rI   r  r;  rP   rP   rQ   rV  08  s    zProxyNode.free_temps)rU   rV   rW   rF  r   r  r   r~   r  rD  r   r  r  rI  rN  rV  rX   rP   rP   rN   rQ   r~  7  s   	r~  c                       s   e Zd Zg ZdZdd Zdd Zdd Zdd	 Zd
d Z	dd Z
 fddZdd Zdd Zdd Zdd Zdd Zdd Z  ZS )r  Nc                 C   sL   t | | |j| _t|dd }|r2|| _|j| _t|dd }|rH|| _d S r  )r  r  rw   r   r   r   r   )rS   r  r   r  rP   rP   rQ   r  >8  s    zCloneNode.__init__c                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r   I8  s    zCloneNode.resultc                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r  L8  s    zCloneNode.may_be_nonec                 C   s   | j |S rI   )r  r  r   rP   rP   rQ   r  O8  s    zCloneNode.type_dependenciesc                 C   s   | j |S rI   r  r   rP   rP   rQ   r~   R8  s    zCloneNode.infer_typec                 C   s6   | j j| _| j j| _d| _t| j dd }|r2|| _| S )Nr%   r   )r  r   r   r   r   r   )rS   rl   r  rP   rP   rQ   r   U8  s    

zCloneNode.analyse_typesc                    s(   | j jr| j ||S tt| ||S rI   )r  r   rz  rK   r  )rS   Z	dest_typerl   rN   rP   rQ   rz  ^8  s    zCloneNode.coerce_toc                 C   s   dS r  rP   rR   rP   rP   rQ   r  c8  s    zCloneNode.is_simplec                 C   s   d S rI   rP   r;  rP   rP   rQ   rI  f8  s    z"CloneNode.generate_evaluation_codec                 C   s   d S rI   rP   r;  rP   rP   rQ   rD  i8  s    zCloneNode.generate_result_codec                 C   s   d S rI   rP   r;  rP   rP   rQ   rN  l8  s    z CloneNode.generate_disposal_codec                 C   s   | j r||  |   d S rI   )r   r:  r   r   r;  rP   rP   rQ   rP  o8  s    z'CloneNode.generate_post_assignment_codec                 C   s   d S rI   rP   r;  rP   rP   rQ   rV  u8  s    zCloneNode.free_temps)rU   rV   rW   r   r   r  r   r  r  r~   r   rz  r  rI  rD  rN  rP  rV  rX   rP   rP   rN   rQ   r  38  s   	r  c                       sB   e Zd ZdZdZedd Zdd Zdd Zd fd	d
	Z	  Z
S )CppOptionalTempCoercionz
    Used only in CoerceCppTemps - handles cases the temp is actually a OptionalCppClassType (and thus needs dereferencing when on the rhs)
    Fc                 C   s   | j jS rI   )r  r   rR   rP   rP   rQ   r   8  s    zCppOptionalTempCoercion.typec                 C   s   d| j   S r  r  rR   rP   rP   rQ   r   8  s    z-CppOptionalTempCoercion.calculate_result_codec                 C   s   d S rI   rP   r;  rP   rP   rQ   rD  8  s    z,CppOptionalTempCoercion.generate_result_codec                    s   t t| j|ddS )NFr   )rK   r  r   r   rN   rP   rQ   r   8  s    z-CppOptionalTempCoercion._make_move_result_rhs)F)rU   rV   rW   rF  r   r  r   r   rD  r   rX   rP   rP   rN   rQ   r  y8  s   
r  c                   @   s   e Zd Zdd ZdS )r;  c                 C   s$   |j r| j|r| S t| ||S rI   )rE  r   r  r  rz  r  rP   rP   rQ   rz  8  s    zCMethodSelfCloneNode.coerce_toN)rU   rV   rW   rz  rP   rP   rP   rQ   r;  8  s   r;  c                   @   s8   e Zd ZeZdZg Zdd Zdd Zdd Z	dd	 Z
d
S )ModuleRefNodeFc                 C   s   | S rI   rP   r   rP   rP   rQ   r   8  s    zModuleRefNode.analyse_typesc                 C   s   dS r"  rP   rR   rP   rP   rQ   r  8  s    zModuleRefNode.may_be_nonec                 C   s   t jS rI   )r   r  rR   rP   rP   rQ   r   8  s    z#ModuleRefNode.calculate_result_codec                 C   s   d S rI   rP   r;  rP   rP   rQ   rD  8  s    z"ModuleRefNode.generate_result_codeN)rU   rV   rW   r   r   r   r   r   r  r   rD  rP   rP   rP   rQ   r  8  s   r  c                   @   s2   e Zd ZdgZeZdZdd Zdd Zdd Z	d	S )
DocstringRefNoder!  Tc                 C   s"   t | | |jjst|| _d S rI   )r   r  r   rj   r   r!  )rS   ry   r!  rP   rP   rQ   r  8  s    zDocstringRefNode.__init__c                 C   s   | S rI   rP   r   rP   rP   rQ   r   8  s    zDocstringRefNode.analyse_typesc              
   C   sH   | d|  | j |td||  | jf  | | d S )Nz%s = __Pyx_GetAttr(%s, %s); %srF  )	r   r   r!  r  r	   r  r   ry   rd  r;  rP   rP   rQ   rD  8  s     z%DocstringRefNode.generate_result_codeN)
rU   rV   rW   r   r   r   r   r  r   rD  rP   rP   rP   rQ   r  8  s   r  c                   @   s@   e Zd Zg ZdZdddZdd Zdd Zd	d
 ZdddZ	dS )AnnotationNodeFNc                 C   sX   t | | |dkrHddlm} t|dd|}t||| d}|| _	|| _
dS )z5string is expected to already be a StringNode or NoneNr%   r  r  )description)r   r   )r   r  r   r  r	   r  writer.  Zas_utf8_stringr  r  )rS   ry   r  r  r  rP   rP   rQ   r  8  s    zAnnotationNode.__init__c                 C   s   | S rI   rP   r   rP   rP   rQ   r   8  s    zAnnotationNode.analyse_typesc                 C   s   |  |d S r  )rU  r   rP   rP   rQ   r  8  s    zAnnotationNode.analyse_as_typec                 C   s   t |tr|j}|jr<||jst|jd| jj	 dd n|j
r|jjr||jjsrt|jd| jj	 dd q|jjr|j|}|r||jst|jd| jj	  q|j|}|r|jrt|jd| jj	 dd nt|jd dS )zZMethod checks for cases when user should be warned that annotation contains unknown types.z5Unknown type declaration '%s' in annotation, ignoringr%   rt   z+Unknown type declaration '%s' in annotationz0Unknown type declaration in annotation, ignoringN)rv   r  r  r   r  rk   r   ry   r  r   r  r  r{  r  r  r  r   Zpxd_file_loaded)rS   rl   r  r  rP   rP   rQ   _warn_on_unknown_annotation8  s6    

 
 


 z*AnnotationNode._warn_on_unknown_annotationc           
   
   C   sj  | j rg d fS | j}d }}|jrt|jddd |jD ]:\}}|jsHq8|jdkr`d}|sr|}q8|jdkr8d}|}q8|r|rt|jddd n"t|t	rt|jd	dd g d fS |j
|d
 ||}|d kr| || g |fW  5 Q R  S |jrt|jddd |r0|s0|js0|js0t|jd |jrB|| |jrT||ng }	W 5 Q R X |	|fS )NFzSDicts should no longer be used as type annotations. Use 'cython.int' etc. directly.r%   rt   )r   s   typeT)r   s   ctypez9Duplicate type declarations found in signature annotationzTTuples cannot be declared as simple tuples of types. Use 'tuple[type1, type2, ...]'.)r  zWStrings should no longer be used for type declarations. Use 'cython.int' etc. directly.zOPython type declaration in signature annotation does not refer to a Python type)untypedr  r  r   ry   r  r  r   rv   r  Znew_c_type_contextr  r  rj   rb  r  r7  r  rW  )
rS   rl   Zassigned_valuer  Zexplicit_pytypeZexplicit_ctyperk   r   r  r[  rP   rP   rQ   rU  9  sZ     


 

 z&AnnotationNode.analyse_type_annotation)N)N)
rU   rV   rW   r   r  r  r   r  r  rU  rP   rP   rP   rQ   r  8  s   

r  c                       s   e Zd ZdZdgZddgZdZdZdZ fddZ	e
dd	 Ze
d
d Zdd Zdd Zdd Z fddZdd Zdd Z  ZS )AssignmentExpressionNodez
    Also known as a named expression or the walrus operator

    Arguments
    lhs - NameNode - not stored directly as an attribute of the node
    rhs - ExprNode

    Attributes
    rhs        - ExprNode
    assignment - SingleAssignmentNode
    r   r~  FNc                    s>   t t| j|f| t|| _t| j}t|||dd| _d S )NT)r  r   re  )rK   r  r  r~  r   r  r*   r~  )rS   ry   r  r   r  Zassign_expr_rhsrN   rP   rQ   r  K9  s    

   z!AssignmentExpressionNode.__init__c                 C   s   | j jS rI   )r   r   rR   rP   rP   rQ   r   R9  s    zAssignmentExpressionNode.typec                 C   s
   | j jjS rI   )r~  r  rk   rR   rP   rP   rQ   target_nameV9  s    z$AssignmentExpressionNode.target_namec                 C   s   | j |S rI   )r   r~   r   rP   rP   rQ   r~   Z9  s    z#AssignmentExpressionNode.infer_typec                 C   s   | j | d S rI   )r~  r  r   rP   rP   rQ   r  ]9  s    z-AssignmentExpressionNode.analyse_declarationsc                 C   sX   | j || _ | j jjsF| j jjs6| j j|| j _nt| j | j_ | j|| _| S rI   )r   r   r  r   r   r  r  r~  r   rP   rP   rQ   r   `9  s    


z&AssignmentExpressionNode.analyse_typesc                    s   || j jjkr| jj}t|tr&|j}|||}||k	r|| j_| j  t| j jtrt| j jt	s| j jj| j _| j jjj| j j_| S t
t| ||S rI   )r~  r   r   r  rv   r  rz  r  r  r  rK   r  )rS   r  rl   Zold_rhs_argZrhs_argrN   rP   rQ   rz  ~9  s    

z"AssignmentExpressionNode.coerce_toc                 C   s
   | j  S rI   )r   r   rR   rP   rP   rQ   r   9  s    z.AssignmentExpressionNode.calculate_result_codec                 C   s   | j | d S rI   )r~  r  r;  rP   rP   rQ   rD  9  s    z-AssignmentExpressionNode.generate_result_code)rU   rV   rW   rF  r   r  r   r~  Z
clone_noder  r  r   r  r~   r  r   rz  r   rD  rX   rP   rP   rN   rQ   r  79  s"   

r  )NN)F(6  
__future__r   ZcythonZdeclarera  Zbintresysr  os.pathr3  r
   ZErrorsr   r   r   r   r   r   r&   r'   ZCoder   r   rk  r	   r   r   r(   r)   r*   r   r   r+   r,   r-   r.   r   r   r   r   r   r   r   r   r   r   r/   r    r0   r1   r"   r!   r   r   ZAnnotater3   r4   Z	Debuggingr5   Z
DebugFlagsr   r   ZPythranr6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   __builtin__rF   ImportErrorrp   rn   r  rq   version_infor$   r  r#   longrH   r   r   rf   rh   rg   ri   r  Zc_const_py_unicode_ptr_typerb   r   rs   r|   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r   r  r  r  r  r#  r.  r   r4  r;  ry  r  r  r  r  r  r  r  r  r  r  r#  r'  r)  r,  r4  r@  rH  rI  r  r  r  r  r  r  r  r  rL  r  r  r  r.  rW  r\  rd  rf  rg  rh  rr  ru  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r)  r,  r.  r2  r6  rV  r=  rD  rg  rI  rJ  ri  rn  rs  r  r  r  r  r  r  r  r  r  not_invnegry   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r|  r  r  r  r  r  matmulr  r   ltler  negegtis_r  rn  and_truedivfloordivr-  modr,  or_r`  rshiftrW  xorr  r  r  r  r  r   r.  r/  r1  r2  r9  r:  compilefindallrZ  	frozensetr[  rY  r]  rh  rn  r  r  r  r  r  r  r  r  r{  r  r  r  r  r  r  r  r  r  r  r~  r  r  r;  r  r  r  r  rP   rP   rP   rQ   <module>   sf                        (@D                    #	 
       !"	 3(XnI2$     z[[ p .#<0ac      : Jm 7   uC7 
   wpb ]*     {3      <)". ,0 >$.
:J$*  $P#3o, "2  _2 K&



	 E 	>Q 1
              ^  s 	
  j  b
[]I(67+6Fs