o
    &[hd0	                    @   sL  d dl mZ d dlZejdi dedededededed	ed
edededededededededededededededededededededed ed!ed"ed#ed$ed%ed&ej 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'd0lm$Z$ d'd1l%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z3m4Z4 d'd2lm%Z% d'd3lm5Z5 d4d5lm6Z6 d'd6l7m8Z8 d'd7lm9Z9 d4d8l:m;Z; d'd9l<m=Z=m>Z> d'd:l?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZN d'd;lmOZO zd d<lPmQZQ W n eRyn   eSZQeTeSfZUY nw eTeVfZUejWd  d=krd>ZXeYZZnd?ZXeYe[fZZG d@dA dAeZ\e\ Z]e Z^i e+e,fdBe+e-fdCe+ej_fdDe+ej`fdDe+ejafdDe+ejbfdDe-e+fdEe-e,fdFe-e/fdGe-ejcfdHe-ejdfdHe/e-fdIe,e+fdJe,e-fdKe,ej_fdLe,ej`fdLe,ejafdLe,ejbfdLe,ejcfdMe,ejdfdMej_e+fdNej`e+fdNejae+fdNejbe+fdNiZedOd ZfdPdQ ZgdRdS ZhddTdUZidVdW ZjdXdY ZkdZd[ Zld\d] Zmd^d_ Znd`da ZoG dbdc dceZpG ddde deepZqG dfdg dgeqZrG dhdi dierZsG djdk dkerZtG dldm dmeqZuG dndo doeuZvG dpdq dqeuZwG drds dseuZxG dtdu dueuZyG dvdw dweuZzdxdy Z{G dzd{ d{euZ|G d|d} d}euZ}G d~d derZ~G dd de~ZG dd deqZG dd deqZG dd deqZG dd depZG dd depZG dd depZG dd deZG dd depZG dd deqZG dd deZG dd deqZG dd depZG dd deqZG dd depZG dd deZG dd dep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 d d depeZG dd deZG dd depZG dd dep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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eqZG dd deZG d d! d!e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/d0 d0e׃ZG d1d2 d2e׃ZG d3d4 d4e܃ZG d5d6 d6e܃Zސd7d8 ZG d9d: d:e܃Zeeeېd;Zd<d= ZG d>d? d?epZd@ZdAZdBZdCZdDZG dEdF dFepZG dGdH dHepZG dIdJ dJeZG dKdL dLeZG dMdN dNepZG dOdP dPepZzejZW n eyy   dQdR ZY nw i dSejdTejdUejdVejdWejdXejdYejdZejd[ejd\ejd]ejd^ejd_ejd`ejdaej dbejdcejejejejeddde dfde dgZdhdi ZG djdk dkepZG dldm dmeZ	dndo Z
G dpdq dqeZG drds dseZG dtdu dueZG dvdw dweZG dxdy dyeZG dzd{ d{eZG d|d} d}eZed~jZeh dZG dd deZG dd deZG dd depZG dd depZG dd depZdddddddddd	ZG dd deZG dd depeZG dd deeZeeeeeeeeeeeeeeedZ dĐddZ!G dd dep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)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warning	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_code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                       (   e Zd ZdZ fddZdd Z  ZS )NotConstantNc                    s"   t jd u rtt | | t _t jS N)rK   _objsuper__new__)cls	__class__ N/var/www/vscode/pina/lib/python3.10/site-packages/Cython/Compiler/ExprNodes.pyrO   O   s   
zNotConstant.__new__c                 C      dS )Nz<NOT CONSTANT>rS   selfrS   rS   rT   __repr__U      zNotConstant.__repr__)__name__
__module____qualname__rM   rO   rX   __classcell__rS   rS   rQ   rT   rK   L   s    rK   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                    sx   t  }|d u r|S |jd r:t fddtjtjtjtjfD r: d j	r*|S |jd dv r3|S d d j
 S |S )Nc_string_encodingc                 3   s    | ]}| v V  qd S rL   rS   .0t
type_tuplerS   rT   	<genexpr>       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)rc   rg   enverrrS   rb   rT   r      s   


c                 C   s   t tttd| jd S )N)bytes	bytearraystrunicodec_string_type)r   r!   r   r   ri   rj   rr   rS   rS   rT   default_str_type   s   rz   c                  G   sJ   | D ] }|du 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noderS   rS   rT   check_negative_indices   s   


r   c              
      s   |j s,|d u r| }|tu r,|jr,t|jdkr,z|jd j}W n	 ty+   Y nw |d uri|j ri|d urU| rUz|j|j	 }W n t
ttfyO   Y nw | S  fdd|jD }t|dkri| S d S )Nr'   r   c                    s   h | ]}|  qS rS   
infer_typer`   itemry   rS   rT   	<setcomp>       z+infer_sequence_item_type.<locals>.<setcomp>)is_sequence_constructorr   r   cf_statelenrhsAttributeErrorhas_constant_resultargsr~   
ValueError	TypeError
IndexErrorpop)rr   seq_node
index_nodeseq_typer   
item_typesrS   ry   rT   infer_sequence_item_type   s,   

r   c                 C   s&   dd |D }d|v 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 | ]T}|d u rt d td fnF|jr"t|j|jr|jnd g|j n3|jr1t|j|j|j	|j
fn$| rF|j|j|jt u rCt|jnd fnt|trT|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   r~   r}   r   valueunicode_valuer`   r   rS   rS   rT   
<listcomp>   s    &
z"make_dedup_key.<locals>.<listcomp>N)tuple)
outer_type
item_nodes	item_keysrS   rS   rT   r      s   	r   c                 C   sV   | d u rdS | j tjkr| jdkrdS | j jr#d| jj| jjf dfS d| jj df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   rp   entrycname)exception_valuerS   rS   rT   get_exception_handler   s$   
	r   c                 C   sL   |r$|r| j tdd | | d| d S | | d| d S d S )NErrOccurredWithGILExceptions.c__Pyx_ErrOccurredWithGIL()PyErr_Occurred())globalstateuse_utility_coder   load_cachedputlnerror_goto_if)codecheck_py_exceptionr   nogilrS   rS   rT   maybe_check_py_error   s   
r   c                 C   s   t |\}}| d | d|  |r| | || t| ||| | d |r1| jdd | | |r<|   | | | | d d S )Ntry {z%s} catch(...) {Tdeclare_gilstate})r   r   error_goto_if_nullr   put_ensure_gilput_release_ensured_gil
error_goto)r   r   inside	py_resultr   r   raise_py_exceptionr   rS   rS   rT   translate_cpp_exception  s   


r   c                 C   sH   | j dksJ | jd u rdS | jjrdS t| jtr"| jjdkr"dS dS )N+TFr   )exception_checkr   is_namer}   CharNoder   )r   rS   rS   rT   needs_cpp_exception_conversion  s   
r   c                 C   s  t |\}}	t |\}
}| d | |d|  t| |	|| | d | d|  t| ||| | d |rB| jdd | |
 |rM|   | | | | d | d |rg| jdd | | |rr|   | | | | d d S )Nr   z__pyx_local_lvalue = %s;r   Tr   r   )r   r   declaration_coder   r   r   r   )r   r   lhs_typelhs_coderhs_codelhs_exc_valassign_exc_valr   handle_lhs_exclhc_check_py_exchandle_assignment_excassignment_check_py_excrS   rS   rT   translate_double_cpp_exception&  s0   






r   c                   @   sX  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edddddkrMe e!"ddZ#n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$Z0d%d& Z1d'd( Z2d)d* Z3d+d, Z4d-d. Z5d/d0 Z6d1d2 Z7d3d4 Z8d5d6 Z9d7d8 Z:d9d: Z;d;d< Z<d=d> Z=d?d@ Z>dAdB Z?dCdD Z@dEdF ZAddHdIZBdJdK ZCdLdM ZDdNdO ZEdPdQ ZFdRdS ZGdTdU ZHdVdW ZIdXdY ZJdZd[ ZKd\d] ZLd^d_ ZMd`da ZNdbdc ZOddde ZPdfdg ZQdhdi ZRdjdk ZSdldm ZTdndo ZUdpdq ZVdrds ZWdtdu ZXdvdw ZYdxdy ZZdzd{ Z[		dd|d}Z\dd~dZ]dd Z^dd Z_dd Z`dd Zadd Zb		dddZcdd Zddd Zedd Zfdd Zgdd Zhdd ZidddZjdd Zkdd Zldd Zmdd Zndd Zodd Zpdd Zqdd ZrdddZsetdd Zudd ZvdS )ExprNodeNTFimplementationrq   cpythonsubexprs)fgetc                 C      | j S rL   )r   rV   rS   rS   rT   child_attrs  s   zExprNode.child_attrsc                 C      d S rL   rS   rW   rr   rS   rS   rT   analyse_annotations  rY   zExprNode.analyse_annotationsc                 C   s   t |d td| jj|f )Nznot implementedz%s.%s not implemented)r7   r   rR   rZ   )rW   method_namerS   rS   rT   not_implemented  s   
zExprNode.not_implementedc                 C   rU   Nr   rS   rV   rS   rS   rT   	is_lvalue  rY   zExprNode.is_lvaluec                 C   s   |   o| jj S rL   )r   r   is_memoryviewslicerV   rS   rS   rT   is_addressable     zExprNode.is_addressablec                 C   s   | j jo| jS rL   )r   rp   is_temprV   rS   rS   rT   is_ephemeral  s   zExprNode.is_ephemeralc                 C   sH   g }| j D ]}t| |}|d ur!t|tu r|| q|| q|S rL   )r   getattrr   listextendappend)rW   r   rq   r   rS   rS   rT   subexpr_nodes  s   


zExprNode.subexpr_nodesc                 C   s   | j r| jS |  S rL   )r   	temp_codecalculate_result_coderV   rS   rS   rT   result  s   zExprNode.resultc                 C   s<   |r| j r| jjr| jjr|S d| _d|rd|S d|S )NTz{}({})__PYX_STD_MOVE_IF_SUPPORTEDz	std::move)r   r   is_cpp_classis_referencehas_temp_movedformatrW   r   optionalrS   rS   rT   _make_move_result_rhs  s   zExprNode._make_move_result_rhsc                 C   s   | j |  ddS )NTr   )r   r   rV   rS   rS   rT   move_result_rhs  r   zExprNode.move_result_rhsc                 C   s6   |  |}|js|js|jo| j}| j|| d}|S )Nr   )	result_asr   needs_refcountingis_rvalue_referencer   r   )rW   r   r   requires_moverS   rS   rT   move_result_rhs_as!  s
   
zExprNode.move_result_rhs_asc                 C   s&   t | rt| S |d usJ t| |S rL   )rB   r8   )rW   type_rS   rS   rT   pythran_result(  s   
zExprNode.pythran_resultc                 C   rU   )zZ
        Subtypes may return False here if result temp allocation can be skipped.
        TrS   rV   rS   rS   rT   is_c_result_required/     zExprNode.is_c_result_requiredc                 C   s:   | j r| jjr|tkrt|t|  S t||  |  S rL   )r   r   rp   r   r-   r   ctyperW   r   rS   rS   rT   r  5  s   zExprNode.result_asc                 C   s
   |  tS rL   )r  r   rV   rS   rS   rT   r   >     
zExprNode.py_resultc                 C   s   | j p| jS rL   )result_ctyper   rV   rS   rS   rT   r
  B     zExprNode.ctypec                 C   r   rL   rS   rV   rS   rS   rT   get_constant_c_result_codeG  s   	z#ExprNode.get_constant_c_result_codec                 C   r   rL   rS   rV   rS   rS   rT   calculate_constant_resultR  s   
z"ExprNode.calculate_constant_resultc                 C      | j tuo	| j tuS rL   r~   constant_value_not_setnot_a_constantrV   rS   rS   rT   r   ^     
zExprNode.has_constant_resultc                 C      t | jd d S )NzInvalid compile-time expressionr   r   rW   denvrS   rS   rT   compile_time_valueb     zExprNode.compile_time_valuec                 C   s   t | jd|jj|f  d S )Nz(Error in compile-time expression: %s: %s)r   r   rR   rZ   )rW   erS   rS   rT   compile_time_value_errorf  s   z!ExprNode.compile_time_value_errorc                 C   r  )NzCannot assign to or delete thisr  r   rS   rS   rT   analyse_target_declarationl     z#ExprNode.analyse_target_declarationc                 C   r  )Nz=Cannot use anything except a name in an assignment expressionr  r   rS   rS   rT   0analyse_assignment_expression_target_declarationo  r  z9ExprNode.analyse_assignment_expression_target_declarationc                 C   s   |  |}|  |S rL   )analyse_typescheck_constrW   rr   r   rS   rS   rT   analyse_const_expressiont  s   
z!ExprNode.analyse_const_expressionc                 C   
   |  |S rL   r!  r   rS   rS   rT   analyse_expressions}     
zExprNode.analyse_expressionsc                 C   r%  rL   )analyse_target_types)rW   rr   r   rS   rS   rT   analyse_target_expression  r(  z"ExprNode.analyse_target_expressionc                 C   s   |  |}||}|S rL   )r!  coerce_to_boolean)rW   rr   r   boolrS   rS   rT   analyse_boolean_expression  s   

z#ExprNode.analyse_boolean_expressionc                 C   s   |  |}|||S rL   )r!  r+  coerce_to_simpler#  rS   rS   rT   analyse_temp_boolean_expression  s   
z(ExprNode.analyse_temp_boolean_expressionc                    s0   t | dd d ur
dS t fdd|  D dS )Nr   rS   c                       g | ]}|  qS rS   )type_dependenciesr   ry   rS   rT   r     r   z.ExprNode.type_dependencies.<locals>.<listcomp>)r   sumr   r   rS   ry   rT   r1    s   zExprNode.type_dependenciesc                 C   s@   t | dd }|d ur|S t | dd }|d ur|jS | d d S )Nr   r   r   )r   r   r   rW   rr   r   r   rS   rS   rT   r     s   zExprNode.infer_typec                 C   s   | j p| jp| jjp| jjS rL   )r   r   r   is_arrayis_cfunctionrV   rS   rS   rT   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   r~   r   baseindex)	IndexNoder   IntNoderv   r   c_py_ssize_t_typerW   r:  rS   rS   rT   inferable_item_node  s   

zExprNode.inferable_item_nodec                 C   r   rL   rS   r   rS   rS   rT   analyse_as_module     zExprNode.analyse_as_modulec                 C   r   rL   rS   r   rS   rS   rT   analyse_as_type  rA  zExprNode.analyse_as_typec                 C   sV   |  |}|r|jr|jrz||jW S  ty   Y nw |r)|jr)t| jd |S )NzType is not specific)rB  is_fusedfused_to_specific
specializeKeyErrorr   r   )rW   rr   r   rS   rS   rT   analyse_as_specialized_type  s   

z$ExprNode.analyse_as_specialized_typec                 C   r   rL   rS   r   rS   rS   rT   analyse_as_extension_type  rA  z"ExprNode.analyse_as_extension_typec                 C      |  d d S )Nr!  r   r   rS   rS   rT   r!       zExprNode.analyse_typesc                 C   r%  rL   r&  r   rS   rS   rT   r)       
zExprNode.analyse_target_typesc                 C   s"   | j r| j jr|   d S d S d S rL   )r   rp   	gil_errorr   rS   rS   rT   nogil_check  s   zExprNode.nogil_checkc                 C   s&   |j r| jjrt| jd d S d S d S )Nz3Assignment of Python object not allowed without gil)r   r   rp   r   r   r   rS   rS   rT   gil_assignment_check  s   zExprNode.gil_assignment_checkc                 C      |    dS NF)	not_constrV   rS   rS   rT   r"       zExprNode.check_constc                 C   r  )Nz$Not allowed in a constant expressionr  rV   rS   rS   rT   rR    r  zExprNode.not_constc                 C   rP  rQ  )addr_not_constrV   rS   rS   rT   check_const_addr  rS  zExprNode.check_const_addrc                 C   r  )NzAddress is not constantr  rV   rS   rS   rT   rT    r  zExprNode.addr_not_constc                 C   r   rL   r   rV   rS   rS   rT   result_in_temp  s   zExprNode.result_in_tempc                 C      |   S rL   r   rV   rS   rS   rT   target_code     zExprNode.target_codec                 C   rI  )Nr   rJ  rV   rS   rS   rT   r     rK  zExprNode.calculate_result_codec                 C   sv   | j rtd| jj| jf | j}|js6|jrtj	}n| j
s*|js*|  s*d | _ d S |jj|| jd| _ d S d | _ d S )Nz'Temp allocated multiple times in %r: %r
manage_ref)r   RuntimeErrorrR   rZ   r   r   is_voidrp   r   r   result_is_usedr   r  	funcstateallocate_tempuse_managed_ref)rW   r   r   rS   rS   rT   allocate_temp_result  s   
zExprNode.allocate_temp_resultc                 C   s   | j s9| jsd S | jrtj| jd  f| jdd   nd}| jr/td| j| j	j
|f 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`  r   ospathbasenameget_descriptionold_tempr^  rR   rZ   ra  release_temp)rW   r   r   rS   rS   rT   release_temp_result  s   0
zExprNode.release_temp_resultc                 C   s$   |   s||  |   d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)rW  
put_increfr   r
  rW   r   rS   rS   rT   make_owned_reference/  s   zExprNode.make_owned_referencec                 C   s*   |   s|j|  | j| j d dS dS )zJ
        Make sure we own the reference to this memoryview slice.
        have_gilN)rW  put_incref_memoryviewslicer   r   in_nogil_contextrm  rS   rS   rT   make_owned_memoryviewslice7  s
   
z#ExprNode.make_owned_memoryviewslicec                 C   sj   |  | || j | jr| | | | | jr/| jjs1| jjs3| 	| | 
| d S d S d S d S rL   ) generate_subexpr_evaluation_codemark_posr   r   rd  generate_result_coder   	is_stringis_pyunicode_ptrgenerate_subexpr_disposal_codefree_subexpr_tempsrm  rS   rS   rT   generate_evaluation_code@  s   



z!ExprNode.generate_evaluation_codec                 C      |   D ]}|| qd S rL   )r   r{  rW   r   r   rS   rS   rT   rt  Q     z)ExprNode.generate_subexpr_evaluation_codec                 C   rI  )Nrv  rJ  rm  rS   rS   rT   rv  U  rK  zExprNode.generate_result_codec                 C   s~   | j r|jtdd | jr8| jjs| jjr"| 	| | 
| |  r6|j|  |  | j d d S d S | 	| d S )NMoveIfSupportedCppSupport.cppro  )r   r   r   r   r   r   r   rw  rx  ry  rz  r   put_decref_clearr
  rr  rm  rS   rS   rT   generate_disposal_codeX  s   



zExprNode.generate_disposal_codec                 C   r|  rL   )r   r  r}  rS   rS   rT   ry  h  s   z'ExprNode.generate_subexpr_disposal_codec                 C   s   | j rK| jjs| jjr| | | | n$| jjr$|d|    n| jj	r:|d|    |d|    | j
rI|jtdd d S d S | | d S )N%s = 0;z%s.memview = NULL;z%s.data = NULL;r  r  )r   r   rw  rx  ry  rz  rp   r   r   r   r   r   r   r   r   rm  rS   rS   rT   generate_post_assignment_coden  s   

z&ExprNode.generate_post_assignment_codec                 C   r   rL   rS   )rW   r   r   overloaded_assignmentr   r   rS   rS   rT   generate_assignment_code     z!ExprNode.generate_assignment_codec                 C   r   rL   rS   rW   r   ignore_nonexistingrS   rS   rT   generate_deletion_code  r	  zExprNode.generate_deletion_codec                 C   s.   | j r| jjs| | d S d S | | d S rL   )r   r   r_  rk  rz  rm  rS   rS   rT   
free_temps  s
   zExprNode.free_tempsc                 C   r|  rL   )r   r  )rW   r   subrS   rS   rT   rz    r~  zExprNode.free_subexpr_tempsc                 C   r   rL   rS   rW   rr   r   rS   rS   rT   generate_function_definitions  rY   z&ExprNode.generate_function_definitionsc                 C      | |  |  | d S rL   )put_decref_setr   r
  rW   r   r   rS   rS   rT   generate_decref_set     zExprNode.generate_decref_setc                 C   r  rL   )put_xdecref_setr   r
  r  rS   rS   rT   generate_xdecref_set  r  zExprNode.generate_xdecref_setc                 C   sB   |r| j s|r| jr|r| | d S ||  |   d S d S rL   )
cf_is_nullcf_maybe_nullgenerate_xgotref
put_gotrefr   r
  )rW   r   handle_nullmaybe_null_extra_checkrS   rS   rT   generate_gotref  s   

zExprNode.generate_gotrefc                 C      | |  |   d S rL   )put_xgotrefr   r
  rm  rS   rS   rT   r       zExprNode.generate_xgotrefc                 C   r  rL   )put_giverefr   r
  rm  rS   rS   rT   generate_giveref  r  zExprNode.generate_giverefc                 C   r  rL   )put_xgiverefr   r
  rm  rS   rS   rT   generate_xgiveref  r  zExprNode.generate_xgiverefc                 C   r|  rL   )r   annotater}  rS   rS   rT   r    r~  zExprNode.annotatec                 C   s~  | }| j }| ||r| S |j}|r|js|j}|jr|j}|js$|jrm|jrP|jsP|jrP|j	jrP|j	}|
 D ]}||rO||_ |j j|_d|j_|   S q8|jrZt| jd n|jrb|jrb| S t| jd t| _ | S | jd urt| jd| jd}||| |jrddlm} |j js|j jrt|||}|S |j jrt||||}|S |jst| jd|f  |S |j jrd|_|j j|| j | j!d	s|j j"|j"rd
}	|j |f}
n	d}	|j j"|j"f}
t| j|	|
  |S |jr3|j#r	 |S |j$d u rt%|j||}|S |j js$|t&u r|j j'rt(||}nt)|||d}|j *|s1t+|||}|S t,|r@t-|j r@|S t,|j rVt-|rM|S t)|||d}|S |j jrr|rj|j.rjt/| jd|  t0|||}|S |j1r||kr|2|rt3|||}|S |t4j5u r||kr|2|st6|||}|S |j |kst7|j t7|ks|2|s| 8| |S )NTzType is not specializedz/Cannot coerce to a type that is not specialized )rq   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_typeis_cv_qualifiedcv_base_typerC  r5  is_ptr	base_type"get_all_specialized_function_typessame_asr   usedr   r   is_null_ptrr.   coercion_typeNameNode	coerce_tor   r  r  rp   CoerceToMemViewSliceNoder4  CythonArrayNodefrom_carrayis_errorwritable_neededconforms_tois_memview_broadcastis_memview_copy_assignmentdtypeis_noner~   NoneNoder   is_intCoerceIntToBytesNodeCoerceToPyTypeNode
subtype_ofPyTypeTestNoder;   r9   r   r   CoerceFromPyTypeNode
is_complexassignable_fromCoerceToComplexNoder   soft_complex_typecoerce_from_soft_complexrv   fail_assignment)rW   dst_typerr   srcsrc_typeused_as_reference	signaturer   r  msgtuprS   rS   rT   r    s   



FDB4/-
!



	,
zExprNode.coerce_toc                 C   s   t | dr	| jjnd }| jjrd| j nd}|jr#d| nd}|| j|}|r2d| }t| j	d| j||||f  d S )Nr   z (alias of '{0}')r  z. z%Cannot assign type '%s'%s to '%s'%s%s)
hasattrr   rq   r   
is_typedefr   resolveassignment_failure_extra_infor   r   )rW   r  src_namesrc_resolveddst_resolvedextra_diagnosticsrS   rS   rT   r  E  s   zExprNode.fail_assignmentc                 C   sX   |r|sd}t | j|f||}|d ur!t| j|| j|d  dS |r*| | dS dS )Nz)Cannot assign type '%(FROM)s' to '%(TO)s')FROMTOTF)r   r   r   r   r  )rW   r  rr   failrg   messagerS   rS   rT   r  Q  s   
z!ExprNode.check_for_coercion_errorc                 C      |  tj|S rL   )r  r   r   r   rS   rS   rT   coerce_to_pyobject]  rK  zExprNode.coerce_to_pyobjectc                 C   s   |   rt| j}t| j||dS | j}|js|jr| S |tj	u r#| S |j
s/|js/|js/|jr4t| |S |jrT|jrT|jdrTt| jt| j| tddg d|S |jrft|jdk}t| j||dS t| jd|  | S )Nr   r~   zoperator bool)obj	attributefunctionr   r   z%Type '%s' not acceptable as a boolean)r   r,  r~   BoolNoder   r   is_enumr  r   c_bint_typerp   r  r  is_floatCoerceToBooleanNoder   scopelookupSimpleCallNodeAttributeNoder
   EncodedStringr!  	is_ctupler   
componentsr   )rW   rr   
bool_valuer   rS   rS   rT   r+  `  s:   


zExprNode.coerce_to_booleanc                 C   s   | j jr| S | tj|S rL   )r   r  r  r   c_long_typer   rS   rS   rT   coerce_to_integer  s   zExprNode.coerce_to_integerc                 C   s   |   r| S t| |S rL   )rW  CoerceToTempNoder   rS   rS   rT   coerce_to_temp     
zExprNode.coerce_to_tempc                 C   s   |   r| S | |S rL   )	is_simpler  r   rS   rS   rT   r.    r  zExprNode.coerce_to_simplec                 C   rX  rL   )rW  rV   rS   rS   rT   r    s   zExprNode.is_simplec                 C   s0   | j r| j js| j jsdS |  r| jd uS dS NFT)r   rp   r   r   r~   rV   rS   rS   rT   may_be_none  s   
zExprNode.may_be_nonec                 C   r   rL   rS   rV   rS   rS   rT   as_cython_attribute  rY   zExprNode.as_cython_attributePyExc_TypeErrorrS   c                 C   s   |   rt| |||S | S rL   )r  NoneCheckNode)rW   r  r   format_argsrS   rS   rT   as_none_safe_node  s   zExprNode.as_none_safe_nodec              	   K   sX   d  }|D ]}||v rqzt||}W n	 ty   Y qw |||< q| |jfi |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   r   )rP   r   kwargs
attributes	attr_namer   rS   rS   rT   	from_node  s   
zExprNode.from_nodec                 C   rU   )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.
        NrS   rV   rS   rS   rT   !get_known_standard_library_import  s   z*ExprNode.get_known_standard_library_importFrL   r   FNN)FTFN)r  rS   )wrZ   r[   r\   r  r   
annotationr   ri  rc  r`  is_numpy_attribute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  r~   r   syspropertyr   
attrgetterr   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/  r1  r   r6  r?  r@  rB  rG  rH  r!  r)  rN  rO  r"  rR  rU  rT  rW  rZ  r   rd  rk  rn  rs  r{  rt  rv  r  ry  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  classmethodr  r  rS   rS   rS   rT   r   C  s    s




		

	


	 	


r   c                   @   s    e Zd Zg Zdd Zdd ZdS )AtomicExprNodec                 C   r   rL   rS   rm  rS   rS   rT   rt    rY   z/AtomicExprNode.generate_subexpr_evaluation_codec                 C   r   rL   rS   rm  rS   rS   rT   ry    rY   z-AtomicExprNode.generate_subexpr_disposal_codeN)rZ   r[   r\   r   rt  ry  rS   rS   rS   rT   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   rU   Nr'   rS   rV   rS   rS   rT   r    rY   zPyConstNode.is_simplec                 C   rU   rQ  rS   rV   rS   rS   rT   r    rY   zPyConstNode.may_be_nonec                 C      | S rL   rS   r   rS   rS   rT   r!    rY   zPyConstNode.analyse_typesc                 C   r   rL   r   rV   rS   rS   rT   r        z!PyConstNode.calculate_result_codec                 C   r   rL   rS   rm  rS   rS   rT   rv    rY   z PyConstNode.generate_result_code)rZ   r[   r\   r   r   r   rN  r  r  r!  r   rv  rS   rS   rS   rT   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   r   rL   rS   r  rS   rS   rT   r    rY   zNoneNode.compile_time_valuec                 C   rU   NTrS   rV   rS   rS   rT   r    rY   zNoneNode.may_be_nonec                    s4   |j s|js|jst| jd|  tt| ||S )NzCannot assign None to %s)rp   r   r  r   r   rN   r  r  rW   r  rr   rQ   rS   rT   r    s   zNoneNode.coerce_to)
rZ   r[   r\   r  r   r~   r  r  r  r]   rS   rS   rQ   rT   r    s    r  c                   @   s   e Zd ZdZeZdd ZdS )EllipsisNodePy_Ellipsisc                 C      t S rL   )Ellipsisr  rS   rS   rT   r    rY   zEllipsisNode.compile_time_valueN)rZ   r[   r\   r   r*  r~   r  rS   rS   rS   rT   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   rU   r   rS   rV   rS   rS   rT   r    rY   zConstNode.is_simplec                 C   rU   r   rS   rV   rS   rS   rT   r6    rY   zConstNode.nonlocally_immutablec                 C   rU   rQ  rS   rV   rS   rS   rT   r    rY   zConstNode.may_be_nonec                 C   r!  rL   rS   r   rS   rS   rT   r!    rY   zConstNode.analyse_typesc                 C   rU   r%  rS   rV   rS   rS   rT   r"     rY   zConstNode.check_constc                 C   rX  rL   rY  rV   rS   rS   rT   r  #     z$ConstNode.get_constant_c_result_codec                 C   
   t | jS rL   )rv   r   rV   rS   rS   rT   r   &  rL  zConstNode.calculate_result_codec                 C   r   rL   rS   rm  rS   rS   rT   rv  )  rY   zConstNode.generate_result_code)rZ   r[   r\   r   rN  r  r6  r  r!  r"  r  r   rv  rS   rS   rS   rT   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      | j | _d S rL   r  rV   rS   rS   rT   r  1     z"BoolNode.calculate_constant_resultc                 C   r   rL   r"  r  rS   rS   rT   r  4  r#  zBoolNode.compile_time_valuec                 C   s$   | j jr| jr	dS dS tt| jS )NPy_TruePy_False)r   rp   r   rv   intrV   rS   rS   rT   r   7     zBoolNode.calculate_result_codec                 C   s   || j kr| S |tu r| j tju r| S |jr&| j jr&t| j| j| j	tjdS |jr9| j jr9t| j| j| j	t
jdS t| ||S Nr7  )r   r   r   	bool_typerp   r  r  r   r   r~   r   r  r+  r  r&  rS   rS   rT   r  =  s"   
zBoolNode.coerce_toN)
rZ   r[   r\   r   r  r   r  r  r   r  rS   rS   rS   rT   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   r   rL   r"  rV   rS   rS   rT   r  T  r#  z#NullNode.get_constant_c_result_codeN)	rZ   r[   r\   r   c_null_ptr_typer   r   r~   r  rS   rS   rS   rT   r6  O  s
    r6  c                   @   s*   e Zd ZejZdd Zdd Zdd ZdS )r   c                 C      t | j| _d S rL   )ordr   r~   rV   rS   rS   rT   r  [  r  z"CharNode.calculate_constant_resultc                 C   r-  rL   )r:  r   r  rS   rS   rT   r  ^  rL  zCharNode.compile_time_valuec                 C   s   dt | j S )Nz'%s')r
   escape_charr   rV   rS   rS   rT   r   a  r  zCharNode.calculate_result_codeN)	rZ   r[   r\   r   r   r   r  r  r   rS   rS   rS   rT   r   X  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<  r  Nc                 C   s   t tt | jS rL   )r   strip_py2_long_suffixhexstr_to_numberr   rV   rS   rS   rT   	hex_valueq     zIntNode.hex_valuec                 C   s   t t| jS rL   )rv   r   r>  r   rV   rS   rS   rT   base_10_valueu  r  zIntNode.base_10_valuec                 K   s.   t j| |fi | d|vr|  | _d S d S )Nr   )r   __init__find_suitable_type_for_valuer   )rW   r   kwdsrS   rS   rT   rB  y  s   zIntNode.__init__c                 C   s   | j tu rz|   W n	 ty   Y nw | js$|  r$| js$| jdkrC| jdkr+dp,d}tj	| j |df }| j
rAt|| j
}|S d| j   krNdk ran n| j
r\| j
jr\| j
}|S tj}|S tj}|S )NLLr4   r'   r2  i   l        )r~   r  r  r   is_c_literalr   unsignedlongnessr   modifiers_and_name_to_typer   widest_numeric_typer  r  r   )rW   ranksuitable_typerS   rS   rT   rC  ~  s2   


z$IntNode.find_suitable_type_for_valuec              	   C   s   | j |u r| S |jr)|  rt| jdt| j |t| jdS t| j| j|t	dS |j
rA|jsAt| j| j| j|d| j| jd}|S |jrVt| j| j| jtjd| j| jd}nt| j| j| j| j| jd}t|||S )Nz%d.0)r   r   r~   T)r   r~   r   rF  rG  rH  F)r   r~   rG  rH  )r   r  r   	FloatNoder   r2  r~   r   r   r  
is_numericr  r<  rG  rH  rp   r   r   r+  r  rW   r  rr   r   rS   rS   rT   r    s2   
zIntNode.coerce_toc                 C   s    t | j| j| jtj| j| jdS )N)r   r~   r   rG  rH  )r<  r   r   r~   r   r  rG  rH  r   rS   rS   rT   r+    s   zIntNode.coerce_to_booleanc                 C   sX   | j jr%t| j}|dkrtnt}||}t|}||| j	| _
d S |  | _
d S )Nl     a$)r   rp   r   r>  r   r=  rv   r<  
get_py_intrH  result_coder  )rW   r   r   	formatterplain_integer_stringrS   rS   rT   r{    s   
z IntNode.generate_evaluation_codec                 C   st   | j | j}}|  }|s4|s4| jjr4|d dkr4|d dkr4| jjtjjkr*d}n
| jjtjjkr4d}|| | S )Nr   -r'   0rE  L)	rG  rH  value_as_c_integer_stringr   r  rK  r   c_longlong_typer  )rW   rG  rH  literalrS   rS   rT   r    s   (z"IntNode.get_constant_c_result_codec                 C   s   | j }t|dkr|S d}|d dkrd}|dd  }|d dkra|d }|r>|dv r>|dd   r>tt|}|| S |dv rNd|dd   }|| S |d	v r]tt|dd  d}|| S | rs| jss| jss|ssd
t| }|| S )Nr4   r  r   rT  r'   rU  oOxX0123456789oObBz0x%X)	r   r   isdigitrv   r   r>  r2  rG  rH  )rW   r   neg_signliteral_typerS   rS   rT   rW    s,   
z!IntNode.value_as_c_integer_stringc                 C   r   rL   rQ  rV   rS   rS   rT   r     r#  zIntNode.calculate_result_codec                 C   s   t | j| _d S rL   )r   r>  r   r~   rV   rS   rS   rT   r    r   z!IntNode.calculate_constant_resultc                 C      t | jS rL   )r   r>  r   r  rS   rS   rT   r    r/  zIntNode.compile_time_value)rZ   r[   r\   rG  rH  rF  r  r?  rA  rB  rC  r  r+  r{  r  rW  r   r  r  rS   rS   rS   rT   r<  e  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 )rM  c                 C   r9  rL   )r   r   r~   rV   rS   rS   rT   r    r  z#FloatNode.calculate_constant_resultc                 C   sN   t | j}d| d}t| j}||t|dfvr%t| jd|  |S )Nz%.330frU  zEUsing this floating point value with DEF may lose precision, using %r)	r   r   stripr   normalise_float_reprreprlstripr   r   )rW   r  float_valuestr_float_value	str_valuerS   rS   rT   r    s   
zFloatNode.compile_time_valuec                 C   sX   |j r| jjrt| j| j| jtjdS |jr%| jj r%t| j| j| j|dS t	
| ||S r4  )rp   r   r  rM  r   r   r~   r   
float_typer+  r  r&  rS   rS   rT   r  	  s   zFloatNode.coerce_toc                 C   r   rL   r`  rV   rS   rS   rT   r     r#  zFloatNode.calculate_result_codec                 C   sH   | j }t|ts
J tt|}|dkrdS |dkrdS |dkr"dS |S )Nnanz(Py_HUGE_VAL * 0)infPy_HUGE_VALz-infz(-Py_HUGE_VAL))r   r}   rH   rd  r   )rW   strvalcmpvalrS   rS   rT   r    s   z$FloatNode.get_constant_c_result_codec                 C   s.   |   }| jjr|| j|| _d S || _d S rL   )r  r   rp   get_py_floatr   rQ  )rW   r   c_valuerS   rS   rT   r{  &  s   
z"FloatNode.generate_evaluation_codeN)rZ   r[   r\   r   c_double_typer   r  r  r  r   r  r{  rS   rS   rS   rT   rM    s    rM  c           
   	   C   s  t | }|d ur|jr|S | }|| }|r=|jr=|j}|js/|tju r/|j	j
dkr/t}|r9|js7|jr9|S |p<|}ddlm} tddt |d |d |d d f}z|d|  |d j|d	}W n	 tym   Y n?w |jjd j}	t|	tr|	|}	t|	tr|	j}|r|js|jr|W  d    S |p|}W d    |S W d    |S W d    |S W d    |S 1 sw   Y  |S )
Nr4   r'   )TreeFragmentTignorer      
sizeof(%s))rq   initial_pos)r   parse_basic_typein_c_type_contextglobal_scoper  is_typer   r   int_typecontextlanguage_levelr   rp   rr  r   filenamer   rootstatsexprr}   SizeofTypeNoder!  arg_type)
rq   r   rr   r
  rz  global_entryr   rr  declarationsizeof_noderS   rS   rT   _analyse_name_as_type.  sX   











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   r.  rL   r  rV   rS   rS   rT   r  _  r/  z#BytesNode.calculate_constant_resultNc                 C   s,   t | j||| | jj}t| j||dS Nr  )r
   bytes_literalr   encodingr  r   )rW   r   r   r   r   rS   rS   rT   as_sliced_nodeb  s   zBytesNode.as_sliced_nodec                 C   
   | j  S rL   )r   
byteencoder  rS   rS   rT   r  f  rL  zBytesNode.compile_time_valuec                 C   s   t | jd| j|S Nz	ISO8859-1)r  r   decoder   r   rS   rS   rT   rB  i     zBytesNode.analyse_as_typec                 C      t | jdkS r   r   r   rV   rS   rS   rT   can_coerce_to_char_literall  rK  z$BytesNode.can_coerce_to_char_literalc                 C      t | j}t| j||dS r  r,  r   r  r   rW   rr   r  rS   rS   rT   r+  o  s   
zBytesNode.coerce_to_booleanc                 C   s"  | j |kr| S |jr-|  st| jd | S |jr!t| jd | S t| j| jt| jdS t	| j| j| j
d}|jrQ|ttjfv rGtj|_ |S | j||dd |S |tjtjfv r^||_ |S |tjtjtjfv ry|tjkrpt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   r   is_unicode_charr   r   r:  r  r~   rp   r   r   r   r  r   rl   rn   rm   ro   c_void_ptr_typeCastNoder  r   is_constr+  r  rO  rS   rS   rT   r  u  s@   


zBytesNode.coerce_toc                 C   sP   | j jr|| j}n| j jr|| j}n| j }t| j tj	|}|| _
d S rL   )r   rp   get_py_string_constr   r  get_string_constas_c_string_literalr-   r   r  rQ  )rW   r   r   rY  rS   rS   rT   r{    s   

z"BytesNode.generate_evaluation_codec                 C   r   rL   rS   rV   rS   rS   rT   r    rY   z$BytesNode.get_constant_c_result_codec                 C   r   rL   r`  rV   rS   rS   rT   r     r#  zBytesNode.calculate_result_coderL   )rZ   r[   r\   r  r   r   r  r  r  rB  r  r+  r  r{  r  r   rS   rS   rS   rT   r  V  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   r.  rL   r  rV   rS   rS   rT   r    r/  z%UnicodeNode.calculate_constant_resultc                 C   s   t | j| j|S rL   )r  r   r   r   rS   rS   rT   rB    r  zUnicodeNode.analyse_as_typec                 C   sv   t | jd | rd S t | j||| }| jj|_| jd ur0t | j||| | jj}nd }t| j|||dS )N)r   bytes_valuer~   )	r
   string_contains_surrogatesr   r  r  r  r  r  r   )rW   r   r   r   r   r  rS   rS   rT   r    s   

zUnicodeNode.as_sliced_nodec                 C   s   || j u r	 | S |jr'|  st| jd | S t| j}t| j|t||dS |j	sR|j
r>| jd ur>t| j| jd||S |jrJt| j| j|dS t| jd | S |ttjfvra| j||dd | S )NzhOnly single-character Unicode string literals or surrogate pairs can be coerced into Py_UCS4/Py_UNICODE.r   r   r~   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   r   r:  r   r<  rv   rp   rw  r  r  r  rx  r  r   r   r1   r  )rW   r  rr   	int_valuerS   rS   rT   r    s2   

zUnicodeNode.coerce_toc                 C   r  r   r  rV   rS   rS   rT   r    rK  z&UnicodeNode.can_coerce_to_char_literalc                 C   r  r  r  r  rS   rS   rT   r+       
zUnicodeNode.coerce_to_booleanc                 C   ra  rL   )r
   r  r   rV   rS   rS   rT   contains_surrogates  r/  zUnicodeNode.contains_surrogatesc              
   C   s   | j jrVt| jrM|td| _|t	| j
d}|| j}|d u r)d S || j |d| j|||| j| jf  || jd| j  d S || j| _d S || j| _d S )Nustringunicode_escapez@%s = PyUnicode_DecodeUnicodeEscape(%s, sizeof(%s) - 1, NULL); %sz__Pyx_PyUnicode_READY(%s))r   rp   r
   string_contains_lone_surrogatesr   get_py_constr   rQ  r  BytesLiteralencodeget_cached_constants_writerru  r   r   r   put_error_if_negr  get_pyunicode_ptr_const)rW   r   
data_cname
const_coderS   rS   rT   r{    s.   z$UnicodeNode.generate_evaluation_codec                 C   r   rL   r`  rV   rS   rS   rT   r     r#  z!UnicodeNode.calculate_result_codec                 C   r   rL   r"  r   rS   rS   rT   r    r#  zUnicodeNode.compile_time_valuerL   )rZ   r[   r\   r  r  r   r   r  rB  r  r  r  r+  r  r{  r   r  rS   rS   rS   rT   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 ur| j | _d S d S rL   )r   r~   rV   rS   rS   rT   r  )  s   
z$StringNode.calculate_constant_resultc                 C   s   t | jp	| jd| j|S r  )r  r   r   r  r   r   rS   rS   rT   rB  .     zStringNode.analyse_as_typec                 C   sx   t | j| j||| }| jj|_| jd ur/t| jd | r#d S t| j||| }nd }t| j|||| j	dS )N)r   r   r~   is_identifier)
r   r   r  r   r
   r  r  r  r   r  )rW   r   r   r   r   r   rS   rS   rT   r  1  s   

zStringNode.as_sliced_nodec                 C   sN   |t ur%t|s%|jst| j| jd||S |tj	ur%| j
||dd | S )Nr"  Tr  )r   r   r  rp   r  r   r   r  r   r1   r  r&  rS   rS   rT   r  @  s   
zStringNode.coerce_toc                 C   s   | j  o
t| jdkS r   )r  r   r   rV   rS   rS   rT   r  K  r  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   rQ  rm  rS   rS   rT   r{  N  s   
z#StringNode.generate_evaluation_codec                 C   r   rL   rS   rV   rS   rS   rT   r  S  rY   z%StringNode.get_constant_c_result_codec                 C   r   rL   r`  rV   rS   rS   rT   r   V  r#  z StringNode.calculate_result_codec                 C   s8   | j jr| j S ts| j  S | jd ur| jS | j dS )N	iso8859-1)r   
is_unicoder&   r  r   r  r   rS   rS   rT   r  Y  s   

zStringNode.compile_time_valuerL   )rZ   r[   r\   r   r   r  r  r   r  rB  r  r  r  r{  r  r   r  rS   rS   rS   rT   r    s    
r  c                   @   s   e Zd ZdZdS )r   TN)rZ   r[   r\   r  rS   rS   rS   rT   r   e  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        )complexr   r   r~   rV   rS   rS   rT   r  r  r  z"ImagNode.calculate_constant_resultc                 C   s   t dt| jS r  )r  r   r   r  rS   rS   rT   r  u  r  zImagNode.compile_time_valuec                 C   s   | j | | S rL   )r   create_declaration_utility_coder   rS   rS   rT   r!  x     zImagNode.analyse_typesc                 C   rU   rQ  rS   rV   rS   rS   rT   r  |  rY   zImagNode.may_be_nonec                 C   s@   | j |u r| S t| j| jd}|jrd|_tj|_ t	|||S )Nr"  r'   )
r   r  r   r   rp   r   r   complex_typer  r  rO  rS   rS   rT   r    s   
zImagNode.coerce_tozConstructing complex numberc                 C   s&   | j jr|  S d| j jt| jf S )Nz	%s(0, %r))r   rp   r   
from_partsr   r   rV   rS   rS   rT   r     s   zImagNode.calculate_result_codec              	   C   sF   | j jr!|d|  t| j||  | jf  | | d S d S )Nz'%s = PyComplex_FromDoubles(0.0, %r); %s)	r   rp   r   r   r   r   r   r   r  rm  rS   rS   rT   rv    s   zImagNode.generate_result_codeN)rZ   r[   r\   r   c_double_complex_typer   r  r  r!  r  r  gil_messager   rv  rS   rS   rS   rT   r  k  s    r  c                   @   8   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 u s|jst| jd t| _d S | | || j}|| _	|| _
|j| _| jS )Nz/new operator can only be applied to a C++ class)cppclassrB  r   r   r   r.   r   	cpp_checkget_constructor
class_typer   )rW   rr   r   constructorrS   rS   rT   r     s   
zNewExprNode.infer_typec                 C   s   | j d u r
| | | S rL   )r   r   r   rS   rS   rT   r!    s   

zNewExprNode.analyse_typesc                 C   rU   rQ  rS   rV   rS   rS   rT   r    rY   zNewExprNode.may_be_nonec                 C   r   rL   rS   rm  rS   rS   rT   rv    rY   z NewExprNode.generate_result_codec                 C   s   d| j   S )Nznew )r  empty_declaration_coderV   rS   rS   rT   r     rK  z!NewExprNode.calculate_result_code)	rZ   r[   r\   r   r   r!  r  rv  r   rS   rS   rS   rT   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 dPd(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.		dQdDdEZ/dFdG Z0dHdI Z1dPdJdKZ2dLdM Z3dNdO Z4  Z5S )Rr  TFNr   c                 C   r   rL   )cython_attributerV   rS   rS   rT   r    r#  zNameNode.as_cython_attributec                 C   s6   | j d u r|| j| _ | j d ur| j jjr| fS dS NrS   )r   r  rq   r   is_unspecifiedr   rS   rS   rT   r1    s
   
zNameNode.type_dependenciesc                 C   s   | j d u r|| j| _ | j d u s| j jtu r!| jd ur| jS tS | j jjs+| j jjr5| j| j jjkr5t	S | j jj
rH| j jjrAtS t| j jS | j jjr[| jr[| jjrX| j js[| jS | j jS rL   )r   r  rq   r   r/   inferred_typer   is_extension_typeis_builtin_typer   r5  r  is_builtin_scoper   CPtrTyperp   r  might_overflowr   rS   rS   rT   r     s"   



zNameNode.infer_typec                 C   s6   z| | jW S  ty   t| jd| j  Y d S w )Nz"Compile-time name '%s' not defined)r  rq   rF  r   r   r  rS   rS   rT   r     s
   zNameNode.compile_time_valuec                 C   s   | j r| j jjr
d S | j jS rL   )r   r   rp   r   rV   rS   rS   rT   r    s   z#NameNode.get_constant_c_result_codec                    st   |t u r1| j}|r1|jr1|j}|r1|jr|jr||j| j}t	| j| jd}||_|
| |S tt	| ||S )Nrq   )r   r   r5  as_variable
is_builtinr  declare_builtinrq   r   r  analyse_rvalue_entryrN   r  )rW   r  rr   r   	var_entryr   rQ   rS   rT   r    s   

zNameNode.coerce_toc           
      C   s^  | j }| j}| jp||}|s|jrdS d}|jjs |jd s#d}n|jr)t	}n|
|\}}|du rB|r?|jd dkr?tnt	}n#|jre|jrez||j}W n tyd   t| jd| j   t}Y nw d}|jr}|jdk}	|jsw||r}|	r{d	nd
}|r|jr|js|jst	}t|jdd |j||| j| ||d }| _|r|js||_dS dS 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.
        NrS   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?r4   )is_cdef
visibilitypytyping_modifiers)rq   r  r   lookup_hereis_module_scoper  r  rj   is_py_class_scoper   analyse_type_annotationr/   rC  rD  rE  r(   r   r   r.   is_c_dataclass_scoperp   can_coerce_to_pyobjectis_c_class_scoper  r   declare_var)
rW   rr   	as_targetrq   r  r   	modifiersatyper  	is_frozenrS   rS   rT   declare_from_annotation  sZ   


z NameNode.declare_from_annotationc                 C   sN   | j }|s|| j}|r|jr|jS |r%|jr%t|j}|r%|jr%|S d S rL   )r   r  rq   	as_moduleknown_standard_library_importr   'get_known_standard_library_module_scoper  )rW   rr   r   r  rS   rS   rT   r@  ^  s   


zNameNode.analyse_as_modulec                 C   s  d }| j rt| j }n	|jrt| j}|r|S | j}|s$|| j}|r2|js2|jr2t	
|j}|rh|jrh|j}|jsL|t	ju rLt| jd t}|S |jrW|jrW|j}|S |t	ju rf| jjdkrft}|S | jdkrotS |jst| jrt| jd| j| jf  d S )NzWFound Python 2.x type 'long' in a Python annotation. Did you mean to use 'cython.long'?r4   objectzJFound C type '%s' in a Python annotation. Did you mean to use 'cython.%s'?)r  r   rx  ry  rq   r   r  r{  r  r    get_known_standard_library_entryr   r2   r   r   r   rp   equivalent_typer|  rz  r}  r~  r3  rS   rS   rT   rB  l  s:   

zNameNode.analyse_as_typec                 C   s:   | j }|s|| j}|r|jr|jjs|jjr|jS d S rL   )r   r  rq   r{  r   r  r  rW   rr   r   rS   rS   rT   rH    s   
z"NameNode.analyse_as_extension_typec                 C      | j |ddS )NFis_assignment_expression_analyse_target_declarationr   rS   rS   rT   r    rK  z#NameNode.analyse_target_declarationc                 C   r  )NTr  r  r   rS   rS   rT   r     rK  z9NameNode.analyse_assignment_expression_target_declarationc                 C   s  d| _ | js|r|| j| _n|| j| _| jrd| j_| js2| jd ur2|j}| j|| d n| jrE| jj	rE| jrE|jrEt
| jd | jsz|jd rWt| jd| j d |jd d	krat}nt}|rp|| j|| j| _n
|| j|| j| _| jjrt| _| jjrd| j_d S d S )
NTr  )r  z7Cannot redeclare inherited fields in Cython dataclasseszwarn.undeclaredzimplicit declaration of '%s'r'   r  F)r  r   #lookup_assignment_expression_targetrq   r  r  r  r  r  is_inheritedr   r   rj   r   r/   r   $declare_assignment_expression_targetr  is_declared_genericr  r  is_variable)rW   rr   r  is_dataclassr   rS   rS   rT   r    s<   
z$NameNode._analyse_target_declarationc                 C   s   |j d | _| j}|d u r3|| j}|s(|| j| j}|r(|jr(|jr(d| _	|s0t
j| _| S || _d|_|jjrEddlm} || | | | S )NinitializedcheckTr'   Buffer)rj   initialized_checkr   r  rq   r  r   r  r  r   r   r.   r   r  	is_bufferr  r  used_buffer_aux_varsr  rW   rr   r   r  rS   rS   rT   r!    s$   

zNameNode.analyse_typesc                 C   s   | j |dd | j}|jr(|jr(|js|jjs|  s(|jr(|j }| _|j| _| jjr5t	| j
d| j  |  sFt	| j
d| j  tj| _d|_|jjrXddlm} || | S )NTr  zAssignment to const '%s'zAssignment to non-lvalue '%s'r'   r  )analyse_entryr   r5  r  is_overridabler   r   fused_cfunctionr  r   r   rq   r   r.   r  r  r  r  r	  r
  rS   rS   rT   r)    s    
zNameNode.analyse_target_typesc                 C   sj   |  | | j}|jrt| _|js|jr&|jr|jrd| _nd| _d| _	| S |j
jr3d| _d| _	d| _| S )Nr   r'   FT)r  r   r  r   r  is_pyglobalr  r  r   is_used_as_rvaluer   r   rc  r  rS   rS   rT   r    s   
zNameNode.analyse_rvalue_entryc                 C   sH   d| _ | jr | j}|jr|js|   d S d S |jr"|   d S d S d S r%  )r   r  r   r  r  rM  r  r  rS   rS   rT   rN  	  s   zNameNode.nogil_checkz"Accessing Python global or builtinc                 C   s<   |    | j}|j}|s|jr| jr| jjr| j}|| _d S rL   )check_identifier_kindr   r   rp   r  r  )rW   rr   r  r   r   rS   rS   rT   r  	  s   
zNameNode.analyse_entryc                 C   s   | j }|jr|jjr|| _|jr-|jjs|jjr-t| j	d t
}d|_| j j|_|| _ d S |jsU|jsW|jsY|js[|js]| j jrG| j j| _ d S | js_t| jd| j	  d S d S d S d S d S d S d S )NTz7'%s' is not a constant, variable or function identifier)r   r{  r   r  
type_entryr  is_cpp_enumr   Entryrq   r   r  r  r  r  r  r5  r   r  is_cython_moduler   r   )rW   r   py_entryrS   rS   rT   r  	  s*   

zNameNode.check_identifier_kindc                 C   s0   | j s| jrdS | jp|| j}|jo|j S rQ  )r  r  r   r  rq   r  r  r  rS   rS   rT   "is_cimported_module_without_shadow2	  s   z+NameNode.is_cimported_module_without_shadowc                 C   rU   r   rS   rV   rS   rS   rT   r  8	     zNameNode.is_simplec                    sp   | j r1| jr1| jjs| jjr1t| ddrdS d| _d}| j D ]}|j r,d} | `|S q| `|S tt	|  S )N_none_checkingFT)
r   r   rp   r   r   r  r   r  rN   r  )rW   r  
assignmentrQ   rS   rT   r  <	  s"   

zNameNode.may_be_nonec                 C   s:   t | rdS | j}|r|jrdS |jp|jp|jp|jS NTF)r   r6  r   
in_closureis_localis_argr  is_readonlyrW   r   rS   rS   rT   r6  Q	  s   

zNameNode.nonlocally_immutablec                 C   r   rL   rS   r   rS   rS   rT   calculate_target_resultsY	  rY   z!NameNode.calculate_target_resultsc                 C   s8   | j }|d ur|js|js|js|jjs|   dS dS r  )r   r  r5  r  r   rR  r   rS   rS   rT   r"  \	  s   zNameNode.check_constc                 C   s(   | j }|js|js|js|   dS dS r  )r   
is_cglobalr5  r  rT  r   rS   rS   rT   rU  g	  s
   zNameNode.check_const_addrc                 C   s"   | j jo| j j p| j jo| j jS rL   )r   r  r  r5  r  rV   rS   rS   rT   r   n	  s   zNameNode.is_lvaluec                 C   s   | j jo| jj S rL   )r   r  r   r   rV   rS   rS   rT   r   w	  r   zNameNode.is_addressablec                 C   rU   r   rS   rV   rS   rS   rT   r   z	  rA  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   rS   rS   rT   r   	  s   
zNameNode.calculate_result_codec           	   
   C   sR  | j }|d u r	d S |jr|j|j |jr|jrd S |jr|jjs&J d|	| j j
}|jr4tj}n|jj}| jsU|d|  ||f  |d|    |d |jtdd |d|  |f  | jsr|d |||  | j | | d S |jr|jjs|jjsJ d|	| j j
}|jtd	d |d
|  |||  | jf  | | d S |js|jr#|jjr#|jjsJ d|	| j j
}|jjr|jtdd |d|  |||  | jf  n |jtdd |d|  |jj|||  | jf  | | d S |js4|js4|js4|jjr| js<| jo?| j }|jjoG| j}|j oN| j}|rZ|j!|j"}n|j#|j"}|r|r|jjsr|sr|r|j$| j|| j%|d d S d S d S d S |j&r|j r| jr|j!|j"}|j$| j||d d S d S d S d S )N,Python global or builtin not a Python objectz%s = PyObject_GetItem(%s, %s);if (unlikely(!%s)) {PyErr_Clear();GetModuleGlobalNameObjectHandling.cz"__Pyx_GetModuleGlobalName(%s, %s);r   GetBuiltinNamez!%s = __Pyx_GetBuiltinName(%s); %sz%__Pyx_GetModuleGlobalName(%s, %s); %sGetNameInClassz$__Pyx_GetNameInClass(%s, %s, %s); %sunbound_check_code)'r   utility_coder   r   r  r  is_pyclass_attrr   rp   intern_identifierrq   r   builtins_cnamer  namespace_cnamer  r   r   r   r   r   r   r  r  r  r  r  from_closurer   r  
allow_nullr  r%   cpp_optional_check_for_null_coder   check_for_null_codeput_error_if_unboundrr  r"  )	rW   r   r   interned_cname	namespaceraise_unboundmemslice_checkoptional_cpp_checkr.  rS   rS   rT   rv  	  s   





""zNameNode.generate_result_codec              	   C   s:  | j }|d u r	d S | j jjrt|tr| js|jst| jd |j	r|jj
s*J d|| j j}| j jj}|jr<d}	n+|jjrFd}	tj}n!|jra| jdkrPdnd}
|jt|
d d	|
 }	nJ t||| jd|	||| f  trtd td|  || || |jr|d|jj j!  d S d S | jj"r| #|| n
| jj$r| %|| d
}| jj
r| j&r|'| |j(p| j j)p| j j*}|r| j+|dd d}|j(r| ,||-| .  n!| j/s| j0r| 1||-| .  n| ,||-| .  nd
}|r|2| | jj"s|sy|rK|3 }|dkr?t4|| jd| 5 |f | jj
r8| 5 nd || j6 n:|d| 5 |f  n.|7| . }t8| jrg|d| 5 | 5 |f  n|| 5 kry|d| 5 |f  trtd td|  |9| n
|: r|9| || d S )Nz?Literal list must be assigned to pointer at time of declarationr&  __Pyx_SetItemOnTypeDictPyDict_SetItemrO   SetNewInClassSetNameInClassr*  __Pyx_Fz%s(%s, %s, %s)z"NameNode.generate_assignment_code:z"...generating disposal code for %szPyType_Modified(%s);T)r  r   %s = %s;new (&%s) decltype(%s){%s};z)...generating post-assignment code for %s);r   r   r  r}   ListNodelhs_of_first_assignmentin_module_scoper   r   r  rp   r1  rq   r  r3  	is_memberr  r   moddict_cnamer0  r   r   r   r   rd  r  r   r   printr  r  r   parent_typetypeptr_cnamer    generate_acquire_memoryviewslicer  generate_acquire_bufferrc  rn  r"  r  r4  r  r  r  r
  r  r  r  r  r   r   r   rr  r  r;   r  rW  )rW   r   r   r  r   r   r   r9  r:  setternassignedis_external_refr   rS   rS   rT   r  	  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'   r  )	lhs_cnamer   lhs_posr   r   rp  first_assignmentN)r  r  put_acquire_memoryviewslicer   r   r   rr  r  )rW   r   r   r  rS   rS   rT   rM  R
  s   
z)NameNode.generate_acquire_memoryviewslicec                 C   s   t |tp|j}|r||  }n|jj| jjdd}|	d|||  f  ddl
m} |j|  || j| j | j|d |sR|	d|  |j| d S d S )NFr\  rC  r'   r  )is_initializedr   r   r  )r}   r  r   r  r
  ra  rb  r   r   r   r  r  put_assign_to_bufferr   rF  r   rj  )rW   r   r   
pretty_rhsrhstmpr  rS   rS   rT   rN  b
  s   z NameNode.generate_acquire_bufferc              	   C   s|  | j d u rd S | j jr3| j jj}|| j j}|rd}nd| j j }|d||||| jf  d S | j j	ri|j
tdd || j j}dtj|f }|r`|d||| jf  d S || j| d S | j jjss| j jjr| js| jr|s|| j| j  | j jr| j|d|d	 |r| jr|j|  |  | j d
 d S |j|  |  | j d
 d S d S 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)r  r  ro  z!Deletion of C names not supported)r   r0  r  r3  r1  rq   r   r   r   r  r   r   r   r   r   module_cnamer  r   rp   r   r  r  r8  r  r  put_xdecref_clearr   r
  r   r  r   )rW   r   r  r:  r9  key_error_codedel_coderS   rS   rT   r  v
  sb   







zNameNode.generate_deletion_codec                 C   sz   t | ddr;| jd | jd | jd t| j d f}| jjr$d\}}nd\}}||t||| j t| jd d S d S )	N	is_calledFr   r'   r4   )py_callzpython function (%s))c_callzc function (%s)size)r   r   r   rq   r   rp   r  r5   )rW   r   r   styletextrS   rS   rT   r  
  s   *
&zNameNode.annotatec                 C   s   | j r| j jS d S rL   )r   r  rV   rS   rS   rT   r  
  s   z*NameNode.get_known_standard_library_importr	  r  )6rZ   r[   r\   r   r  r  rF  r  r   r  r  r  r5  r   r  r  r1  r   r  r  r  r  r@  rB  rH  r  r   r  r!  r)  r  rN  r  r  r  r  r  r  r6  r!  r"  rU  r   r   r   r   rv  r  rM  rN  r  r  r  r]   rS   rS   rQ   rT   r    sj    
@'#

	[
p
2	r  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   )ri  r!  r  r   r   rS   rS   rT   r!  
  s   zBackquoteNode.analyse_typeszBackquote expressionc                 C      t | jj| _d S rL   )rd  ri  r~   rV   rS   rS   rT   r  
  r   z'BackquoteNode.calculate_constant_resultc              	   C   s:   | d|  | j ||  | jf  | | d S )Nz%s = PyObject_Repr(%s); %s)r   r   ri  r   r   r   r  rm  rS   rS   rT   rv  
  s   z"BackquoteNode.generate_result_codeN)
rZ   r[   r\   r   r   r   r!  r  r  rv  rS   rS   rS   rT   rh  
  s    rh  c                   @   s@   e Zd ZeZdZdZdZg dZdd Z	dZ
dd	 Zd
d ZdS )
ImportNodeNFT)module_name	name_listmodule_namesc                    s    j d u r| jr|jd stj| jjvrd _ nd _  j	|}|
| _ jjs1J  jrB j	|}|
| _ S d jjv rdt jj fddttj jjdD d	| _ S )N
py2_importr   .c                    s   g | ]}t  jj||d qS )r  )r   rl  r   )r`   partrV   rS   rT   r   
  s    z,ImportNode.analyse_types.<locals>.<listcomp>r   )r|   rz  parent_modulerj   r6   r   r}  future_directivesrl  r!  r  r  rm  r   	TupleNoder   mapr
   r  r  rn  )rW   rr   rl  rm  rS   rV   rT   r!  
  s*   

zImportNode.analyse_typeszPython importc              	   C   sH  | j jsJ | j j}| jdkrM| jsM| jsM| jr| jjsJ | jdkr,t	dd}d}nt	dd}d}|j
| d|| j  | jrH| j ndf }n|j
t	d	d d
| j  | jrd| j nd| jf }| jdkr|tv rt| \}}}|j
t	|| d||f }|d|  |||  | jf  | | d S )Nr   ImportDottedModulezImportExport.c__Pyx_ImportDottedModuleImportDottedModuleRelFirst __Pyx_ImportDottedModuleRelFirst
%s(%s, %s)r7  Importz__Pyx_Import(%s, %s, %d)rU  %s(%s)%s = %s; %s)rl  r  r   r|   rm  get_top_level_modulern  r   r   r   r   r   r   r+   r   r   r   r   r  )rW   r   rl  r/  helper_funcimport_code	code_name	code_filerS   rS   rT   rv    s@   
zImportNode.generate_result_codec                 C      | j jS rL   )rl  r   rV   rS   rS   rT   r  *  r,  z,ImportNode.get_known_standard_library_import)rZ   r[   r\   r   r   rn  r  r   r   r!  r  rv  r  rS   rS   rS   rT   rk  
  s    %rk  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   s<   |d ur	|| _ d S | jrt|| _ d S | j sd | _ d S d S rL   )
expr_scopehas_local_scoper   ComprehensionScope)rW   outer_scoper  rS   rS   rT   
init_scope=  s   

zScopedExprNode.init_scopec                 C      |  | d S rL   )r  r   rS   rS   rT   analyse_declarationsE  rK  z#ScopedExprNode.analyse_declarationsc                 C   r   rL   rS   r   rS   rS   rT   analyse_scoped_declarationsH  r  z*ScopedExprNode.analyse_scoped_declarationsc                 C   r!  rL   rS   r   rS   rS   rT   r!  L  r  zScopedExprNode.analyse_typesc                 C   r!  rL   rS   r   rS   rS   rT   analyse_scoped_expressionsP  r  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
s:|jjr:|jr:|| q'|sH|| |d d S | }| }|| | || |d}|| |j|fgtt| | D ]\}	}
||	r||	 | || ||
 qs|| |d || ||_d S )Nz{ /* enter inner scope */c                 s   s    | ]	}|d  r|V  qdS )r   NrS   r   rS   rS   rT   rd   ^  s    z:ScopedExprNode.generate_evaluation_code.<locals>.<genexpr>z} /* exit inner scope */
exit_scope)rN   r  r{  r  r  var_entriesr   sortedentriesitemsr  r   rp   r  r   new_loop_labelsnew_error_label_generate_vars_cleanup	new_labelput_gotoerror_labelr   zipget_loop_labels
label_used	put_labelset_loop_labels)rW   r   generate_inner_evaluation_code
py_entries_r   old_loop_labelsold_error_labelr  label	old_labelrQ   rS   rT   r{  T  sB   
"











z'ScopedExprNode.generate_evaluation_codec                 C   s6   |D ]}|j r|| ||d q|| qd S )Nr$  )r"  put_var_gotrefput_var_decref_setput_var_xdecref_clear)rW   r   r  r   rS   rS   rT   r    s   
z%ScopedExprNode._generate_vars_cleanuprL   )rZ   r[   r\   r   r  r  r  r  r  r!  r  r{  r  r]   rS   rS   rQ   rT   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r"| jjjs"| jj| _n=| jjjr2t| j	| jd|S | 
 rI| jjjd j}t| j	|dd|S | j|| _| jjttfv r_| jd| _d| _| S )N)r  r   T)r  reversed!'NoneType' object is not iterabler'   )r  r  r!  r   r4  r  rw  r   CppIteratorNoder   is_reversed_cpp_iteration	arg_tupler   ri  r  r   r   r  r   )rW   rr   r  rS   rS   rT   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
s'd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   )r}   r  r  r  r   r   r  r   rq   r   r  CoercionNoderi  r   r   )rW   funcri  rS   rS   rT   r    s   z&IteratorNode.is_reversed_cpp_iterationc                 C   s   | j | jp|S rL   )r  r1  r  r   rS   rS   rT   r1    r   zIteratorNode.type_dependenciesc                 C   sP   | j |}|js|jr|S |jr!|jd}|d ur|jjS t
S |j	r&|S t
S )Nbegin)r  r   r4  r  r   r  r  r   return_typerp   r   )rW   rr   sequence_typer  rS   rS   rT   r     s   zIteratorNode.infer_typec              	   C   s  | j j}|jrJ d|js|jrtd|ttfv }|s$| jr$J d|j	 | _
| j
r;|d| j  | j  f  |s@| j
r|d|  | j  |  f  |jjtjdd| _| jr|tu red}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 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\  __Pyx_PyList_GET_SIZE__Pyx_PyTuple_GET_SIZE%s = %s(%s);#if !CYTHON_ASSUME_SAFE_MACROS#endifz--%s;r  
%s = NULL;} else {z	%s = -1; %s = PyObject_GetIter(%s); %sz+%s = __Pyx_PyObject_GetIterNextFunc(%s); %sr   )r  r   r   r4  r  r   r   r   r  r  may_be_a_sequencer   r   r   ra  rb  r   r=  counter_cnameerror_goto_if_negr   _func_iternext_typeiter_func_ptrputr   r  )rW   r   r  is_builtin_sequencelen_funcrS   rS   rT   rv    sl   






z!IteratorNode.generate_result_codec                 C   s  | j sJ d|dv sJ d||  f }d}| jjr=t| jj}| jjd u r,|}d}nt| jjjt	r=|| jjj }d}|rJ|
d| j |f  n4|
d |
dtj|f  |
d	 |
|tj| j |
d
 |
d| j tjf  |
d | jrd}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; %srU  #elsez,%s = __Pyx_PySequence_ITEM(%s, %s); %s%s; %s)r  r   r  r   r   r   r   r}   r~   r%   r   r   quick_temp_cnamer  r   r  r   r  r   )rW   	test_nameresult_namer   
final_sizesize_is_safe
item_countinc_decrS   rS   rT   generate_next_sequence_item  sd   





z(IteratorNode.generate_next_sequence_itemc                 C   sR  | j j}| jr|d| j  |tu r| d|| d S |tu r)| d|| d S | jrZ|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   r   r  r   )rW   r  r   r  rS   rS   rT   generate_iter_next_result_codeJ  sF   









z+IteratorNode.generate_iter_next_result_codec                 C   s>   | j r
|j| j  | jr|j| j d | _t| | d S rL   )r  ra  rj  r  r   r  rm  rS   rS   rT   r  o  s   zIteratorNode.free_temps)rZ   r[   r\   r   r   r  r  r  is_asyncr  r   r!  r  r   r  	CFuncTypeCFuncTypeArgr  r  r1  r   rv  r  r  r  rS   rS   rS   rT   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  Nrq  r  TFr  c                 C   s   | j sdS dS )N)r  end)rbeginrend)r  rV   rS   rS   rT   get_iterator_func_names  rK  z'CppIteratorNode.get_iterator_func_namesc                 C   s  | j j}|jr
|j}|  \}}|j|}|j|}|d u s(|jjr(|jjr9t	| j
d|| j jf  t| _| S |d u sE|jjrE|jjrVt	| j
d|| j jf  t| _| S |jj}|jr|jd red| _|| j
d||jjgd u rt	| j
d|| j jf  t| _| S || j
d|gd u rt	| j
d|| j jf  t| _| S || j
d|gd u rt	| j
d|| j jf  t| _| S || _| S |jr||jjkst	| j
d	||f  || _| S 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   r  r  r  r  r  r5  r   r   r   r.   r  r   rj   extra_dereferencelookup_operator_for_types)rW   rr   r  
begin_nameend_namer  r  	iter_typerS   rS   rT   r!    sl   

zCppIteratorNode.analyse_typesc                 C   s   | j j}|  \}}| j  r"|d|  | j  | j|f  d S |}|jr-t	|j
}|js6|jjd r9d| _|jj|dd| _|d| j|jrLdnd| j  f  |d|  | j| j|f  d S )	Nz%s = %s%s%s();r  ->Fr\  z
%s = %s%s;&r  )r  r   r  r  r   r   cpp_attribute_opr   r   r  r  r  r   rj   ra  rb  cpp_sequence_cnamer   )rW   r   r  r  r  	temp_typerS   rS   rT   rv    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  )rW   r  r   r  r  rS   rS   rT   r    s   z.CppIteratorNode.generate_iter_next_result_codec                 C      | j sd S t| | d S rL   )r  r   ry  rm  rS   rS   rT   ry       z.CppIteratorNode.generate_subexpr_disposal_codec                 C   r  rL   )r  r   rz  rm  rS   rS   rT   rz    r  z"CppIteratorNode.free_subexpr_tempsc                 C   s.   | j st| | t| | t| | d S rL   )r  r   ry  rz  r  rm  rS   rS   rT   r    s   z&CppIteratorNode.generate_disposal_codec                 C   s$   | j r
|j| j  t| | d S rL   )r  ra  rj  r   r  rm  rS   rS   rT   r     s   zCppIteratorNode.free_temps)rZ   r[   r\   r  r  r  r   r  r   r  r!  rv  r  ry  rz  r  r  rS   rS   rS   rT   r  x  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      t | |j || _d S rL   r  rB  r   iteratorrW   r  rS   rS   rT   rB       
zNextNode.__init__c                 C   r   rL   rS   r   rS   rS   rT   rN    r  zNextNode.nogil_checkc                 C      | j |S rL   )r  r1  r   rS   rS   rT   r1    r/  zNextNode.type_dependenciesNc                 C   s   |d u r
| j |}|js|jr|jS |jr*|| jd|gjj	}t
j|dd}|S t| j| j jt| jdt
jdd}||S )Nr   T)remove_fakerefPY_SSIZE_T_MAXr  r8  )r  r   r  r4  r  r   r  r   r   r  r   remove_cv_refr;  r  r<  r=  )rW   rr   iterator_type	item_typefake_index_noderS   rS   rT   r     s    
zNextNode.infer_typec                 C   s   |  || jj| _d| _| S r   )r   r  r   r   r   rS   rS   rT   r!  ,  s   zNextNode.analyse_typesc                 C   s   | j |  | d S rL   )r  r  r   rm  rS   rS   rT   rv  1  r  zNextNode.generate_result_coderL   )	rZ   r[   r\   rB  rN  r1  r   r!  rv  rS   rS   rS   rT   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   r)  rL   r   r   rS   rS   rT   r   C  rY   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   rp   r   r   r  r   rS   rS   rT   r!  F  s   
zAsyncIteratorNode.analyse_typesc              	   C   N   |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   r   r  rm  rS   rS   rT   rv  O     z&AsyncIteratorNode.generate_result_codeN)rZ   r[   r\   r   r  r   r   r   r  r   r!  rv  rS   rS   rS   rT   r  5  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   r  rL   r  r  rS   rS   rT   rB  c  r  zAsyncNextNode.__init__c                 C   r)  rL   r  r   rS   rS   rT   r   g  rY   zAsyncNextNode.infer_typec                 C   r!  rL   rS   r   rS   rS   rT   r!  j  rY   zAsyncNextNode.analyse_typesc              	   C   r  )Nr  r  z*%s = __Pyx_Coroutine_AsyncIterNext(%s); %s)r   r   r   r   r   r   r  r   r   r   r  rm  rS   rS   rT   rv  m  r   z"AsyncNextNode.generate_result_codeN)
rZ   r[   r\   r   r   r   rB  r   r!  rv  rS   rS   rS   rT   r  X  s    r  c                   @   s,   e Zd ZddgZdZdZdd Zdd ZdS )	WithExitCallNoder   
await_exprTNc                 C   s4   | j || _ | jr| j|| _tj| _d| _| S r%  )r   r!  r  r   r  r   r   r   rS   rS   rT   r!    s   zWithExitCallNode.analyse_typesc                 C   st  | 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r|| j
|   |j| | j r|d d S d S )N	if (%s) {Fr\  PyObjectCallr*  z'%s = __Pyx_PyObject_Call(%s, %s, NULL);r  T)source_cnamedecref_sourcerC  z%s = __Pyx_PyObject_IsTrue(%s);r   )test_if_runr   	with_statexit_varr   r{  ra  rb  r   ru  r   r   r   r   r   r   r  r  r  r   r  r  r   r  r`  rd  r  rj  )rW   r   
result_varrS   rS   rT   r{    sB   

z)WithExitCallNode.generate_evaluation_code)rZ   r[   r\   r   r  r  r!  r{  rS   rS   rS   rT   r  v  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 rL   r   rB  )rW   r   rS   rS   rT   rB    r  zExcValueNode.__init__c                 C   
   || _ d S rL   var)rW   r  rS   rS   rT   set_var  rL  zExcValueNode.set_varc                 C   r   rL   r  rV   rS   rS   rT   r     r#  z"ExcValueNode.calculate_result_codec                 C   r   rL   rS   rm  rS   rS   rT   rv    rY   z!ExcValueNode.generate_result_codec                 C   r!  rL   rS   r   rS   rS   rT   r!    rY   zExcValueNode.analyse_typesN)
rZ   r[   r\   r   r   rB  r  r   rv  r!  rS   rS   rS   rT   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   rB  r   rp   r   r  r   )rW   r   r   rr   rS   rS   rT   rB    s
   
zTempNode.__init__c                 C   r!  rL   rS   r   rS   rS   rT   r!    rY   zTempNode.analyse_typesc                 C   
   d| _ d S r%  r  r   rS   rS   rT   r    rL  z#TempNode.analyse_target_declarationc                 C   r   rL   rS   rm  rS   rS   rT   rv    rY   zTempNode.generate_result_codec                 C   s   |j j| jdd| _d S )NTr\  )ra  rb  r   
temp_cnamerm  rS   rS   rT   allocate  r  zTempNode.allocatec                 C   s   |j | j d | _d S rL   )ra  rj  r  rm  rS   rS   rT   release  r  zTempNode.releasec                 C   s   z| j W S    J d)NFz-Remember to call allocate/release on TempNode)r  rV   rS   rS   rT   r     s   zTempNode.resultc                 C   r   rL   rS   rm  rS   rS   rT   rd    rY   zTempNode.allocate_temp_resultc                 C   r   rL   rS   rm  rS   rS   rT   rk    rY   zTempNode.release_temp_resultrL   )rZ   r[   r\   r   rB  r!  r  rv  r  r  r   rd  rk  rS   rS   rS   rT   r    s    	
r  c                   @      e Zd Zdd ZdS )
PyTempNodec                 C   s   t | |tj| d S rL   )r  rB  r   r   )rW   r   rr   rS   rS   rT   rB    r  zPyTempNode.__init__NrZ   r[   r\   rB  rS   rS   rS   rT   r        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 ur|| _d S d S )Nr  )r   rB  r   )rW   r   r   r   rS   rS   rT   rB    s   
zRawCNameExprNode.__init__c                 C   r!  rL   rS   r   rS   rS   rT   r!    rY   zRawCNameExprNode.analyse_typesc                 C   r  rL   r   )rW   r   rS   rS   rT   	set_cname
  rL  zRawCNameExprNode.set_cnamec                 C   r   rL   r  rV   rS   rS   rT   r     r#  zRawCNameExprNode.resultc                 C   r   rL   rS   rm  rS   rS   rT   rv    rY   z%RawCNameExprNode.generate_result_codeNN)	rZ   r[   r\   r   rB  r!  r  r   rv  rS   rS   rS   rT   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                        fdd| j D | _ | S )Nc                    s   g | ]
}|   qS rS   )r!  r  )r`   vry   rS   rT   r   '      z/JoinedStrNode.analyse_types.<locals>.<listcomp>)r   r   rS   ry   rT   r!  &  s   zJoinedStrNode.analyse_typesc                 C   rU   rQ  rS   rV   rS   rS   rT   r  *  r  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 ]\}}|| || d|  }d|  }	d}
t|trz|jd	 d
}	|jd d}
W n2 ty   |	d
krttt|j}|dk rd}	tt|j}n|dkrd}	tt|j}n	 Y nw tt|j}nt|tr|jjjrd}
|
s|
d||	||	|f  |
d||f  || |
d||| f  || || qM| | j |  | |j!"t#$dd |
d| % ||||||  | jf  | &| |'|t |j(| |j(| |j(| d S )NTr\  Fz%s = PyTuple_New(%s); %sr  z	%s = 127;z__Pyx_PyUnicode_GET_LENGTH(%s)z"__Pyx_PyUnicode_MAX_CHAR_VALUE(%s)r  255zus-asciii   65535i   1114111z%s = (%s > %s) ? %s : %s;z	%s += %s;zPyTuple_SET_ITEM(%s, %s, %s);JoinPyUnicodeStringTools.cz-%s = __Pyx_PyUnicode_Join(%s, %d, %s, %s); %s))ru  r   r   r   ra  rb  r   r   r=  c_py_ucs4_typer   r   r  	enumerater{  rn  r   r}   r  r   r  UnicodeEncodeErrormaxrw  r:  rv   FormattedValueNoder   rN  r  r  r  rd  r   r   r   r   r   r  r  rj  )rW   r   	num_itemslist_varulength_varmax_char_varir   ulengthmax_char_valueis_asciimax_charrS   rS   rT   r{  .  s   








z&JoinedStrNode.generate_evaluation_codeN)rZ   r[   r\   r   r   r   r  r   r!  r  r{  rS   rS   rS   rT   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 )r-  r   format_specTNzString formattingPyObject_UnicodePyObject_ReprPyObject_ASCII__Pyx_PyNumber_IntOrLong)sradc                 C   rU   rQ  rS   rV   rS   rS   rT   r    r  zFormattedValueNode.may_be_nonec                 C   s   | j || _ | jr| jjr&| jr| jj n| j jj}| j jj||dr&|| _| jr3| j||| _| jd u rX| j || _ | jsX| j	rJ| j	dkrX| j jt
u rX| j  sX| j S | S )N)r7  r<  )r   r!  r7  r  r   default_format_speccan_coerce_to_pystringc_format_specr  conversion_charr   r  )rW   rr   rB  rS   rS   rT   r!    s   
z FormattedValueNode.analyse_typesc           	      C   sn  | j d ur1| jjjs1| jj| j || j }|d|  |||  | jf  | 	| d S | j
 }| jjtu oA| j  }| jrMd}| j
 }nd}tj}| j}|dkr]|r]d }|r| |}|d usnJ d| d||f }|jtdd |d	7 }n| jr|jtd
d n
|jtdd |d|  |||||  | jf  | 	| d S )Nr  __Pyx_PyObject_Format__Pyx_PyObject_FormatSimpler<  z(invalid conversion character found: '%s'r~  PyObjectFormatAndDecrefr(  	AndDecrefPyObjectFormatPyObjectFormatSimple%s = %s(%s, %s); %s)rB  r   r   rp   convert_to_pystringr   r   r   r   r  r   r   r  r7  r   empty_unicoderC  find_conversion_funcr   r   r   r   )	rW   r   convert_func_callvalue_resultvalue_is_unicodeformat_funcr7  rC  fnrS   rS   rT   rv    sX   






z'FormattedValueNode.generate_result_code)rZ   r[   r\   r   r   r   r   rB  r  ri   rM  r  r!  rv  rS   rS   rS   rT   r-  |  s     r-  c                   @   .   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   
   d| _ | S r%  rV  r   rS   rS   rT   r!       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   rm  rS   rS   rT   rv    s   

z1ParallelThreadsAvailableNode.generate_result_codec                 C   r   rL   r   rV   rS   rS   rT   r     r#  z#ParallelThreadsAvailableNode.resultN
rZ   r[   r\   __doc__r   
c_int_typer   r!  rv  r   rS   rS   rS   rT   rT    s    	rT  c                   @   rS  )	ParallelThreadIdNodez/
    Implements cython.parallel.threadid()
    c                 C   rU  r%  rV  r   rS   rS   rT   r!    rV  z"ParallelThreadIdNode.analyse_typesc                 C   sB   | d | d| j  | d | d| j  | d d S )NrW  z%s = omp_get_thread_num();r  r  r  rY  rm  rS   rS   rT   rv    s
   

z)ParallelThreadIdNode.generate_result_codec                 C   r   rL   rZ  rV   rS   rS   rT   r     r#  zParallelThreadIdNode.resultNr[  rS   rS   rS   rT   r^    s    r^  c                   @   $   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v S rL   )r9  r   r   r1   r   r   r!   r   rV   rS   rS   rT   r     s   
z_IndexingBaseNode.is_ephemeralc                 C   s   | j  o	| j S rL   )r9  rU  r:  r"  rV   rS   rS   rT   rU  %     z"_IndexingBaseNode.check_const_addrc                 C   s*   | j jr| j jjrdS dS | j jrdS dS r  )r   r   r  r4  r  rV   rS   rS   rT   r   (  s   
z_IndexingBaseNode.is_lvalueN)rZ   r[   r\   r   rU  r   rS   rS   rS   rT   r`    s    r`  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;  r9  r:  NTFc                 C   s   | j j| jj | _d S rL   )r9  r~   r:  rV   rS   rS   rT   r  H  r  z#IndexNode.calculate_constant_resultc              
   C   sT   | j |}| j|}z|| W S  ty) } z| | W Y d }~d S d }~ww rL   )r9  r  r:  	Exceptionr  )rW   r  r9  r:  r  rS   rS   rT   r  K  s   
zIndexNode.compile_time_valuec                 C   s.   | j }| o| j o|jo|jjp|jjS rL   )r9  r  r:  r   r  r4  rW   r9  rS   rS   rT   r  S  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v rdS t| S rQ  )r9  r   rw  r}   r:  	SliceNoder   r!   r   r   r1   r   r   r   r  rW   r  rS   rS   rT   r  X  s   

zIndexNode.may_be_nonec                 C   r   rL   rS   r   rS   rS   rT   r  d  rY   z$IndexNode.analyse_target_declarationc              	   C   s  | j |}|r|js|jr+| jjr| jj}n| jg}tj| j	|d d}|j
||dS | jjs3| jjrWddlm} ||j | jjrG| jgnt| jj}t||||S |js| j|}|d ur|zt|}W n ttfyu   Y nw t||S t| j	d d S )N)r   positional_argskeyword_args)r  r'   r  z*Array size must be a compile time constant)r9  rB  r   python_type_constructor_namer:  r   r   r   TemplatedTypeNoder   analyser   r  r  r   view_utility_coder   r   MemoryViewSliceTypeget_axes_specsrp   r  r2  r   r   
CArrayTyper   )rW   rr   r  template_values	type_noder  axesr:  rS   rS   rT   rB  g  s8   
zIndexNode.analyse_as_typec                 C   sF   g }| }|j r!|j|}|r|jr|jr||j |j}|j s|S rL   )r  r9  rB  rh  modifier_namer   r:  )rW   rr   r  modifier_nodemodifier_typerS   rS   rT   analyse_pytyping_modifiers  s   
z$IndexNode.analyse_pytyping_modifiersc                 C      | j || j| S rL   )r9  r1  r:  r   rS   rS   rT   r1    r  zIndexNode.type_dependenciesc                 C   sb  | j |}| jjr'|jrtS |jrtS |tttt	t
tfv r |S |jr%|S tS | j|}|r2|js8t| jtr|tu r?tjS |tu rE|S |t	u rLtjS t| j trTtS |tt
fv rkt|| j | j|d}|d urj|S nT|jsq|jrt|jS |jrt| jtr| j r| jj}|dk r||j7 }d|  kr|jk rn n#|j| S n|jr|jdkr	 |jdkr|jS t |j|j!dd  S | jj"r|jr|}| jj#D ]}|js nt$| j%t&| j j%|d|d|}q|S |j'rG dd d}|| j%|d|| j%|dg}	|(d	|	}
|
d ur|
j)j*S t+|r&t+|r&| j|f}t,t-||gS |ttfv r/|S tS )
Nr   r   r'   r  r8  c                   @   r  )z)IndexNode.infer_type.<locals>.FakeOperandc                 [      | j | d S rL   )__dict__update)rW   rD  rS   rS   rT   rB    r  z2IndexNode.infer_type.<locals>.FakeOperand.__init__Nr  rS   rS   rS   rT   FakeOperand      r{  )r   r   []).r9  r   r:  r   rw  r   rx  r   r   r!   r   r   r   r   r  r}   r<  r   r)  c_uchar_typer  r   r  r4  r  r  r   r~   re  r  ndimr  rl  rq  r   r   r;  r   r   r   lookup_operatorr   r  r;   rG   rA   )rW   rr   r  
index_typer  r:  r  r>  r{  operands
index_funcindex_with_typerS   rS   rT   r     s   






zIndexNode.infer_typec                 C   r  )NTgetting)analyse_base_and_index_typesr   rS   rS   rT   r!    rK  zIndexNode.analyse_typesc                 C   sH   | j |dd}|jjrt| jd || u r"| s"t| jd|j  |S )NT)settingzAssignment to const dereference%Assignment to non-lvalue of type '%s')r  r   r  r   r   r   r#  rS   rS   rT   r)    s   zIndexNode.analyse_target_typesc           	      C   s  |r	| j || _ | j jjrtj| _| S | jj}|jd s.|r)t	| jj
| jj nt	| j |sDt| jtrDt| jjrD| j|| _| j jj}|sit| j tsS|ri| j jjsb| j jjsi| j jjsi| j || _ | ||}|d uru|S |j| _| j j}|js| j|| _| jj| _| jjr| jj| _|jr|rt| jddd n	| jj dv r| 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 )N
wraparoundz%cannot assign to Unicode string indexr'   r{   )r   rp  z'Attempting to index non-array type '%s')*r9  r!  r   r  r   r.   r:  r   rj   r   r   r   r}   r<  r   long_literalr   r  r   r  rw  r  r4  analyse_as_buffer_operationr   r5  original_index_typer   r  r  r   r   r~   rp   analyse_as_pyobjectanalyse_as_c_arrayr   analyse_as_cppanalyse_as_c_functionr  analyse_as_c_tupler   )	rW   rr   r  r  analyse_baser   is_memslicereplacement_noder  rS   rS   rT   r    sd   






z&IndexNode.analyse_base_and_index_typesc                 C   s  | j j}| jjjr |tur t| jddd | j|| _d| _nV| jjj	rl|turl|rV|j
d sV|tttfv rV| jjjrR|j
d rRt| jtrV| j rV| jjdkrVd| _nd| _| jtj||| _| j| n
| j|| _d| _| jjj	r|tu rtj| _nX| jjj	r|tu r|rtj| _nHtj| _nC|r|ttttttfv r|| _n3d }|ttfv r| jjj	rt|| j | j|d}|tttfv r| j  d| _ |d u 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'   r{   boundscheckr  r   rw  &'NoneType' object is not subscriptable)$r9  r   r:  r  r   r   r   r  r   r  rj   r   r   r!   signedr}   r<  r   r~   r  r   r=  r.  r  create_to_py_utility_coder   r)  r~  r]  r   r   r   r  rp   r   wrap_in_nonecheck_node)rW   rr   r   r  r  r  r  rS   rS   rT   r  N  s`   



zIndexNode.analyse_as_pyobjectc                 C   sv   | j j}|j| _| jjrt| j| _|r|| _| S | jjjr*| jtj	|| _| S | jjj
s9t| jd| jj  | S )NzInvalid index type '%s')r9  r   r  r   r   CReferenceTyper:  rp   r  r=  r  r   r   )rW   rr   r   r  rS   rS   rT   r    s   

zIndexNode.analyse_as_c_arrayc                 C   s   | j j}|d| j | jg}|d u r't| jd|| jjf  tj| _d| _| S |j}|j	r0|j
}|j| _|j| _| jrM|s@d| _t| rM|tdd | j|jd j|| _|j| _|rl|jjslt| jd| j  | S )	Nr}  z/Indexing '%s' not supported for index type '%s'r#  TCppExceptionConversionr  r   z#Can't set non-reference result '%s')r9  r   r  r:  r   r   r   r.   rQ  r  r  r   r   r   r   r   r   r   r  r   r  r   )rW   rr   r  r  r  	func_typerS   rS   rT   r    s,   zIndexNode.analyse_as_cppc                 C   s   | j j}|jr| | | S | || _d | _|jd u r't| j	d t
| _| S | jd u r1t
| _| S t|jt| jkrPt| j	dt|jt| jf  t
| _| S |tt|j| j| _| S )Nz)Can only parameterize template functions.z7Wrong number of template arguments: expected %s, got %s)r9  r   rC  parse_indexed_fused_cdefparse_index_as_typestype_indicesr:  	templatesr   r   r.   r   rE  dictr  rW   rr   r  rS   rS   rT   r    s*   


zIndexNode.analyse_as_c_functionc                 C   s   | j j}t| jtrC| j rC| jj}|j |  kr |jk r3n n|dk r+||j7 }|j| | _| S t	| j
d||f  tj| _| S | j || _ | j|||ddS )Nr   zIndex %s out of bounds for '%s'Fr  r  r  )r9  r   r}   r:  r<  r   r~   re  r  r   r   r   r.   r  r  )rW   rr   r  r  r  r:  rS   rS   rT   r    s"   
zIndexNode.analyse_as_c_tuplec                    s  t | jtr| jj}n| jg}| j}|j}d}|jrRddlm} |j	r4|
|}|dur4|j}|j}|}|||j\}	}}
|	rIt| j||d}not| j||d}nf|jsX|jr|jsbt||jkrd} fdd|D }|jrtdd	 |D }|rt|D ]\}}|jrt|j|j|j|jd
}| }|||< qn	tdd	 |D }|rt| j||d}t | jtrJ |dur| |}|S )zI
        Analyse buffer indexing and memoryview indexing/slicing
        Nr'   r  )indicesr9  Tc                    r0  rS   r&  r`   r:  ry   rS   rT   r     r   z9IndexNode.analyse_as_buffer_operation.<locals>.<listcomp>c                 s   s&    | ]}|j jp|jp|j jV  qd S rL   )r   r  r   r;   r  rS   rS   rT   rd     s
    
z8IndexNode.analyse_as_buffer_operation.<locals>.<genexpr>r   r   r   c                 s   s    | ]}|j jV  qd S rL   r   r  r  rS   rS   rT   rd      re   )r}   r:  rv  r   r9  r   r   r  r  r  merged_indicesunellipsifyr  MemoryViewSliceNoder   MemoryViewIndexNoder  r;   r   allr*  r   SliceIntNoder   r   r   r!  BufferIndexNode	CloneNode)rW   rr   r  r  r9  r  r  r  r  have_slicesnewaxesr  do_replacementr2  r:  rS   ry   rT   r    sP   


z%IndexNode.analyse_as_buffer_operationc                 C   s*   |j d r
| j sd S | jd| _d S )N	nonecheckr  )rj   r9  r  r  rW   rr   r  rS   rS   rT   r  
  s   z IndexNode.wrap_in_nonecheck_nodec                 C   sb   t | jtr| jj}n| jg}g }|D ]}||| |d d u r.|r+t|jd  d S q|S )Nrp  znot parsable as a type)r}   r:  rv  r   r   rB  r   r   )rW   rr   requiredr  r  r:  rS   rS   rT   r    s   
zIndexNode.parse_index_as_typesc                    sB  t j| _d| _| jj}g }| jjs| jjr|| jj	 nt
| jtr0| jjD ]}||j	 q'| j|dd}|du rq| j|| _| jjjsNt| j	d n| jjj | j_| _| jj | j_| _d| j_d| _d| j_d| _dS t|D ]\}}||||< qu| }t|t|krt| j	dS t|t|k r|t| }	t| j	d|	 S t|||D ]"\}
 }t fdd	|jD st|
d
  S  du sΈ jr dS qtt||}||}|jrt| j	d dS | jj D ]-}| |r|| _| jjr|j| _d| _| jj!| _!d| jj_|| j_|j| j_ dS qt"d)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 rS   )r  r_   specific_typerS   rT   r   U  r   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_indexr9  r:  r   r  r   r   r}   rv  r   r  r!  r   r  r   r   r  r*  specialize_fusedget_fused_typesr   r  rk   typesr  r  rE  rC  r  r  r  r   )rW   rr   r  	positionsri  specific_typesr2  r   fused_typesra   r   
fused_typerD  r  rS   r  rT   r    sv   	





z"IndexNode.parse_indexed_fused_cdefzIndexing Python objectc                 C   s
  | j jtttfv r,| j jtu rd}ng| j jtu rd}n^| j jtu r$d}nUJ d| j j | j jjrCd| j  ddd	 | jD f S | j jj	r`| j
j}|d
k rW|| j jj7 }d| j  |f S | jjsh| jjrw| j| j jkrwt| 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      g | ]}|  qS rS   )r  )r`   paramrS   rS   rT   r         z3IndexNode.calculate_result_code.<locals>.<listcomp>r   z%s.f%szInvalid use of pointer slicez(%s[%s]))r9  r   r   r   r!   r5  r   joinr  r  r:  r~   re  r  r4  r   r   )rW   
index_coder:  rS   rS   rT   r   z  s.   

zIndexNode.calculate_result_codec                 C   s   | j jjrB| jjtu }t|jjd o$| jj	o$t
| j jto#| j jdk }t|jjd }d| j | jj	r8dp9d| jj|||f S dS )Nr  r   r  z, %s, %d, %s, %d, %d, %dr'   r  )r:  r   r  r9  r   r,  r   rj   r  r  r}   r~   r%   r  to_py_function)rW   r   is_listr  r  rS   rS   rT   extra_index_params  s"   

zIndexNode.extra_index_paramsc                 C   sd  | j sd S d }d }| jjrhd}| jjjr/| jjtu rd}n| jjtu r&d}nd}t	dd}n| jjt
u r>d}t	dd}ny| jjtu rU| jjttfv rUd	}t	dd}nbd
}|jt	dd t	dd}nO| jjr| jjtu r| jjjsyJ d}d}t	dd}n3| jjtu r| jjjsJ | jjsJ d}d}t	dd}n| jjjr| jsJ d| j| jj| jf |d ur|j| | jjjr| j }n| j }| jjjr| jrt|| jd|  | j | j f | jjr|  nd | j| j n)|dkrdnd| }|d|  || j || ||||   | jf  | jjr0| | d S d S )Nr7  __Pyx_GetItemInt_List__Pyx_GetItemInt_Tuple__Pyx_GetItemInt
GetItemIntr*  __Pyx_PyDict_GetItemDictGetItem__Pyx_PyObject_Dict_GetItem__Pyx_PyObject_GetItemObjectGetItem__Pyx_GetItemInt_Unicodez(Py_UCS4)-1GetItemIntUnicoder(  __Pyx_GetItemInt_ByteArray-1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   rp   r:  r  r9  r   r   r	   r   r   r   r   r   r   r   r   r  r!   r   r   r   r   r   r   r   rr  r   r  r   r  )rW   r   r/  error_valuer  r  error_checkrS   rS   rT   rv    s   




zIndexNode.generate_result_codec                 C   s   | j jjr*| jjtu r|jtdd d}n|jtdd d}| j 	 }n| j 
 }| jjtu r8d}nd}||d	|| j
 ||| |f | j d S )
NSetItemIntByteArrayr(  __Pyx_SetItemInt_ByteArray
SetItemIntr*  __Pyx_SetItemIntr?  PyObject_SetItemz%s(%s, %s, %s%s))r:  r   r  r9  r!   r   r   r   r   r   r   r   r   r  r  r   )rW   
value_coder   r  r  rS   rS   rT   generate_setitem_code  s2   



	
zIndexNode.generate_setitem_codec              	   C   s  |  | | jjr| | | ng| jjtu r%| ||}| || nT| jjjrl| j	rl| j	dkrl|rO|rO| j
|krOt|| j| j|  | | j
|| j n*t|| jd|  | f | jjrd|  nd | j
| j n|d|  | f  | | | | || || d S )Nr   rC  )rt  r   rp   r  r   r9  r!   _check_byte_valuer   r   r   r   r   r   rr  r   r   ry  rz  r  r  )rW   r   r   r  r   r   r  rS   rS   rT   r    s0   



z"IndexNode.generate_assignment_codec                 C   s  |j jsJ t|j | }| r.d|j  krdk r |S  d}t|jd|j dd n|j tj	k}| j
s{g }|js@|j jrG|d|  |jsX|jrX|j tj	tjtjfv s_|d|  |r{|d	d
|  |d|| j  |d |rd| }|S )Nr      Tz9value outside of range(0, 256) when assigning to byte: %sr'   r{   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  rd  r   r   r~   r   r   r   r~  r   r   r  r   r   r   c_schar_typer   r  r   )rW   r   r   r  
needs_cast
conditionsrS   rS   rT   r  /  sJ   

zIndexNode._check_byte_valuec                 C   s   |  | | jjjrd}| j }|jtdd n| j	 }| j
jtu r*d}nd}||d|| j
	 || |f | j | | | | d S )N__Pyx_DelItemInt
DelItemIntr*  PyDict_DelItemPyObject_DelItemz%s(%s, %s%s))rt  r:  r   r  r   r   r   r   r   r   r9  r   r   r  r  r   ry  rz  )rW   r   r  r  r  rS   rS   rT   r  S  s,   





z IndexNode.generate_deletion_code)FFTTr  r	  )$rZ   r[   r\   r   r  r  r  r  r  r  r  r  rB  ru  r1  r   r!  r)  r  r  r  r  r  r  r  r  r  r  r  r   r  rv  r  r  r  r  rS   rS   rS   rT   r;  8  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
    r9  r  TFrS   c                 C   s   | j |dd d S NFr  r&  r   rS   rS   rT   r)    r   z$BufferIndexNode.analyse_target_typesc                 C   s   | j jst| j jst| jd t| _| S |s2| j jjjs$t| jd nd| _	| j jj
r2d| 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 bufferTr  )r9  r   r;   r   r   r   r.   r   writabler  r  
buffer_auxnone_error_messageanalyse_buffer_indexr  r  rS   rS   rT   r!    s   

zBufferIndexNode.analyse_typesc                 C   s|   t | jjrdd | jD }tt| jj|| _n| j|| _| jjj| _| jj| _|r:| jj	s5| jj r<d| _
d S d S d S )Nc                 S   s   g | ]}||j fqS rS   r  )r`   idxrS   rS   rT   r     r   z8BufferIndexNode.analyse_buffer_index.<locals>.<listcomp>T)r;   r9  r   r  rG   rA   r.  r  buffer_typerp   r   )rW   rr   r  index_with_type_listrS   rS   rT   r    s   

z$BufferIndexNode.analyse_buffer_indexc                 C   rU   )zk
        Called by IndexNode when this node is assigned to,
        with the rhs of the assignment
        NrS   rW   r   rS   rS   rT   analyse_assignment  s    z"BufferIndexNode.analyse_assignmentc                 C   s,   |j d r
| j sd S | j| j| _d S )Nr  )rj   r9  r  r  r  r   rS   rS   rT   r    s   z&BufferIndexNode.wrap_in_nonecheck_nodec                 C   s2   | j s| jr| jjrt| jd t| _d S d S d S )Nz2Cannot access buffer with object dtype without gil)r  r  r   rp   r   r   r.   r   rS   rS   rT   rN    s   
zBufferIndexNode.nogil_checkc                 C   s
   d| j  S Nr$  )buffer_ptr_coderV   rS   rS   rT   r     rL  z%BufferIndexNode.calculate_result_codec                 C   s    | j }| j jr
|j}|j|S rL   )r9  is_nonecheckri  r   	get_entryrc  rS   rS   rT   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\  rC  )
ra  rb  r   rJ  r   r  c_ssize_t_typec_size_t_typer   r   )rW   r   ivarretrS   rS   rT   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r8|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]
        r  z(Use boundscheck(False) for faster accessr'   r{   c                    s   g | ]}  |qS rS   )r  r`   r  r   rW   rS   rT   r         z6BufferIndexNode.buffer_lookup_code.<locals>.<listcomp>r  negative_indicesc                 S   s   g | ]}|j jqS rS   )r   r  r  rS   rS   rT   r     r  )r   index_signedsindex_cnamesrj   r   r   r  rr  )rr  r  r  r   rj   r   r   r  index_tempsr  r  r  r   r  r  buffer_defaultsput_buffer_lookup_code)rW   r   r  r  r  r  rS   r  rT   buffer_lookup_code  s&   

z"BufferIndexNode.buffer_lookup_codec                 C   sB   |  | | || | | | | || || d S rL   )rt  generate_buffer_setitem_codery  rz  r  r  rW   r   r   r  rS   rS   rT   r    s   



z(BufferIndexNode.generate_assignment_coder  c           
      C   sL  | j j}t|rGt|jrG|jjtt| j jdd}|d|  |d||| j 	 f  |d|t
| j||	 f  |j| d S | |\}}| jjjr|jj|jdd}| }	|d||f  |d| | jj |d|	|f  |d	|||	f  |d| | jj |j| d S |d	||| f  d S )
NFr\  __Pyx_call_destructor(%s);rD  z%s%s %s= %s;rC  z*%sz%__Pyx_INCREF(%s); __Pyx_XDECREF(*%s);z*%s %s= %s;)r9  r   r;   r9   ra  rb  rG   rC   r   r  r@   r  rj  r  r  r  rp   buf_ptr_typer   r  r  )
rW   r   r   opr  r  r  ptrexprptrr   rS   rS   rT   r    s8   	

z,BufferIndexNode.generate_buffer_setitem_codec                 C   s   t | jjr$|  }|d|  |d||| j t| jf  d S | |\}| _	| jj
rP|  }|d|| j	f  |d||f  |d|  d S 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);)r;   r9  r   r   r   r  r@   r  r  r  rp   )rW   r   resr  rS   rS   rT   rv    s"   z$BufferIndexNode.generate_result_codec                    s2   | j D ]}|j| qd| _ tt| | d S r  )r  ra  rj  rN   r  rz  )rW   r   temprQ   rS   rT   rz  .  s   
z"BufferIndexNode.free_subexpr_tempsr  r	  )r  )rZ   r[   r\   r\  r   r  r  r  r)  r!  r  r  r  rN  r   r  r  r  r  r  rv  rz  r]   rS   rS   rQ   rT   r  l  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   sD  ddl m} t|| _| j}||| jjj\}}}|s-d| _	| jj
s'| jjr-d| jjj_	| o8t|| jjjk| _g }tj}g }	t|t| | jjjkrbt| _t|| jjj jd| jj  | S d}
t|d d  D ]\}}||}|jrd| _|	| |d ql| jjj|
 \}}|
d7 }
|jrd| _|jjr|||f n||df dD ]}t||}|js|||}t||| |	| qql|jjs|jj r|jj rt!|jd	| d| _"|||}|||< |	| qlt| _t|jd
|j  |   S | j"o| j | _"|	| _|| _#|j$| _$| %||| | &| | S )Nr'   r  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)'r  r  r?   is_pythran_moder  r  r9  r   r  r  r   r  r   r   memslice_indexr   r=  r.   r   r   r*  r!  r  r  r   rq  r   r   r   r  setattrr  rp   r)   r  original_indicesr   analyse_operationr  )rW   rr   r  r  r  r  r  rq  r  new_indicesaxis_idxr2  r:  accesspackingattrr   rS   rS   rT   r!  :  st   







z!MemoryViewIndexNode.analyse_typesc                 C   s   d| _ | || d S )Nz"Cannot index None memoryview slice)r  r  )rW   rr   r  rq  rS   rS   rT   r    s   z%MemoryViewIndexNode.analyse_operationc                 C   s0   | j jr| }|js|jrd|_d|_dS dS 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  rW   r   lhsrS   rS   rT   analyse_broadcast_operation  s   
z/MemoryViewIndexNode.analyse_broadcast_operationc                 C   s   |  |}|r|j|_|S | S rL   )r  r  r"  rS   rS   rT   $analyse_as_memview_scalar_assignment  s
   
z8MemoryViewIndexNode.analyse_as_memview_scalar_assignmentNr  )	rZ   r[   r\   r  r  r!  r  r$  r%  rS   rS   rS   rT   r  5  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 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 rL   )r   r   r  r   r   r  rS   rS   rT   rd     s
    
z<MemoryViewSliceNode.analyse_ellipsis_noop.<locals>.<genexpr>N)r  r  is_ellipsis_noopr9  r   r  rS   rS   rT   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
|s2t| _d S t| jjj|| _| j sO| j sQ| j|| _d S d S d S )Nr'   r  Tz&Cannot assign to None memoryview slicez"Cannot slice None memoryview slice)r  r  r  r  r'  r&  r:  r   rc  validate_axesr   r.   r   r   rl  r9  r  r  rW  r  )rW   rr   r  rq  r  rS   rS   rT   r    s$   z%MemoryViewSliceNode.analyse_operationc                 C   s8   |j js| j j|j s|j jrt| j| S t| j| S rL   )r   r   r  r  rp   MemoryCopyScalarr   MemoryCopySlicer  rS   rS   rT   r    s   z&MemoryViewSliceNode.analyse_assignmentc                 C   s   |sdS | j dd }|dd }t| j D ]/\}}|jr>|jjr;|jjr;|jjr;|d ||< |d |s:|  S q dS |jj	sE dS q|r[t
|t
| | jjjkrWd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  r*  r   r   r  r   r   r   r   r  r   r9  r  )rW   r  r  r2  r<  rS   rS   rT   r    s*   
z"MemoryViewSliceNode.merged_indicesc                 C   s"   | j r| j p| j S |  S rL   )r&  r9  r  rW  rV   rS   rS   rT   r    s   zMemoryViewSliceNode.is_simplec                 C   r  )z3This is called in case this is a no-op slicing node)r9  r   rV   rS   rS   rT   r     r  z)MemoryViewSliceNode.calculate_result_codec              	   C   s   | j rd S |  }| j }d}t| j}| jD ]'}|jr:d}|jjs't	||_|j
js0t	||_
|jjs9t	||_qt	| qt|rEJ |j|| j|  | j|||jjd d S )NFT)rp  r  rj   )r&  r  rr  iterr  r  r   r   r  nextr   r   r   generate_buffer_slice_coder   r   r   rj   )rW   r   r  rp  r  r  r:  rS   rS   rT   rv    s.   






z(MemoryViewSliceNode.generate_result_codec                 C   sp   | j r	| | n| | | jr| || n| || | j r'| | n| | || || d S rL   )	r&  rt  r{  is_memview_scalar_assignment+generate_memoryviewslice_assign_scalar_code&generate_memoryviewslice_setslice_codery  r  r  r  rS   rS   rT   r    s   


z,MemoryViewSliceNode.generate_assignment_codeNr	  )rZ   r[   r\   r  r&  r.  r  r  r'  r  r  r  r  r   rv  r  rS   rS   rS   rT   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 rL   )rN   r1  rB  r2  r   rW   r   r2  rQ   rS   rT   rB  <  s   zMemoryCopyNode.__init__Fc                 C   sH   | j | | || | j | | j | || || d S rL   )r2  r{  _generate_assignment_coder  r  r  rS   rS   rT   r  A  s   
z'MemoryCopyNode.generate_assignment_coder	  )rZ   r[   r\   r\  r   rB  r  r]   rS   rS   rQ   rT   r1  3  s
    r1  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
    T__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))r2  r   assert_direct_dimsr   r   r  copy_slice_cnamer   r  r  rp   )rW   r  r   r2  rS   rS   rT   r4  V  s   
z)MemoryCopySlice._generate_assignment_codeN)rZ   r[   r\   r\  r  r7  r4  rS   rS   rS   rT   r*  J  s
    r*  c                       rJ   )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 rL   )rN   r)  rB  r   r  r3  rQ   rS   rT   rB  m  s   zMemoryCopyScalar.__init__c                 C   sF  ddl m} | jj| jj | jjj}|d}| jjd}|  |	d||
 f  | j s9| j r?| j
 }n|	d|| j
 f  d}d}| jj}	|	D ]}
t|
trj|
jjrh|
jjrh|
jjsjd}qU|j| jj|| jjj||d	}| }|jr|	d
|  |	d||f  |jr|	d |  |  d S )Nr'   r  r  z%s __pyx_temp_scalar = %s;z%s __pyx_temp_slice = %s;__pyx_temp_sliceFT)force_stridedzPy_DECREF(*(PyObject **) %s);z!*((%s *) %s) = __pyx_temp_scalar;zPy_INCREF(__pyx_temp_scalar);)r  r  r2  r   r6  r   r  r   begin_blockr   r   rW  r  r  r}   rd  r   r  r   r   
slice_iterr  start_loopsrp   	end_loops	end_block)rW   scalarr   r  r  	type_decl
slice_decldst_tempr9  r  r  slice_iter_objprS   rS   rT   r4  q  sB   



z*MemoryCopyScalar._generate_assignment_code)rZ   r[   r\   r\  rB  r4  r]   rS   rS   rQ   rT   r)  d  s    r)  c                       s   e Zd Zg dZdZdZdd Zd3ddZd	d
 Zdd Z	dd Z
dd Zdd Zd4d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		d5d%d&Zd6d'd(Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Z  ZS )7SliceIndexNode)r9  r   r   sliceFNc                 C   s^   | j |}|js|jrtS |jrtS |ttttt	t
tfv r |S |js&|jr-t|jd S tS rL   )r9  r   rw  r   r   rx  r   r!   r   r1   r   r   r  r4  r   c_array_typer  r   r  rS   rS   rT   r     s   
zSliceIndexNode.infer_typer   c                 C   s6   |t ur| jr| j r|| jj7 }nt }| j|S rL   )r  r   r   r~   r9  r?  r>  rS   rS   rT   r?    s
   
z"SliceIndexNode.inferable_item_nodec                 C   s8   | j j}|r|jrdS |ttttttfv rdS t	
| S rQ  )r9  r   rw  r   r   r   r1   r   r   r   r  re  rS   rS   rT   r    s   
zSliceIndexNode.may_be_nonec                 C   sF   | j d u rd }n| j j}| jd u rd }n| jj}| jj|| | _d S rL   )r   r~   r   r9  )rW   r   r   rS   rS   rT   r    s   

z(SliceIndexNode.calculate_constant_resultc              
   C   s   | j |}| jd u rd}n| j|}| jd u rd }n| j|}z||| W S  tyA } z| | W Y d }~d S d }~ww r   )r9  r  r   r   rb  r  )rW   r  r9  r   r   r  rS   rS   rT   r    s   

z!SliceIndexNode.compile_time_valuec                 C   r   rL   rS   r   rS   rS   rT   r    rY   z)SliceIndexNode.analyse_target_declarationc                 C   s    | j |dd}|jjrt|_|S r  )r!  r   rp   r   r#  rS   rS   rT   r)    s   z#SliceIndexNode.analyse_target_typesTc                    sP  | j || _ | j jjs| j jjs| j jjr=t| j}t| j| j	p"|| j
p&||d}t| j|| j d}|j||| ddS | j	rG| j	|| _	| j
rQ| j
|| _
|jd s]t| j	| j
 | j j}|jrx|sx| j	sp| j
sp|| _n7t|j| _n/|js~|jrt|| _n#|jrt| _n|jr|| _n|jrt|j| _n
| j || _ t| _|jr|| _| j d| _ | jtu r| j	r| j	jr| j
r| j
jrt| j}t| jt| j	p|t| j
p||d|| _ n=tj!  fdd}| j	r	| j	jj"r|| j	d	|| _	| j	# || _	| j
r#| j
jj"r|| j
d
|| _
| j
# || _
d| _$| S )Nr  )r:  r9  Fr  r  r  c              
      sz   ddl m}m} || }t| jt| j || rt|ntd|	 |t
| j|dt| jd|d|}|||S )Nr'   EvalWithTempExprNodeResultRefNoder  is)operand1r   operand2)true_val	false_valtest)	UtilNodesrI  rJ  CondExprNoder   r<  r]  r2  r  r  PrimaryCmpNoder  r!  analyse_result_type)r   default_valuerr   rI  rJ  node_refnew_exprc_intrS   rT   
allow_none+  s,   

z0SliceIndexNode.analyse_types.<locals>.allow_nonerU  r  r'   )%r9  r!  r   r  r;   r   r  r   rd  r   r   r;  r  rj   r   r4  r   r  r  rw  is_cpp_stringrz   rx  r   r  r  r   r  r  r   copydeepcopyrF  r=  rp   r  r   )rW   rr   r  	none_noder:  r   r  rZ  rS   rX  rT   r!    s   




zSliceIndexNode.analyse_typesc                 C   sj   | j |}|r3| js3| js3ddlm} ||j t| j	}t
| j	|||d}t||||gS d S )Nr'   r  r  )r9  rB  r   r   r  r  r   rk  r  r   rd  r   rl  rm  )rW   rr   r  r  r^  
slice_noderS   rS   rT   rB  M  s    
zSliceIndexNode.analyse_as_typec                    s   |j | _ tt| |S rL   )r   rN   rE  rN  r   rQ   rS   rT   rN  _  s   zSliceIndexNode.nogil_checkzSlicing Python objectSliceObjectr*  r  Get)r}  Setc                    s   | j jjs
| j jjr,|ttttfv r,|ttfvr)|jd s)t	| j
d| j j|f  || _|jrA| j jjrA| jsA| jsA| j ||S tt| ||S )Nr^   :default encoding required for conversion from '%s' to '%s')r9  r   rw  r[  r   r!   r   r   rj   r   r   r4  r   r   r  rN   rE  r&  rQ   rS   rT   r  k  s   
zSliceIndexNode.coerce_toc                 C   s  | j jst| jd| j   d S | j }|  }|  }|  }| jj jrr| j }| jj t	j
t	jfvr8d| }| j tu r@d}n| j j }| jd u r^|d||||||| jf  n |d||||||||| jf  n| jj jr| j }| jj t	jkrd| }| jd u r|d|||||| jf  |jtdd	 n|d
|||||||| jf  |jtdd	 n| jj tu r|jtdd	 |d||||||| jf  nx| j tu r|j| j |  \}}}	}
}}}|d|| j |	|
|||||t|jjd ||| jf  n?| jj tu r3|jt dd d}n| jj t!u rG|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)	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); %spyunicode_from_unicoder(  z?%s = __Pyx_PyUnicode_FromUnicodeAndLength(%s + %s, %s - %s); %sPyUnicode_Substringz.%s = __Pyx_PyUnicode_Substring(%s, %s, %s); %szD%s = __Pyx_PyObject_GetSlice(%s, %s, %s, %s, %s, %s, %d, %d, %d); %sr  SliceTupleAndListr*  __Pyx_PyList_GetSlice__Pyx_PyTuple_GetSlicePySequence_GetSlicez%s = %s(%s, %s, %s); %s)#r   rp   r   r   r9  r   
start_code	stop_coderw  r   rl   rn   r!   rq   titler   r   r   rx  c_py_unicode_ptr_typer   r   r   r   r   r   get_slice_utility_codeget_slice_configr   r,  rj   r   r	   r   r  )rW   r   base_resultr   rk  rl  	type_namehas_c_start
has_c_stopc_startc_stoppy_startpy_stoppy_slicecfuncrS   rS   rT   rv  {  s   





	








z#SliceIndexNode.generate_result_codec                 C   s  |  | | jjr:|j| j |  \}}}}	}
}}|| jd| j	
 |
 ||	|
||||t|jjd f
  n>| jrA|  nd}|jjrR|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)r  rU  z%s - %sIncludeStringHr(  z,memcpy(&(%s[%s]), %s, sizeof(%s[0]) * (%s));)rt  r   rp   r   r   set_slice_utility_coderp  r  r   r9  r   r,  rj   r   rk  r4  re  generate_slice_guard_coderl  r   r   r   r   ry  rz  r  r  )rW   r   r   r  r   r   rs  rt  ru  rv  rw  rx  ry  start_offsetarray_lengthrS   rS   rT   r    s:   
	




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)r  )r9  r   rp   r   r   rt  r   r   r|  rp  r  r   r,  rj   ry  rz  )
rW   r   r  rs  rt  ru  rv  rw  rx  ry  rS   rS   rT   r    s*   



z%SliceIndexNode.generate_deletion_codec                 C   s   d\}}}| j r| j jj }|r| j  }nd| j   }d\}}}| jr:| jjj }|r3| j }nd| j  }| jrDd| j  pEd}|||||||fS )N)FrU  r7  &%sr7  )r   r   rp   r   r   r   rF  )rW   rs  ru  rw  rt  rv  rx  ry  rS   rS   rT   rp    s    

zSliceIndexNode.get_slice_configc           
      C   sT  | j jjsd S | j jj}zt| }}W n ty   d }Y nw d  }}| jrT| j }zt|}|dk rE|d u r@d||f }n||7 }n|}d }W n	 tyS   Y nw | jr| j }z.t|}|dk rw|d u rsd| j jj|f }n||7 }t	|t
r||8 }nd||f }d }W n	 ty   Y nw d }d}zt|}	W n ty   d }	Y nw t	|t
}|r|dk r|	dkrt| jd n3|r|d u r|d u r|	|krt| jd||f  n|d ur|d u r|}d||f }n	|d ur|}n|}|r(|d||f  | jr|  |d	||f  | jr|  ||| j |d
 d S 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   )r9  r   r4  re  r2  r   r   r   r   r}   r%   r   r   r   r   r   r   r   )
rW   r   target_size
slice_sizetotal_lengthr   r   runtime_checkcompile_time_checkint_target_sizerS   rS   rT   r}  ,  s   







z(SliceIndexNode.generate_slice_guard_codec                 C   s   | j r| j  S dS )NrU  )r   r   rV   rS   rS   rT   rk  ~  s   
zSliceIndexNode.start_codec                 C   s(   | j r| j  S | jjjr| jjjS dS )Nr  )r   r   r9  r   r4  re  rV   rS   rS   rT   rl    s
   


zSliceIndexNode.stop_codec                 C   rU   )Nz<unused>rS   rV   rS   rS   rT   r     r  z$SliceIndexNode.calculate_result_coder
  r  r  r	  )rZ   r[   r\   r   r   rF  r   r?  r  r  r  r  r)  r!  rB  rN  r  r	   loadro  r|  r  rv  r  r  rp  r}  rk  rl  r   r]   rS   rS   rQ   rT   rE    s@    	
	

`

i

"RrE  c                   @   sT   e Zd Zg d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 )rd  r  Tr'   c                 C      t | jj| jj| jj| _d S rL   rF  r   r~   r   r   rV   rS   rS   rT   r    
   
z#SliceNode.calculate_constant_resultc              
   C   d   | j |}| j|}| j|}zt|||W S  ty1 } z| | W Y d }~d S d }~ww rL   r   r  r   r   rF  rb  r  rW   r  r   r   r   r  rS   rS   rT   r       zSliceNode.compile_time_valuec                 C   rU   rQ  rS   rV   rS   rS   rT   r    rY   zSliceNode.may_be_nonec                 C   sp   | j |}| j|}| j|}||| _ ||| _||| _| j jr6| jjr6| jjr6d| _d| _| S r  )r   r!  r   r   r  r   r   )rW   rr   r   r   r   rS   rS   rT   r!    s   zSliceNode.analyse_typesz Constructing Python slice objectc                 C   r   rL   r`  rV   rS   rS   rT   r     r#  zSliceNode.calculate_result_codec                 C   s   | j r&t| j| f}|jtdd|d| _|| j}|d u r d S || j |	d| 
 | j | j | j || 
 | jf  | | | j rS| | d S d S )NrF  r4   cleanup_level	dedup_keyz %s = PySlice_New(%s, %s, %s); %s)r   r   r   r  r   rQ  r  ru  r   r   r   r   r   r   r   r   r  r  )rW   r   r  rS   rS   rT   rv    s(   
zSliceNode.generate_result_codeN)rZ   r[   r\   r   r   r"   r   r   r  r  r  r!  r  r   rv  rS   rS   rS   rT   rd    s    	rd  c                   @   @   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   r  rL   r  rV   rS   rS   rT   r    r  z&SliceIntNode.calculate_constant_resultc              
   C   r  rL   r  r  rS   rS   rT   r    r  zSliceIntNode.compile_time_valuec                 C   rU   rQ  rS   rV   rS   rS   rT   r    rY   zSliceIntNode.may_be_nonec                 C   s   | j || _ | j|| _| j|| _| j js | j || _ | jjs+| j|| _| jjs6| j|| _| j jrH| jjrH| jjrHd| _d| _| S r  )r   r!  r   r   r  r  r   r   r   rS   rS   rT   r!    s   zSliceIntNode.analyse_typesc                 C   r   rL   rS   rV   rS   rS   rT   r     rY   z"SliceIntNode.calculate_result_codec                 C   s.   | j | j| jfD ]}t|tr|j  qd S rL   )r   r   r   r}   r  ri  r   )rW   r   r>  rS   rS   rT   rv    s
   

z!SliceIntNode.generate_result_codeN)
rZ   r[   r\   r   r  r  r  r!  r   rv  rS   rS   rS   rT   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           	         s@  | j }| }t|trt|jS |tu r&t|dd }|d ur&|j	p%|}|j
r,|j}|jrbt| j dd r_t| dr_| j j } fdd| jD }t||}|r_|j	}|j
r\|j}|jS |jS |tu r|jr|jr|jj	r|jj	}|jry|S |jr|jjdkrtjS |jjtjv r|S | j  }|r|js|jr|S tS )Nr   r   c                    r0  rS   r   r`   ri  ry   rS   rT   r   !  r   z'CallNode.infer_type.<locals>.<listcomp>r   )r  r   r}   r  r   r  r  r   r   r   r  r  r5  r  r   all_alternativesr   
best_matchr  r   r   r  r  rq   rq  r   #types_that_construct_their_instancerB  is_struct_or_unionr   )	rW   rr   r  r  r   alternatives	arg_types
func_entryresult_typerS   ry   rT   r     sF   


zCallNode.infer_typec                 C   r  rL   )r  r1  r   rS   rS   rT   r1  8  r  zCallNode.type_dependenciesc                 C   rU   rQ  rS   rV   rS   rS   rT   r  =  r  zCallNode.is_simplec                 C   s^   | j d ur| j S | jj}|tu r*| jjr*| jj}|jjrdS |jjr*|jt	j
v r*dS t| S rQ  )may_return_noner  r   r   r   r   r  r  rq   r   r  r   r  )rW   r  r   rS   rS   rT   r  D  s   

zCallNode.may_be_nonec                 C   s   |d u r|j }|tju r<|jr<|jr<|jjr<|jjtjv r<|jjdkr,tj	| _ tj	| _
ntj|jj | _ t| _
d| _d S |jrO|jrO|jj | _ t| _
d| _d S t| _ d S )Nr   F)r   r   r   r   r   r  rq   r  r   rq  r  builtin_typesr   r  r  )rW   r  r  rS   rS   rT   set_py_result_typeQ  s*   





zCallNode.set_py_result_typec           	   	      s*  | j  }|rJ|jrJ|  \}}g }t||jjD ]\}}|t|j	t
|j	|jd|d q|r7||j7 }|| _t| _|   | |  dS |r|jr fdd| jD | _|jd}|srt| j j	d| j j  t| _| S t| j j	|j| _ || j _| j |  |   || _dS d S d S )N)r   r   )r   keyr   Tc                    r0  rS   r&  r  ry   rS   rT   r   z  r   z8CallNode.analyse_as_type_constructor.<locals>.<listcomp>z<init>z'no constructor found for C++  type '%s')r  rB  r  explicit_args_kwdsr  r  r  r   DictItemNoder   r  rq   key_value_pairsDictNoderR   r!  r  r   r   r  r   r.   r   r  r   r  r  analyse_c_function_call)	rW   rr   r   r   rD  r  ri  memberr  rS   ry   rT   analyse_as_type_constructork  s6   
$



z$CallNode.analyse_as_type_constructorc                 C   r  rL   )r   r   rV   rS   rS   rT   r     r,  zCallNode.is_lvaluec                 C   s@   |   }|jr|   d S |jst|dds|   d S d S d S )Nr   F)function_typerp   rM  r  r   )rW   rr   r  rS   rS   rT   rN    s   zCallNode.nogil_checkzCalling gil-requiring functionrL   )rZ   r[   r\   r  r   r1  r  r  r  r  r   rN  r  rS   rS   rS   rT   r    s    (
r  c                       s   e Zd Zg dZdZdZdZdZdZdZ	dZ
d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  )rW   coerced_selfr  r   r  NFc              
      s\   | j  } fdd| jD }z|| W S  ty- } z| | W Y d }~d S d }~ww )Nc                    r0  rS   r  r  r  rS   rT   r     r   z5SimpleCallNode.compile_time_value.<locals>.<listcomp>)r  r  r   rb  r  )rW   r  r  r   r  rS   r  rT   r    s   
z!SimpleCallNode.compile_time_valuec                 C   sP   |j }||j}|sJ d||jf t||j||jd}| |||gd}|S )Nz Getter not found in scope %s: %s)rq   r   r   r  )r  r  rq   r  r  r   )rP   r   r  r   property_scopegetter_entryr  r   rS   rS   rT   for_cproperty  s   zSimpleCallNode.for_cpropertyc                 C   s   | j  }|dkr3t| jdkrt| jjd d S | jd |}|s.t| jd jd d S t|S |dkrPt| jdkrEt| jjd | jd 	|}|j
S d S )Npointerr'   zonly one type allowed.r   zUnknown typetypeof)r  r  r   r   r   r   rB  r   r  r!  r   )rW   rr   r!  r   operandrS   rS   rT   rB    s   

zSimpleCallNode.analyse_as_typec                 C   s
   | j d fS rL   rs  rV   rS   rS   rT   r    rL  z!SimpleCallNode.explicit_args_kwdsc                    s  | j r| S d| _ |  r| S d| j_| j | _| j}|jr1|jr1|jjr1|j| _	t
| j	|_|  }d| _t rg|jrgt|rgd}t| j| jd| _| j | _| jjD ]}|t|M }qYt|| _| jr t| tj| t|| jtt|| jjdS |jrt| j| jd| _| j  | _d | _| || d| _ | S  fdd| jD | _| !  |j"dkrd| _ | S )	NTr'   Frs  )function_cnamer  r   c                    r0  rS   r&  r  ry   rS   rT   r     r   z0SimpleCallNode.analyse_types.<locals>.<listcomp>r   )#analysedr  r  ra  r!  r  r   
is_cmethodr  rW   r  r  is_numpy_call_with_exprsr?   r  rD   rv  r   r   r  rB   r,  add_include_filerE   NumPyMethodCallNoder  rF   rG   r<   rp   r  r  r   r  r   )rW   rr   r  r  has_pythran_argsri  rS   ry   rT   r!    sT   



zSimpleCallNode.analyse_typesc                 C   s   | j j}|jr
|j}|S rL   )r  r   r  r  rW   r  rS   rS   rT   r    s   zSimpleCallNode.function_typec                 C   s  | j j}|tu rt| _d S |jr%|jr%| jr!| jjjr!t| jd | j	}n| jr0| jg| j	 }n| j	}|j
rL| j jjd}|d u rKtj| _d| _d S nt| j drW| j j}n| j jre| j jre| j jj}nd }|r| j jjr|| j j }dd |D }n| }tdd |D || j||}|stj| _d| _d S d|_|j
s|| j _|j| j _|  }nd }|  }|jst| jd	|  tj| _d| _d S t|j	}||j }	t|}
|jr|	|
krd
| _d
| _|re|jre|j	re|jse|j	d }|d }|jr)| jr| jjd t|j!dkrdndd|j!gd| _n|jd|j!|jj!gd}| jrG|j"r7t#| j}nt$| j}|%|j| }| _&n|jj'ra|%|j|}|jj'rat(|t)rad|_*||d< d}t+t,||
D ]S}|j	| }|j}|| %||}|jr|d}|jr|dkrd}n'|jj-r|j.s|dkr| jd urn|/ rn|dkrd}|0|}|||< qnt+||
D ]A}|| }|jj-r|jt1u rtj2}n|j3 }|d u rt| j	|d
  jd n
|%|| ||< }|jr|dkrd}q|rYt+|
d
 D ]F}|dkr!| jd ur!q|| }|/ r,q|jj
r3q|j.r>|jj-r>q|dksN|d
krW| jd urWt4|jdd  nq|| j	d d < t(| j t5rpt6| j j7| _n|j8| _| j j9s~| j j:r| j j}|r|j;s|j<rd
| _| jj-rt=| _>d
| _n|j?d us|j@rd
| _n| jjArd
| _| 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      g | ]}|j qS rS   )r   )r`   frS   rS   rT   r   .      z:SimpleCallNode.analyse_c_function_call.<locals>.<listcomp>c                 S   r  rS   r  r  rS   rS   rT   r   2  r  TzCalling non-function type '%s'r'   r   *'NoneType' object has no attribute '%{0}s'   .30r  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   r  r  overflowcheck)Kr  r   r.   r5  is_static_methodrW   r  r   r   r   r   r  r  r   rQ  r  r   r  r  rC  r  r  r  r  r  r   optional_arg_counthas_optional_argsr   r  not_noner  r   rq   accept_builtin_subtypesCMethodSelfCloneNoder  r  r  r  r}   r  exact_builtin_typerangeminrp   r   r6  r  r   rl   default_coerced_ctyper   r  r  r  r  r   r  r/  utility_code_definitionr   r  r   r   r   r   CFakeReferenceTyper  r   r   r   r   rj   r  )rW   rr   r  r   overloaded_entry	functypesr  r   	max_nargsexpected_nargsactual_nargs
formal_argri  some_args_in_tempsr2  formal_type	arg_ctyper  rS   rS   rT   r    s*  




















 


z&SimpleCallNode.analyse_c_function_callc                 C   rX  rL   )c_call_coderV   rS   rS   rT   r     r,  z$SimpleCallNode.calculate_result_codec                 C   s  |   }| jtju s|jsdS |j}g }tt|| j}t|j}||j	 }t| j}|d | D ]\}}	|	
|j}
||
 q1|jrS|tt| jpO| jjj |j	rg||kr]d}nd| j }|| | jt|d  D ]	}	||	  qpd| j d|f }|S )Nr#  r7  r  r~  , )r  r   r   r.   r5  r   r   r  r   r  r  r   r  rv   r2  wrapper_callr  r   is_unbound_cmethodopt_arg_structr   r   r  )rW   r  formal_argsarg_list_coder   r  r  r  r  
actual_argarg_codeoptional_argsr   rS   rS   rT   r    s.   




zSimpleCallNode.c_call_codec                 C   s    |   }|jr|jdkrdS dS )Nr   FT)r  r   r   r  rS   rS   rT   r    s   z#SimpleCallNode.is_c_result_requiredc              
      s  | j }|js	|jr|j|j d}| jjo| jj}| j	rH|rH|
 |v rH|jtdd |d| jd 
 | jd j || jf  |jjr\t| jjdks\| jjrf| jjrftt| | d S | jjrp| jjd nd }| j| j||f}|D ]}|d ur|| q||| j | jsJ | | |d u r|jtdd |d	| 
 | | | 
 | jf  n"|jtd
d |d| 
 | | | | 
 | jf  | !| |D ]}|d ur|"| |#| qd S )N)abslabs__Pyx_abs_longlong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'   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  r  r  r   r   r   r   r   r   r  r   r   rp   r   r  r   rN   r  r{  rW   r  ru  r   rd  r   r   r  r  r  )rW   r   r  abs_function_cnamesis_signed_intri  r   subexprrQ   rS   rT   r{    st   








z'SimpleCallNode.generate_evaluation_codec              
   C   s0  |   }|jr4| j }|jtdd |d| 	 | j
 ||| 	 | jf  | | d S |jr|jj }| jrt| 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  qzg }
| j jr| j!r|
"d| 	   nq| j j#r| j!sJ |
"| j $| 	  n\|j%d	kr|j&}|j%}|d ur|
"d
| 	 |j'(|f  |r|r|
st)| j
dd }t*j+| j|jj,|r|jnd | j j-d|o|j.d |jtdd |
"d n|
"d | j!s|
r| / }| 	 r=d| 	  }| j!r<| j jr<t0t1| j |}nd}|j%d	kr^t2|| jd||f | j jrW| 	 nd |j&| n|
rl|3d4|
| j}nd}|d|||f  | j jr| 	 r| | | jr|j5| j d S d S d S )Nr  r*  z*%s = __Pyx_PyObject_Call(%s, %s, NULL); %sTr\  %s.%s = %s;rP  r  r   z%s == %sr   )function_namevoid_returnis_callis_from_pxdr   r   r   r   z%s = r  z%s%s;z && z%s%s; %s)6r  rp   r  r   r   r   r   r   r   r   r  r   r   r  r5  ra  	gil_ownedr  r   r   r  rb  op_arg_structr  r  r   pyrex_prefixr   r  opt_arg_cnamerq   r  r   r   r   r   error_conditionr   r   r  	cast_coder   r   write_noexcept_performance_hintr  r_  defined_in_pxdr  r-   r   r   r   r  rj  )rW   r   r  r  r   r  r  r   r  r  
exc_checksexc_val	exc_checkperf_hint_entryr   r#  
goto_errorrS   rS   rT   rv  7  s   












Az#SimpleCallNode.generate_result_code)rZ   r[   r\   r   rW   r  r  r  r  r   r  r  r  r  r  rB  r  r!  r  r  r   r  r  r{  rv  r]   rS   rS   rQ   rT   r    s0    
	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 u sJ | jj}|D ]}|| q|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)};r  c                 s       | ]}|  V  qd S rL   )r  )r`   r>  rS   rS   rT   rd     re   z?NumPyMethodCallNode.generate_evaluation_code.<locals>.<genexpr>)ru  r   rd  r  r   r   r{  r   r   r  r  )rW   r   r   ri  rS   rS   rT   r{    s   

z,NumPyMethodCallNode.generate_evaluation_codeN)rZ   r[   r\   r   r   r  r{  rS   rS   rS   rT   r    s
    r  c                   @   s    e Zd ZddgZdZdd ZdS )PyMethodCallNoder  r  Tc              	   C   s4  | | j | | | j| | jjd u sJ | jj}|D ]}|| q| jj}|r3| j	 }n&|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rd	nd
}	n-| jjr| jjr| jjD ]}
|
j}|r|jr|jjr|jjjr||rd	}	 nqd
}	nd
}	|d |d|	|f  |d||f  |d|  |d|  ||t |dt ||td |d|  |d |d |d |jt !dd |d |d|r t"|d nd||r/d#dd |D ndf  |d| 	 ||t"||f  |$|t |j
%| |j
%| |D ]}|| || qX||&| 	 | j | '| |r| j| | j| n|(|t |j
%| |d d S )NTr\  	%s = %s; r  Fr  c                 S   s   | j }|jr|jjrdS dS r  )r  r   r   r  )r!  r  rS   rS   rT   attribute_is_likely_method  s   zMPyMethodCallNode.generate_evaluation_code.<locals>.attribute_is_likely_methodlikely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  rX  r   r  PyObjectFastCallr*  r  z(PyObject *__pyx_callargs[%d] = {%s, %s};r'   r4   r  c                 s   r   rL   r   r  rS   rS   rT   rd     re   z<PyMethodCallNode.generate_evaluation_code.<locals>.<genexpr>r7  z=%s = __Pyx_PyObject_FastCall(%s, __pyx_callargs+1-%s, %d+%s);))ru  r   rd  r  r{  r  r   r   r   r   ra  rb  r   rn  r  r   r  r  r   r   c_uint_typer  r   r   r   r  r   rp   rl  r  r   r   r   r   r   r  r^  rj  r   r  r  )rW   r   r   ri  reuse_function_tempr  self_argarg_offset_cnamer  likely_methodr  r   rS   rS   rT   r{    s   








z)PyMethodCallNode.generate_evaluation_codeN)rZ   r[   r\   r   r   r{  rS   rS   rS   rT   r    s    r  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   r  r'   Nc                 C   s>   | j j}|js
|jrdS t|jt| jkrdS |jrdS dS r  )r  def_nodestar_argstarstar_argr   r   num_kwonly_argsr  rS   rS   rT   can_be_inlined"  s   z%InlinedDefNodeCallNode.can_be_inlinedc                    s  | j  | _  fdd| jD | _| jj}t| j}d}t|D ]7}|j| j}| j| | }|j	r<|dkr;d}n|jj
rS jsS| rHn|dkrNd}| }|| j|< q!|rt|d D ]'}| j| }| rmqa|jjrrqa jrz|jj
rzqa|dkrt|jdd  | S qa| S )Nc                    r0  rS   r&  r  ry   rS   rT   r   /  r   z8InlinedDefNodeCallNode.analyse_types.<locals>.<listcomp>Fr   Tr'   r  )r  r!  r   r  r  r   r  r   r  r   rp   r   r6  r  r   r   r   )rW   rr   r  r  r  r2  r  ri  rS   ry   rT   r!  ,  sD   


z$InlinedDefNodeCallNode.analyse_typesc              
   C   s   | j  g}| jj}t| j|jD ]\}}|jjr#||	|j q||
  qd|}|d| 
 | jjjj||| 
 | jf  | | d S )Nr  %s = %s(%s); %s)r  r   r  r  r  r   r   rp   r   r  r   r  r   r   pyfunc_cnamer   r   r  )rW   r   r  r  ri  	proto_argrS   rS   rT   rv  e  s    

z+InlinedDefNodeCallNode.generate_result_code)rZ   r[   r\   r   r   r   r   r  r  r  r!  rv  rS   rS   rS   rT   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)rq   r   r   r/  r  )rW   r   py_namer   r  r/  rS   rS   rT   rB  z  s   
zPythonCapiFunctionNode.__init__c                 C   r!  rL   rS   r   rS   rS   rT   r!  ~  rY   z$PythonCapiFunctionNode.analyse_typesc                 C   s   | j r|j| j  d S d S rL   )r/  r   r   rm  rS   rS   rT   rv    s   z+PythonCapiFunctionNode.generate_result_codec                 C   r   rL   r  rV   rS   rS   rT   r     r#  z,PythonCapiFunctionNode.calculate_result_coderL   )rZ   r[   r\   r   rB  r!  rv  r   rS   rS   rS   rT   r  w  s    
r  c                   @   s   e Zd ZdZ	dddZdS )PythonCapiCallNodeFNc                 K   s<   |j | _| j| _t|||||d| _tj| |fi | d S )N)r/  )r  r   r  r  r  r  rB  )rW   r   r  r  r/  r  r  rS   rS   rT   rB    s   zPythonCapiCallNode.__init__r  )rZ   r[   r\   r  rB  rS   rS   rS   rT   r    s    r  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   )rN   r  rB  r   r  r   )rW   	call_noder  r   r   rQ   rS   rT   rB    s   

z$CachedBuiltinMethodCallNode.__init__c                 C   s   | j d ur| j S t| S rL   )r  r   r  rV   rS   rS   rT   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   r  rS   r  r  rS   rS   rT   r     r  zDCachedBuiltinMethodCallNode.generate_result_code.<locals>.<listcomp>r  )r  r   r   r   r   r   cached_unbound_method_call_coder   r   r   r   r   r  )rW   r   
type_cname	obj_cnamer   	call_coderS   rS   rT   rv    s   


z0CachedBuiltinMethodCallNode.generate_result_code)	rZ   r[   r\   r   r   rB  r  rv  r]   rS   rS   rQ   rT   r    s    r  c                   @   sF   e Zd ZeZg dZejZdd Z	dd Z
dd Zdd	 Zd
d ZdS )GeneralCallNode)r  rf  rg  c              
   C   sf   | j |}| j|}| j|}z||i |W S  ty2 } z| | W Y d }~d S d }~ww rL   )r  r  rf  rg  rb  r  )rW   r  r  rf  rg  r  rS   rS   rT   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.)rg  r  rf  r   r   r   r   rV   rS   rS   rT   r    s   z"GeneralCallNode.explicit_args_kwdsc                 C   s   |  |r| S | j|| _| jjjsU| jjjrt| _| S t| jdrN|  }|d ur4|| ur4||S | jj	j
rA| j|| _n|| u rLt| jd n		 n| 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   rp   r  r.   r  map_to_simple_call_noder   r  r  r   r   rg  rf  r  r   r#  rS   rS   rT   r!    s6   





zGeneralCallNode.analyse_typesc                    sn  t | jts| S | jjs| S | j}t|dd}|s| S |j}|jr$|j	}|j
s)| S | jj | j}|j}|jr<|dd }t t|krTt| jdt|t f  dS dd |dt  D }|t d }d}t }	t|}
d}|jD ]}|jj}||
v rt|jd	|  d
}|
| qxt||jD ]\}}|jj}|j|kr|| |d7 }|	|j q ddlm}m} g }t|j|kr~|t|	d }t fddt|jD }d}|D ]W}|j}||vr|s|}q|r|jr|   S t| jd|   dS || \}}|| |d7 }|j r!|	|j q||j}| s-J |	| |||f q|r~g }g }|d d }|	D ]$}||u rR n| r^|| qI||}|| || qI|rs|}	|dd t |D  }|jD ]}|jj}||vrd
}t|jd|  q|rdS t!| j||	d}|ddd D ]}|||}q|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 rS   r  r  rS   rS   rT   r     s    z:GeneralCallNode.map_to_simple_call_node.<locals>.<setcomp>r   Fzargument '%s' passed twiceT)rI  
LetRefNodec                    s(   g | ]\}}|j j|t  |ffqS rS   )r  r   r   r`   r2  ri  pos_argsrS   rT   r   A  s    z;GeneralCallNode.map_to_simple_call_node.<locals>.<listcomp>z(C function call is missing argument '%s'rp  c                 S   s   g | ]\}}|qS rS   rS   r#  rS   rS   rT   r   q  r  z/C function got unexpected keyword argument '%s'r  )"r}   rf  rv  rg  r  r  r   r   r  r  r5  r   r  r   r   r   r   setr  r  r   addr  rq   r   rQ  rI  r"  r  r*  r  r  r  r  )rW   r  r   r  r  declared_argsmatched_argsunmatched_argsmatched_kwargs_countr   seen
has_errorsri  rq   decl_argrI  r"  tempskeywordsfirst_missing_keywordr   r  
final_args	new_tempsfirst_temp_arg	arg_valuer   rS   r$  rT   r!    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 )Nr7  r  r*  z(%s = __Pyx_PyObject_Call(%s, %s, %s); %s)r   r  rg  r   r   r   r   r   r   r   r  rf  r   r   r  )rW   r   r  rS   rS   rT   rv    s"   
z$GeneralCallNode.generate_result_codeN)rZ   r[   r\   r   r   r   r*   rM  rN  r  r  r!  r!  rv  rS   rS   rS   rT   r     s    	  r   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 )AsTupleNoderi  r'   c                 C   rj  rL   )r   ri  r~   rV   rS   rS   rT   r    r   z%AsTupleNode.calculate_constant_resultc              
   C   sH   | j |}zt|W S  ty# } z| | W Y d }~d S d }~ww rL   )ri  r  r   rb  r  )rW   r  ri  r  rS   rS   rT   r    s   
zAsTupleNode.compile_time_valuec                 C   s6   | j ||| _ | j jtu r| j dS t| _| S Nr  )ri  r!  r  r   r   r  r   rS   rS   rT   r!    s
   zAsTupleNode.analyse_typesc                 C   rU   rQ  rS   rV   rS   rS   rT   r    rY   zAsTupleNode.may_be_noneConstructing Python tuplec              
   C   sT   | j jttfv r
dnd}|d|  || j  ||  | jf  | 	| d S )N__Pyx_PySequence_TuplePySequence_Tupler  )
ri  r   r   r   r   r   r   r   r   r  )rW   r   rz  rS   rS   rT   rv    s   
z AsTupleNode.generate_result_codeN)rZ   r[   r\   r   r   r  r  r!  r  r*   rM  rN  r  rv  rS   rS   rS   rT   r6    s    r6  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 )MergedDictNoderg  r'   Tc                 C   sp   i }| j }| jD ]*}|jrdd |jD }n|j }|D ]\}}|r-||v r-td| |||< qq|| _d S )Nc                 s   s     | ]\}}|j |j fV  qd S rL   r~   r`   r  r   rS   rS   rT   rd     s    z;MergedDictNode.calculate_constant_result.<locals>.<genexpr>$duplicate keyword argument found: %s)reject_duplicatesrg  r  r  r~   	iteritemsr   )rW   r   r?  r   r  r  r   rS   rS   rT   r    s   



z(MergedDictNode.calculate_constant_resultc           	         s   i }| j }| jD ]G}|jr fdd|jD }n|  }z|D ]\}}|r2||v r2td| |||< q"W q tyO } z| | W Y d }~qd }~ww |S )Nc                    s$   g | ]\}}|  |  fqS rS   r  r=  r  rS   rT   r     s    z5MergedDictNode.compile_time_value.<locals>.<listcomp>r>  )	r?  rg  r  r  r  r@  r   rb  r  )	rW   r  r   r?  r   r  r  r   r  rS   r  rT   r    s&   


z!MergedDictNode.compile_time_valuec                 C   rU   r  rS   r   rS   rS   rT   r1    rY   z MergedDictNode.type_dependenciesc                 C   r)  rL   r   r   rS   rS   rT   r     rY   zMergedDictNode.infer_typec                    r!  )Nc                    "   g | ]}|   d qS )z1argument after ** must be a mapping, not NoneTyper!  r  r  r  ry   rS   rT   r         z0MergedDictNode.analyse_types.<locals>.<listcomp>)rg  r   rS   ry   rT   r!    s   
zMergedDictNode.analyse_typesc                 C   rU   rQ  rS   rV   rS   rS   rT   r    rY   zMergedDictNode.may_be_noneConstructing Python dictc              
   C   s  | | j | | t| j}t|}|| |jtur'|	d|
   |jrB|| |	d|  |
 f  || n|	d|  |
 ||  |jf  | | || |jtur|	d |jtdd |	d|  |
 ||  | jf  | | || |	d || t }|D ]}|jr|jD ]Q}|| | jr|	d	|  |j
 f  |d
 |	d|j
 || jf  |	d ||jjd|  |j
 |j
 f  || || qq|| | jr|d ||jd|  |
 f  n)|d |	d|  |
 f  |	d|
   |	||j |	d || || qt|D ]}|jt|d qTd S )Nz$if (likely(PyDict_CheckExact(%s))) {rC  z%s = PyDict_Copy(%s); %sr  r  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)MergeKeywordsz__Pyx_MergeKeywords(%s, %s)RaiseMappingExpectedz*if (unlikely(PyDict_Update(%s, %s) < 0)) {zVif (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseMappingExpectedError(%s);FunctionArguments.c) ru  r   rd  r+  rg  r,  r{  r   r   r   r   r  rn  r   r  r   r  r  r   r   r   r   r  r&  r  r?  r  r'  r   r  r   r  )rW   r   r   r   helpersri  helperrS   rS   rT   r{    s   


























z'MergedDictNode.generate_evaluation_codec                 C      | j D ]}|| qd S rL   )rg  r  rW   r   r   rS   rS   rT   r  Y     
zMergedDictNode.annotateN)rZ   r[   r\   r   r   r   r   r?  r  r  r1  r   r!  r  r  r{  r  rS   rS   rS   rT   r;    s    
Qr;  c                   @   sH  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)r}   r  r  r  r  r  )rW   cyrS   rS   rT   r  w  s   

z!AttributeNode.as_cython_attributec              	   C   s  |t u rz| j}|r|jr|jrd| _|j| _| | | S |rz|jrz| jjtj	urzd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'   rH  r  PyMethodNew2Argr*  r  rW   __Pyx_PyMethod_New2Arg)r  r  r   r/  )r   r   r5  r  r   analyse_as_python_attributer  r   r   r   rQ  rI  rJ  r  r   r  r   r   r   r  r  r  r   r!  )rW   r  rr   r   rI  rJ  obj_nodeunbound_noder/  r  binding_callcomplete_callrS   rS   rT   r    s@   



zAttributeNode.coerce_toc                 C   s2   | j }|dr|drd S t| jj|| _d S )N__)r  
startswithendswithr   r  r~   )rW   r!  rS   rS   rT   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y; } z| 	| W Y d }~d S d }~ww )Nr\  z6Invalid attribute name '%s' in compile-time expression)
r  r]  r^  r   r   r  r  r   rb  r  )rW   r  r!  r  r  rS   rS   rT   r    s   z AttributeNode.compile_time_valuec                 C   r  rL   )r  r1  r   rS   rS   rT   r1    r/  zAttributeNode.type_dependenciesc                 C   s   | j |dd}|d ur|jjr|jjjrt|jjS |jjS | |}|d ur,|jjS | j|}| j	||d |j
rB| jjrBtS | jrK| jjrKtS | jS )NFtarget)obj_type)#analyse_as_cimported_attribute_noder   r   r5  r   r  analyse_as_type_attributer  r   analyse_attributer  r   r  )rW   rr   r   ra  rS   rS   rT   r     s   
zAttributeNode.infer_typec                 C   r  r%  r  r   rS   rS   rT   r    rL  z(AttributeNode.analyse_target_declarationc                 C   sF   | j |dd}|jjrt| jd| j  | s!t| jd| j  |S )Nr'   r_  z"Assignment to const attribute '%s'r  )r!  r   r  r   r   r  r   r#  rS   rS   rT   r)    s   z"AttributeNode.analyse_target_typesc                 C   s   | j stj| _ |jd | _| ||}|d u r|s| |}|d u r.| ||}|d us.J |js4|j	r;|j
r;d|j
_|jrC|| |S )Nr  T)r   r   r.   rj   r  rb  rc  "analyse_as_ordinary_attribute_noder  r   r   r  wrap_obj_in_nonecheck)rW   rr   r`  r   rS   rS   rT   r!    s   

zAttributeNode.analyse_typesc                 C   sp   | j |}|r6|| j}|r&|js&|js|js|js|jr&| 	|||S | 
|r6t| jd| j  | S d S )Nz&cimported module has no attribute '%s')r  r@  r  r  r  r"  r5  r{  r  as_name_noder  r   r   )rW   rr   r`  module_scoper   rS   rS   rT   rb    s"   

z1AttributeNode.analyse_as_cimported_attribute_nodec                    s   j jrd S j  rjsjsjrSjj}|rQ|j	s*jrQ|j
jrQjr5js2d S |}n| } fdd|jD |_j |ddS d S jsYjrjjv rjjD ]}|jjkruj |dd  S qctjdjf  d S tjdjf  d S )Nc                    s   g | ]	} | qS rS   )_create_unbound_cmethod_entry)r`   overloaded_alternativerr   rW   r   rS   rT   r     s    z;AttributeNode.analyse_as_type_attribute.<locals>.<listcomp>Fr_  z%s not a known value of %s)r  r  rB  r  r  r   r  r  r  r  r   r5  ra  ri  overloaded_alternativesrg  r  r  r   r   enum_valuesrq   r   r   )rW   rr   r   
ubcm_entryrS   rk  rT   rc    s6   
z'AttributeNode.analyse_as_type_attributec                 C   s   |j rG|jjd u rG|j }|jjs|jr|jjr|j}n7|jr-t| jd|j	|f  t
j}n%t|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 %srW   r   %s->%sr'   )
func_cnamer   r  r  parent_scopeis_cpp_class_scoper   r   r   rq   r   r.   r\  r   r  vtabptr_cnamer   r   r  r5  r  r  )rW   r   r   rr   r   r
  rn  rS   rS   rT   ri  *  s,   z+AttributeNode._create_unbound_cmethod_entryc                 C   sV   | j |}|r|| jS | j js)| j |}|r)t|dd d ur)|j| jS d S )Nr  )r  r@  lookup_typer  r  rB  r   r  )rW   rr   rh  r  rS   rS   rT   rB  D  s   zAttributeNode.analyse_as_typec                 C   s@   | j |}|r|| j}|r|jr|jjs|jjr|jS d S rL   )r  r@  r  r  r{  r   r  r  rW   rr   rh  r   rS   rS   rT   rH  N  s   
z'AttributeNode.analyse_as_extension_typec                 C   s0   | j |}|r|| j}|r|jr|jS d S rL   )r  r@  r  r  r  ru  rS   rS   rT   r@  Y  s   
zAttributeNode.analyse_as_modulec                 C   s8   t j| | j|d}|r||}n||}d|j_|S )N)rq   r   r'   )r  r  r  r)  r  r   r  )rW   rr   r   r`  r   rS   rS   rT   rg  c  s   
zAttributeNode.as_name_nodec                 C   s   | j || _ | | | jr| jjr| js	 | jr$|s"d| _t| _	| S |r3| j j
jr3t| jd | S | jrO| jjrO|sIt| j| j | j|S t| jd | S )Nr'   z'Assignment to an immutable object fieldz"Assignment to a read-only property)r  r!  rd  r   r  ra  
is_py_attrr   r   r  r   r  r   r   is_cpropertyr  r  )rW   rr   r`  rS   rS   rT   re  n  s"   

z0AttributeNode.analyse_as_ordinary_attribute_nodec                 C   s  |d u}d| _ | j| _|d u r%| jjjs| jjjr | j|| _| jj}n|js+|jr-t}|j	s3|j
r:|j}d| _n|js@|jrDd| _n|jrN|jrNd| _nd| _|jr| r|j| j}|jr|s| jdkr}d| _d| _d| _| jj| j| _d S || j|| j |j| j}|r|jrd }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  rq  TTz/Cannot select attribute of incomplete type '%s'__weakref__z,Illegal use of special attribute __weakref__)(rv  r  r  r  r   rw  rx  r  r   r  r4  r  r  r  r  r   is_fake_referencehas_attributesattributes_knownr  r  r   is_memslice_transposer   rc  	transposer   declare_attributerH  r   r   r.   r   rq   rw  r  r  r  r   rW  )rW   rr   ra  immutable_objr   rS   rS   rT   rd    sh   



zAttributeNode.analyse_attributec                 C   s   |d u r| j j}|| j| _| j| _t| _d| _|js||js~|j	s>|j
s>|js>|js>|js>|jr6||s>|jrK||rK|sI| j || _ d S d S |jro| j jsV| j jro| j jjro| j jjjjro|sm| j || _ d S d S t| jd|| jf  d S d S d S )Nr'   z)Object of type '%s' has no attribute '%s')r  r   mangle_class_private_namer  r  r   rv  rp   r  rw  r[  r  r   rN  r  r  	is_structr  r5  r   r  r   r  r   r   )rW   rr   ra  r  rS   rS   rT   rW    sN   z)AttributeNode.analyse_as_python_attributec                 C   s   |j d sd S d }d}| jjjr)| jr)| js)dt| jdkr!dnd}| jf}n| jjj	rE| j
r4d}n| jjj| j}|rEd}|jf}|rS| jj|d	|d
| _d S d S )Nr  rS   r  r  r  r  z&Cannot transpose None memoryview slicez5Cannot access '%s' attribute of None memoryview slicer  r  )rj   r  r   r  needs_none_checkrv  r   r   r  r   r}  r  r  rq   r  )rW   rr   r  r  r   rS   rS   rT   rf    s*   



z#AttributeNode.wrap_obj_in_nonecheckc                 C   s   | j r	|   d S d S rL   )rv  rM  r   rS   rS   rT   rN    s   zAttributeNode.nogil_checkzAccessing Python attributec                 C   r  rL   )r  r  r   rS   rS   rT   r    r/  z0AttributeNode.is_cimported_module_without_shadowc                 C   s"   | j r|  p| j  S t| S rL   )r  rW  r  r  rV   rS   rS   rT   r  
  s   
zAttributeNode.is_simplec                 C   s   | j rdS t| S r%  )r  r  r   rV   rS   rS   rT   r     s   
zAttributeNode.is_lvaluec                 C   s   | j r| j  S t| S rL   )r  r   r  rV   rS   rS   rT   r     s   

zAttributeNode.is_ephemeralc                 C   s(   |   }| jr| jjr| jsd| }|S r  )calculate_access_coder   r%  r  )rW   r   rS   rS   rT   r     s   z#AttributeNode.calculate_result_codec                 C   s   | j }||j}| jr@| jjr@|jjr8| jjs8| jjr | jjS | jjr)| jj	| _
d|jj|| j|jj| j
f S | jr>| j
S d S |jjrMd| j
 |f S |jjrb| jrb| jjrb|jj| dd}d|| j| j
f S )Nz((struct %s *)%s%s%s)->%sz__Pyx_C%s(%s)T)to_object_structz%s%s%s)r  r  r   r   r  r  is_builtin_cmethodfinal_func_cname
from_fusedr   r  vtabstruct_cnamer  vtabslot_cnamer`  r  upperr  r  r  r   )rW   r  obj_coderS   rS   rT   r  "  s(   

z#AttributeNode.calculate_access_codec                 C   s  | j rB| jr|jtdd d}n|jtdd d}|d|  || j	 |
| j||  | jf  | | d S | jjr| jr| jjD ]\}}|dkr^t| jd  d S qM|d	|  | j f  |j|  | jd
d d|   }|||| j d S | jr|d|  || jf  d S d S | jjr| jr| jr|  }n	| jrJ |  }| j|}|j| j| j|d d S | jjr| jjjrd S | jr| jj r|j!| j d S d S d S )NPyObjectLookupSpecialr*  __Pyx_PyObject_LookupSpecialPyObjectGetAttrStr__Pyx_PyObject_GetAttrStrrJ  r  z=Transposing not supported for slices with indirect dimensionsrC  Tro  z__pyx_memslice_transpose(&%s)zeif (unlikely(!%s.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");%s}r-  )"rv  is_special_lookupr   r   r   r   r   r   r  r   r1  r  r   r   r  r   r   r}  rq  r   rq  r  r  r   r   r%  r  r   r  r6  r8  r  r  r  )rW   r   lookup_func_namer  r   rx  undereferenced_resultr.  rS   rS   rT   rv  F  sh   




z"AttributeNode.generate_result_codec                 C   s>   | j r| jjr| jr|j|  | jdd d S t| | d S )NTro  )r   r   r   r}  r^  r   r   r  rm  rS   rS   rT   r    s   z$AttributeNode.generate_disposal_codec              
   C   s  | j | | jr3|jtdd || jd| j 	 |
| j|	 f  || || n| j jjr_|d| j | j jj| j | j j||  f  || || nW|  }| jjr| jr|| || ||| j |||   n| jjrddlm} | ||| | j| | jjs|d||!|  f  |"| || | j | | j | d S )Nr[  r*  z%__Pyx_PyObject_SetAttrStr(%s, %s, %s)z__Pyx_SET_C%s%s(%s, %s);r'   r  rC  )#r  r{  rv  r   r   r   r   r  r   r   r1  r  r  r  r   r  r   r  r  implementation_suffixr  r
  r   rp   rc  rn  r  r  
put_decrefr   r  r  put_assign_to_memviewslicer  r  )rW   r   r   r  r   r   select_coder  rS   rS   rT   r    sZ   








z&AttributeNode.generate_assignment_codec                 C   s   | j | | js| jjjr2d| jjjv r2|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  r{  rv  r   r  is_property_scoper  r   r   r   r   r  r   r   r1  r  r   r  r  r  rS   rS   rT   r    s   

z$AttributeNode.generate_deletion_codec                 C   s@   | j rd\}}nd\}}|| jt||| j t| jd d S )N)py_attrzpython attribute (%s))c_attrzc attribute (%s)rd  )rv  r  r   r5   r   r   r  )rW   r   rf  rg  rS   rS   rT   r    s   
(zAttributeNode.annotatec                 C   s&   | j  }|rtd|| jf S d S )NrS  )r  r  r
   r  r  )rW   rl  rS   rS   rT   r    s   
z/AttributeNode.get_known_standard_library_importr
  rL   rQ  r  r	  )-rZ   r[   r\   r  r   r   ra  r  r}  r  rv  r  r  r  r  r1  r   r  r)  r!  rb  rc  ri  rB  rH  r@  rg  re  rd  rW  rf  rN  r  r  r  r   r   r   r  rv  r  r  r  r  r  rS   rS   rS   rT   r  ^  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  )rW   r   r`  rS   rS   rT   rB    ra  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   r   r`  r  r   rS   rS   rT   r    s   z)StarredUnpackingNode.analyse_declarationsc                 C   r  rL   )r`  r   r   rS   rS   rT   r     r/  zStarredUnpackingNode.infer_typec                 C   s.   | j s	t| jd | j|| _| jj| _| S r  )r  r   r   r`  r!  r   r   rS   rS   rT   r!    s
   
z"StarredUnpackingNode.analyse_typesc                 C   rx  rL   )r`  r  r   rS   rS   rT   r    r  z/StarredUnpackingNode.analyse_target_declarationc                 C   s   | j || _ | j j| _| S rL   )r`  r)  r   r   rS   rS   rT   r)    s   
z)StarredUnpackingNode.analyse_target_typesc                 C   rU   Nr  rS   rV   rS   rS   rT   r     rY   z*StarredUnpackingNode.calculate_result_codec                 C   r   rL   rS   rm  rS   rS   rT   rv    rY   z)StarredUnpackingNode.generate_result_codeN)rZ   r[   r\   r   r  r   r   r   r  rB  r  r   r!  r  r)  r   rv  rS   rS   rS   rT   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                    r0  rS   r  r  r  rS   rT   r     r   z8SequenceNode.compile_time_value_list.<locals>.<listcomp>rs  r  rS   r  rT   compile_time_value_list  ra  z$SequenceNode.compile_time_value_listc                 C   sT   d| _ g }| jD ]}|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   r   r`  r   rW   r   ri  rS   rS   rT   replace_starred_target_node  s   

z(SequenceNode.replace_starred_target_nodec                 C   s"   |    | jD ]}|| qd S rL   )r  r   r  rW   rr   ri  rS   rS   rT   r  )  s   
z'SequenceNode.analyse_target_declarationc                 C   sl   t | jD ]\}}|s||}||| j|< q| jr1| j|}|jjs+||}||| _d| _| S r   )	r*  r   r!  r  r   r   r  r.  r   )rW   rr   skip_childrenr2  ri  r   rS   rS   rT   r!  .  s   

zSequenceNode.analyse_typesc                    sr   | j |kr| S | jrJ t| j|jkr"t| 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 rS   )r  )r`   ri  r   ry   rS   rT   r   C  r#  z1SequenceNode.coerce_to_ctuple.<locals>.<listcomp>T)r   r   r   )
r   r   r   r   re  r   r   r  r  rv  rW   r  rr   coerced_argsrS   ry   rT   coerce_to_ctuple<  s   

zSequenceNode.coerce_to_ctuplec              	   C   s   |    tdd | jD s| S g }g }| jD ]&}|jr8|r1|t|d j|dj|dd g }||j q|| q|rQ|t|d j|dj|dd t	| j|| j
}| jrmt| jd|| j|d| j
dd}|S )	Nc                 s       | ]}|j V  qd S rL   )r  r  rS   rS   rT   rd   H      z?SequenceNode._create_merge_node_if_necessary.<locals>.<genexpr>r   rs  Tr  r   )inplacer   r   )_flatten_starred_argsrk   r   r  r   rv  r   r!  r`  MergedSequenceNoder   r   
binop_noder  )rW   rr   r   r   ri  r   rS   rS   rT   _create_merge_node_if_necessaryF  s*   
""z,SequenceNode._create_merge_node_if_necessaryc                 C   sR   g }| j D ]}|jr|jjr|jjs||jj  q|| q|| j d d < d S rL   )r   r  r`  r   r   r   r   r  rS   rS   rT   r  ^  s   
z"SequenceNode._flatten_starred_argsc                 C   rU   rQ  rS   rV   rS   rS   rT   r  g  rY   zSequenceNode.may_be_nonec                 C   s   | j r	t| jd g | _g | _d| _t| jD ]E\}}|| }| j|< |j	r<|j
ts4t|jd |j
tu r<t|_
t| j|}||j
|}||urPd| _| j| | j| qt| _
| S )Nz#can't assign to multiplied sequenceFz2starred target must have Python object (list) typeT)r   r   r   unpacked_itemscoerced_unpacked_itemsany_coerced_itemsr*  r   r)  r  r   r  r   r   r  r  r   )rW   rr   r2  ri  unpacked_itemcoerced_unpacked_itemrS   rS   rT   r)  j  s,   
z!SequenceNode.analyse_target_typesc                 C   r  rL   generate_operation_coderm  rS   rS   rT   rv    rK  z!SequenceNode.generate_result_codec                 C   s  |d u r|   }d }}d }| jr?|s?| j}|jjr?|  }t|jtr/|jdkr/d|j }n|jjr:d||f }nd|f }| jtu ro| j	sJ| j
ro|so|d|t| jddd	 | jD ||| jf  ||t n| jjrt| jD ]\}}|d
|||  f  qxn| jtu rd\}	}
n| jtu rd\}	}
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|
||r|rd||f p|p|| || jf  q|r9|d |d |d uru|jj rw|dtj|| |tj| jf  |tjt |!|t |d|tjf  |d d S d S d S )Nr  r   z * %sz * ((%s<0) ? 0:%s)z * (%s)z%s = PyTuple_Pack(%d, %s); %sr  c                 s   r   rL   r  r  rS   rS   rT   rd     re   z>SequenceNode.generate_sequence_packing_code.<locals>.<genexpr>z%s.f%s = %s;)
PyList_New__Pyx_PyList_SET_ITEM)PyTuple_New__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); %srC  )"r   r   r   r  r}   r~   r%   r  r   r   slowr   r   r   r  r   r   r  r   r  r*  r   r   r   r  r  rW  rl  r
  r  r   r   rp   r  )rW   r   r`  plainsize_factorc_multr   r2  ri  create_funcset_item_func	arg_countcounteroffsetrS   rS   rT   generate_sequence_packing_code  s   












"



z+SequenceNode.generate_sequence_packing_codec                    s~   | j r| j jjrtt| | d S | jtu r'| js| jr'tt| | d S | j	D ]}|
| q*| j r=| j | d S d S rL   )r   r   r  rN   r  ry  r   r   r  r   r  r  rW   r   ri  rQ   rS   rT   ry    s   
z+SequenceNode.generate_subexpr_disposal_codec                 C   sD   | j r
| || n| || | jD ]}|| q|| d S rL   )r   generate_starred_assignment_code!generate_parallel_assignment_coder  r  r  )rW   r   r   r  r   r   r   rS   rS   rT   r    s   
z%SequenceNode.generate_assignment_coder  c                 C   s   | j D ]}|| q|jtu p|jttfv p|jj }t| j dk}|r.| j|||d n|	d | j
||| j |d |	d | jD ]}|| qEtt| jD ]}| j| | j| | qTd S )NrI   use_loopr  r   )r  r  r   r   r   r   r  r   (generate_special_parallel_unpacking_coder   (generate_generic_parallel_unpacking_coder  r{  r  r   r  )rW   r   r   r   special_unpacklong_enough_for_a_loop
value_noder2  rS   rS   rT   r    s0   







z.SequenceNode.generate_parallel_assignment_codec              
   C   s  d}d|   }|jtu rdg}| r|}n%|jtu r&dg}| r%|}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r|d|d   t| jD ]\}	}
|d|
 |d |	f  qt|dkr|d t| jD ]\}	}
|d|
 |d |	f  q|d | jD ]}
||
 |
  q|d |s%t| jD ]!\}	}
|d|
 |	||
 | jf  ||
 |
j qnJ|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 d S ||kr|d |j	t
d&d |d'|| j  |d d S |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)) {RaiseTooManyValuesToUnpackr*  z1if (size > %d) __Pyx_RaiseTooManyValuesError(%d);RaiseNeedMoreValuesToUnpackz9else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);r   r  r4   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      g | ]}d |   qS r  r   r   rS   rS   rT   r   V   r  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  RaiseNoneIterErrorz%__Pyx_RaiseNoneNotIterableError(); %sr  )r   r   r   r  r   r   r   r   r   r   r   r   r   r   r*  r  r   rl  r
  r   r  r  r   r  r  )rW   r   r   r  sequence_type_test
none_checkr3   tuple_check
list_checkr2  r   rS   rS   rT   r     s   


























z5SequenceNode.generate_special_parallel_unpacking_codeTc              	   C   sD  |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 }	|r|dt|  |d|	  || |dt
 |d |d n"t|D ]\}
}|d|
| |	| f  || || q|r|j tdd || jd|	t|f  |d|  ||t
 |d}|| || ||t
 |d|  |d ||| j || |j| |r |j| d }|S )Nr  r*  
IterFinishzPy_ssize_t index = -1;r  r  c                 S   r  r  r  r   rS   rS   rT   r   {   r  zISequenceNode.generate_generic_parallel_unpacking_code.<locals>.<listcomp>Tr\  r  Fz(%s = __Pyx_PyObject_GetIterNextFunc(%s);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)) UnpackItemEndCheckz$__Pyx_IternextUnpackEndCheck(%s, %d)r  unpacking_donezCif (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);)r   r   r   r   r   r   r  r  ra  rb  r   r   r   r   r  r  r  r  r  r  r*  r   r  r  r  r  r   rj  )rW   r   r   r  r  	terminateiterator_tempiternext_funcunpacking_error_labelunpack_coder2  r   unpacking_done_labelrS   rS   rT   r  q   s   














z5SequenceNode.generate_generic_parallel_unpacking_codec                 C   sZ  t | jD ]\}}|jr#| j| }| jd | }| j|d d  } nqJ d }|r[|D ]}	|	| q,|d | j|||ddd}t |D ]\}}	| j| }
|
| qG|d || |	 }|d||sv|j
rv|jttfv rvdnd	|p|| ||| jf  || |r||t |j| n|| |r|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|	 |||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| | qd S )Nr'   Fr  T)r  r  r   r  __Pyx_PySequence_ListKeepNewPySequence_Listr  r*  r\  z%s = PyList_GET_SIZE(%s);zif (unlikely(%s < %d)) {z)__Pyx_RaiseNeedMoreValuesError(%d+%s); %srp  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);)#r*  r   r  r  r  r   r  r  r{  r   r   r   r   r   r   r   r   r  r  ra  rj  r  r   r   r   r   rb  r   r=  r   r   r  r  r  r  )rW   r   r   r2  ri  starred_targetunpacked_fixed_items_leftunpacked_fixed_items_rightr  r   r  target_listlength_tempcoerced_argsublist_temprS   rS   rT   r     s   

















z-SequenceNode.generate_starred_assignment_codec                 C   sP   | j D ]}|| q| jr$| jD ]}|| q| jD ]	}|| qd S d S rL   )r   r  r  r  r  rS   rS   rT   r  !  s   


zSequenceNode.annotater	  rQ  r  r  )!rZ   r[   r\   r   r   r  r   r  r  r  r  r!  r  r  r  r  r)  rv  r  ry  r  r   r  r  r   r  r  r  r  r  r  r  r]   rS   rS   rQ   rT   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 )rv  Fr8  c                    sJ   | j s| jstS  fdd| jD }tdd |D rtS  | j|jS )Nc                    r0  rS   r   r  ry   rS   rT   r   !!  r   z(TupleNode.infer_type.<locals>.<listcomp>c                 s   s(    | ]}|j p|jp|jp|jV  qd S rL   )rp   r   r  rC  )r`   r   rS   rS   rT   rd   "!  s     z'TupleNode.infer_type.<locals>.<genexpr>)r   r   r   rk   declare_tuple_typer   r   )rW   rr   r  rS   ry   rT   r   !  s   zTupleNode.infer_typec                 C   sF  | j rd| _ | jrd| _t| jdkrd| _d| _ | S |s5t| jD ]\}}|jr,d|_||| j|< q"| j	sVt
dd | jD sV|| jdd | jD j| _d| _| S tj| |dd}||}|jsh|S td	d |jD st|S |j	r|j	j rt|j	jtrd|_d|_ |S |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 rL   )r  r   rp   r   rC  r  rS   rS   rT   rd   9!  s    &z*TupleNode.analyse_types.<locals>.<genexpr>c                 s   r  rL   r  r  rS   rS   rT   rd   ;!  r  r'   r  c                 s   r  rL   )r   )r`   childrS   rS   rT   rd   D!  r  )r   is_partly_literalr   r   r   r*  r  r  r!  r   rk   r  r   r   r  r  r   r  r}   r~   r%   rp   r  r  )rW   rr   r  r2  ri  r   rS   rS   rT   r!  '!  sP   
zTupleNode.analyse_typesc                    sH   | j sd S  fdd| j D }tdd |D rd S  | j|}|jS )Nc                    r0  rS   )rB  r  ry   rS   rT   r   V!  r   z-TupleNode.analyse_as_type.<locals>.<listcomp>c                 s   s    | ]}|d u V  qd S rL   rS   r_   rS   rS   rT   rd   W!  re   z,TupleNode.analyse_as_type.<locals>.<genexpr>)r   rk   r  r   r   )rW   rr   r   r   rS   ry   rT   rB  R!  s   zTupleNode.analyse_as_typec                    s   | j jr?|jr| j j|jkr| | S |tu s|tu r6 fdd| jD }t| j|t| j	ddj
 ddS |  | S |jrK| j	sK| | S t| | S )Nc                    r0  rS   )r  r  ry   rS   rT   r   a!  r   z'TupleNode.coerce_to.<locals>.<listcomp>r'   )r   r   r   r   Tr  )r   r  re  r  r   r   r   rv  r   r   r!  r  r  r  r  rS   ry   rT   r  \!  s$   zTupleNode.coerce_toc                 C   0   t | j| j| jd}t| jtrt| j|_|S N)r   r   )rE  r   r   r   r}   r~   r   r   rW   ra   rS   rS   rT   as_listp!     zTupleNode.as_listc                 C   rU   r%  rS   rV   rS   rS   rT   r  v!  r  zTupleNode.is_simplec                 C   rU   r%  rS   rV   rS   rS   rT   r6  z!  r  zTupleNode.nonlocally_immutablec                 C   s   t | jdkr
| jS tjS r   )r   r   rQ  r   empty_tuplerV   rS   rS   rT   r   ~!  s   zTupleNode.calculate_result_codec                 C      t dd | jD | _d S )Nc                 S   r  rS   r<  r  rS   rS   rT   r   !      z7TupleNode.calculate_constant_result.<locals>.<listcomp>)r   r   r~   rV   rS   rS   rT   r  !     z#TupleNode.calculate_constant_resultc              
   C   sF   |  |}zt|W S  ty" } z| | W Y d }~d S d }~ww rL   )r  r   rb  r  rW   r  r   r  rS   rS   rT   r  !  s   

zTupleNode.compile_time_valuec              
   C   sL  t | jdkr	d S | js| jrt| j| jr| jnd g| j }|jtdd|d}|	|}|d urG|
| j | j||| j d ||t | jrO|| _d S | jjjr||jtdd |d|  || j ||  | jf  | | d S |d	|  || j ||  | jf  | | d S d
| jj_| | d S )Nr   r   r4   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  ru  r   r  r  rQ  r  r   r   r   r   r   r   r   r  r   r   r  )rW   r   r  tuple_targetr  rS   rS   rT   r  !  s8    




z!TupleNode.generate_operation_codeNr	  )rZ   r[   r\   r   r   r  r  r   r!  rB  r  r  r  r6  r   r  r  r  rS   rS   rS   rT   rv  !  s    
	+
rv  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 )rE  FzConstructing Python listc                 C   rU   r  rS   r   rS   rS   rT   r1  !  rY   zListNode.type_dependenciesc                 C   r)  rL   )r   r   rS   rS   rT   r   !  r  zListNode.infer_typec                 C   s.   | j D ]}|jrd|_qt| |}||S r%  )r   r  r  r  r'  r  )rW   rr   ri  r   rS   rS   rT   r'  !  s   

zListNode.analyse_expressionsc                 C   sb   t dd}t| j| _t| |}W d    n1 sw   Y  ||_|jr*d| _|	|}|S )NTrs  )
r   r   r   original_argsr  r!  obj_conversion_errorsr  rG  r  )rW   rr   errorsr   rS   rS   rT   r!  !  s   
zListNode.analyse_typesc           	      C   s  |j r | jD ]}t| qg | _| j|st| jd|  | S |js&|jr|j	t
jurt| j}| jrYt| jjtrQ| jjdkrJt| jd|  n|| jj9 }nt| jd|  |j	}t
||| _tt| jD ]}| j| }t|try|j}|||| j|< qj| S |jrt| j| t
jd||S | jrt| jd|  | S |jrt| jt|jjkrt| jd|  n7t| jt|jjk rt| jd| d	 tt | j|jjD ]\}\}}t|tr|j}||j|| j|< q|| _| S |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'   )$rp   r   r   r   r  r   r   r4  r  r  r   c_void_typer   r   r   r}   r~   r%   rn  r  r  r  ri  r  r   TypecastNoder   r  r  r  r   r*  r  r  r  r.   )	rW   r  rr   rs   r  r  r2  ri  r  rS   rS   rT   r  !  sX   

'


 
zListNode.coerce_toc                 C   r!  rL   rS   rV   rS   rS   rT   r  "  rY   zListNode.as_listc                 C   r  r  )rv  r   r   r   r}   r~   r   r   r  rS   rS   rT   as_tuple
"  r  zListNode.as_tuplec                 C   sT   | j jr"| jr|jj| j dddd| _d S |jj| j ddd| _d S t| | d S )NFT)r]  staticreusable)r]  r  )r   r4  rG  ra  rb  r   r  rd  rm  rS   rS   rT   rd  "  s   
zListNode.allocate_temp_resultc                 C   s"   | j rt dd | jD | _d S )Nc                 S   r  rS   r<  r  rS   rS   rT   r   !"  r  z6ListNode.calculate_constant_result.<locals>.<listcomp>)r   r   r   r~   rV   rS   rS   rT   r  "  s
   z"ListNode.calculate_constant_resultc                 C   s$   |  |}| jr|| j|9 }|S rL   )r  r   r  )rW   r  lrS   rS   rT   r  $"  s   
zListNode.compile_time_valuec              
   C   sl  | j jr| jD ]}t| q| | d S | j jr| jrB|d |dtj	  |dj
tj	| j d dt| jtj	f }nd}t| jD ]4\}}|j jrn|jtdd |d	|  ||| |  f  qI|d
|  ||| f  qI| jr|d |d d S d S | j jrt| j| j jjD ]\}}|d|  |j| f  qd S td)Nr  zPy_ssize_t %s;z&for ({i} = 0; {i} < {count}; {i}++) {{)r2  countz+ (%d * %s)r  r{  r(  z'memcpy(&(%s[%s%s]), %s, sizeof(%s[0]));z%s[%s%s] = %s;r   r  zList type never specified)r   rp   r   r   r  r4  r   r   r   r  r   r   r   r   r*  r   r   r   r   r  r  r  r  r   r   )rW   r   rs   r  r2  ri  r  rS   rS   rT   r  *"  sN   







z ListNode.generate_operation_codeN)rZ   r[   r\   r   r   r   rG  r  r1  r   r'  r!  r  r  r  rd  r  r  r  rS   rS   rS   rT   rE  !  s     
/rE  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   r   rL   r  r   rS   rS   rT   r   Z"  r#  zComprehensionNode.infer_typec                 C   sj   | | j _| | t| jtjr't| jjtsJ | jj| jjd | d S t| jtj	s3J | jd S rL   )
r   r`  r  r}   r
  r   _ForInStatNoder  r  ForFromStatNoder   rS   rS   rT   r  ]"  s   
z&ComprehensionNode.analyse_declarationsc                 C   rx  rL   )r
  r  r   rS   rS   rT   r  g"  r  z-ComprehensionNode.analyse_scoped_declarationsc                 C   s   | j s
| j|| _| S rL   r  r
  r'  r   rS   rS   rT   r!  j"     zComprehensionNode.analyse_typesc                 C   s   | j r
| j|| _| S rL   r  r   rS   rS   rT   r  o"  r  z,ComprehensionNode.analyse_scoped_expressionsc                 C   rU   rQ  rS   rV   rS   rS   rT   r  t"  rY   zComprehensionNode.may_be_nonec                 C   r  rL   r  rm  rS   rS   rT   rv  w"  rK  z&ComprehensionNode.generate_result_codec              	   C   s   | j tju r	d}n| j tju rd}n| j tju rd}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   r   r  r
  generate_execution_code)rW   r   create_coderS   rS   rT   r  z"  s   
z)ComprehensionNode.generate_operation_codec                 C   rx  rL   )r
  r  rm  rS   rS   rT   r  "  r  zComprehensionNode.annotateN)rZ   r[   r\   r   r   r  r~   r   r  r  r!  r  r  rv  r  r  rS   rS   rS   rT   r	  R"  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 rL   )r  r'  r   rp   r  r   rS   rS   rT   r'  "  s   
z+ComprehensionAppendNode.analyse_expressionsc              	   C   s   | j jtu r|jtdd d}n| j jtu rd}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  r{  r   r   r   r   r  r  rW   r   r  rS   rS   rT   r  "  s(   


z/ComprehensionAppendNode.generate_execution_codec                 C   s   | j || d S rL   )r  r  r  rS   rS   rT   r  "  r   z5ComprehensionAppendNode.generate_function_definitionsc                 C   rx  rL   )r  r  rm  rS   rS   rT   r  "  r  z ComprehensionAppendNode.annotate)rZ   r[   r\   r   r`  r   r]  r   r'  r  r  r  rS   rS   rS   rT   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s&| j|| _| S rL   )r  r'  r   rp   r  r  r   rS   rS   rT   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  r{  r  r   r   r`  r   r   r  r  rm  rS   rS   rT   r  "  s   
z3DictComprehensionAppendNode.generate_execution_codec                 C   s    | j || | j|| d S rL   )r  r  r  r  rS   rS   rT   r  "     z9DictComprehensionAppendNode.generate_function_definitionsc                 C      | j | | j| d S rL   )r  r  r  rm  rS   rS   rT   r  "     z$DictComprehensionAppendNode.annotateN)rZ   r[   r\   r   r'  r  r  r  rS   rS   rS   rT   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 ur%|tttfv sJ |||_|jt||t	j
|d tt| j|fd|i| d S )NT)r`  r   r  )r  gbody
is_inlinedr   r   r   inlined_comprehension_typerz  r  r   retval_cnamerN   r  rB  )rW   r   r  comprehension_typer  r  rQ   rS   rT   rB  "  s    z'InlinedGeneratorExpressionNode.__init__c                 C   s
   | j dvS )N)rk   r  r  )	orig_funcrV   rS   rS   rT   r  "  rL  z*InlinedGeneratorExpressionNode.may_be_nonec                 C   r   rL   r  r   rS   rS   rT   r   "  r#  z)InlinedGeneratorExpressionNode.infer_typec                 C   s   | j || _ | S rL   )r  r'  r   rS   rS   rT   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   r   r  rm  rS   rS   rT   rv   #  s
   z3InlinedGeneratorExpressionNode.generate_result_coderL   )rZ   r[   r\   r   r$  r`  r   r   r   rB  r  r   r!  rv  r]   rS   rS   rQ   rT   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v r'|r'|d jr'|d jt ur't|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   rE  r   r   r   r   rB  )rW   r   r   r   rS   rS   rT   rB  #  s   &zMergedSequenceNode.__init__c                 C   s   g }| j D ]&}|jr|jr|jjdkrq|js|jr#dd |j D }n|j}|| q| jtu r6t|}n| jt	u r@t
|}n| jtu sGJ || _d S )Nr   c                 s   r  rL   r<  r  rS   rS   rT   rd   ##  r  z?MergedSequenceNode.calculate_constant_result.<locals>.<genexpr>)r   r   r   r~   r  r   r   r   r&  r   r   r   )rW   r   r   r  rS   rS   rT   r  #  s   





z,MergedSequenceNode.calculate_constant_resultc              
      s   g }| j D ],}|jr|jr|j dkrq|js|jr' fdd|j D }n| }|| q| jtu rWzt|}W |S  t	yV } z| 
| W Y d }~|S d }~ww | jtu rbt|}|S | jtu siJ |S )Nr   c                 3   s    | ]}|  V  qd S rL   r  r  r  rS   rT   rd   7#  s    z8MergedSequenceNode.compile_time_value.<locals>.<genexpr>)r   r   r   r  r  r   r   r   r&  rb  r  r   r   r   )rW   r  r   r   r  r  rS   r  rT   r  /#  s.   




z%MergedSequenceNode.compile_time_valuec                 C   rU   r  rS   r   rS   rS   rT   r1  F#  rY   z$MergedSequenceNode.type_dependenciesc                 C   r   rL   r  r   rS   rS   rT   r   I#  r#  zMergedSequenceNode.infer_typec                    sV    fdd| j D }t|dkr|d j| ju r|d S | jtttfv s&J || _ | S )Nc                    rB  )z2argument after * must be an iterable, not NoneTyperC  r  ry   rS   rT   r   M#  rD  z4MergedSequenceNode.analyse_types.<locals>.<listcomp>r'   r   )r   r   r   r   r   r   )rW   rr   r   rS   ry   rT   r!  L#  s   
z MergedSequenceNode.analyse_typesc                 C   rU   rQ  rS   rV   rS   rS   rT   r  ]#  rY   zMergedSequenceNode.may_be_nonec           
   
   C   s  | | j | | | jtu }t| j}t|}|| |r#|j	s-|s@|j
r@|jtu r@|d|  | f  || n0|d|  |rJdn|jrV|jttfv rVdnd| ||  | jf  | | || || t }|rd}d}nd}d	}|D ]l}|r|j	s|j
s|j
r|js|s|jr|d
 |jD ]!}|| ||jd||  | f  || || qq|r|d n|d || ||jd||  | f  || || q| jtu r/|d |dtj|  f  ||  t |d|  tj||  | jf  | | |d t|D ]}	|j t!j"|	  q3d S )NrC  r  	PySet_Newr  r  r  __Pyx_PySet_Updater  __Pyx_PyList_Extend)r  r  r|  )PySet_Updatez
Builtins.c)
ListExtendr  r  z"PyObject *%s = PyList_AsTuple(%s);r  r   )#ru  r   rd  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   )
rW   r   is_setr   r   rM  add_funcextend_funcri  rN  rS   rS   rT   r{  `#  s   





















z+MergedSequenceNode.generate_evaluation_codec                 C   rO  rL   )r   r  rP  rS   rS   rT   r  #  rQ  zMergedSequenceNode.annotateN)rZ   r[   r\   r\  r   r   r  rB  r  r  r1  r   r!  r  r{  r  rS   rS   rS   rT   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   )rW   rr   r2  ri  rS   rS   rT   r!  #  s   

zSetNode.analyse_typesc                 C   rU   rQ  rS   rV   rS   rS   rT   r  #  rY   zSetNode.may_be_nonec                 C   s   dd | j D | _d S )Nc                 S   s   h | ]}|j qS rS   r<  r  rS   rS   rT   r   #  r  z4SetNode.calculate_constant_result.<locals>.<setcomp>)r   r~   rV   rS   rS   rT   r  #  r  z!SetNode.calculate_constant_resultc              
      P    fdd| j D }zt|W S  ty' } z| | W Y d }~d S d }~ww )Nc                    r0  rS   r  r  r  rS   rT   r   #  r   z.SetNode.compile_time_value.<locals>.<listcomp>)r   r&  rb  r  r  rS   r  rT   r  #  s   
zSetNode.compile_time_valuec                 C   s   | j D ]}|| q| | |d|  ||  | jf  | | | j D ]}|| jd|  |	 f  |
| || q*d S )Nz%s = PySet_New(0); %szPySet_Add(%s, %s))r   r{  rd  r   r   r   r   r  r  r   r  r  r  rS   rS   rT   r{  #  s$   




z SetNode.generate_evaluation_codeN)rZ   r[   r\   r\  r   r   r   r  r  r!  r  r  r  r{  rS   rS   rS   rT   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"  r   rS   rT   r   #  s    z'DictNode.from_pairs.<locals>.<listcomp>r  rS   )rP   r   pairsrS   r2  rT   
from_pairs#  s   
zDictNode.from_pairsc                 C   r  )Nc                 S   r  rS   r<  r   rS   rS   rT   r   #  r  z6DictNode.calculate_constant_result.<locals>.<listcomp>)r  r  r~   rV   rS   rS   rT   r  #  r  z"DictNode.calculate_constant_resultc              
      r.  )Nc                    s$   g | ]}|j  |j fqS rS   )r  r  r   r   r  rS   rT   r   #  s    z/DictNode.compile_time_value.<locals>.<listcomp>)r  r  rb  r  )rW   r  r4  r  rS   r  rT   r  #  s   

zDictNode.compile_time_valuec                 C   rU   r  rS   r   rS   rS   rT   r1  $  rY   zDictNode.type_dependenciesc                 C   r)  rL   rA  r   rS   rS   rT   r   $  r  zDictNode.infer_typec                    sJ   t dd} fdd| jD | _W d    n1 sw   Y  || _| S )NTrs  c                    r0  rS   r&  r   ry   rS   rT   r   $  s    z*DictNode.analyse_types.<locals>.<listcomp>)r   r  r   )rW   rr   r  rS   ry   rT   r!  $  s   

zDictNode.analyse_typesc                 C   rU   rQ  rS   rV   rS   rS   rT   r  $  rY   zDictNode.may_be_nonec                    s  |j r7|   | jjr't|st| jd|  t| j fdd| j	D dS | j|s5t| jd|  | S |jr|| _|j
sPt| j	dkrPt| jd|  n|j
rgt| j	t|jjk rgt| jd| d | j	D ]O}t|jtrw|jj|_|jjst|jjd	 t|jjd
d|_qjt|jj}|j|}|st|jjd||f  qj|j}t|tr|j}||j |_qj| S tt| | S )Nz-Cannot interpret struct as non-dict type '%s'c                    s,   g | ]}t |j|j |j d qS r/  )r  r   r  r  r   r   ry   rS   rT   r   $  s    
z&DictNode.coerce_to.<locals>.<listcomp>r3  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')rp   release_errorsr   r  r   r  r   r   r  r  r  r   r  r  r   r}   r  r  ri  r  r  rv   r   r  r  rN   )rW   r  rr   r   r  r  r   rQ   ry   rT   r  $  sB   




zDictNode.coerce_toc                 C   s   | j D ]}t| qg | _ d S rL   )r   r   )rW   rs   rS   rS   rT   r6  =$  s   


zDictNode.release_errorsrE  c              	   C   sp  | | j | | | jj}|r3|   |d|  t| j	|
|  | jf  | | d }n| jj}t }d }d}| j	D ]}|| |r| jrW|d|j   |j}| jr|d ur|jsgd }n(|j|v rod }n |t|jur|d u rt|j}||j n	d }n||j |d u r|d|  | f  d}|d| ||jf  |d || jd|  |j |j f  | jr|d u r|d	 | jr|d	 n=t|jj}||}	|	d usJ d
| |	j}
|j }|jjjr|d|  |
||f  n|d|  |
|f  || || qA|r6|jt !dd d S d S )Nz%%s = __Pyx_PyDict_NewPresized(%d); %sFr  rF  TrH  r  rI  r   zAstruct member %s not found, error was not handled during coercionzmemcpy(%s.%s, %s, sizeof(%s));r  rG  rL  )"ru  r   rd  r   rp   r6  r   r   r   r  r   r  r  r&  r{  exclude_null_valuesr   r   r  r?  r  r'  r   r  rv   r  r   r4  r  r  r   r   r   r   )rW   r   is_dictstruct_scope	keys_seenkey_typeneeds_error_helperr   r  r  	key_cnamevalue_cnamerS   rS   rT   r{  D$  s   















z!DictNode.generate_evaluation_codec                 C   rO  rL   )r  r  rP  rS   rS   rT   r  $  rQ  zDictNode.annotatec                 C   s   t dd | jD S )Nc                 S   s   g | ]	\}}|j |fqS rS   r"  r=  rS   rS   rT   r   $  s    z+DictNode.as_python_dict.<locals>.<listcomp>)r  r  rV   rS   rS   rT   as_python_dict$     zDictNode.as_python_dict)rZ   r[   r\   r   r   r7  r   r   r  r?  r   r  r5  r  r  r1  r   r!  r  r  r6  r  r{  r  r?  r]   rS   rS   rQ   rT   r  #  s,    
	&S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 rL   )r  r~   r   rV   rS   rS   rT   r  $  s   
z&DictItemNode.calculate_constant_resultc                 C   s<   | j || _ | j|| _| j || _ | j|| _| S rL   )r  r!  r   r  r   rS   rS   rT   r!  $  s
   zDictItemNode.analyse_typesc                 C   r  rL   )r  r{  r   rm  rS   rS   rT   r{  $  r  z%DictItemNode.generate_evaluation_codec                 C   r  rL   )r  r  r   rm  rS   rS   rT   r  $  r  z#DictItemNode.generate_disposal_codec                 C   r  rL   )r  r  r   rm  rS   rS   rT   r  $  r  zDictItemNode.free_tempsc                 C   s   t | j| jgS rL   )r+  r  r   rV   rS   rS   rT   __iter__$  r  zDictItemNode.__iter__)rZ   r[   r\   r   rN  r  r!  r{  r  r  rA  rS   rS   rS   rT   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 )SortedDictKeysNoderi  Tc                 C   s   t j| |j|d tj| _d S )N)ri  )r   rB  r   r   r   r   rW   ri  rS   rS   rT   rB  $  s   zSortedDictKeysNode.__init__c                 C   s,   | j |}|jtju r|d}|| _ | S r7  )ri  r!  r   r   r   r  r  rS   rS   rT   r!  $  s   z SortedDictKeysNode.analyse_typesc                 C   rU   rQ  rS   rV   rS   rS   rT   r  $  rY   zSortedDictKeysNode.may_be_nonec              
   C   s  | j  }| j jtju r%|d|  |||  | jf  | 	| nT|j
tdd |td}|d|  ||||  | jf  | 	| |d|    | |d|    |||  | j | 	| |d || jd	|    d S )
Nz%s = PyDict_Keys(%s); %sPyObjectCallMethod0r*  keysz+%s = __Pyx_PyObject_CallMethod0(%s, %s); %sz"if (unlikely(!PyList_Check(%s))) {zPySequence_List(%s)r   zPyList_Sort(%s))ri  r   r   r   r   r   r   r   r   r  r   r   r   r   r1  r
   r  r  r  )rW   r   dict_result
keys_cnamerS   rS   rT   rv  $  s0   





z'SortedDictKeysNode.generate_result_codeN)	rZ   r[   r\   r   r   rB  r!  r  rv  rS   rS   rS   rT   rB  $  s    rB  c                   @   s   e Zd Zdd Zdd ZdS )ModuleNameMixinc                 C      |j | jddS NT)r  )r  rl  rm  rS   rS   rT   get_py_mod_name$     zModuleNameMixin.get_py_mod_namec                 C   rI  rJ  )r  qualnamerm  rS   rS   rT   get_py_qualified_name$  rL  z%ModuleNameMixin.get_py_qualified_nameN)rZ   r[   r\   rK  rN  rS   rS   rS   rT   rH  $  s    rH  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   r   rL   rS   r   rS   rS   rT   r   %  rY   zClassNode.analyse_annotationsc                 C   r)  rL   r  r   rS   rS   rT   r   %  r  zClassNode.infer_typec                 C   s8   | j r| j || _ | j || _ |tdd | S )NCreateClassr*  )rP  r!  r  r   r   r   r   rS   rS   rT   r!  %  s
   zClassNode.analyse_typesc                 C   rU   r%  rS   rV   rS   rS   rT   r  %  rY   zClassNode.may_be_noneConstructing Python classc                 C   s   | j }|| j}| jr$|| jd|j |t	d| j f  | 
|}| |}|d|  |j |j |||||  | jf  | | d S )NrI  r\  z.%s = __Pyx_CreateClass(%s, %s, %s, %s, %s); %s)class_def_noder1  rq   rP  r  r   r  r   r
   r  rK  rN  r   r   basesr   r  )rW   r   rS  r   py_mod_namerM  rS   rS   rT   rv  %  s4   

	zClassNode.generate_result_codeN)rZ   r[   r\   r   r   r   r   r   r   r!  r  r  rv  rS   rS   rS   rT   rO  $  s    
rO  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   r)  rL   r  r   rS   rS   rT   r   H%  r  zPy3ClassNode.infer_typec                 C   r!  rL   rS   r   rS   rS   rT   r!  L%  rY   zPy3ClassNode.analyse_typesc                 C   rU   r%  rS   rV   rS   rS   rT   r  O%  rY   zPy3ClassNode.may_be_nonerR  c                 C   s   ddl m} | jj}dd |j D }|rKt||d}t|t	dd}|
|jp2||jt||_t|||d}|| | jjjd	| d S d S )
Nr'   AnnotationWriterc                 S   s2   g | ]}|j rt|jt|j|jd |j jdqS r"  r0  )r  r  r   r   rq   stringr`   r   rS   rS   rT   r   W%  s    z4Py3ClassNode.analyse_annotations.<locals>.<listcomp>r3  __annotations__r  )r#  r   r   )AutoDocTransformsrX  rS  r   r  r   r  r  r
   r  r  rq   r  r   r   r,   r  bodyr  insert)rW   rr   rX  position
dict_itemsannotations_dictr#  r   rS   rS   rT   r   T%  s   	
z Py3ClassNode.analyse_annotationsc                 C   s   |j tdd || j}| j}|jr|j nd}|j	r&|j	 }n| j
r,d}nd}|d|  |||j |j || j| j||  | jf	  | | d S )NPy3ClassCreater*  r7  z((PyObject*)&PyType_Type)z$((PyObject*)&__Pyx_DefaultClassType)z9%s = __Pyx_Py3ClassCreate(%s, %s, %s, %s, %s, %d, %d); %s)r   r   r   r   r1  rq   rS  mkwr   	metaclass
force_typer   r   rT  r  calculate_metaclassallow_py2_metaclassr   r   r  )rW   r   r   rS  rd  re  rS   rS   rT   rv  h%  s.   z!Py3ClassNode.generate_result_codeN)rZ   r[   r\   r   r   r   rf  r   r   r!  r  r  r   rv  rS   rS   rS   rT   rV  7%  s    rV  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   rS   rS   rT   r!  %  s   z"PyClassMetaclassNode.analyse_typesc                 C   rU   r%  rS   rV   rS   rS   rT   r  %  rY   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 )NPy3MetaclassGetr*  z__Pyx_Py3MetaclassGet(%s, %s)CalculateMetaclassz"__Pyx_CalculateMetaclass(NULL, %s)r  )rS  rT  rd  r   r   r   r   r   r   r   r   r  )rW   r   rT  rd  callrS   rS   rT   rv  %  s.   

z)PyClassMetaclassNode.generate_result_codeNrZ   r[   r\   r   r!  r  rv  rS   rS   rS   rT   ri  %  s
    ri  c                   @   *   e Zd ZdgZdd Zdd Zdd ZdS )	PyClassNamespaceNoderP  c                 C   s*   | j r| j ||| _ t| _d| _| S r   )rP  r!  r  r   r   r   r   rS   rS   rT   r!  %  s
   z"PyClassNamespaceNode.analyse_typesc                 C   rU   r%  rS   rV   rS   rS   rT   r  %  rY   z PyClassNamespaceNode.may_be_nonec           
      C   s   | | j}| |}| |}| j}d}| jr| j n|}|jr'|j n|}|j	r1|j	 n|}	|
d|  |	|j |||||||  | jf	  | | d S )Nz(PyObject *) NULLz>%s = __Pyx_Py3MetaclassPrepare(%s, %s, %s, %s, %s, %s, %s); %s)r1  rq   rK  rN  rS  rP  r   rd  r   re  r   rT  r   r   r  )
rW   r   r   rU  rM  rS  nulldoc_coderd  re  rS   rS   rT   rv  %  s,   

z)PyClassNamespaceNode.generate_result_codeNrm  rS   rS   rS   rT   ro  %  s
    ro  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   r!  rL   rS   r   rS   rS   rT   r'  %  rY   z)ClassCellInjectorNode.analyse_expressionsc                 C   s<   | j sJ |d|  ||  | jf  | | d S )Nz%s = PyList_New(0); %s)	is_activer   r   r   r   r  rm  rS   rS   rT   rv  %  s   
z*ClassCellInjectorNode.generate_result_codec                 C   s<   | j sJ |jtdd || jd|  |f  d S )NCyFunctionClassCellCythonFunction.cz&__Pyx_CyFunction_InitClassCell(%s, %s))rs  r   r   r   r   r  r   r   )rW   r   classobj_cnamerS   rS   rT   generate_injection_code%  s   


z-ClassCellInjectorNode.generate_injection_codeN)rZ   r[   r\   r   r   r   r   rs  r'  rv  rw  rS   rS   rS   rT   rr  %  s    rr  c                   @   s,   e Zd Zg ZdZdZeZdd Zdd Z	dS )ClassCellNodeTFc                 C   r!  rL   rS   r   rS   rS   rT   r!  %  rY   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   r   rl  r   rm  rS   rS   rT   rv  %  s    


z"ClassCellNode.generate_result_codeN)
rZ   r[   r\   r   r   ry  r   r   r!  rv  rS   rS   rS   rT   rx  %  s    rx  c                   @   s   e Zd Zg dZdZdZdZdZdZdZ	dZ
dZdZe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_kwdictrb  NFr   r'   c                 C   s&   | |j ||jj|p|j|jt|dS )N)r  pymethdef_cnamebindingspecialized_cpdefsr}  )r   r   r  r  CodeObjectNode)rP   r   r  rS   rS   rT   from_defnode!&  s   zPyCFunctionNode.from_defnodec                 C   s   | j r| | | S rL   )r  analyse_default_argsr   rS   rS   rT   r!  *&     
zPyCFunctionNode.analyse_typesc                 C   s  g }g }g }g }g }|j p| jjo|j}| jjD ]b}|jrd|sK|jjr9t|j|j|_|jj	r8|j
|j	||_nd|_|j	jrF|| n|| |jj	rd|jj	|rd|jr_|| n|| |jrz|j||_||j|j|jjf q| jj| jjfD ]}|r|jr|j||_||j|j|jjf q| jj}	|	r|	|| j_||	jtd|	jf |s|r=| }
|
tj}t|}g | _|D ]"}|j	}|j r|j!}|j"|j|dtj#|j dd}| j||f q|D ]}|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_%|sC|r| j%du rw|rat+| jdd |D d}||,|| _-|rvt.| jdd |D d}||| _/nd| j0s|rt1| j|| j%}nt2| j}|rt3| 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 dS )zB
        Handle non-literal function's default arguments.
        TreturnN)allow_pyobjectF)r  allow_memoryviewstructr'   r  ro  c                 S   r  rS   )rg   r  rS   rS   rT   r   &  r  z8PyCFunctionNode.analyse_default_args.<locals>.<listcomp>rs  c                 S   s*   g | ]}t |jt|j|jd |jdqS rY  )r  r   r   rq   rg   r  rS   rS   rT   r   &  s    r3  )r  r   __defaults__)r   r  r  r^  
decoratorsrq   c                 S   s(   g | ]\}}}t |t||d |dqS rY  )r  r   )r`   r   rq   r   rS   rS   rT   r   &  s    )@r  r  
is_wrapperr  r   rg   r   DefaultLiteralArgNoder   r   r  
is_dynamicrp   r   r  kw_onlyr  r!  rq   rZ  r  r  return_type_annotationr
   r  rz  next_idr   defaults_struct_prefixr   StructOrUnionScopedefaultsr  r9  r  
arg_prefixdeclare_struct_or_uniondefaults_structr   defaults_pyobjectsdynamic_args_cnamer   rU  rv  r  r~  r  r  r  DefaultsTupleNoder  DefaultsKwDictNoder   DefNodeReturnStatNoder   r  r'  r^  local_scopepy_wrapper_requiredpymethdef_requireddefaults_getterrb  )rW   rr   nonliteral_objectsnonliteral_otherdefault_argsdefault_kwargsannotationsmust_use_constantsri  r  rh  r   r  r  r   r~  r  r  rb  rS   rS   rT   r  /&  s   















	


z$PyCFunctionNode.analyse_default_argsc                 C   rU   rQ  rS   rV   rS   rS   rT   r  &  rY   zPyCFunctionNode.may_be_nonezConstructing Python functionc                 C   rU   )Nr7  rS   rV   rS   rS   rT   closure_result_code&  rY   z#PyCFunctionNode.closure_result_codec                 C   s"   | j r
| | d S | | d S rL   )r  generate_cyfunction_codegenerate_pycfunction_coderm  rS   rS   rT   rv  &  s   z$PyCFunctionNode.generate_result_codec                 C   sH   |  |}|d|  | j|  |||  | jf  | | d S )Nz'%s = PyCFunction_NewEx(&%s, %s, %s); %s)rK  r   r   r  r  r   r   r  )rW   r   rU  rS   rS   rT   r  &  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r4| j }nd}g }|j	rA|
d n|jrI|
d	 |jjjrW|jjsW|
d
 |jr_|
d |rgd|}nd}|d|  || j|| ||  | |tj|||  | jf
  | | |jr|jsJ 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  | j/rA|d|  | j/ f  d S d S d S )Nr   FusedFunctionru  __pyx_FusedFunction_NewCythonFunction__Pyx_CyFunction_Newr7  __Pyx_CYFUNCTION_STATICMETHOD__Pyx_CYFUNCTION_CLASSMETHOD__Pyx_CYFUNCTION_CCLASS__Pyx_CYFUNCTION_COROUTINEz | rU  z(%s = %s(&%s, %s, %s, %s, %s, %s, %s); %szpyclass_stack is emptyrp  zPyList_Append(%s, %s);z:if (!__Pyx_CyFunction_InitDefaults(%s, sizeof(%s), %d)) %sz!__Pyx_CyFunction_Defaults(%s, %s)ro  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);)0r  r  is_specializationr   r   r   r   r}  r   is_staticmethodr   is_classmethodr  rq  r  r   is_anonymousis_coroutiner  r   r   r  rN  r  rK  r   rI  r   r   r  requires_classobjpyclass_stackrl  r   
class_cellr  r  r  rq   r  r   r  r   r~  r  r  r  rb  )
rW   r   r  r  code_object_resultflags
class_noder  ri  r   rS   rS   rT   r  &  s   








z(PyCFunctionNode.generate_cyfunction_code)rZ   r[   r\   r   r}  r  r  r  r  r  r~  r  rb  r   r   r   r  r  r  r  r!  r  r  r  r  rv  r  r  rS   rS   rS   rT   r|  &  s4    
 r|  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)r7  )needs_closure_coder   cur_scope_cnamerV   rS   rS   rT   r  +'  r  z%InnerFunctionNode.closure_result_codeN)rZ   r[   r\   r  r  r  rS   rS   rS   rT   r  %'  s    r  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 rS   r  r  rS   rS   rT   r   ?'  r   z+CodeObjectNode.__init__.<locals>.<listcomp>c                 S   s   g | ]
}t |j|jd qS )r"  )r   r   rq   r  rS   rS   rT   r   B'      r   r'   )r   r   r   )	r   rB  r   r   r   r  r  rv  r  )rW   r  r   
local_varsrS   rS   rT   rB  ;'  s   
zCodeObjectNode.__init__c                 C   rU   rQ  rS   rV   rS   rS   rT   r  G'  rY   zCodeObjectNode.may_be_nonec                 C   s"   | j d u r|jtddd| _ | j S )Ncodeobjr4   r  )rQ  r  r   rm  rS   rS   rT   r   J'  s   
z$CodeObjectNode.calculate_result_codec                 C   sj  | j d u r|jtddd| _ || j }|d u rd S || j | j}|j|jdd|jd}t	
|jd  dd}|j|ddd	}d
dg}| jjrQ|d | jjrZ|d | jjrd|d n| jjrn|d n	| jjrw|d |d| j t|j|j |j|jt| jjd|pdtjtjtj| j tjtj||| jd tj|| j | jf  d S )Nr  r4   r  TFr  r   utf8)r  r  CO_OPTIMIZED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|rU  r'   )rQ  r  r   r  ru  r   r  r  rq   r
   r  get_filenametable_entryr  r  r   r  is_asyncgenr  ry  r   r   r   r  num_posonly_argsr  r  r   empty_bytesr  r   r   )rW   r   r  	func_name	file_pathfile_path_constr  rS   rS   rT   rv  O'  sT   




z#CodeObjectNode.generate_result_coderL   )
rZ   r[   r\   r   r   rQ  rB  r  r   rv  rS   rS   rS   rT   r  1'  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 )r  TFc                    s2   t t| | || _|j| _| jj| _d| _d S rQ  )rN   r  rB  ri  r~   r   	evaluated)rW   r   ri  rQ   rS   rT   rB  '  s
   

zDefaultLiteralArgNode.__init__c                 C   r!  rL   rS   r   rS   rS   rT   r!  '  rY   z#DefaultLiteralArgNode.analyse_typesc                 C   r   rL   rS   rm  rS   rS   rT   rv  '  rY   z*DefaultLiteralArgNode.generate_result_codec                 C   s    | j s| j| d| _ d S d S r%  )r  ri  r{  rm  rS   rS   rT   r{  '  s   
z.DefaultLiteralArgNode.generate_evaluation_codec                 C   s   | j | j S rL   )r   r  ri  r   rV   rS   rS   rT   r   '  r   zDefaultLiteralArgNode.result)rZ   r[   r\   r   r   r   rB  r!  rv  r{  r   r]   rS   rS   rQ   rT   r  '  s    r  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 rL   )rN   r  rB  ri  r  )rW   r   ri  r  rQ   rS   rT   rB  '  s   
z!DefaultNonLiteralArgNode.__init__c                 C      | j j| _d| _| S rQ  )ri  r   r   r   rS   rS   rT   r!  '     
z&DefaultNonLiteralArgNode.analyse_typesc                 C   r   rL   rS   rm  rS   rS   rT   rv  '  rY   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)r  rq   r   rz  r  ri  r   rV   rS   rS   rT   r   '  s   
zDefaultNonLiteralArgNode.result)	rZ   r[   r\   r   rB  r!  rv  r   r]   rS   rS   rQ   rT   r  '  s    r  c                       s*   e Zd Z fddZd fdd	Z  ZS )r  c                    sL   g }|D ]}|j jst|||}n|j }|| qtt| j||d d S )Nrs  )rg   r   r  r   rN   r  rB  )rW   r   r  r  r   ri  rQ   rS   rT   rB  '  s   zDefaultsTupleNode.__init__Fc                    s   t t| |||S rL   )rN   r  r!  r  )rW   rr   r  rQ   rS   rT   r!  '  r  zDefaultsTupleNode.analyse_typesr	  rZ   r[   r\   rB  r!  r]   rS   rS   rQ   rT   r  '  s    
r  c                       s   e Zd Z fddZ  ZS )r  c                    sh   g }|D ]#}t |j|jd}|jjst|||}n|j}|t|j||d qtt	| j
||d d S )Nr"  r0  r3  )r   r   rq   rg   r   r  r   r  rN   r  rB  )rW   r   r  r  r  ri  rq   rQ   rS   rT   rB  '  s   zDefaultsKwDictNode.__init__)rZ   r[   r\   rB  r]   rS   rS   rQ   rT   r  '  s    r  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  r  r  r  no_assignment_synthesisr  is_cyfunctionr  r   r  add_lambda_defr   rS   rS   rT   r  '  s   
zLambdaNode.analyse_declarationsc                    s   | j || _ tt| |S rL   )r  r'  rN   r  r!  r   rQ   rS   rT   r!  '  s   zLambdaNode.analyse_typesc                    s    | j | tt| | d S rL   )r  r  rN   r  rv  rm  rQ   rS   rT   rv  '  s   zLambdaNode.generate_result_code)rZ   r[   r\   r   r
   r  rq   r  r!  rv  r]   rS   rS   rQ   rT   r  '  s    

r  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|g|R i | g | _d S rL   )rN   r  rB  r  )rW   r   r   rD  rQ   rS   rT   rB  
(  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rAt| jjts7J | jjd | d S t| jtjsJJ d S )Ngenexpr_namer  F)r  r  r  rN   r  r  r  r  r  r  r0   pyfunction_noargsr   r  r}   r
  r   r  r  r  r  r  r   rQ   rS   rT   r  (  s   
z,GeneratorExpressionNode.analyse_declarationsc              
   C   s`   |   gdd | jD  }d|}|d|  | jjj|||  | j	f  | 
| d S )Nc                 S   r  rS   r  )r`   cprS   rS   rT   r   #(  r  z@GeneratorExpressionNode.generate_result_code.<locals>.<listcomp>r  r  )r  r  r  r   r   r  r   r  r   r   r  )rW   r   args_to_callrS   rS   rT   rv  !(  s   
z,GeneratorExpressionNode.generate_result_code)rZ   r[   r\   r
   r  rq   r  r  r   r   rB  r  rv  r]   rS   rS   rQ   rT   r  '  s    
	r  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 )YieldExprNoderi  r   Fyieldc                 C   sZ   | j r	| jr| jrt| jd| j  d| _| jd ur+| j|| _| jj	j
s+| | | S )Nz'%s' not supported herer'   )	label_numis_yield_fromin_async_genr   r   expr_keywordr   ri  r!  r   rp   coerce_yield_argumentr   rS   rS   rT   r!  =(  s   


zYieldExprNode.analyse_typesc                 C      | j || _ d S rL   ri  r  r   rS   rS   rT   r  G(  r   z#YieldExprNode.coerce_yield_argumentc                 C   sp   | j r*| j | | j | |dtj| j tf  | j | | j 	| n|
tjt | | d S NrC  )ri  r{  rn  r   r   r"  r  r   r  r  put_init_to_py_nonegenerate_yield_coderm  rS   rS   rT   r{  J(  s   
z&YieldExprNode.generate_evaluation_codec                 C   sb  | | jdd\}}|| g }|jj  |j D ]7\}}}|jj|}|	|||f |j
rD|jtdd d| }n||| |dtj||f  q|tjt |jjd }	|jjd }
|	sm|
rx|jtj|jj d	 |  |jjd
ur|dtj  n|dtj  |d| jrdnd| jrdndf  |dtj|f  | jr| js|dtj  n|dtj  || |D ]:\}}}dtj|f }|j
rd| }|d||f  |jr|d|  ||| q|j r|d||f  q| !|tj" | j#r/| $| |%d| & tj"f  |'| & t d
S d
S )z
        Generate the code to return the argument in 'Naming.retval_cname'
        and to continue at the yield label.
         r  r  r  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 r  awaitr  z%s->resume_label = %d;z,return __Pyx__PyAsyncGenValueWrapperNew(%s);z
return %s;ro  rC  r  z"%s.memview = NULL; %s.data = NULL;r  )(new_yield_labelr  replace	use_labelra  closure_tempsresettemps_in_userb  r   r   r   r   r   r   r  r   r   r  r"  r   rj   put_trace_returnr  put_finish_refcount_contextcurrent_exceptr{  r  is_awaitr  rp   r  r   !generate_sent_value_handling_codesent_value_cnamer`  rd  r  r   rl  )rW   r   r  
label_namesavedr   r   r]  
save_cnamer  r  rS   rS   rT   r  X(  sn   




z!YieldExprNode.generate_yield_codec                 C   s   | ||| j d S rL   )r   r   r   rW   r   r>  rS   rS   rT   r  (  r  z/YieldExprNode.generate_sent_value_handling_codeN)rZ   r[   r\   r   r   r   r  r  r  r  r  r!  r  r{  r  r  rS   rS   rS   rT   r  .(  s    
Ar  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  rL   )NotImplementedErrorrm  rS   rS   rT   yield_from_func(  r#  z(_YieldDelegationExprNode.yield_from_funcNFc                 C   s   |d u r
| j | |dtj| |tj|d u r| j  n|f  |d u r4| j | | j 	| n|r<|
|t |tjt |dtj  | | |d | jr^| | n| | |d d S )Nz%s = %s(%s, %s);r  r  r   )ri  r{  r   r   r"  r  r{  r   r  r  r  r   r  r  r`  fetch_iteration_resulthandle_iteration_exception)rW   r   r  r  rS   rS   rT   r{  (  s*   


z1_YieldDelegationExprNode.generate_evaluation_codec                 C   s6   | d|    || jd|    | | d S )Nr  z(__Pyx_PyGen_FetchStopIterationValue(&%s))r   r   r  r   r  rm  rS   rS   rT   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   r   rm  rS   rS   rT   r  (  s
   


z3_YieldDelegationExprNode.handle_iteration_exceptionrQ  )rZ   r[   r\   r  r{  r  r  rS   rS   rS   rT   r
  (  s
    
r
  c                   @   $   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)ri  r   rw  r   r   r  r   rS   rS   rT   r  (  s   
z'YieldFromExprNode.coerce_yield_argumentc                 C      |j tdd dS )NGeneratorYieldFromr  __Pyx_Generator_Yield_Fromr   r   r   r   rm  rS   rS   rT   r  (     z!YieldFromExprNode.yield_from_funcN)rZ   r[   r\   r  r  r  r  rS   rS   rS   rT   r  (  s
    r  c                   @   r  )AwaitExprNodeTr  c                 C   s    | j d ur| j || _ d S d S rL   r  r   rS   rS   rT   r  (  s   
z#AwaitExprNode.coerce_yield_argumentc                 C   r  )NCoroutineYieldFromr  __Pyx_Coroutine_Yield_Fromr  rm  rS   rS   rT   r  (  r  zAwaitExprNode.yield_from_funcN)rZ   r[   r\   r  r  r  r  rS   rS   rS   rT   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   rm  rS   rS   rT   _generate_break(  s   



z%AwaitIterNextExprNode._generate_breakc                    s,   |j sJ d| | tt| | d S )N1AwaitIterNextExprNode outside of 'async for' loop)break_labelr  rN   r  r  rm  rQ   rS   rT   r  (  s   
z,AwaitIterNextExprNode.fetch_iteration_resultc                 C   sF   |j sJ d|d|  | | ||| j |d d S )Nr  r'  r   )r  r   r  r   r   r	  rS   rS   rT   r   )  s
   
z7AwaitIterNextExprNode.generate_sent_value_handling_code)rZ   r[   r\   r  r  r  r]   rS   rS   rQ   rT   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 rL   )r   r   globals_utility_coder   rS   rS   rT   r!  )  r  zGlobalsExprNode.analyse_typeszConstructing globals dictc                 C   rU   rQ  rS   rV   rS   rS   rT   r  )  rY   zGlobalsExprNode.may_be_nonec                 C   s2   | d|  ||  | jf  | | d S )Nz%s = __Pyx_Globals(); %s)r   r   r   r   r  rm  rS   rS   rT   rv  )  s
   z$GlobalsExprNode.generate_result_codeN)
rZ   r[   r\   r   r   r   r!  r  r  rv  rS   rS   rS   rT   r  	)  s    r  c                   @   r  )LocalsDictItemNodec                 C   sT   | j || _ | j|| _| j || _ | jj|r%| j|| _| S d | _| S rL   )r  r!  r   r  r   r  r   rS   rS   rT   r!  )  s   z LocalsDictItemNode.analyse_typesN)rZ   r[   r\   r!  rS   rS   rS   rT   r!  )  r|  r!  c                       $   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 rS   r  r[  rS   rS   rT   r   +)  s
    z/FuncLocalsExprNode.__init__.<locals>.<listcomp>c              
      s,   g | ]}t  t |d t |dddqS )r"  T)rq   r5  r0  )r!  r   r  )r`   r  r2  rS   rT   r   -)  s    
T)r  r7  )r  r  r   r  rB  )rW   r   rr   r  r  rS   r2  rT   rB  *)  s   


zFuncLocalsExprNode.__init__c                    s&   t t| |}dd |jD |_|S )Nc                 S   s   g | ]	}|j d ur|qS rL   r"  )r`   r2  rS   rS   rT   r   6)  s    
z4FuncLocalsExprNode.analyse_types.<locals>.<listcomp>)rN   r#  r!  r  r#  rQ   rS   rT   r!  4)  s   z FuncLocalsExprNode.analyse_typesr  rS   rS   rQ   rT   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      t | | || _d S rL   )r  rB  pyclass_dict)rW   r   r&  rS   rS   rT   rB  <)     
zPyClassLocalsExprNode.__init__c                 C   r  rQ  )r&  r   r   r   rS   rS   rT   r!  @)  r  z#PyClassLocalsExprNode.analyse_typesc                 C   rU   rQ  rS   rV   rS   rS   rT   r  E)  rY   z!PyClassLocalsExprNode.may_be_nonec                 C   r  rL   )r&  r   rV   rS   rS   rT   r   H)  rL  zPyClassLocalsExprNode.resultc                 C   r   rL   rS   rm  rS   rS   rT   rv  K)  rY   z*PyClassLocalsExprNode.generate_result_codeN)rZ   r[   r\   rB  r!  r  r   rv  rS   rS   rS   rT   r$  ;)  s    r$  c                 C   s*   |j rt| S |jrt| |jS t| |S rL   )r  r  r  r$  r  r#  )r   
scope_noderr   rS   rS   rT   LocalsExprNodeO)  s
   
r)  )not~rT  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 rL   )compile_time_unary_operatorsr   r  r~   rW   r  rS   rS   rT   r  t)     
z"UnopNode.calculate_constant_resultc              
   C   sj   t | j}|st| jd| j  | j|}z||W S  ty4 } z| | W Y d }~d S d }~ww )Nz3Unary '%s' not supported in compile-time expression)	r-  ri   r   r   r   r  r  rb  r  )rW   r  r  r  r  rS   rS   rT   r  x)  s   
zUnopNode.compile_time_valuec                 C   s<   | j |}|js|jr|| j}|d ur|S | ||S rL   )r  r   r   r  find_cpp_operation_typer   infer_unop_type)rW   rr   operand_typecpp_typerS   rS   rT   r   )  s   zUnopNode.infer_typec                 C   s   |j rtS |S rL   )rp   r   rW   rr   r2  rS   rS   rT   r1  )  s   zUnopNode.infer_unop_typec                 C   s,   | j jr| j jjr| j jturdS t| S rQ  )r  r   r  r   r   r  rV   rS   rS   rT   r  )  s   
zUnopNode.may_be_nonec                 C   s~   | j || _ | |rtt| j| j j| _d| _| S |  r-| 	| t
| _d| _| S |  r8| | | S | | | S r   )r  r!  is_pythran_operationrG   r>   r   r   r   is_py_operationcoerce_operand_to_pyobjectr   is_cpp_operationanalyse_cpp_operationanalyse_c_operationr   rS   rS   rT   r!  )  s   
	


zUnopNode.analyse_typesc                 C   r  rL   r  r"  rV   rS   rS   rT   r"  )  rL  zUnopNode.check_constc                 C   s   | j jjp	| j jjS rL   )r  r   rp   r  rV   rS   rS   rT   r6  )  ra  zUnopNode.is_py_operationc                 C   s    t |}| jj}|o|jp|jS rL   )r?   r  r   r  r;   )rW   rr   
np_pythranop_typerS   rS   rT   r5  )  s   zUnopNode.is_pythran_operationc                 C      |   r
|   d S d S rL   r6  rM  r   rS   rS   rT   rN  )     zUnopNode.nogil_checkc                 C   s   | j j}|jS rL   )r  r   r   r  rS   rS   rT   r8  )  s   zUnopNode.is_cpp_operationc                 C   r  rL   )r  r  r   rS   rS   rT   r7  )  r   z#UnopNode.coerce_operand_to_pyobjectc                 C   s   | j jr'|d |d|    |d|  |  | j| j f  d S | jj jr3| | d S | j	rr| 
 r`| jdkr`t|| jd|  | j| j f | j jrW|  nd | j| j d S |d|  | j| j f  d S d S )Nz// Pythran unaryopr  r  r   %s = %s %s;)r   r;   r   r   r   r  r  rp   generate_py_operation_coder   r8  r   r   r   r   rr  rm  rS   rS   rT   rv  )  s(   

$zUnopNode.generate_result_codec              
   C   sF   |  |}|d|  || j ||  | jf  | | d S )Nr  )py_operation_functionr   r   r  r   r   r   r  r  rS   rS   rT   rB  )  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   r   r   r   r.   rV   rS   rS   rT   
type_error)  s
   
zUnopNode.type_errorc                 C   s  | j jg}| jr| js|tj || j| j	|}|r$|s$| 
  d S |rF|jj| _|jj| _| jdkrEd| _t| rE|tdd nd| _d| _| jr^| js^| j jj| j	tjd}n| j j| j	}|r}|d u r}t| jd| j	tf  | 
  d S || _d S )Nr   Tr  r  r  )r2  z '%s' operator not defined for %s)r  r   is_inc_dec_op	is_prefixr   r   r]  r  r   r   rD  r   r   r   r   r   r   r   r0  r   )rW   rr   overload_checkoperand_typesr   r3  rS   rS   rT   r9  )  s:   




zUnopNode.analyse_cpp_operationNr  )rZ   r[   r\   r   infixrE  r  r  r   r1  r  r!  r"  r6  r5  rN  r8  r7  rv  rB  rD  r9  rS   rS   rS   rT   r,  d)  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 rL   )r  r~   rV   rS   rS   rT   r  	*  r  z!NotNode.calculate_constant_resultc              
   C   sF   | j |}z| W S  ty" } z| | W Y d }~d S d }~ww rL   )r  r  rb  r  )rW   r  r  r  rS   rS   rT   r  *  s   zNotNode.compile_time_valuec                 C      t jS rL   )r   r  r4  rS   rS   rT   r1  *  r#  zNotNode.infer_unop_typec                 C   s<   | j || _ | j j}|jr| | | S | j || _ | S rL   )r  r!  r   r   r9  r+  r4  rS   rS   rT   r!  *  s   
zNotNode.analyse_typesc                 C      d| j   S )Nz(!%s)r  r   rV   rS   rS   rT   r   *  rK  zNotNode.calculate_result_codeN)rZ   r[   r\   r   r   r  r   r  r  r1  r!  r   rS   rS   rS   rT   rJ  *  s    	rJ  c                   @   (   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 rL   )r   rJ  r  r   r]  r   rS   rS   rT   r:  (*  s   

z!UnaryPlusNode.analyse_c_operationc                 C   rU   )NPyNumber_PositiverS   rm  rS   rS   rT   rC  ,*  rY   z#UnaryPlusNode.py_operation_functionc                 C   s    |   rd| j  S | j S )Nz(+%s))r8  r  r   rV   rS   rS   rT   r   /*  s   
z#UnaryPlusNode.calculate_result_codeN)rZ   r[   r\   r   r:  rC  r   rS   rS   rS   rT   rP  #*  s
    rP  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )UnaryMinusNoderT  c                 C   sR   | j jjrt| j jtj| _n| j jjrtj| _n|   | jjr'd| _	d S d S rQ  )
r  r   rN  r   rJ  r]  r  rD  r  rI  r   rS   rS   rT   r:  ;*  s   




z"UnaryMinusNode.analyse_c_operationc                 C   rU   )NPyNumber_NegativerS   rm  rS   rS   rT   rC  F*  rY   z$UnaryMinusNode.py_operation_functionc                 C   s0   | j r
d| j  S d| jjd| j f S )N(-%s)r~  rT  )rI  r  r   r   unary_oprV   rS   rS   rT   r   I*  s   z$UnaryMinusNode.calculate_result_codec                 C   s   | j  }|rd| S d S )NrT  )r  r  )rW   r   rS   rS   rT   r  O*  s   
z)UnaryMinusNode.get_constant_c_result_codeN)rZ   r[   r\   r   r:  rC  r   r  rS   rS   rS   rT   rR  6*  s    rR  c                   @   r_  )	TildeNodec                 C   sD   | j jjrt| j jtj| _d S | j jjrtj| _d S |   d S rL   )r  r   r  r   rJ  r]  r  rD  r   rS   rS   rT   r:  W*  s   



zTildeNode.analyse_c_operationc                 C   rU   )NPyNumber_InvertrS   rm  rS   rS   rT   rC  `*  rY   zTildeNode.py_operation_functionc                 C   rM  )Nz(~%s)rN  rV   rS   rS   rT   r   c*  rK  zTildeNode.calculate_result_codeN)rZ   r[   r\   r:  rC  r   rS   rS   rS   rT   rV  T*  s    	rV  c                   @   r  )	CUnopNodec                 C   rU   rQ  rS   rV   rS   rS   rT   r6  i*  rY   zCUnopNode.is_py_operationN)rZ   r[   r\   r6  rS   rS   rS   rT   rX  g*  s    rX  c                   @   rO  )	DereferenceNoder   c                 C   s   |j r|jS tjS rL   )r  r  r   r.   r4  rS   rS   rT   r1  q*  s   zDereferenceNode.infer_unop_typec                 C   sB   | j jjr|jrt| j jj| _d S | j jj| _d S |   d S rL   )r  r   r  is_cppr   r  r  rD  r   rS   rS   rT   r:  w*  s
   
z#DereferenceNode.analyse_c_operationc                 C   rM  r  rN  rV   rS   rS   rT   r   *  rK  z%DereferenceNode.calculate_result_codeN)rZ   r[   r\   r   r1  r:  r   rS   rS   rS   rT   rY  l*  s
    	rY  c                   @   rO  )	DecrementIncrementNodeTc                 C   sV   | j jjs%| 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  rF  r   r   r   r   r.   rV   rS   rS   rT   rD  *  s   
z!DecrementIncrementNode.type_errorc                 C   sF   | j jjrt| j jtj| _d S | j jjr| j j| _d S |   d S rL   )r  r   rN  r   rJ  r]  r  rD  r   rS   rS   rT   r:  *  s   



z*DecrementIncrementNode.analyse_c_operationc                 C   s.   | j rd| j| j f S d| j | jf S )Nz(%s%s))rF  r   r  r   rV   rS   rS   rT   r   *  s   z,DecrementIncrementNode.calculate_result_codeN)rZ   r[   r\   rE  rD  r:  r   rS   rS   rS   rT   r[  *  s
    
	r[  c                    s    fddS )Nc                    s   t | f d|S )NrF  r   )r[  )r   rD  r\  rS   rT   <lambda>*  r   z%inc_dec_constructor.<locals>.<lambda>rS   r\  rS   r\  rT   inc_dec_constructor*  rK  r^  c                   @   r  )AmpersandNoder  c                 C   s
   t |S rL   )r   
c_ptr_typer4  rS   rS   rT   r1  *  rL  zAmpersandNode.infer_unop_typec                 C   s   | j || _ | j j}|jr| j|dd |js3|js3| j  s3|jr*| 	d | S | 	d|  | S |j
rS| 	d| j jrCd| j j n| j jrMd| j j nd  | S |jrY| js_t|| _| S )	NF)rG  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'r  )r  r!  r   r   r9  r5  r   r   r   r   rp   r   rq   r  r  r   r`  )rW   rr   argtyperS   rS   rT   r!  *  s(   
zAmpersandNode.analyse_typesc                 C   r  rL   )r  rU  rV   rS   rS   rT   r"  *  rL  zAmpersandNode.check_constc                 C      t | j| tj| _d| _d S Nr#  r   r   r   r.   r   rQ  rW   messrS   rS   rT   r   *     
zAmpersandNode.errorc                 C   rM  )Nz(&%s)rN  rV   rS   rS   rT   r   *  rK  z#AmpersandNode.calculate_result_codec                 C   s^   | j jjr+| jdkr-t|| jd|  | j| j  f | jjr"|  nd | j	| j
 d S d S d S )Nr   rA  )r  r   r   r   r   r   r   r   rp   r   rr  rm  rS   rS   rT   rv  *  s   z"AmpersandNode.generate_result_codeN)
rZ   r[   r\   r   r1  r!  r"  r   r   rv  rS   rS   rS   rT   r_  *  s    r_  )r   rT  r+  c                 C   s   t |tr|dkrt|jtt|j |j|jdS t |t	r8|j
|  kr+dv r8n nt| d|fd  d t| | ||dS )NrT  )r   r   rH  rG  z+-zAPython has no increment/decrement operator: %s%sx == %s(%sx) == x      )r   r  )r}   r<  r   rv   r   r>  r   rH  rG  r,  r   r   unop_node_classes)r   r   r  rS   rS   rT   	unop_node*  s   $rk  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   rU   r  rS   r   rS   rS   rT   r1  *  rY   zTypecastNode.type_dependenciesc                 C   s0   | j d u r| j|}| j||\}| _ | j S rL   )r   r  rj  
declarator)rW   rr   r  r  rS   rS   rT   r   *  s   
zTypecastNode.infer_typec                 C   s  | j d u r| j|}| j||\}| _ | j r|   | j jr,t| j	d t
j| _ | j|| _| j t
ju r?| j|S | j j}| jj j}|r_|s_| j r_| j js_| j js_t| j	d |r|s| j tu rs| jj jrst| j|S | jj |rt| _| j| j || _n| jj jr| jj jjs| jj jjst| j	d nt| j	d| jj | j f  | j|| _n|r|s| j |r| j| j || _nl| j jr| j jjs| j jjst| j	d nWt| j	d| j | jj f  nI|r|r| j rt!| j| j |dd| _n3t"| jt#r| j| j || _n"| j j$r%| jj j$r%| j|| _n| jj j%r4| j| j || _| j jr_| j jjr_| j jj&r_| jj }|jrP|j}|jr_|j&s_t| 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   r  rj  rl  r  r   r  r5  r   r   r   r.   r!  r  r+  rp   r   rN  r   r   r  r  r  r   r  r  r  r_  r  r   r.  create_from_py_utility_code	typecheckr  r}   rE  r  rC  r   )rW   rr   r  r  to_pyfrom_pyr=  rS   rS   rT   r!   +  sz   






"zTypecastNode.analyse_typesc                 C   r  rL   )r  r  rV   rS   rS   rT   r  @+  r  zTypecastNode.is_simplec                 C   r  rL   )r  r   rV   rS   rS   rT   r   D+  r  zTypecastNode.is_ephemeralc                 C   s   | j p| j S rL   )r   r  r6  rV   rS   rS   rT   r6  H+  r  z!TypecastNode.nonlocally_immutablec                 C   s,   | j r| j jr| jr|   d S d S d S d S rL   )r   rp   r   rM  r   rS   rS   rT   rN  K+  s   zTypecastNode.nogil_checkc                 C   r  rL   r;  rV   rS   rS   rT   r"  O+  rL  zTypecastNode.check_constc                 C   s   |  | jj| _d S rL   )r   r  r~   rV   rS   rS   rT   r  R+  ra  z&TypecastNode.calculate_constant_resultc                 C   s   |d u r	| j  }| jjrB| j  }| j jjr0| jj| j j|}| jj| j j|}n	| jj|}d}d| jj||f S | j|S NrU  r|  )	r  r   r   r  	real_typer  	real_code	imag_coder  )rW   operand_result	real_part	imag_partrS   rS   rT   r   U+  s&   


z"TypecastNode.calculate_result_codec                 C   s   | j  }|r| j|S d S rL   )r  r  r   r  )rW   rv  rS   rS   rT   r  i+  s   
z'TypecastNode.get_constant_c_result_codec                 C   s&   | j jr| js| j|S t| |S rL   )r   rp   r   r  r  r   r  rS   rS   rT   r  n+  s   zTypecastNode.result_asc                 C   s>   | j r|d|  | j f  ||  |   d S d S )Nz%s = (PyObject *)%s;)r   r   r   r  rl  r
  rm  rS   rS   rT   rv  u+  s   z!TypecastNode.generate_result_coderL   )rZ   r[   r\   r   r  rl  r   r1  r   r!  r  r   r6  rN  r"  r  r   r  r  rv  rS   rS   rS   rT   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s@t| jjt | S g }|jrU|jrT||j |j}|jsHn|jr\|j}n
t| jd|  | S ||sw|jswt| jjt | S | jj	jrt||krt| jjd|t|f  | S t|D ]\}}	|	jjst|	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v }|	j%js7|r7|	j%||	_%|	j%j	j&s|	j%j#r|	j%j	j'st|	j%jd |   S |	j%(|dkr.t|	j%jt) |   S |dkr6d| _*q|	j%jsJ|sJt|	j%jt) |   S q| jj+sW| j$|| _d	gt| }| j*dkrid
|d< nd
|d< t,||| _-| j-.| j | /|| _	|0| |1|j2 | S )Nr'   r  zunexpected base type %s foundz/Expected %d dimensions, array has %d dimensionsr7  r   zExpected an integer literalfortran)r  follow)r  contigrp  )3r  r  r  r!  array_dtypebase_type_noderj  rq  r.   r   ry  r   r  r4  r   r   ERR_NOT_POINTERr   re  r  r  r_  ERR_BASE_TYPEr*  r   r  	ERR_STARTr   r<  rv   r   r]  ERR_NOT_STOPr  
shape_typer   r  r   r  r  r  	ERR_STEPSmoder   rl  r  validate_memslice_dtypeget_cython_array_typeuse_cython_array_utility_coder   typeinfo_to_format_code)rW   rr   r  r~  rq  r  r  array_dimension_sizesaxis_noaxisdimsizeshapefirst_or_lastrS   rS   rT   r!  +  s   






zCythonArrayNode.analyse_typesc                 C   s$   | j rtd|j| jd| _ d S )Nztemp allocated multiple timesT)r   r^  ra  rb  r   rm  rS   rS   rT   rd  ,  s   z$CythonArrayNode.allocate_temp_resultc                 C   r%  rL   )r  r   rS   rS   rT   r   ,  rL  zCythonArrayNode.infer_typec                 C   s"   |  jj}|  |jdjS )Narray)rz  r}  cython_scopeload_cythonscope	viewscoper  r   )rW   rr   r  rS   rS   rT   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rQ 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'   r  c                    s   g | ]
} j | qS rS   )r  r  r   )r`   r  rV   rS   rT   r   ,  r  z8CythonArrayNode.generate_result_code.<locals>.<listcomp>Trv  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); %sr  zS%s = __pyx_array_new(%s, %s, PyBytes_AS_STRING(%s), (char *) "%s", (char *) %s); %sc                    s     | t  j|  d S rL   )r  r   ra  rj  )r  )r   rS   rT   disposeE,  r  z5CythonArrayNode.generate_result_code.<locals>.dispose)r  r  ry  r  r  ra  rb  r   r  get_type_information_cnamer  r   r  r   r   r   r   r   r  r   r  r  r  )rW   r   r  ry  r  shapes_tempformat_tempitemsize	type_infobuildvalue_fmtr  rS   r  rT   rv  ,  sJ   




z$CythonArrayNode.generate_result_codec           	      C   s   |j }|j}t|}g }|jr |t||||d |j}|jst|ddd|d _t	j
|||d}t||||d}||}|S )z@
        Given a C array type, return a CythonArrayNode
        r  r  T)r   rF  rp  )rq  r  )r  r  r~  )r   r   r  r4  r   rd  r  r<  r   r   MemoryViewSliceTypeNoder  r!  )	rP   src_noderr   r   r  r^  rq  memslicenoder   rS   rS   rT   r  L,  s&   
zCythonArrayNode.from_carray)rZ   r[   r\   r\  r   ry  r   r  r~  r   r=  r  r!  rd  r   r  rv  r  r  rS   rS   rS   rT   r  +  s    h2r  c                   @   s"   e Zd ZejZdd Zdd ZdS )
SizeofNodec                 C   rU   r%  rS   rV   rS   rS   rT   r"  i,  rY   zSizeofNode.check_constc                 C   r   rL   rS   rm  rS   rS   rT   rv  l,  rY   zSizeofNode.generate_result_codeN)rZ   r[   r\   r   r  r   r"  rv  rS   rS   rS   rT   r  d,  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<   	 | j
d u r| j |}| j||\}}	|	| _
|   | S rL   )r  module_pathr  r  r  r   r  rq   SizeofVarNoder!  r  rj  rl  
check_type)
rW   rr   rf  r  r  r!  r   r  r  r  rS   rS   rT   r!  y,  s   

zSizeofTypeNode.analyse_typesc                 C   s`   | j }|sd S |jr|jst| jd d S |jr t| jd d S | s.t| jd|  d S d S )Nz Cannot take sizeof Python objectzCannot take sizeof voidz'Cannot take sizeof incomplete type '%s')r  rp   r  r   r   r_  is_complete)rW   r  rS   rS   rT   r  ,  s   zSizeofTypeNode.check_typec                 C   s2   | j jr| j jddd}d| S | j  }d| S )Nr  r'   )deref(sizeof(%s)))r  r  r   r  )rW   r  rS   rS   rT   r   ,  s
   
z$SizeofTypeNode.calculate_result_code)rZ   r[   r\   r   r  r!  r  r   rS   rS   rS   rT   r  p,  s    r  c                   @   rn  )	r  r  c                 C   sx   | j |}|r3|| _| jjr*z
| j|j| _W n ty)   t| j jd Y nw t	| _
|   | S | j || _ | S )NzLType cannot be specialized since it is not a fused argument to this function)r  rB  r  rC  rE  rD  r(   r   r   r  rR   r  r!  )rW   rr   operand_as_typerS   rS   rT   r!  ,  s    zSizeofVarNode.analyse_typesc                 C   rM  )Nr  rN  rV   rS   rS   rT   r   ,  rK  z#SizeofVarNode.calculate_result_codec                 C   r   rL   rS   rm  rS   rS   rT   rv  ,  rY   z"SizeofVarNode.generate_result_codeN)rZ   r[   r\   r   r!  r   rv  rS   rS   rS   rT   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}|j r|d| j}|d}tt|jS )Nzlibcpp.typeinfor  )	r  r  find_moduler   r  r   r  c_const_typer   )rW   rr   
env_moduletypeinfo_moduletypeinfo_entryrS   rS   rT   get_type_info_type,  s   
zTypeidNode.get_type_info_typeztypeid operatorc                 C   s   | j stj| _ | | | |}|s| d | S | jd u r!| S || _ | j|}|r6|| _d| _	d | _n6| j
|| _d| _	d | _| jj jrO| d | S | jj jr[| d | S | jj  sl| 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'r  r  )r   r   r.   r  r  r   r  rG  r  r{  r!  rp   r_  r  r   r   r   )rW   rr   r  as_typerS   rS   rT   r!  ,  s:   







zTypeidNode.analyse_typesc                 C   rb  rc  rd  re  rS   rS   rT   r   ,  rg  zTypeidNode.errorc                 C   rU   r%  rS   rV   rS   rS   rT   r"  ,  rY   zTypeidNode.check_constc                 C   r   rL   rZ  rV   rS   rS   rT   r   -  r#  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   r   r   rr  )rW   r   r  rS   rS   rT   rv  -  s   
zTypeidNode.generate_result_code)rZ   r[   r\   r   r  r  r   r  cpp_messager!  r   r"  r   rv  rS   rS   rS   rT   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 )
TypeofNodeNrY  c                 C   sH   | j || _ tt| j j}t| j|d}||}||| _	| S )Nr"  )
r  r!  r
   r  rv   r   r  r   r  rY  )rW   rr   r   rY  rS   rS   rT   r!  -  s   
zTypeofNode.analyse_typesc                 C   s   | j || _ | j jS rL   )r  r!  r   r   rS   rS   rT   rB   -  s   zTypeofNode.analyse_as_typec                 C   rU   rQ  rS   rV   rS   rS   rT   r  $-  rY   zTypeofNode.may_be_nonec                 C   rx  rL   )rY  r{  rm  rS   rS   rT   r{  '-  r  z#TypeofNode.generate_evaluation_codec                 C   r  rL   )rY  r   rV   rS   rS   rT   r   *-  rL  z TypeofNode.calculate_result_code)rZ   r[   r\   rY  r   r   r   r!  rB  r  r{  r   rS   rS   rS   rT   r  -  s    r  c                 C   s.   z| j }W n ty   |j}Y nw || |S rL   )
__matmul__r   __rmatmul__)r>  br  rS   rS   rT   matmul_operator6-  s   


r  <<===r  >=>rK  is_notr   r  ///<<%r   r  **c                 C   s   | |v S rL   rS   xseqrS   rS   rT   r]  S-      r  c                 C   s   | |vS rL   rS   r  rS   rS   rT   r]  T-  r  )>>rT  ^@innot_inc                 C   s&   t | j}|st| jd| j  |S )Nz4Binary '%s' not supported in compile-time expression)compile_time_binary_operatorsri   r   r   r   )r   r  rS   rS   rT   get_compile_time_binopW-  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 )*	BinopNoderL  rM  Fc                 C   s"   t | j }|| jj| jj| _d S rL   )r  r   rL  r~   rM  r.  rS   rS   rT   r  p-  s
   

z#BinopNode.calculate_constant_resultc              
   C   s^   t | }| j|}| j|}z|||W S  ty. } z| | W Y d }~d S d }~ww rL   )r  rL  r  rM  rb  r  )rW   r  r  rL  rM  r  rS   rS   rT   r  v-  s   zBinopNode.compile_time_valuec                 C   s   |  | j|| j||S rL   )r  rL  r   rM  r   rS   rS   rT   r   -  s   zBinopNode.infer_typec                 C   s*   | j || _ | j|| _| | | S rL   )rL  r!  rM  r  r   rS   rS   rT   r!  -  s   
zBinopNode.analyse_typesc                 C   s   |  |r| | jj| jj|| _| jjsJ d| _d S |  r<| | | | jj| jj|| _| jj	s7J d| _d S | 
 rG| | d S | | d S r   )r5  r  rL  r   rM  r;   r   r6  coerce_operands_to_pyobjectsrp   r8  r9  r:  r   rS   rS   rT   r  -  s    





zBinopNode.analyse_operationc                 C   s   |  | jj| jjS rL   )is_py_operation_typesrL  r   rM  rV   rS   rS   rT   r6  -  ra  zBinopNode.is_py_operationc                 C   s   |j p|j p|jp|jS rL   )rp   r  rW   type1type2rS   rS   rT   r  -  r  zBinopNode.is_py_operation_typesc                 C   s   |  | jj| jj|S rL   )is_pythran_operation_typesrL  r   rM  r   rS   rS   rT   r5  -  r  zBinopNode.is_pythran_operationc                 C   s(   t |ot|ot|ot|pt|S rL   )r?   r:   r;   )rW   r  r  rr   rS   rS   rT   r  -  s
   z$BinopNode.is_pythran_operation_typesc                 C      | j jjp	| jjjS rL   rL  r   r   rM  rV   rS   rS   rT   r8  -  r  zBinopNode.is_cpp_operationc                 C   s   | | j| j| jg}|s|   d S |j}|j| _|j| _| jdkr3d| _t	| r3|
tdd |jr9|j}t|jdkrM| j|jd j|| _n| j|jd j|| _| j|jd j|| _|j| _d S )Nr   r'   r  r  r   )r  r   rL  rM  rD  r   r   r   r   r   r   r   r   r  r  r   r   r  r  )rW   rr   r   r  rS   rS   rT   r9  -  s$   
zBinopNode.analyse_cpp_operationc                 C   s   |  |||rtt| j||S | ||rO|jrtj}n|jr#tj	}|jr*tj}n|jr0tj	}|j
s6|j
rM||u rA| jdv rA|S | ||}|d urM|S tS |jsU|jrXtjS | ||S )Nz**%+|&^)r  rG   r=   r   r  rw  r   r   rx  r   r  infer_builtin_types_operationr   r  r   r.   compute_c_result_type)rW   r  r  rr   r  rS   rS   rT   r  -  s*   zBinopNode.result_typec                 C   r   rL   rS   r  rS   rS   rT   r  -  rY   z'BinopNode.infer_builtin_types_operationc                 C   r>  rL   r?  r   rS   rS   rT   rN  -  r@  zBinopNode.nogil_checkc                 C   s    | j || _ | j|| _d S rL   )rL  r  rM  r   rS   rS   rT   r  -  r  z&BinopNode.coerce_operands_to_pyobjectsc                 C      | j  o	| j S rL   rL  r"  rM  rV   rS   rS   rT   r"  -  ra  zBinopNode.check_constc                    s"   t t|  p| j p| j S rL   )rN   r  r   rL  rM  rV   rQ   rS   rT   r   -  s
   zBinopNode.is_ephemeralc                 C   s  | j j}| jj}| jjrO|d |d|    | jdkr6|d|  |  | j  | j f  d S |d|  |  | j  | j| j f  d S |jsU|jr| 	|}| jdkradnd}|jrk| j 
 n| j  }|jrx| j
 n| j }|d|  ||||||  | jf  | | d S | jr|  r| jd	krt|| jd
|  |  f | jjr|  nd | j| j d S |d
|  |  f  d S 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_Noner  r  r   rC  )rL  r   rM  r;   r   r   r   r  rp   rC  r   r   r   r  r   r8  r   r   r   r   rr  )rW   r   r  r  r  
extra_args
op1_result
op2_resultrS   rS   rT   rv  -  sX   


zBinopNode.generate_result_codec                 C   s@   | j jjs| jjjst| jd| j| j j| jjf  tj| _d S )Nz'Invalid operand types for '%s' (%s; %s))	rL  r   r  rM  r   r   r   r   r.   rV   rS   rS   rT   rD  .  s   

zBinopNode.type_error)rZ   r[   r\   r   r  r  r  r   r!  r  r6  r  r5  r  r8  r9  r  r  rN  r  r"  r   rv  rD  r]   rS   rS   rQ   rT   r  `-  s,    	,r  c                   @   ,   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 rL   )r  r!  r6  r   r.   r   r#  rS   rS   rT   r!  &.  s   zCBinopNode.analyse_typesc                 C   rU   r  rS   rm  rS   rS   rT   rC  ,.  rY   z CBinopNode.py_operation_functionc                 C   s   d| j  | j| j f S N
(%s %s %s))rL  r   r   rM  rV   rS   rS   rT   r   /.  s
   z CBinopNode.calculate_result_codec                 C   sD   d }|j s|jr|| j|}|d u r |j s|jr || j|}|S rL   )r   r  r0  r   )rW   r  r  r3  rS   rS   rT   r  5.  s   z CBinopNode.compute_c_result_typeN)rZ   r[   r\   r!  rC  r   r  rS   rS   rS   rT   r  $.  s
    r  c                    s    fdd}|S )Nc                    s   t | fd i|S )Nr   )r  )r   r  r   rS   rT   make_binop_node@.  ra  z,c_binop_constructor.<locals>.make_binop_noderS   )r   r  rS   r  rT   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s|   d S | jjrd| _| jjrc|jd rc| j	| j
v rc| j	dv rF| j  rF| j sF| j| j | _ | _d| _|jd | _| jj| j
| j	 || j d| _d| _| jrl|jr|jr| j | j|| _ | j| j|| _d S d S d S )NFr  )r   r   Tzoverflowcheck.fold)	const_rhs)rL  r   rM  r  rD  r  rI  r  rj   r   overflow_op_namesr   overflow_checkoverflow_foldoverflow_check_binopr  r   rN  r  rW   rr   r  r  rS   rS   rT   r:  K.  s<   

z NumBinopNode.analyse_c_operationc                 C   sL   |  ||r$t||}|tju r| jdvrtj}|S t|tj}|S d S )Nz|^&)c_types_okayr   rJ  r  r   r]  rW   r  r  widest_typerS   rS   rT   r  f.  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 rQ  )r   r  rL  rM  rN   r  r  r  rQ   rS   rT   r  t.  s   zNumBinopNode.may_be_nonec                 C   s0   | j  }| j }|r|rd|| j|f S d S r  )rL  r  rM  r   )rW   value1value2rS   rS   rT   r  .  s
   

z'NumBinopNode.get_constant_c_result_codec                 C      |j s|jo|j p|jS rL   )rN  r  r  rS   rS   rT   r  .     
zNumBinopNode.c_types_okayc                    s   | j r| | _|jjtjdd| _|d| j  tt	| 
| | j rG|d| j  |d ||| j |d |j| j d S d S )NFr\  r  r  z8PyErr_SetString(PyExc_OverflowError, "value too large");r   )r  overflow_bit_nodera  rb  r   r]  overflow_bitr   rN   r  r{  r   r   rj  rm  rQ   rS   rT   r{  .  s   

z%NumBinopNode.generate_evaluation_codec                 C   s   | j d urd| j| j | j | j jf S | jjs| jrAt	| jr.| j
 | j
 }}n| j | j }}d|| j|f S | j| j}|d u rXt| jd| j| jf  d|| j | j f S )Nz%s(%s, %s, &%s)r  z'binary operator %s not supported for %sr|  )r  r  rL  r   rM  r  r   r   rI  r;   r  r   	binary_opr   r   )rW   result1result2r  rS   rS   rT   r   .  s(   

z"NumBinopNode.calculate_result_codec                 C      |j p|j pt| ||S rL   )r  r  r  r  rS   rS   rT   r  .  
   z"NumBinopNode.is_py_operation_typesc                 C   s"   | j | j }| jr|dd}|S )N	PyNumber_PyNumber_InPlace)py_functionsr   r  r  )rW   r   r  rS   rS   rT   rC  .  s   z"NumBinopNode.py_operation_functionPyNumber_OrPyNumber_XorPyNumber_AndPyNumber_LshiftPyNumber_RshiftPyNumber_AddPyNumber_SubtractPyNumber_Multiply__Pyx_PyNumber_MatrixMultiply__Pyx_PyNumber_DividePyNumber_FloorDividePyNumber_RemainderPyNumber_Power)r  r  r  r  r  r   rT  r   r  r  r  r  r  r'  r  mullshift)r   rT  r   r  )rZ   r[   r\   rI  r  r  r:  r  r  r  r  r{  r   r  rC  r  r  r]   rS   rS   rQ   rT   r  D.  s@    r  c                   @   r  )IntBinopNodec                 C   r  rL   )r  r  r  rS   rS   rT   r  .  r  zIntBinopNode.c_types_okayN)rZ   r[   r\   r  rS   rS   rS   rT   r		  .  r  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 r   )rw  rx  r  r  r  rS   rS   rT   r  .  s   zAddNode.is_py_operation_typesc                 C   s<   t ttttf}||v r||v r|t|||| S d S rL   )r   r!   r   r1   r   r,  r:  )rW   r  r  string_typesrS   rS   rT   r  .  s   z%AddNode.infer_builtin_types_operationc                 C   sF   |j s|jr|js|jr|S |j s|jr|js|jr|S t| ||S rL   )r  r4  r  r  r  r  r  rS   rS   rT   r  .  s   zAddNode.compute_c_result_typec                    s  | j j| jj}}d }|tu s|tu rI|ttfv r"|ttfv r"d}nt| j ts.t| jtr1d}nd}|rH| js<| j jrF|j	
tdd d}n|tu r]|tu r]|j	
tdd d}|rz| jsf| j jrj|d7 }| j  st| j rx|d	7 }|S tt| |S )
NTFUnicodeConcatInPlacer*  __Pyx_PyUnicode_ConcatStrConcatInPlace__Pyx_PyStr_ConcatInPlaceSafe)rL  r   rM  r   r   r}   r-  r  r   r   r   r   r   r  rN   r
	  rC  )rW   r   r  r  r  is_unicode_concatrQ   rS   rT   rC  .  s6   

zAddNode.py_operation_function)rZ   r[   r\   r  r  r  rC  r]   rS   rS   rQ   rT   r
	  .  s
    	
r
	  c                   @   r  )SubNodec                 C   sH   |j s|jr|js|jr|S |j s|jr|j s|jrtjS t| ||S rL   )r  r4  r  r  r   c_ptrdiff_t_typer  r  r  rS   rS   rT   r  /  s   zSubNode.compute_c_result_typeN)rZ   r[   r\   r  rS   rS   rS   rT   r	  /  r  r	  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r:| j }| j}|jr+|jd u r+| |||S |jr:|jd u r:| |||S | | | S rL   )	rL  r!  rM  calculate_is_sequence_mulis_sequence_mulr   r   analyse_sequence_mulr  rW   rr   rL  rM  rS   rS   rT   r!  ,/  s   

zMulNode.analyse_typesc                 C   s   | j o
| tv o
| tuS rL   )r  r$   r#   r  rS   rS   rT   is_builtin_seqmul_type=/  r@  zMulNode.is_builtin_seqmul_typec                 C   sX   | j j}| jj}|tu s|jr||}}|tu s|jr*|js!|jr#dS | |r*dS dS r  )rL  r   rM  r2   r  rw  r  r	  r  rS   rS   rT   r	  A/  s   

z!MulNode.calculate_is_sequence_mulc                 C   s(   |j d u sJ ||}||_ ||S rL   )r   r  r!  )rW   rr   r  multrS   rS   rT   r	  N/  s   

zMulNode.analyse_sequence_mulc                    sR   | j r| jjjr| j|| _d S | jjjr| j|| _d S tt| | d S rL   )	r	  rL  r   r  r  rM  rN   r	  r  r   rQ   rS   rT   r  T/  s   

z$MulNode.coerce_operands_to_pyobjectsc                    s   | j ptt| ||S rL   )r	  rN   r	  r  r  rQ   rS   rT   r  ^/  r  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*  __Pyx_PySequence_Multiply__Pyx_PySequence_Multiply_Left)r	  r   r   r   r   rL  r   rp   rN   r	  rC  rm  rQ   rS   rT   rC  a/  s   
zMulNode.py_operation_functionc                 C   s@   |j r|j r| |r|S | |r|S |jr|S |jr|S d S rL   )r  r	  r  r  rS   rS   rT   r  h/  s   

z%MulNode.infer_builtin_types_operation)rZ   r[   r\   r	  r!  staticmethodr	  r	  r	  r  r  rC  r  r]   rS   rS   rQ   rT   r	  (/  s    

r	  c                       r"  )MatMultNodec                 C   rU   r%  rS   r  rS   rS   rT   r  |/  rY   z!MatMultNode.is_py_operation_typesc                    s(   |j tdd tt| | d S )NMatrixMultiplyr*  )r   r   r   r   rN   r	  r{  rm  rQ   rS   rT   r{  /  s   z$MatMultNode.generate_evaluation_code)rZ   r[   r\   r  r{  r]   rS   rS   rQ   rT   r	  y/  s    r	  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 u rt|trt|trt d }|S )Nr  r  )r  r   truedivisionr}   r%   rW   op1op2r  rS   rS   rT   !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 rL   )rL  r~   rM  r&	  r#	  rS   rS   rT   r  /  s   
z!DivNode.calculate_constant_resultc              
   C   sb   | j |}| j|}z| ||}|||W S  ty0 } z| | W Y d }~d S d }~ww rL   )rL  r  rM  r&	  rb  r  )rW   r  rL  rM  r  r  rS   rS   rT   r  /  s   zDivNode.compile_time_valuec                 C   s&   | j s|jd rd| _d S | j| _d S )N	cdivisionF)r'	  rj   ctruedivisionr"	  r   rS   rS   rT   _check_truedivision/  s   
zDivNode._check_truedivisionc                 C   s(   |  | | | j|| j||S rL   )r)	  r  rL  r   rM  r   rS   rS   rT   r   /  s
   

zDivNode.infer_typec                 C   s   |  | t| | |  rd| _| jjsF| jd u o,|jd  o,| j	  p,| jj
dk| _| js6|jd rH| j|| _| j|| _d S d S d S )NTr'	  r   cdivision_warnings)r)	  r  r  r8  r'	  r   rp   rj   rM  r   r~   zerodivision_checkrL  r.  r   rS   rS   rT   r  /  s   

zDivNode.analyse_operationc                 C   sT   | j dkr#| jr#|js#|js#|js#|js#t|tj}t||}|S t| ||S )Nr  )	r   r(	  r   r  r   rJ  rq  r  r  r  rS   rS   rT   r  /  s   zDivNode.compute_c_result_typec                 C      | j jrdS dS )N"integer division or modulo by zerozfloat divisionr  rV   rS   rS   rT   zero_division_message/     zDivNode.zero_division_messagec                 C   s   | j js6| j js6| jd u r%|jjd p#| j jp#| j js| j jo#| j j	 | _| js6|j
tdd| j  t| | | | d S )Nr'	  DivIntCMath.c)r   rp   r  r'	  r   rj   r  rN  r  r  r   r   r   rE  r  r{  generate_div_warning_coderm  rS   rS   rT   r{  /  s   
z DivNode.generate_evaluation_codec                 C   sb  | j }| jjs+| jr| jsd| jd| j f }nd| j  }|d|  |r0|	  |d| 
   |r?|  ||| j |d | jjr| jjr| jdkr|jtdd	 | jjjd
krsd| j  }n| jj }d|| j |f }|d| j || j f  |r|	  |d |r|  ||| 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 d S d S d S )Nr~  zeroz%s == 0r  z/PyErr_SetString(PyExc_ZeroDivisionError, "%s");r   r  UnaryNegOverflowsr  r4   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");r*	  r  CDivisionWarningr1	  z$if (unlikely((%s < 0) ^ (%s < 0))) {z1__Pyx_cdivision_warning(%(FILENAME)s, %(LINENO)s))FILENAMELINENOr   zint %s;T)r  rC  zif (unlikely(%s)) )rr  r   rp   r+	  rI  rU  rM  r   r   r   r.	  r   r   r   r  r  r   r   r   r   r   r  rL  rj   r   filename_cnamelineno_cnameset_error_infor  r  r  )rW   r   in_nogil	zero_testminus1_checktype_of_op2warning_coderQ  rS   rS   rT   r2	  /  sz   





#z!DivNode.generate_div_warning_codec                 C   s   | j js|  rt| S | j jr"| jdkr"d| j | j	 f S | j
s(| jrU| j }| j	 }| j
rO| j | jj krB| j |}| j | j	j krO| j |}d||f S d| j  | j | j	 f S )Nr  zfloor(%s / %s)z	(%s / %s)z__Pyx_div_%s(%s, %s))r   r  r8  r  r   r  r   rL  r   rM  r"	  r'	  r  specialization_name)rW   r$	  r%	  rS   rS   rT   r   0  s*   


zDivNode.calculate_result_code)rZ   r[   r\   r'	  r"	  r(	  r*	  r+	  r&	  r  r  r)	  r   r  r  r.	  r{  r2	  r   rS   rS   rS   rT   r!	  /  s"    
?r!	  s'   %(?:%|(?:\([^)]+\))?[-+#,0-9 ]*([a-z]))>      E   F   G   X   a   b   c   d   e   f   g   i   o   u   xc                       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   r  rL   )rw  r  r  r  rS   rS   rT   r  E0  r  zModNode.is_py_operation_typesc                 C   s   |t u r|js| j s|S d S |tttfv rG|t u r|S |jr"|S | jjr<|tu s.|tu r:t	t
| jjtkr:|S tS |tu rE|jsEd S tS d S rL   )r   r  rL  r  r   r   r1   rN  r  r&  _find_formatting_typesr   _safe_bytes_formatsr  rS   rS   rT   r  J0  s$   z%ModNode.infer_builtin_types_operationc                 C   r,	  )Nr-	  zfloat divmod()r  rV   rS   rS   rT   r.	  `0  r/	  zModNode.zero_division_messagec                 C   sp   t | | | jjs0| jd u r|jd p| jj | _| js2| jjs4| jjs6t	| j
d| j  d S d S d S d S d S )Nr'	  z(mod operator not supported for type '%s')r!	  r  r   rp   r'	  rj   r  r  r  r   r   r   rS   rS   rT   r  f0  s   
zModNode.analyse_operationc                 C   sr   | j js,| js,| j jr|jtdd| j  n|jtddj| j | j j	d t
| | | | d S )NModIntr1	  ModFloat)math_h_modifier)r   rp   r'	  r  r   r   r   r   rE  rU	  r  r{  r2	  rm  rS   rS   rT   r{  n0  s   
z ModNode.generate_evaluation_codec                 C   sd   | j r"| jjrd| jj| j | j f S d| j | j f S d| j | j | j f S )Nzfmod%s(%s, %s)z
(%s %% %s)z__Pyx_mod_%s(%s, %s))r'	  r   r  rU	  rL  r   rM  r@	  rV   rS   rS   rT   r   {0  s    zModNode.calculate_result_codec                    s   | j j| jj}}|tu r(| j  s$|jr||s$|tu r&t| jt	s&dS dS |t
u rG| j  sC|jr9||sC|tu rEt| jt	sEdS dS tt| |S )N__Pyx_PyUnicode_FormatSafePyUnicode_Format__Pyx_PyString_FormatSafe__Pyx_PyString_Format)rL  r   rM  r   r  r  r  r   r}   r  r   rN   rP	  rC  )rW   r   r  r  rQ   rS   rT   rC  0  s(   

zModNode.py_operation_function)rZ   r[   r\   r  r  r.	  r  r{  r   rC  r]   rS   rS   rQ   rT   rP	  B0  s    rP	  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 urd S |jd | _ d S )Ncpow)is_cpowrj   r   rS   rS   rT   _check_cpow0  s   
zPowNode._check_cpowc                       |  | tt| |S rL   )r]	  rN   rZ	  r   r   rQ   rS   rT   r   0  r  zPowNode.infer_typec                    r^	  rL   )r]	  rN   rZ	  r!  r   rQ   rS   rT   r!  0  r  zPowNode.analyse_typesc                 C   s  t | | | jjr5| jjjr*| j| j|| _| j| j|| _| j	d| _
d S t| jd d| _
d S | jjrBd| jj | _
d S | jjrmd| j dd | _
|tdd	j| j
| j | jjrfd
pgdd d S | jjst| jd| jj| jjf  d S d S )Nr  z complex int powers not supportedr#  powz__Pyx_pow_%sr  r  IntPowr1	  r'   r   )r  r   r  z1got unexpected types for C power operator: %s, %s)r  r:  r   r  rs  r  rL  r  rM  r  pow_funcr   r   rU	  r  r  r  r   r   r   rE  r  r  r   rS   rS   rT   r:  0  s0   


zPowNode.analyse_c_operationc                    s0  ddl m} d }| j o| jjdkp|jo|jdk}|jp3| j o3t| jj|o3t	| jj| jjk}d}| j
rUtt| ||}| j sTt| jjtoS| jjdk }n8|sY|rtt| ||}| j ss|jol|j}|rrd| _nt| jjto| jjdk }n| ||rtj}d| _|rt|tj}|S )Nr   )RealFT)numbersrb	  rL  r   r~   r  r  rM  r}   r2  r\	  rN   rZ	  r  r%   type_was_inferredr  r   r  rJ  rq  )rW   r  r  rb	  c_result_typeop1_is_definitely_positivetype2_is_intneeds_wideningrQ   rS   rT   r  0  sF   




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 rL   )r   r   r  r  rV   rS   rT   r-   0  s   z/PowNode.calculate_result_code.<locals>.typecastr|  )ra	  rL  rM  )rW   r-   rS   rV   rT   r   0  s   zPowNode.calculate_result_codec                    s`   | j jr(| jjdkr(t| jjtr(| jj tu r(|j	t
dd | jr&dS dS tt| |S )Nr4   PyNumberPow2r  __Pyx_PyNumber_InPlacePowerOf2__Pyx_PyNumber_PowerOf2)r   rp   rL  r~   r}   r%   rM  r   r   r   r   r   r  rN   rZ	  rC  rm  rQ   rS   rT   rC  1  s   zPowNode.py_operation_functionc           	         s   || j kr| S | jd u rh| jrh|js|jrh| j tju r%d	 fdd	 d}n|jr/dd  d}ndd   | j\}} | j\}}|rh|rht	| j
d|  d| _|| _|| _| |}|j |krf|||}|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)recurser  )r   r  r  r}   r  ri  )r  rm	  check_typesrS   rT   ro	  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 )NTr  r  ri	  rS   rS   rT   ro	  1  s   zan integer C numeric typec                 S   rU   )Nr  rS   ri	  rS   rS   rT   ro	  '1  rY   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.r  )r   r\	  rd	  r  r  r   r  rL  rM  r   r   r!  r  rN   rZ	  )	rW   r  rr   
msg_detail	check_op1r$	  	check_op2r%	  r   rQ   rn	  rT   r  1  s8   


zPowNode.coerce_to)rZ   r[   r\   r\	  rd	  r]	  r   r!  r:  r  r   rC  r  r]   rS   rS   rQ   rT   rZ	  0  s    *rZ	  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
    rL  rM  TNc                 C   s$   | j |}| j|}t||S rL   )rL  r   rM  r   independent_spanning_typer  rS   rS   rT   r   K1  s   zBoolBinopNode.infer_typec                 C   s(   | j dkr
| j S | j p| j S )Nor)r   rM  r  rL  rV   rS   rS   rT   r  P1  s   

zBoolBinopNode.may_be_nonec                 C   s6   | j j}| jj}| jdkr|o|| _d S |p|| _d S Nand)rL  r~   rM  r   )rW   rL  rM  rS   rS   rT   r  V1  s
   
z'BoolBinopNode.calculate_constant_resultc                 C   s2   | j |}| j|}| jdkr|o|S |p|S rv	  )rL  r  rM  r   )rW   r  rL  rM  rS   rS   rT   r  ^1  s
   
z BoolBinopNode.compile_time_valuec                 C      | j  p	| j S rL   )rL  r   rM  rV   rS   rS   rT   r   f1  ra  zBoolBinopNode.is_ephemeralc                 C   sJ   | j |}| j|}t|j|j| _| ||| _ | ||| _| S rL   )rL  r!  rM  r   rt	  r   _wrap_operandr	  rS   rS   rT   r!  i1  s   zBoolBinopNode.analyse_typesc                 C   s    t |ttfst|| j|}|S rL   )r}   rs	  BoolBinopResultNoder   )rW   r  rr   rS   rS   rT   ry	  u1  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)ry	  rL  rM  r   rS   rS   rT   wrap_operandsz1  s   zBoolBinopNode.wrap_operandsc                 C   r  rL   r  r   r  r   rS   rS   rT   r+  1  rK  zBoolBinopNode.coerce_to_booleanc                 C   s2   | j ||}| j||}tj| || j||dS )N)r   r   rL  rM  )rL  r  rM  rs	  r  r   )rW   r  rr   rL  rM  rS   rS   rT   r  1  s   zBoolBinopNode.coerce_toc           
   	   C   s   | | j ||f}| jdkr|d }	}n|d }	}| j|||||||	 |\}}||	 | j||||||| d S )Nrw	  next_andnext_or)ru  r   r   r  rL  generate_bool_evaluation_coder  rM  )
rW   r   final_result_tempfinal_result_type	and_labelor_label	end_labelfall_throughouter_labelsmy_labelrS   rS   rT   r	  1  s   

z+BoolBinopNode.generate_bool_evaluation_codec              	   C   sX   |  | | jjrtjn| j}d  }}|d}| ||  ||||| || d S )Nbool_binop_done)	rd  r   rp   r   r   r  r	  r   r  )rW   r   r  r	  r	  r	  rS   rS   rT   r{  1  s   

z&BoolBinopNode.generate_evaluation_codeTruth-testing Python objectc                 C   r  rL   r  rV   rS   rS   rT   r"  1  ra  zBoolBinopNode.check_constc                 C   r   rL   rS   rm  rS   rS   rT   ry  1  rY   z,BoolBinopNode.generate_subexpr_disposal_codec                 C   r   rL   rS   rm  rS   rS   rT   rz  1  rY   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   rp   ra  rb  r   r  r   rL  r   r  r   r   rW   r   test_resultrS   rS   rT   generate_operand1_test1  s   
z$BoolBinopNode.generate_operand1_test)rZ   r[   r\   r\  r   r   r   rL  rM  r   r  r  r  r   r!  ry	  r{	  r+  r  r	  r{  r  r"  ry  rz  r	  rS   rS   rS   rT   rs	  :1  s0    
rs	  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 )rz	  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
    ri  r   TNc                    s<   | |}t|}tt| j|j||t|||d d S )N)ri  r   r   )r.  	ProxyNoderN   rz	  rB  r   r  r  )rW   ri  r  rr   rQ   rS   rT   rB  1  s   


zBoolBinopResultNode.__init__c                 C   r  rL   r|	  r   rS   rS   rT   r+  1  rK  z%BoolBinopResultNode.coerce_to_booleanc                 C   s(   | j j }|tju r||}t|||S rL   )ri  r   r  r+  rz	  )rW   r  rr   ri  rS   rS   rT   r  1  s   

zBoolBinopResultNode.coerce_toc                 C   r   rL   rS   r   rS   rS   rT   rN  1  r  zBoolBinopResultNode.nogil_checkc              	   C   sZ   | j jjr!|jjtjdd}|d|| j  |	|| j
f  n| j  }|| j jjfS r	  )ri  r   rp   ra  rb  r   r  r   r   r  r   r   r	  rS   rS   rT   generate_operand_test1  s   

z)BoolBinopResultNode.generate_operand_testc                 C   sz  | | j | j| |s|rk| |\}}	|	r#|r#|r#| j| |r'dnd}
|d|
|f  |	r:|j| |	r@|r@|sF| j| |rQ||krQ|	| |rk|rb|d |	sb| j| ||krk|	| |ro|s|ss|rx|d | j
| | j
| |d|| j
|f  | j
| | j| | j
| ||kr|	| |s|r|d | j| d S )NrK  r  zif (%s%s) {r  rC  r   )ru  r   ri  r{  r	  r  r   ra  rj  r  r   rn  r  r  r  )rW   r   r	  r	  r	  r	  r	  r	  r	  	uses_tempsenserS   rS   rT   r	  1  sF   





z1BoolBinopResultNode.generate_bool_evaluation_codec                 C   r!  rL   rS   r   rS   rS   rT   r!  /2  rY   z!BoolBinopResultNode.analyse_types)rZ   r[   r\   r\  r   r   ri  r   rB  r+  r  rN  r	  r	  r!  r]   rS   rS   rQ   rT   rz	  1  s    	7rz	  c                       s   e Zd ZdZdZdZg d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 ) rR  NT)rP  rN  rO  c                 C   rv  rL   )rN  r1  rO  r   rS   rS   rT   r1  @2  r  zCondExprNode.type_dependenciesc                 C   s   t | j|| j|S rL   )r   rt	  rN  r   rO  r   rS   rS   rT   r   C2  s   

zCondExprNode.infer_typec                 C   s$   | j jr| jj| _d S | jj| _d S rL   )rP  r~   rN  rO  rV   rS   rS   rT   r  H2  r3  z&CondExprNode.calculate_constant_resultc                 C   rx	  rL   )rN  r   rO  rV   rS   rS   rT   r   N2  ra  zCondExprNode.is_ephemeralc                 C   s4   | j || _ | j|| _| j|| _| |S rL   )rP  r/  rN  r!  rO  rT  r   rS   rS   rT   r!  Q2  s   
zCondExprNode.analyse_typesc                 C   s   | j j}| jj}t||| _| jjrt| jj| _| jjr#t	| _
n| j  s-| j r3t| jd |js=|js=| jjrY|| jkrK| j | j|| _ || jkrY| j| j|| _| jjra|   | S )NzPUnsafe C derivative of temporary Python reference used in conditional expression)rN  r   rO  r   rt	  r   r  r  rp   r   r  r   r   r   r  r  rD  )rW   rr   true_val_typefalse_val_typerS   rS   rT   rT  W2  s"   

z CondExprNode.analyse_result_typec                    sr   | j jjs| j || _ | jjjs| j|| _d | _| |}|jjs7|| u r2tt||}|S ||}|S rL   )	rN  r   r  r  rO  r  rT  rN   rR  )rW   rr   outrQ   rS   rT   r  m2  s   



zCondExprNode.coerce_to_integerc                    s   | j j|kr| j ||| _ | jj|kr| j||| _d | _| |}|j|kr>|| u r8tt|||}|S |||}|S rL   )rN  r   r  rO  r  rT  rN   rR  )rW   r  rr   r	  rQ   rS   rT   r  ~2  s   

zCondExprNode.coerce_toc                 C   s<   | j jjs| jjjst| jd| j j| jjf  tj| _d S )Nz5Incompatible types in conditional expression (%s; %s))rN  r   r  rO  r   r   r   r.   rV   rS   rS   rT   rD  2  s
   zCondExprNode.type_errorc                 C   s   | j  o| j o| j S rL   )rP  r"  rN  rO  rV   rS   rS   rT   r"  2  s
   
zCondExprNode.check_constc                 C   s   | | j | | | j| |d| j   | || j |d | || j	 |d | j
| | j| d S )Nr  r  r   )ru  r   rd  rP  r{  r   r   eval_and_getrN  rO  r  r  rm  rS   rS   rT   r{  2  s   


z%CondExprNode.generate_evaluation_codec                 C   s`   | | | jjr|| n|| |d|  ||  f  |	| |
| d S r  )r{  r   r   rs  rn  r   r   r  r
  r  r  )rW   r   r  rS   rS   rT   r	  2  s   

 
zCondExprNode.eval_and_getc                 C   r   rL   rS   rm  rS   rS   rT   ry  2  rY   z+CondExprNode.generate_subexpr_disposal_codec                 C   r   rL   rS   rm  rS   rS   rT   rz  2  rY   zCondExprNode.free_subexpr_temps)rZ   r[   r\   rN  rO  r   r   r1  r   r  r   r!  rT  r  r  rD  r"  r{  r	  ry  rz  r]   rS   rS   rQ   rT   rR  32  s&    
rR  Py_LTPy_LEPy_EQPy_NEPy_GT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   r)  rL   r  r   rS   rS   rT   r   2  r  zCmpNode.infer_typec                 C   s   t | j }| jj}t|trt|trt|t|krd S | jdv rYt| jttt	frG| jj
s7| jdk| _d S t| jtrF| jsF| j | _nt| jtrY| jjsY| jdk| _d S |||| _d S )Nr  r  r  )r  r   rM  r~   r}   any_string_typer   rE  rv  r-  r   cascader  r  r  )rW   operand1_resultr  operand2_resultrS   rS   rT   "calculate_cascaded_constant_result2  s(   


z*CmpNode.calculate_cascaded_constant_resultc              
   C   sx   t | }| j|}z|||}W n ty* } z| | d }W Y d }~nd }~ww |r:| j}|r:|o9|||}|S rL   )r  rM  r  rb  r  r	  cascaded_compile_time_value)rW   rL  r  r  rM  r   r  r	  rS   rS   rT   r	  2  s   
z#CmpNode.cascaded_compile_time_valuec                 C   r  rL   r  rV   rS   rS   rT   is_cpp_comparison2  ra  zCmpNode.is_cpp_comparisonc           	      C   s   |j }|j }d}d}|jr| rd}|jr| rd}|jr%|r#|S d S |jr.|r,|S d S |r?|r?tj||fv r<tjS tjS d S r  )	r   r  r  r  r   r   r   r)  r~  )	rW   rr   r  rL  rM  r  r  type1_can_be_inttype2_can_be_intrS   rS   rT   find_common_int_type2  s,   zCmpNode.find_common_int_typec           	      C   s`  | j }|j}|j}d }|tkr|js%|ttfv s%|tkr.|js%|ttfv r.t| jd t}n`|j	s4|j	rr|dvrM|j	s>|j
rM|j	sD|j
rMt| jd t}nA|jr\|tjrYtjnt}n2|jrk|tjrhtjnt}n#t||}n|j
r|j
rt||}n|d u s|js| ||||}|d u r|js|jrt}na||kr|}nZ|js|jr|j
s|jr|||rt}nEt}nB|j
s|jr|||rt}n3t}n0t|rt|rt}n#| ||| t}n||r|}n||r|}n	| ||| t}|jrt|tst|trt}|d u s|jr|}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)rM  r   r   rw  r   r   r   r   r.   r  rN  rp   r  r   r  r   r   rJ  r	  r  r  r  invalid_types_errorr}   r  r  spanning_typer	  find_common_typer   )	rW   rr   r  rL  common_typerM  r  r  new_common_typerS   rS   rT   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   r   r   )rW   rL  r  rM  rS   rS   rT   r	  j3  s   
zCmpNode.invalid_types_errorc                 C   s6   |    o|   o|  p| jo| j p| jdv S Nr	  )is_ptr_containsis_c_string_containshas_python_operandsr	  is_python_comparisonr   rV   rS   rS   rT   r	  n3  s   
zCmpNode.is_python_comparisonc                 C   s:   | j }|j|kr|||| _ | jr| j|| d S d S rL   )rM  r   r  r	  coerce_operands_to)rW   r  rr   rM  rS   rS   rT   r	  u3  s   
zCmpNode.coerce_operands_toc                 C   s@   |   r| jd u r| jdvr|   r|   p| jo| j S )N)rK  r  r  r  )r	  special_bool_cmp_functionr   r	  r	  r	  is_python_resultrV   rS   rS   rT   r	  |3  s   zCmpNode.is_python_resultc                 C   s@   | j dv o| jjjr| jjjp| jjtu p| jjjo| jjtu S r	  )	r   rL  r   r  rM  rw  r   r  r   rV   rS   rS   rT   r	  3  s   



zCmpNode.is_c_string_containsc                 C   s*   | j dv r| jj}|js|jo|j S d S r	  )r   rM  r   r  r4  rw  )rW   container_typerS   rS   rT   r	  3  s   
zCmpNode.is_ptr_containsFc           	      C   s  | j dv r|j| jj}}|s|jr|jr|tju s|tju r+tdd| _d| _	dS |tj
u s5|tj
u rAtdd| _d| _	dS |tju sK|tju rWtdd| _d| _	dS |tju sa|tju rmtdd| _d	| _	dS |rd
dlm} || j dkr}dnd| tj|| j}|r|\| _	| _| _}dS dS | j dv r| jjtju r| jd| _tdd| _d| _	dS | jjtju r| jd| _tdd| _d| _	dS | jjtju r| jd| _tdd| _d| _	dS | jjjs| j|| _tdd| _d| _	dS dS )Nr	  UnicodeEqualsr(  __Pyx_PyUnicode_EqualsTBytesEquals__Pyx_PyBytes_Equals	StrEquals__Pyx_PyString_Equalsr'   )optimise_numeric_binopr  EqNer	  r  PyDictContainsr*  __Pyx_PyDict_ContainsTFPySetContains__Pyx_PySet_ContainsTFPyUnicodeContains__Pyx_PyUnicode_ContainsTFPySequenceContains__Pyx_PySequence_ContainsTFF)r   r   rM  r  r   r   r   r   special_bool_cmp_utility_coder	  r   r1   r   Optimizer	  r   r  special_bool_extra_argsr   r  r   rp   r  )	rW   rr   rL  result_is_boolr  r  r	  r   r  rS   rS   rT   "find_special_bool_compare_function3  st   

z*CmpNode.find_special_bool_compare_functionc                 C   s\  | j jr|j}d| }| jr|jtdd d}n
d}n|j}d}d}| jrt|j jr1|	 }	n|
 }	|j jr>|	 }
n|
 }
ddd	 | jD }| jrW|j| j |d
||| j|	|
| jre|nt| |||| jf  d S |j jr|dvr|dvsJ || j js| j tju sJ |d|| j jrdnd|	 |	 t| |||| jf  d S |j jr|d|||dkrdpd|j d|
 |
 f  d S |j }|j }|js|jr||st}n|jrt||}n|}||}||}d|||| ||f }|  r'| jdkr't|| j|| j jr|nd | j| j  d S || d S )Nz__Pyx_XGOTREF(%s); PyBoolOrNullFromLongr*  __Pyx_PyBoolOrNull_FromLong__Pyx_PyBool_FromLongr  r  c                 S   r  rS   r  )r`   	extra_argrS   rS   rT   r   3  s    z3CmpNode.generate_operation_code.<locals>.<listcomp>z%s = %s(%s(%s, %s, %s)); %s%s)rK  r  r	  z-%s = PyObject_RichCompare%s(%s, %s, %s); %s%sBoolz%s = %s(%s%s(%s, %s));r  rK  eqz%s = %s(%s %s %s);r   )!r   rp   r   r	  r   r   r   r   r  r   r   r  r	  r	  r   richcmp_constantsr   r   r  r  rU  r  r  r   rN  rJ  r  
c_operatorr	  r   r   r   rr  )rW   r   rQ  rL  r  rM  error_clausegot_refcoerce_resultr  r  special_bool_extra_args_resultr  r  r	  code1code2	statementrS   rS   rT   r  3  s   






	
	

zCmpNode.generate_operation_codec                 C   s   |dkrdS |dkrdS |S )NrK  r  r  r  rS   )rW   r  rS   rS   rT   r	  '4  s
   zCmpNode.c_operatorrL   r	  )rZ   r[   r\   r	  r	  r	  r   r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r  r	  rS   rS   rS   rT   r	  2  s&    
S
<Zr	  c                   @   s   e Zd Zg dZdZdZdZdd Zdd Zdd	 Z	d
d Z
dd Zdd Zdd Zd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 )$rS  )rL  rM  coerced_operand2r	  r	  NFc                 C   sN   | j |}| j|}t|st|r%t|r%t|r%tt| j||S tS rL   )	rL  r   rM  r;   r9   rG   r=   r   r   r  rS   rS   rT   r   D4  s   zPrimaryCmpNode.infer_typec                 C   rU   r  rS   r   rS   rS   rT   r1  O4  rY   z PrimaryCmpNode.type_dependenciesc                 C   s   | j rJ | | jj d S rL   )r	  r	  rL  r~   rV   rS   rS   rT   r  R4  r/  z(PrimaryCmpNode.calculate_constant_resultc                 C   s   | j |}| ||S rL   )rL  r  r	  )rW   r  rL  rS   rS   rT   r  V4  s   z!PrimaryCmpNode.compile_time_valuec                 C   s$   | j }|r| j|_|j }|sd S d S rL   )r	  r   )rW   cdrrS   rS   rT   unify_cascade_typeZ4  s
   z!PrimaryCmpNode.unify_cascade_typec                 C   s  | j || _ | j|| _|  r"| | | jr t| jd | S | j j}| jj}t	|s2t	|rIt
|rIt
|rItt| j||| _d| _| S | |rP| S | jrZ| j|| _| jdv r|  rd| _d }| jrst| jd | S | jjtu r|tdd n'| j jtju r| j tj|| _ | jjtur| jt|| _|tdd | jd| _nX|  r| jrt| jd	 tj| _| S | || j r| j jjs| j || _ d }d| _n,t }d
| _n&| || j r| j jjs| j || _ d }d| _n| !|| j| j }|j| _|d ur(|j"s(| j j|kr"| j ||| _ | #|| | jrJ| j$|| _| j%| | j&| j|}|| jurJ|| _'| ( rTtj | _ntj| _| )  | jsh| jsh| j*rkd| _+| S )Nz5Cascading comparison not yet supported for cpp types.Fr	  z?Cascading comparison not yet supported for 'int_val in string'.PyUCS4InUnicoder(  BytesContainsz+argument of type 'NoneType' is not iterablez?Cascading comparison not supported for 'val in sliced pointer'.Tr'   ),rL  r!  rM  r	  analyse_cpp_comparisonr	  r   r   r   r;   r9   rG   r=   r   is_pycmp"analyse_memoryviewslice_comparisonr	  r   r   r   r   r   r~  r  r   r   r  r	  r  r	  rp   r  r   r	  r  r	  r.   coerce_cascaded_operands_to_tempoptimise_comparisonr	  r	  r	  r	  r   )rW   rr   r  r  r	  rM  rS   rS   rT   r!  `4  s   






zPrimaryCmpNode.analyse_typesc                 C   s  | j j}| jj}d| _|| j| j | jg}|d u r/t| jd| j||f  tj	| _d| _
d S |j}|jr8|j}|j| _|j| _| jdkrUd| _t| rU|tdd t|jdkri| j|jd	 j|| _n| j |jd	 j|| _ | j|jd j|| _|j| _d S )
NFr	  r#  r   Tr  r  r'   r   )rL  r   rM  r	  r  r   r   r   r   r.   rQ  r  r  r   r   r   r   r   r   r   r   r   r  r  )rW   rr   r  r  r   r  rS   rS   rT   r	  4  s2   

z%PrimaryCmpNode.analyse_cpp_comparisonc                 C   sV   | j jp| jj}| j jjp| jjj}d}|r)|r)| j|v r)d| _tj| _d| _	dS dS )N)r  r  rK  r  FT)
rL  r  rM  r   r   r   r	  r   r  is_memslice_nonecheck)rW   rr   	have_none
have_sliceopsrS   rS   rT   r	  4  s   
z1PrimaryCmpNode.analyse_memoryviewslice_comparisonc                 C   sn   | j r1| j|| jddr1d| _ tj| _d| _| jr+| jj| j	|dd}|| j	ur+|| _
|   | S t| |S )NT)r	  Fr'   )r	  r	  rL  r   r  r   r   r	  r	  rM  r	  r	  r   r+  )rW   rr   rM  rS   rS   rT   r+  4  s    
z PrimaryCmpNode.coerce_to_booleanc                 C   r  rL   )rL  r   rp   rM  rV   rS   rS   rT   r	  4  r  z"PrimaryCmpNode.has_python_operandsc                 C   s&   | j r	|   dS | j o| j S rQ  )r	  rR  rL  r"  rM  rV   rS   rS   rT   r"  4  s   zPrimaryCmpNode.check_constc                 C   s   | j | j}}|jjr%| jdkrd}nd}d||jd| | f S |  rI|jtu r1d}nd}| jdkr;d}nd}d||| | f S t	| jrX|
 |
 }}n| | }}| jrq|jjrmd	| }nd	| }d
|| | j|f S )Nr  rK  r  z(%s%s(%s, %s))r  __Pyx_UnicodeContainsUCS4__Pyx_BytesContainsr  ((PyObject *) %s.memview)r  )rL  rM  r   r  r   r  r   r	  r   r;   r  r	  r   r	  )rW   rL  rM  negationmethodr  r  rS   rS   rT   r   4  sH   






z$PrimaryCmpNode.calculate_result_codec                 C   s   | j | | j| | jD ]}|| q| jr]| | | ||  | j | j| j | j	rC| j	j||  | j
p<| j| j
d ud | j | | j | | j| | j| d S d S )Nneeds_evaluation)rL  r{  rM  r	  r   rd  r  r   r   r	  r	  r  r  )rW   r   r	  rS   rS   rT   r{  #5  s&   

z'PrimaryCmpNode.generate_evaluation_codec                 C   r  rL   )rL  r  rM  rm  rS   rS   rT   ry  55     z-PrimaryCmpNode.generate_subexpr_disposal_codec                 C   r  rL   )rL  r  rM  rm  rS   rS   rT   rz  ;5  r	  z!PrimaryCmpNode.free_subexpr_tempsc                 C   s2   | j | | j| | jr| j| d S d S rL   )rL  r  rM  r	  rm  rS   rS   rT   r  A5  s
   zPrimaryCmpNode.annotate)rZ   r[   r\   r   r	  r	  r	  r   r1  r  r  r	  r!  r	  r	  r+  r	  r"  r   r{  ry  rz  r  rS   rS   rS   rT   rS  /4  s*    T*rS  c                   @   s|   e Zd Zg d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 )CascadedCmpNode)rM  r	  r	  r	  Nc                 C   r)  rL   r  r   rS   rS   rT   r   Y5  r  zCascadedCmpNode.infer_typec                 C   rU   r  rS   r   rS   rS   rT   r1  ]5  rY   z!CascadedCmpNode.type_dependenciesc                 C   r  rL   r  rV   rS   rS   rT   r   `5  r  z#CascadedCmpNode.has_constant_resultc                 C   s&   | j || _ | jr| j|| _| S rL   )rM  r!  r	  r   rS   rS   rT   r!  d5  s   zCascadedCmpNode.analyse_typesc                 C   
   | j jjS rL   )rM  r   rp   rV   rS   rS   rT   r	  j5  rL  z#CascadedCmpNode.has_python_operandsc                 C   rU   rQ  rS   rV   rS   rS   rT   r	  m5  r  z!CascadedCmpNode.is_cpp_comparisonFc                 C   sZ   |  |||rd| _tj| _|jjs||}| jr+| j| j	||}|| j	ur+|| _
|S rQ  )r	  r	  r   r  r   rp   r  r	  r	  rM  r	  )rW   rL  rr   r	  rM  rS   rS   rT   r	  q5  s   

z#CascadedCmpNode.optimise_comparisonc                 C   sL   | j || _ | j jtu r| jdv r| j d| _ | jr$| j| d S d S )Nr	  r  )rM  r  r   r   r   r  r	  r  r   rS   rS   rT   r  }5  s   z,CascadedCmpNode.coerce_operands_to_pyobjectsc                 C   s(   | j r| j|| _| j | d S d S rL   )r	  rM  r.  r	  r   rS   rS   rT   r	  5  s   z0CascadedCmpNode.coerce_cascaded_operands_to_tempc                 C   s   | j jr|d|  ||| j  n|d|  |r!|| | j| | jD ]}|| q*| |||| j| j | j	rQ| j	j||| j
pJ| j| j
d ud |r]|| || | j| | j| |d d S )Nz if (__Pyx_PyObject_IsTrue(%s)) {r  r	  r   )r   rp   r   r  r{  rM  r	  r  r   r	  r	  r  r  )rW   r   r   rL  r	  r	  rS   rS   rT   r{  5  s.   




z(CascadedCmpNode.generate_evaluation_codec                 C   s&   | j | | jr| j| d S d S rL   )rM  r  r	  rm  rS   rS   rT   r  5  s   zCascadedCmpNode.annotater	  )rZ   r[   r\   r   r	  r	  r  r~   r   r1  r   r!  r	  r	  r	  r  r	  r{  r  rS   rS   rS   rT   r	  H5  s     


r	  )ru	  rw	  r  r  r  r  r  r   rT  r   r  r  r  r  r  c                 K   s   t | | f||||d|S )N)r   rL  rM  r  )binop_node_classes)r   r   rL  rM  r  r  rS   rS   rT   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  ri  c                    s6   t t| |j || _trtd| | jf  d S d S )Nz%s Coercing %s)rN   r  rB  r   ri  r    rJ  rC  rQ   rS   rT   rB  5  s
   zCoercionNode.__init__c                 C   r   rL   rS   rV   rS   rS   rT   r  5  r  z&CoercionNode.calculate_constant_resultc              	   C   s\   | j | | j j| jkr,| j\}}}||||d ftddd| j j| jf d d S d S )Nr'   coercez[%s] to [%s])rf  tagrg  )ri  r  r   r   r5   )rW   r   filelinecolrS   rS   rT   r  5  s   zCoercionNode.annotatec                 C   r!  rL   rS   r   rS   rS   rT   r!  5  rY   zCoercionNode.analyse_types)rZ   r[   r\   r   r  r~   rB  r  r  r!  r]   rS   rS   rQ   rT   r  5  s    r  c                   @       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J |jj rJ t| | || _d| _d| _|| _| j| d S )Nr'   T)r   r   r  rB  r   rc  ri  rn  rW   ri  r  rr   rS   rS   rT   rB  5  s   
z!CoerceToMemViewSliceNode.__init__c                 C   s(   | | j| j |  | j| d S rL   )r   r   from_py_call_coderi  r   r   r   rm  rS   rS   rT   rv   6  s   

z-CoerceToMemViewSliceNode.generate_result_codeN)rZ   r[   r\   r\  rB  rv  rS   rS   rS   rT   r  5  s    
r  c                   @   r  )
r  c                 C   r%  rL   )r  rB  r   )rW   ri  new_typerS   rS   rT   rB  6  r'  zCastNode.__init__c                 C   r  rL   ri  r  rV   rS   rS   rT   r  6  rL  zCastNode.may_be_nonec                 C   s   | j | jS rL   )ri  r  r   rV   rS   rS   rT   r   6  rK  zCastNode.calculate_result_codec                 C   rx  rL   ri  rv  rm  rS   rS   rT   rv  6  r  zCastNode.generate_result_codeN)rZ   r[   r\   rB  r  r   rv  rS   rS   rS   rT   r  	6  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J d|j|f t| | || _| | _|| _d S )Nz/PyTypeTest for %s against non extension type %s)r  r  r   r  rB  r
  r  rm  )rW   ri  r  rr   rm  rS   rS   rT   rB  !6  s   

zPyTypeTestNode.__init__zPython type testc                 C   r!  rL   rS   r   rS   rS   rT   r!  .6  rY   zPyTypeTestNode.analyse_typesc                 C   s   | j rdS | j S rQ  )rm  ri  r  rV   rS   rS   rT   r  16  s   
zPyTypeTestNode.may_be_nonec                 C   r  rL   ri  r  rV   rS   rS   rT   r  66  rL  zPyTypeTestNode.is_simplec                 C   r  rL   ri  rW  rV   rS   rS   rT   rW  96  rL  zPyTypeTestNode.result_in_tempc                 C   r  rL   )ri  r   rV   rS   rS   rT   r   <6  rL  zPyTypeTestNode.is_ephemeralc                 C   r  rL   ri  r6  rV   rS   rS   rT   r6  ?6  rL  z#PyTypeTestNode.nonlocally_immutablec                 C   sR   | j | jj ks| jjs| S | j  s| S | j r&| jr&| jd| j j S | jS )Nz!Cannot convert NoneType to %.200s)r   ri  r   typeobj_is_availabler  rm  r  rq   rV   rS   rS   rT   	reanalyseB6  s   
zPyTypeTestNode.reanalysec                 C   r   rL   rS   rV   rS   rS   rT   r  K6  r  z(PyTypeTestNode.calculate_constant_resultc                 C   r  rL   ri  r   rV   rS   rS   rT   r   O6  rL  z$PyTypeTestNode.calculate_result_codec                 C   s   | j  rF| j jr"| j j| j | j| jd}|j	t
dd n| j | j | j}|j	t
dd |d||| jf  d S t| jd d S )N)exactRaiseUnexpectedTypeErrorr*  ExtTypeTestzif (!(%s)) %szICannot test type of extern C class without type object name specification)r   r
  r  type_test_coderi  r   rm  r  r   r   r   r   r   r   r   r   )rW   r   	type_testrS   rS   rT   rv  R6  s&   


z#PyTypeTestNode.generate_result_codec                 C   rx  rL   ri  r  rm  rS   rS   rT   r  e6  r  z,PyTypeTestNode.generate_post_assignment_codec                 C   r   rL   rS   rm  rS   rS   rT   rd  h6  rY   z#PyTypeTestNode.allocate_temp_resultc                 C   r   rL   rS   rm  rS   rS   rT   rk  k6  rY   z"PyTypeTestNode.release_temp_resultc                 C   rx  rL   ri  r  rm  rS   rS   rT   r  n6  r  zPyTypeTestNode.free_tempsc                 C   rx  rL   )ri  rz  rm  rS   rS   rT   rz  q6  r  z!PyTypeTestNode.free_subexpr_tempsNr	  )rZ   r[   r\   r  rB  r*   rM  rN  r  r!  r  r  rW  r   r6  r
  r  r   rv  r  rd  rk  r  rz  rS   rS   rS   rT   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   TrS   c                 C   s<   t | | |j| _| | _|| _|| _t|pd| _d S r  )	r  rB  r   r
  r  exception_type_cnameexception_messager   exception_format_args)rW   ri  r
  r
  r
  rS   rS   rT   rB  |6  s   
zNoneCheckNode.__init__Nc                 C   r!  rL   rS   r   rS   rS   rT   r!  6  rY   zNoneCheckNode.analyse_typesc                 C   rU   rQ  rS   rV   rS   rS   rT   r  6  rY   zNoneCheckNode.may_be_nonec                 C   r  rL   r
  rV   rS   rS   rT   r  6  rL  zNoneCheckNode.is_simplec                 C   r  rL   r
  rV   rS   rS   rT   rW  6  rL  zNoneCheckNode.result_in_tempc                 C   r  rL   r
  rV   rS   rS   rT   r6  6  rL  z"NoneCheckNode.nonlocally_immutablec                 C   r  rL   r
  rV   rS   rS   rT   r   6  rL  z#NoneCheckNode.calculate_result_codec                 C   s0   | j jr	| j S | j jrd| j  S td)Nr	  zunsupported type)r   rp   ri  r   r   r   rb  rV   rS   rS   rT   	condition6  s
   
zNoneCheckNode.conditionr  Fc                 C   s"   | ||||}||_ || d S rL   )rr  put_nonecheck)rP   ri  r   r
  r
  r
  rr  r   rS   rS   rT   generate6  s   zNoneCheckNode.generatec                 C   s$   |  r| |||||| d S d S rL   )r  r
  )rP   ri  r   r
  r
  r
  rr  rS   rS   rT   generate_if_needed6  s   z NoneCheckNode.generate_if_neededc              
      s   | d|    | jr|  tj | jr4| d| jt| j	dd
 fdd| jD f  n| d| j | j	df  | jrK|  | || j | d d S )	Nzif (unlikely(%s == Py_None)) {zPyErr_Format(%s, "%s", %s);UTF-8r  c                    s"   g | ]}d  t |d qS )z"%s"r
  )rv   r  r  escaperS   rT   r   6  s    z/NoneCheckNode.put_nonecheck.<locals>.<listcomp>zPyErr_SetString(%s, "%s");r   )r   r
  rr  r   r
   escape_byte_stringr
  r
  r
  r  r  r   r   r   rm  rS   r
  rT   r
  6  s0   


zNoneCheckNode.put_nonecheckc                 C   r  rL   )r
  rm  rS   rS   rT   rv  6  rK  z"NoneCheckNode.generate_result_codec                 C   rx  rL   r
  rm  rS   rS   rT   r  6  r  z+NoneCheckNode.generate_post_assignment_codec                 C   rx  rL   r
  rm  rS   rS   rT   r  6  r  zNoneCheckNode.free_temps)rS   )r  rS   F)rZ   r[   r\   r  rB  rN  r!  r  r  rW  r6  r   r
  r  r
  r
  r
  rv  r  r  rS   rS   rS   rT   r   u6  s,    
	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r||}t| | |tu rK|j j	s+|j j
r1t|| _ n|j js9|j jr=t| _ n|j jrEtj| _ | j | _d S |j j	sS|j j
rq|ttfvri|jd sit|jd|j |f  | | _ | _d S || _d S )Nz$Cannot convert '%s' to Python objectr^   rc  )r   r  r   r   r  r.  r  rB  r   rw  r[  rz   rx  r  r   r   r  target_typer   r!   rj   )rW   ri  rr   r   rS   rS   rT   rB  6  s0   

zCoerceToPyTypeNode.__init__zConverting to Python objectc                 C   rU   rQ  rS   rV   rS   rS   rT   r  6  r  zCoerceToPyTypeNode.may_be_nonec                 C   s8   | j j}|tjks|jr|jdkr| j |S t| |S )Nr,  )ri  r   r   r  rp   rq   r  r  )rW   rr   r  rS   rS   rT   r+  6  s   


z$CoerceToPyTypeNode.coerce_to_booleanc                 C   s    | j jjr| j S | j tj|S rL   )ri  r   r  r  r   r  r   rS   rS   rT   r  7  s   
z$CoerceToPyTypeNode.coerce_to_integerc                 C   r!  rL   rS   r   rS   rS   rT   r!  7  r  z CoerceToPyTypeNode.analyse_typesc                 C   sH   | d| jj| j |  | j||  | jf  | | d S )Nz%s; %s)	r   ri  r   to_py_call_coder   r
  r   r   r  rm  rS   rS   rT   rv  7  s   z'CoerceToPyTypeNode.generate_result_codeN)rZ   r[   r\   r   r   r
  r   rB  r  r  r+  r  r!  rv  rS   rS   rS   rT   r  6  s    r  c                   @   r	  )r  r'   c                 C   s"   | |}t| | tj| _d S rL   )r.  r  rB  r   r   r   rW   ri  rr   rS   rS   rT   rB  !7  s   
zCoerceIntToBytesNode.__init__c              	   C   s   | j }| }|jtjtjtjfvr7|jjr |d||f  n|d|  |d|	| j
  |d d }|jtjurS|jjtjdd}|d||f  |}|d|  |||  | j
f  |d urp|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)ri  r   r   r   r   r~  r  r  r   r   r   ra  rb  r   rj  r  )rW   r   ri  
arg_resultr  rS   rS   rT   rv  &7  s8   


z)CoerceIntToBytesNode.generate_result_codeN)rZ   r[   r\   r   rB  rv  rS   rS   rS   rT   r  7  s    r  c                   @   r  )r  Nc                 C   s   t | | || _d| _||st|jd|  | jjs!| jjrF| j	j
r8| j	jr8| j	jjr8t|jd| dd | jjrHt|jddd d S d S d S )Nr'   z$Cannot convert Python object to '%s'z=Obtaining '%s' from externally modifiable global Python valuer{   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  rB  r   r   rn  r   r   rw  rx  ri  r   r   r  r   )rW   r  ri  rr   rS   rS   rT   rB  J7  s(   

zCoerceFromPyTypeNode.__init__c                 C   r!  rL   rS   r   rS   rS   rT   r!  ^7  r  z"CoerceFromPyTypeNode.analyse_typesc                 C   s   | j jo| j j o| j S rL   )r   r  r4  ri  r   rV   rS   rS   rT   r   b7  r  z!CoerceFromPyTypeNode.is_ephemeralc              
   C   s   d }| j jr'| jj tu r'| j jdr'd| j jtdd   }t| j|d |	| j j
| j |  | j||| jd | j jrH| | d S d S )N__Pyx_PyObject_As__Pyx_PyBytes__Pyx_PyObjectzexpected bytes, NoneType found)from_py_functionspecial_none_cvalue)r   rw  ri  r   r!
  r]  r   r   r
  r   r	  r   r   r   r"
  rp   r  )rW   r   r!
  rS   rS   rT   rv  e7  s   
z)CoerceFromPyTypeNode.generate_result_codec                 C   r  )Nz0Coercion from Python not allowed without the GILr  r   rS   rS   rT   rN  u7  r  z CoerceFromPyTypeNode.nogil_check)	rZ   r[   r\   r"
  rB  r!  r   rv  rN  rS   rS   rS   rT   r  C7  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  PyList_GET_SIZEPyTuple_GET_SIZEPySet_GET_SIZEPyBytes_GET_SIZEPyByteArray_GET_SIZE__Pyx_PyUnicode_IS_TRUEc                 C   s"   t | | |jjrd| _d S d S r   )r  rB  r   rp   r   r
  rS   rS   rT   rB  7  s   
zCoerceToBooleanNode.__init__c                 C   s2   | j jjr| j| j jd u r|   d S d S d S rL   )ri  r   rp   _special_builtinsri   rM  r   rS   rS   rT   rN  7  s   zCoerceToBooleanNode.nogil_checkr	  c                 C   s   | j r	|   dS | j S rQ  )r   rR  ri  r"  rV   rS   rS   rT   r"  7  s   
zCoerceToBooleanNode.check_constc                 C   rM  )Nz	(%s != 0)r
  rV   rS   rS   rT   r   7  rK  z)CoerceToBooleanNode.calculate_result_codec              	   C   s   | j sd S | j| jj}|d ur<| j rd| j  gng }|d|| j f  |d| 	 d
|f  d S |d| 	 | j || 	 | jf  d S )Nz(%s != Py_None)z(%s(%s) != 0)rC  z&&r	  )r   r)
  ri   ri  r   r  r   r   r   r   r  r  r   )rW   r   	test_funcchecksrS   rS   rT   rv  7  s    z(CoerceToBooleanNode.generate_result_codec                 C   r!  rL   rS   r   rS   rS   rT   r!  7  rY   z!CoerceToBooleanNode.analyse_typesN)rZ   r[   r\   r   r  r   r   r   r   r   frozenset_typer   r!   r   r)
  rB  rN  r  r"  r   rv  r!  rS   rS   rS   rT   r  y7  s"    
r  c                   @   r  )
r  c                 C   s2   |j jr	||}|| _ t| | || d S rL   )r   r  r.  r  rB  r  r	  rS   rS   rT   rB  7  s
   
zCoerceToComplexNode.__init__c                 C   sT   | j jjr| j j| j  }| j j| j  }n| j  }d}d| jj||f S rr  )ri  r   r  rt  r   ru  r  )rW   rw  rx  rS   rS   rT   r   7  s   

z)CoerceToComplexNode.calculate_result_codec                 C   r   rL   rS   rm  rS   rS   rT   rv  7  rY   z(CoerceToComplexNode.generate_result_codec                 C   r!  rL   rS   r   rS   rS   rT   r!  7  rY   z!CoerceToComplexNode.analyse_typesN)rZ   r[   r\   rB  r   rv  r!  rS   rS   rS   rT   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rB|||}|S )Nr'   )
HasGilNoder   rp  r  T)r   r   r   __Pyx_SoftComplexToDoubleSoftComplexToDoublez	Complex.c)r/  r   )rQ  r-
  r   r  rq  r  r  r  r  r   r   r   r!  r   r  )ri  r  rr   r-
  
cfunc_typerl  rS   rS   rT   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rt| _	d S d S r   )
r  rB  ri  r   as_argument_typer~   r   rp   r   r  r
  rS   rS   rT   rB  7  s   

zCoerceToTempNode.__init__z#Creating temporary Python referencec                 C   r!  rL   rS   r   rS   rS   rT   r!  7  r  zCoerceToTempNode.analyse_typesc                 C   r  rL   r 
  rV   rS   rS   rT   r  7  rL  zCoerceToTempNode.may_be_nonec                 C   s4   | j || _ | j  r| j S | j j| _| j| _| S rL   )ri  r+  r  r   r  r   rS   rS   rT   r+  7  s   

z"CoerceToTempNode.coerce_to_booleanc                 C   sj   | d|  | j|  f  | jr3| jjs$||  |   d S |j	|  | j| j
 d d S d S )NrC  ro  )r   r   ri  r  r
  rc  r   r   rl  rq  rr  rm  rS   rS   rT   rv  8  s   
z%CoerceToTempNode.generate_result_codeN)	rZ   r[   r\   rB  r  r!  r  r+  rv  rS   rS   rS   rT   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 rL   )rN   r	  rB  r~   update_type_and_entryrC  rQ   rS   rT   rB  8  s   zProxyNode.__init__c                 C   s   | j || _ |   | S rL   )ri  r'  r2
  r   rS   rS   rT   r!  8  s   zProxyNode.analyse_typesc                 C   r  rL   ri  r   r   rS   rS   rT   r   #8  r/  zProxyNode.infer_typec                 C   sB   t | jdd }|r|| _| jj| _t | jdd }|r|| _d S d S Nr   r   )r   ri  r   r  r   )rW   r   	arg_entryrS   rS   rT   r2
  &8  s   

zProxyNode.update_type_and_entryc                 C   rx  rL   r
  rm  rS   rS   rT   rv  /8  r  zProxyNode.generate_result_codec                 C   r  rL   r
  rV   rS   rS   rT   r   28  rL  zProxyNode.resultc                 C   r  rL   r
  rV   rS   rS   rT   r  58  rL  zProxyNode.is_simplec                 C   r  rL   r 
  rV   rS   rS   rT   r  88  rL  zProxyNode.may_be_nonec                 C   rx  rL   )ri  r{  rm  rS   rS   rT   r{  ;8  r  z"ProxyNode.generate_evaluation_codec                 C   rx  rL   )ri  r  rm  rS   rS   rT   r  >8  r  z ProxyNode.generate_disposal_codec                 C   rx  rL   r
  rm  rS   rS   rT   r  A8  r  zProxyNode.free_temps)rZ   r[   r\   r\  rN  rB  r!  r   r2
  rv  r   r  r  r{  r  r  r]   rS   rS   rQ   rT   r	  8  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   sP   t | | |j| _t|dd }|r|| _|j| _t|dd }|r&|| _d S d S r4
  )r  rB  r~   r   r   r  r   )rW   ri  r   r5
  rS   rS   rT   rB  O8  s   
zCloneNode.__init__c                 C   r  rL   r
  rV   rS   rS   rT   r   Z8  rL  zCloneNode.resultc                 C   r  rL   r 
  rV   rS   rS   rT   r  ]8  rL  zCloneNode.may_be_nonec                 C   r  rL   )ri  r1  r   rS   rS   rT   r1  `8  r/  zCloneNode.type_dependenciesc                 C   r  rL   r3
  r   rS   rS   rT   r   c8  r/  zCloneNode.infer_typec                 C   s6   | j j| _| j j| _d| _t| j dd }|r|| _| S )Nr'   r   )ri  r   r  r   r   r   )rW   rr   r5
  rS   rS   rT   r!  f8  s   

zCloneNode.analyse_typesc                    s(   | j jr| j ||S tt| ||S rL   )ri  r   r  rN   r  )rW   	dest_typerr   rQ   rS   rT   r  o8  s   zCloneNode.coerce_toc                 C   rU   r%  rS   rV   rS   rS   rT   r  t8  rY   zCloneNode.is_simplec                 C   r   rL   rS   rm  rS   rS   rT   r{  w8  rY   z"CloneNode.generate_evaluation_codec                 C   r   rL   rS   rm  rS   rS   rT   rv  z8  rY   zCloneNode.generate_result_codec                 C   r   rL   rS   rm  rS   rS   rT   r  }8  rY   z CloneNode.generate_disposal_codec                 C   s"   | j r||  |   d S d S rL   )r   rl  r   r
  rm  rS   rS   rT   r  8  s   z'CloneNode.generate_post_assignment_codec                 C   r   rL   rS   rm  rS   rS   rT   r  8  rY   zCloneNode.free_temps)rZ   r[   r\   r   rN  rB  r   r  r1  r   r!  r  r  r{  rv  r  r  r  r]   rS   rS   rQ   rT   r  D8  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   r  rL   )ri  r   rV   rS   rS   rT   r   8  r[  zCppOptionalTempCoercion.typec                 C   rM  r  r
  rV   rS   rS   rT   r   8  rK  z-CppOptionalTempCoercion.calculate_result_codec                 C   r   rL   rS   rm  rS   rS   rT   rv  8  rY   z,CppOptionalTempCoercion.generate_result_codec                    s   t t| j|ddS )NFr   )rN   r7
  r   r   rQ   rS   rT   r   8  r@  z-CppOptionalTempCoercion._make_move_result_rhsr	  )rZ   r[   r\   r\  r   r  r   r   rv  r   r]   rS   rS   rQ   rT   r7
  8  s    
r7
  c                   @   r  )r  c                 C   s$   |j r| j|r| S t| ||S rL   )r  r   r  r  r  r&  rS   rS   rT   r  8  s   zCMethodSelfCloneNode.coerce_toN)rZ   r[   r\   r  rS   rS   rS   rT   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   r!  rL   rS   r   rS   rS   rT   r!  8  rY   zModuleRefNode.analyse_typesc                 C   rU   rQ  rS   rV   rS   rS   rT   r  8  rY   zModuleRefNode.may_be_nonec                 C   rL  rL   )r   r]  rV   rS   rS   rT   r   8  r#  z#ModuleRefNode.calculate_result_codec                 C   r   rL   rS   rm  rS   rS   rT   rv  8  rY   z"ModuleRefNode.generate_result_codeN)rZ   r[   r\   r   r   r   r   r!  r  r   rv  rS   rS   rS   rT   r8
  8  s    r8
  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J || _d S rL   )r   rB  r   rp   r^  )rW   r   r^  rS   rS   rT   rB  8  s   
zDocstringRefNode.__init__c                 C   r!  rL   rS   r   rS   rS   rT   r!  8  rY   zDocstringRefNode.analyse_typesc              
   C   sH   | d|  | j |td||  | jf  | | d S )Nz%s = __Pyx_GetAttr(%s, %s); %sr\  )	r   r   r^  r1  r
   r  r   r   r  rm  rS   rS   rT   rv  8  s   z%DocstringRefNode.generate_result_codeN)
rZ   r[   r\   r   r   r   r   rB  r!  rv  rS   rS   rS   rT   r9
  8  s    r9
  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u r$ddlm} t|dd|}t||| d}|| _	|| _
dS )z5string is expected to already be a StringNode or NoneNr'   rW  r  )description)r   r   )r   rB  r]  rX  r
   r  writer  as_utf8_stringrZ  r  )rW   r   r  rZ  rX  rS   rS   rT   rB  8  s   
zAnnotationNode.__init__c                 C   r!  rL   rS   r   rS   rS   rT   r!  8  rY   zAnnotationNode.analyse_typesc                 C   s   |  |d S r   )r  r   rS   rS   rT   rB  8  s   zAnnotationNode.analyse_as_typec                 C   s  t |tr|j}|jr!||jst|jd| jj	 dd dS dS |j
r||jjr|||jjs=t|jd| jj	 dd dS |jjr_|j|}|r[||js]t|jd| jj	  dS dS dS |j|}|rx|jrzt|jd| jj	 dd dS dS dS 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'   r{   z+Unknown type declaration '%s' in annotationz0Unknown type declaration in annotation, ignoringN)r}   rE  r9  r   r  rq   r   r   rZ  r   r  r  r  r@  rt  r  r   pxd_file_loaded)rW   rr   r  rh  rS   rS   rT   _warn_on_unknown_annotation8  s6   





z*AnnotationNode._warn_on_unknown_annotationc           
      C   sx  | j rg d fS | j}d }}|jrGt|jddd |jD ]\}}|js$q|jdv r0d}|s/|}q|jdv r9d}|}q|rF|rFt|jddd nt|t	rXt|jd	dd g d fS |j
|d
R ||}|d u ry| || g |fW  d    S |jrt|jddd |r|s|js|jst|jd |jr|| |jr||ng }	W d    |	|fS 1 sw   Y  |	|fS )NFzSDicts should no longer be used as type annotations. Use 'cython.int' etc. directly.r'   r{   )r   s   typeT)r
  s   ctypez9Duplicate type declarations found in signature annotationzTTuples cannot be declared as simple tuples of types. Use 'tuple[type1, type2, ...]'.)ry  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   r   r  r  r   r}   rv  new_c_type_contextrB  r?
  rp   r  r  r  r  ru  )
rW   rr   assigned_valuer  explicit_pytypeexplicit_ctyperq   r   r  r  rS   rS   rT   r  9  sd   





z&AnnotationNode.analyse_type_annotationrL   )
rZ   r[   r\   r   r@
  rB  r!  rB  r?
  r  rS   rS   rS   rT   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                    sB   t t| j|fi | t|| _t| j}t|||dd| _d S )NT)r#  r   r  )rN   rE
  rB  r	  r   r  r,   r  )rW   r   r#  r   rD  assign_expr_rhsrQ   rS   rT   rB  \9  s   

z!AssignmentExpressionNode.__init__c                 C   r  rL   )r   r   rV   rS   rS   rT   r   c9  r[  zAssignmentExpressionNode.typec                 C   r	  rL   )r  r#  rq   rV   rS   rS   rT   target_nameg9  r  z$AssignmentExpressionNode.target_namec                 C   r  rL   )r   r   r   rS   rS   rT   r   k9  r/  z#AssignmentExpressionNode.infer_typec                 C   rx  rL   )r  r  r   rS   rS   rT   r  n9  r  z-AssignmentExpressionNode.analyse_declarationsc                 C   sX   | j || _ | j jjs#| j jjs| j j|| j _nt| j | j_ | j|| _| S rL   )r   r!  ri  r   r   r  r\  r  r   rS   rS   rT   r!  q9  s   


z&AssignmentExpressionNode.analyse_typesc                    s   || j jjkrF| jj}t|tr|j}|||}||urF|| j_| j  t| j jtrDt| j jt	sD| j jj| j _| j jjj| j j_| S t
t| ||S rL   )r  r   r   ri  r}   r  r  r2
  r  r  rN   rE
  )rW   r  rr   old_rhs_argrhs_argrQ   rS   rT   r  9  s   

z"AssignmentExpressionNode.coerce_toc                 C   r  rL   )r   r   rV   rS   rS   rT   r   9  rL  z.AssignmentExpressionNode.calculate_result_codec                 C   rx  rL   )r  r  rm  rS   rS   rT   rv  9  r  z-AssignmentExpressionNode.generate_result_code)rZ   r[   r\   r\  r   r   r   r  
clone_noderB  r  r   rG
  r   r  r!  r  r   rv  r]   rS   rS   rQ   rT   rE
  H9  s$    

rE
  rS   r  r	  (6  
__future__r   cythondeclarer  bintrer  r\  os.pathre  r   Errorsr   r   r   r   r   r   r(   r)   Coder   r	   r  r
   r   r   r*   r+   r,   r   r   r-   r.   r/   r0   r   r   r   r   r   r   r   r   r   r!   r1   r"   r2   r3   r$   r#   r   r   Annotater5   r6   	Debuggingr7   
DebugFlagsr   r    Pythranr8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   __builtin__rH   ImportErrorrv   rt   r	  rw   version_infor&   r2  r%   longrK   r  r  rl   rn   rm   ro   rn  c_const_py_unicode_ptr_typerh   r   rz   r   r   r   r   r   r   r   r   r   r  r  r  r'  r+  r  r6  r   r<  rM  r  r  r  r  r   r  r  r  rh  rk  r  r  r  r  r  r  r  r  r  r  r  r  r-  rT  r^  r`  r;  r  r  r  r1  r*  r)  rE  rd  r  r  r  r  r  r  r  r  r  r   r6  r;  r  r  r  rv  rE  r	  r  r  r  r  r-  r  r  rB  rH  rO  rV  ri  ro  rr  rx  r|  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r!  r#  r$  r)  not_invnegr   r-  r,  rJ  rP  rR  rV  rX  rY  r[  r^  r_  rj  rk  r  r  r  r  r  r  r  r  r  r  r  r  matmulr  r   ltler	  negegtis_r  r'  and_truedivfloordivr	  modr	  or_r_	  rshiftr  xorr  r  r  r  r  r  r		  r
	  r	  r	  r	  r!	  compilefindallrQ	  	frozensetrR	  rP	  rZ	  rs	  rz	  rR  r	  r	  rS  r	  r	  r  r  r  r  r  r   r  r  r  r  r  r  r  r	  r  r7
  r  r8
  r9
  r:
  rE
  rS   rS   rS   rT   <module>   s  $		
(@D



	








#	 
       !"	 3(XnI2$     z[[ p .#<0ac      : Jm 7   yC7 
   xpb ]*     {3      <)". ,0 @$.
:J$*  $P#3o, "2  _2 K&
	





	 E 	>Q 1^  s 	
  j  b
[]I(67+6Fs