o
    wi{	                    @   s  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d&ed'ed(ed)e d dlZd dlZ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*d0lmZ d*d1lmZmZ d*d2lmZ d*d3lm Z m!Z!m"Z"m#Z#m$Z$ d*d4lm%Z% d*d5l&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z1m2Z2 d*d6lm&Z& d*d7lm3Z3 d8d9lm4Z4 d*d:l5m6Z6 d*d;lm7Z7 d8d<l8m9Z9 d*d=l:m;Z;m<Z< d*d>l=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZL d*d?lmMZM eNeOfZPG d@dA dAZQeQ ZRe ZSe,e-fdBe,ej fdCe,ejTfdCe,ejUfdCe,ejVfdCe-e,fdDe-ejWfdEe-ejXfdEej e,fdFejTe,fdFejUe,fdFejVe,fdFejYejYfdGejZejZfdHiZ[dId Z\dJdK Z]dLdM Z^ddNdOZ_dPdQ Z`dRdS ZadTdU ZbdVdW ZcdXdY ZddZd[ ZeG d\d] d]eZfG d^d_ d_efZgG d`da daefZhG dbdc dcehZiG ddde deeiZjG dfdg dgeiZkG dhdi diehZlG djdk dkelZmG dldm dmelZnG dndo doelZoG dpdq dqelZpG drds dselZqdtdu ZrG dvdw dwelZsG dxdy dyelZtG dzd{ d{etZuG d|d} d}ehZvG d~d dehZwG dd dehZxG dd defZyG dd defZzG dd defZ{G dd de{Z|G dd defZ}G dd dehZ~G dd de{ZG dd dehZG dd defZG dd dehZG dd defZG dd deZG dd defZG dd defZG dd defZG dd dehZG dd dehZG dd defZG dd deZG dd deZG dd deZG dd deZG dd defZG dd deZG dd deZG dd defZG dd defZG dd deZG dd defZG dd deZG dd defZG dd deZG ddÄ deZG ddń defZG ddǄ deZG ddɄ deZG dd˄ deZG dd̈́ defZG ddτ defZG ddф defZG ddӄ defZG ddՄ defZG ddׄ deZG ddل deZG ddۄ de{ZG dd݄ deZG dd߄ deZG dd defZG dd defZG dd defZG dd defZG dd defZG dd defZG dd degZG dd dZG dd defeZG dd defZG dd defZG dd defeZG dd defZG dd defZG dd defeZG dd deZG d d dZG dd defZG dd defZG dd defZG dd	 d	eZG d
d deZG dd deZG dd deZG dd defZG dd deZG dd deZG dd deZG dd deÃZG dd dehZG dd deZG dd deZG d d! d!ehZȐd"d# Zejejejej͐d$ZG d%d& d&efZG d'd( d(eσ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ԃZ֐d5d6 ZG d7d8 d8eԃZeeeӐd9Zِd:d; ZG d<d= d=efZېd>Zܐd?Zݐd@ZސdAZߐdBZG dCdD dDefZG dEdF dFefZG dGdH dHeZG dIdJ dJeZG dKdL dLefZG dMdN dNefZzejZW n ey'   dOdP ZY nw i dQejdRej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ejejejedbdc dddc deZdfdg ZG dhdi diefZ G djdk dke Zdldm ZG dndo doe 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 defZG dd defZG dd defZdddddddddd	ZG dd dZG dd def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 defZG dd deZG dd deZG dd deZG dd deg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Z)G dd de(Z*G dd defZ+G dd defZ,G dd defZ-G dd defZ.G dÐdĄ defZ/dS (      N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
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build_line_tableinspectcopyospathlibresys   )r   r   r   r   r   r   CannotSpecializeperformance_hint)r   r   )r#   )r	   )r   )r   )NodeSingleAssignmentNode)r   )c_char_ptr_typer   typecast
error_typeunspecified_type)	TypeSlots)r   r   r   r   r   r   r   r   r    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)PythranExprc                       (   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 jS N)rJ   _objsuper__new__)cls	__class__ V/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/Cython/Compiler/ExprNodes.pyrN   B   s   
zNotConstant.__new__c                 C      dS )Nz<NOT CONSTANT>rR   selfrR   rR   rS   __repr__H      zNotConstant.__repr__)__name__
__module____qualname__rL   rN   rW   __classcell__rR   rR   rP   rS   rJ   ?   s    rJ   zGCannot convert Unicode string to 'bytes' implicitly, encoding required.z5Unicode objects only support coercion to Py_UNICODE*.zBCannot convert 'bytes' object to str implicitly, decoding requiredz8Cannot convert 'bytes' object to Py_UNICODE*, use 'str'.z?Cannot convert 'char*' to unicode implicitly, decoding requiredzcython.pymutex cannot be copiedz*cython.pythread_type_lock cannot be copiedc                    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 rK   rR   .0t
type_tuplerR   rS   	<genexpr>k       z&find_coercion_error.<locals>.<genexpr>r*   )asciiutf8z\'%s' objects do not support coercion to C types with non-ascii or non-utf8 c_string_encodingr   )coercion_error_dictget
directivesanyr   r/   c_uchar_ptr_typec_const_char_ptr_typec_const_uchar_ptr_typeis_pyobjectname)rb   defaultenverrrR   ra   rS   r   f   s   


c                 C   s   t tttd| jd S )N)bytes	bytearraystrunicodec_string_type)r   r   r   rh   ri   rq   rR   rR   rS   default_str_typew   s   ry   c                  G   sB   | D ]}|du st |jttf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_resultintfloatr   pos)nodesnoderR   rR   rS   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 | ]}|j rt |n| qS rR   )
is_starredinfer_sequence_item_type
infer_typer_   itemrx   rR   rS   	<setcomp>   s    z+infer_sequence_item_type.<locals>.<setcomp>)is_sequence_constructorr   r   cf_statelenrhsAttributeErrorhas_constant_resultargsr}   
ValueError	TypeError
IndexErrorpop)rq   seq_node
index_nodeseq_typer   
item_typesrR   rx   rS   r      s0   


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 | ]F}|d u rt d td fn8|jr"t|j|jr|jnd g|j n%|jr1t|j|j|j	|j
fn| rF|j|j|jt u rCt|jnd fnd qS rK   )r   typer   make_dedup_key
is_literalmult_factorr   is_slicestartstopstepr   r}   r_   r   rR   rR   rS   
<listcomp>   s    	&
z"make_dedup_key.<locals>.<listcomp>N)tuple)
outer_type
item_nodes	item_keysrR   rR   rS   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_typevaluern   entrycname)exception_valuerR   rR   rS   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   nogilrR   rR   rS   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   rR   rR   rS   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   rR   rR   rS   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_excrR   rR   rS   translate_double_cpp_exception	  s0   






r   c                   @   s\  e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZeZejj dkrGe!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  Z0dd!d"Z1d#d$ Z2d%d& Z3d'd( Z4d)d* Z5d+d, Z6d-d. Z7d/d0 Z8d1d2 Z9d3d4 Z:d5d6 Z;d7d8 Z<d9d: Z=d;d< Z>d=d> Z?d?d@ Z@dAdB ZAdCdD ZBdEdF ZCddHdIZDdJdK ZEdLdM ZFdNdO ZGdPdQ ZHdRdS ZIdTdU ZJdVdW ZKdXdY ZLdZd[ ZMd\d] ZNd^d_ ZOd`da ZPdbdc ZQddde ZRdfdg ZSdhdi ZTdjdk ZUdldm ZVdndo ZWdpdq ZXdrds ZYdtdu ZZdvdw Z[dxdy Z\dzd{ Z]		dd|d}Z^dd~dZ_dd Z`dd Zadd Zbdd Zcdd Zd		dddZedd Zfdd Zgdd Zhdd Zidd Zjdd ZkdddZldd Zmdd Zndd Zodd Zpdd Zqdd Zrdd Zsdd Ztdd ZudddZvewdd Zxdd ZydS )ExprNodeNTFcpythonsubexprs)fgetc                 C      | j S rK   )r   rU   rR   rR   rS   child_attrs  s   zExprNode.child_attrsc                 C      d S rK   rR   rV   rq   rR   rR   rS   analyse_annotations  rX   zExprNode.analyse_annotationsc                 C   s   t |d td| jj|f )Nznot implementedz%s.%s not implemented)r8   r   rQ   rY   )rV   method_namerR   rR   rS   not_implemented  s   
zExprNode.not_implementedc                 C   rT   Nr   rR   rU   rR   rR   rS   	is_lvalue  rX   zExprNode.is_lvaluec                 C   s   |   o| jj S rK   )r   r   is_memoryviewslicerU   rR   rR   rS   is_addressable     zExprNode.is_addressablec                 C   s   | j jo| jS rK   )r   rn   is_temprU   rR   rR   rS   is_ephemeral  s   zExprNode.is_ephemeralc                 C   sH   g }| j D ]}t| |}|d ur!t|tu r|| q|| q|S rK   )r   getattrr   listextendappend)rV   r   ro   r   rR   rR   rS   subexpr_nodes  s   


zExprNode.subexpr_nodesc                 C   s   | j r| jS |  S rK   )r   	temp_codecalculate_result_coderU   rR   rR   rS   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rV   r   optionalrR   rR   rS   _make_move_result_rhs  s   zExprNode._make_move_result_rhsc                 C   s   | j |  ddS )NTr   )r   r   rU   rR   rR   rS   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   )rV   r   r   requires_moverR   rR   rS   move_result_rhs_as  s
   
zExprNode.move_result_rhs_asc                 C   s&   t | rt| S |d usJ t| |S rK   )rC   r9   )rV   type_rR   rR   rS   pythran_result  s   
zExprNode.pythran_resultc                 C   rT   )zZ
        Subtypes may return False here if result temp allocation can be skipped.
        TrR   rU   rR   rR   rS   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 rK   )r   r   rn   r   r0   r   ctyperV   r   rR   rR   rS   r     s   zExprNode.result_asc                 C   s
   |  tS rK   )r   r   rU   rR   rR   rS   r   !     
zExprNode.py_resultc                 C   s   | j p| jS rK   )result_ctyper   rU   rR   rR   rS   r  %     zExprNode.ctypec                 C   r   rK   rR   rU   rR   rR   rS   get_constant_c_result_code*  s   	z#ExprNode.get_constant_c_result_codec                 C   r   rK   rR   rU   rR   rR   rS   calculate_constant_result5  s   
z"ExprNode.calculate_constant_resultc                 C      | j tuo	| j tuS rK   r}   constant_value_not_setnot_a_constantrU   rR   rR   rS   r   A     
zExprNode.has_constant_resultc                 C      t | jd d S )NzInvalid compile-time expressionr   r   rV   denvrR   rR   rS   compile_time_valueE     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   rQ   rY   )rV   erR   rR   rS   compile_time_value_errorI  s   z!ExprNode.compile_time_value_errorc                 C   s2   |   r| jS |  }|d ur|S t| jd d S )Nz Exception value must be constant)r   r}   r  r   r   rV   rq   r   rR   rR   rS   as_exception_valueM  s   zExprNode.as_exception_valuec                 C   r  )NzCannot assign to or delete thisr  r   rR   rR   rS   analyse_target_declaration^     z#ExprNode.analyse_target_declarationc                 C   r  )Nz=Cannot use anything except a name in an assignment expressionr  r   rR   rR   rS   0analyse_assignment_expression_target_declarationa  r  z9ExprNode.analyse_assignment_expression_target_declarationc                 C   s   |  |}|  |S rK   )analyse_typescheck_constrV   rq   r   rR   rR   rS   analyse_const_expressionf  s   
z!ExprNode.analyse_const_expressionc                 C   
   |  |S rK   r  r   rR   rR   rS   analyse_expressionso     
zExprNode.analyse_expressionsc                 C   r#  rK   )analyse_target_types)rV   rq   r   rR   rR   rS   analyse_target_expressionu  r&  z"ExprNode.analyse_target_expressionc                 C   s   |  |}||}|S rK   )r  coerce_to_boolean)rV   rq   r   boolrR   rR   rS   analyse_boolean_expression{  s   

z#ExprNode.analyse_boolean_expressionc                 C   s   |  |}|||S rK   )r  r)  coerce_to_simpler!  rR   rR   rS   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   rR   c                       g | ]}|  qS rR   )type_dependenciesr   rx   rR   rS   r         z.ExprNode.type_dependencies.<locals>.<listcomp>)r   sumr   r   rR   rx   rS   r/    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   rV   rq   r   r   rR   rR   rS   r     s   zExprNode.infer_typec                 C   s   | j p| jp| jjp| jjS rK   )r   r   r   is_arrayis_cfunctionrU   rR   rR   rS   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   IntNoderu   r   c_py_ssize_t_typerV   r9  rR   rR   rS   inferable_item_node  s   

zExprNode.inferable_item_nodec                 C   r   rK   rR   r   rR   rR   rS   analyse_as_module     zExprNode.analyse_as_modulec                 C   r   rK   rR   r   rR   rR   rS   analyse_as_type  r@  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)rA  is_fusedfused_to_specific
specializeKeyErrorr   r   )rV   rq   r   rR   rR   rS   analyse_as_specialized_type  s   

z$ExprNode.analyse_as_specialized_typec                 C   r   rK   rR   r   rR   rR   rS   analyse_as_extension_type  r@  z"ExprNode.analyse_as_extension_typec                 C      |  d d S )Nr  r   r   rR   rR   rS   r       zExprNode.analyse_typesc                 C   r#  rK   r$  r   rR   rR   rS   r'       
zExprNode.analyse_target_typesc                 C   s"   | j r| j jr|   d S d S d S rK   )r   rn   	gil_errorr   rR   rR   rS   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   rn   r   r   r   rR   rR   rS   gil_assignment_check  s   zExprNode.gil_assignment_checkc                 C      |    dS NF)	not_constrU   rR   rR   rS   r        zExprNode.check_constc                 C   r  )Nz$Not allowed in a constant expressionr  rU   rR   rR   rS   rQ    r  zExprNode.not_constc                 C   rO  rP  )addr_not_constrU   rR   rR   rS   check_const_addr  rR  zExprNode.check_const_addrc                 C   r  )NzAddress is not constantr  rU   rR   rR   rS   rS    r  zExprNode.addr_not_constc                 C   r   rK   r   rU   rR   rR   rS   result_in_temp  s   zExprNode.result_in_tempc                 C      |   S rK   r   rU   rR   rR   rS   target_code     zExprNode.target_codec                 C   rH  )Nr   rI  rU   rR   rR   rS   r     rJ  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   RuntimeErrorrQ   rY   r   r   is_voidrn   r   r   result_is_usedr   r  	funcstateallocate_tempuse_managed_ref)rV   r   r   rR   rR   rS   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   r&   pathbasenameget_descriptionold_tempr]  rQ   rY   r`  release_temp)rV   r   r   rR   rR   rS   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)rV  
put_increfr   r  rV   r   rR   rR   rS   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)rV  put_incref_memoryviewslicer   r   in_nogil_contextrk  rR   rR   rS   make_owned_memoryviewslice)  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 rK   ) generate_subexpr_evaluation_codemark_posr   r   rc  generate_result_coder   	is_stringis_pyunicode_ptrgenerate_subexpr_disposal_codefree_subexpr_tempsrk  rR   rR   rS   generate_evaluation_code2  s   



z!ExprNode.generate_evaluation_codec                 C      |   D ]}|| qd S rK   )r   ry  rV   r   r   rR   rR   rS   rr  C     z)ExprNode.generate_subexpr_evaluation_codec                 C   rH  )Nrt  rI  rk  rR   rR   rS   rt  G  rJ  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.cpprm  )r   r   r   r   r   r   r   ru  rv  rw  rx  r   put_decref_clearr  rp  rk  rR   rR   rS   generate_disposal_codeJ  s   



zExprNode.generate_disposal_codec                 C   rz  rK   )r   r  r{  rR   rR   rS   rw  Z  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   ru  rv  rw  rx  rn   r   r   r   r   r   r   r   r   rk  rR   rR   rS   generate_post_assignment_code`  s   

z&ExprNode.generate_post_assignment_codec                 C   r   rK   rR   )rV   r   r   overloaded_assignmentr   r   rR   rR   rS   generate_assignment_coder     z!ExprNode.generate_assignment_codec                 C   r   rK   rR   rV   r   ignore_nonexistingrR   rR   rS   generate_deletion_codey  r  zExprNode.generate_deletion_codec                 C   s.   | j r| jjs| | d S d S | | d S rK   )r   r   r^  ri  rx  rk  rR   rR   rS   
free_temps  s
   zExprNode.free_tempsc                 C   rz  rK   )r   r  )rV   r   subrR   rR   rS   rx    r|  zExprNode.free_subexpr_tempsc                 C   r   rK   rR   rV   rq   r   rR   rR   rS   generate_function_definitions  rX   z&ExprNode.generate_function_definitionsc                 C      | |  |  | d S rK   )put_decref_setr   r  rV   r   r   rR   rR   rS   generate_decref_set     zExprNode.generate_decref_setc                 C   r  rK   )put_xdecref_setr   r  r  rR   rR   rS   generate_xdecref_set  r  zExprNode.generate_xdecref_setc                 C   sB   |r| j s|r| jr|r| | d S ||  |   d S d S rK   )
cf_is_nullcf_maybe_nullgenerate_xgotref
put_gotrefr   r  )rV   r   handle_nullmaybe_null_extra_checkrR   rR   rS   generate_gotref  s   

zExprNode.generate_gotrefc                 C      | |  |   d S rK   )put_xgotrefr   r  rk  rR   rR   rS   r       zExprNode.generate_xgotrefc                 C   r  rK   )put_giverefr   r  rk  rR   rR   rS   generate_giveref  r  zExprNode.generate_giverefc                 C   r  rK   )put_xgiverefr   r  rk  rR   rR   rS   generate_xgiveref  r  zExprNode.generate_xgiverefc                 C   rz  rK   )r   annotater{  rR   rR   rS   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 )ro   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_typerB  r4  is_ptr	base_type"get_all_specialized_function_typessame_asr   usedr   r   is_null_ptrr1   coercion_typeNameNode	coerce_tor   r  r  rn   CoerceToMemViewSliceNoder3  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<   r:   r   r   CoerceFromPyTypeNode
is_complexassignable_fromCoerceToComplexNoder   soft_complex_typecoerce_from_soft_complexru   fail_assignment)rV   dst_typerq   srcsrc_typeused_as_reference	signaturer   r  msgtuprR   rR   rS   r    s   



FDB4/-
!



	,
zExprNode.coerce_toc                 C   s   t | dr	| jjnd }| jjrd| j  dnd}|jr%d|  dnd}|| j|}t| jd| j d| d| d| |rBdnd | 
 d S )	Nr   z (alias of 'z')r  zCannot assign type ''z to '.)	hasattrr   ro   r   
is_typedefresolveassignment_failure_extra_infor   r   )rV   r  src_namesrc_resolveddst_resolvedextra_diagnosticsrR   rR   rS   r  7  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  )rV   r  rq   failrp   messagerR   rR   rS   r  B  s   
z!ExprNode.check_for_coercion_errorc                 C      |  tj|S rK   )r  r   r   r   rR   rR   rS   coerce_to_pyobjectN  rJ  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_typern   r  r  is_floatCoerceToBooleanNoder   scopelookupSimpleCallNodeAttributeNoder	   EncodedStringr  	is_ctupler   
componentsr   )rV   rq   
bool_valuer   rR   rR   rS   r)  Q  s:   


zExprNode.coerce_to_booleanc                 C   s   | j jr| S | tj|S rK   )r   r  r  r   r<  r   rR   rR   rS   coerce_to_indexp  s   zExprNode.coerce_to_indexc                 C   s   |   r| S t| |S rK   )rV  CoerceToTempNoder   rR   rR   rS   coerce_to_tempt     
zExprNode.coerce_to_tempc                 C   s   |   r| S | |S rK   )	is_simpler  r   rR   rR   rS   r,  {  r  zExprNode.coerce_to_simplec                 C   rW  rK   )rV  rU   rR   rR   rS   r    s   zExprNode.is_simplec                 C   s    z|   W S  ty   Y dS w rP  )r  	ExceptionrU   rR   rR   rS   try_is_simple  s
   
zExprNode.try_is_simplec                 C   s0   | j r| j js| j jsdS |  r| jd uS dS NFT)r   rn   r   r   r}   rU   rR   rR   rS   may_be_none  s   
zExprNode.may_be_nonec                 C   r   rK   rR   rU   rR   rR   rS   as_cython_attribute  rX   zExprNode.as_cython_attributePyExc_TypeErrorrR   c                 C   s   |   rt| |||S | S rK   )r  NoneCheckNode)rV   r  r   format_argsrR   rR   rS   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   )rO   r   kwargs
attributes	attr_namer   rR   rR   rS   	from_node  s   
zExprNode.from_nodec                 C   rT   )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.
        NrR   rU   rR   rR   rS   !get_known_standard_library_import  s   z*ExprNode.get_known_standard_library_importFrK   r   FNN)FTFN)r   rR   )zrY   rZ   r[   r	  r   
annotationr   rg  rb  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_targetr   r  r}   r)   implementationro   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+  r-  r/  r   r5  r>  r?  rA  rF  rG  r  r'  rM  rN  r   rQ  rT  rS  rV  rY  r   rc  ri  rl  rq  ry  rr  rt  r  rw  r  r  r  r  rx  r  r  r  r  r  r  r  r  r  r  r  r  r)  r  r  r,  r  r  r  r  r  classmethodr  r	  rR   rR   rR   rS   r   &  s    s


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


	 	


r   c                       s   e Zd ZdZdgZdZ f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d Zdd Z  ZS ) _TempModifierNodez[Base class for nodes that inherit the result of their temp argument and can modify it.
    argFc                    s   t  j||d d S Nr  )rM   __init__rV   r   r  rP   rR   rS   r"       z_TempModifierNode.__init__c                 C      | j jS rK   r  r   rU   rR   rR   rS   r     rZ  z_TempModifierNode.typec                 C      | j |S rK   r  r   r   rR   rR   rS   r        z_TempModifierNode.infer_typec                 C      | j || _ | S rK   )r  r  r   rR   rR   rS   r       z_TempModifierNode.analyse_typesc                 C   
   | j  S rK   )r  r  rU   rR   rR   rS   r    rK  z+_TempModifierNode.calculate_constant_resultc                 C   r,  rK   r  r  rU   rR   rR   rS   r    rK  z_TempModifierNode.may_be_nonec                 C   r,  rK   r  r  rU   rR   rR   rS   r    rK  z_TempModifierNode.is_simplec                 C   r,  rK   r  rV  rU   rR   rR   rS   rV    rK  z _TempModifierNode.result_in_tempc                 C   r,  rK   r  r5  rU   rR   rR   rS   r5    rK  z&_TempModifierNode.nonlocally_immutablec                 C   r,  rK   r  r   rU   rR   rR   rS   r     rK  z'_TempModifierNode.calculate_result_codec                 C   r   rK   rR   rk  rR   rR   rS   rt    rX   z&_TempModifierNode.generate_result_codec                 C      | j | d S rK   r  r  rk  rR   rR   rS   r    r  z/_TempModifierNode.generate_post_assignment_codec                 C   r'  rK   )r  rc  rk  rR   rR   rS   rc    r)  z&_TempModifierNode.allocate_temp_resultc                 C   r2  rK   r  r  rk  rR   rR   rS   r    r  z_TempModifierNode.free_temps)rY   rZ   r[   __doc__r   r   r"  r  r   r   r  r  r  r  rV  r5  r   rt  r  rc  r  r\   rR   rR   rP   rS   r    s&    
r  c                   @   s    e Zd Zg Zdd Zdd ZdS )AtomicExprNodec                 C   r   rK   rR   rk  rR   rR   rS   rr    rX   z/AtomicExprNode.generate_subexpr_evaluation_codec                 C   r   rK   rR   rk  rR   rR   rS   rw     rX   z-AtomicExprNode.generate_subexpr_disposal_codeN)rY   rZ   r[   r   rr  rw  rR   rR   rR   rS   r6    s    r6  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   rT   Nr*   rR   rU   rR   rR   rS   r    rX   zPyConstNode.is_simplec                 C   rT   rP  rR   rU   rR   rR   rS   r    rX   zPyConstNode.may_be_nonec                 C      | S rK   rR   r   rR   rR   rS   r    rX   zPyConstNode.analyse_typesc                 C   r   rK   r   rU   rR   rR   rS   r        z!PyConstNode.calculate_result_codec                 C   r   rK   rR   rk  rR   rR   rS   rt    rX   z PyConstNode.generate_result_code)rY   rZ   r[   r   r   r   rM  r  r  r  r   rt  rR   rR   rR   rS   r7    s    r7  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   rK   rR   r  rR   rR   rS   r  #  rX   zNoneNode.compile_time_valuec                 C   rT   NTrR   rU   rR   rR   rS   r  &  rX   zNoneNode.may_be_nonec                    s0   |j s|js|jst| jd|  t ||S )NzCannot assign None to %s)rn   r   r  r   r   rM   r  rV   r  rq   rP   rR   rS   r  )  s   zNoneNode.coerce_to)
rY   rZ   r[   r  r   r}   r  r  r  r\   rR   rR   rP   rS   r    s    r  c                   @      e Zd ZdZeZdd ZdS )EllipsisNodePy_Ellipsisc                 C      t S rK   )Ellipsisr  rR   rR   rS   r  7  rX   zEllipsisNode.compile_time_valueN)rY   rZ   r[   r   rC  r}   r  rR   rR   rR   rS   r@  0  s    r@  c                   @   sd   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eefddZdS )	ConstNoder*   Nc                 C   rT   r8  rR   rU   rR   rR   rS   r  C  rX   zConstNode.is_simplec                 C   rT   r8  rR   rU   rR   rR   rS   r5  F  rX   zConstNode.nonlocally_immutablec                 C   rT   rP  rR   rU   rR   rR   rS   r  I  rX   zConstNode.may_be_nonec                 C   r9  rK   rR   r   rR   rR   rS   r  L  rX   zConstNode.analyse_typesc                 C   rT   r=  rR   rU   rR   rR   rS   r   O  rX   zConstNode.check_constc                 C   rW  rK   rX  rU   rR   rR   rS   r  R     z$ConstNode.get_constant_c_result_codec                 C   
   t | jS rK   )ru   r   rU   rR   rR   rS   r   U  rK  zConstNode.calculate_result_codec                 C   r   rK   rR   rk  rR   rR   rS   rt  X  rX   zConstNode.generate_result_codec                 C   s   t }|tju s|dks|dkr|jrt| S |jstjrt}n|jr%t	}n|t
u r,t}n|tu r2t}|j|u r@|| ||d}|S || |||d}|S )NNULLr   r  r   r   r}   )rD  r   c_null_ptr_typer  NullNoder  r  r;  r  	FloatNoder   	BytesNoder   UnicodeNoder   )r   r   r   r}   rO   r   rR   rR   rS   for_type[  s"   

zConstNode.for_type)rY   rZ   r[   r   rM  r  r5  r  r  r   r  r   rt  staticmethodr  rN  rR   rR   rR   rS   rD  ;  s    rD  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 rK   r  rU   rR   rR   rS   r  z  r)  z"BoolNode.calculate_constant_resultc                 C   r   rK   r:  r  rR   rR   rS   r  }  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   rn   r   ru   r~   rU   rR   rR   rS   r        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 Nr6  )r   r   r   	bool_typern   r  r  r   r   r}   r   r  rD  r  r>  rR   rR   rS   r    s"   
zBoolNode.coerce_toN)
rY   rZ   r[   r   r  r   r  r  r   r  rR   rR   rR   rS   r  v  s    r  c                   @   s"   e Zd ZejZdZdZdd ZdS )rJ  rG  r   c                 C   r   rK   r:  rU   rR   rR   rS   r    r;  z#NullNode.get_constant_c_result_codeN)	rY   rZ   r[   r   rI  r   r   r}   r  rR   rR   rR   rS   rJ    s
    rJ  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 rK   )ordr   r}   rU   rR   rR   rS   r    r  z"CharNode.calculate_constant_resultc                 C   rF  rK   )rW  r   r  rR   rR   rS   r    rK  zCharNode.compile_time_valuec                 C   s   dt | j S )Nz'%s')r	   escape_charr   rU   rR   rR   rS   r     r  zCharNode.calculate_result_codeN)	rY   rZ   r[   r   r   r   r  r  r   rR   rR   rR   rS   r     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 rK   )r   strip_py2_long_suffixhexstr_to_numberr   rU   rR   rR   rS   	hex_value     zIntNode.hex_valuec                 C   s   t t| jS rK   )ru   r   r[  r   rU   rR   rR   rS   base_10_value  r  zIntNode.base_10_valuec                 K   s.   t j| |fi | d|vr|  | _d S d S )Nr   )r   r"  find_suitable_type_for_valuer   )rV   r   kwdsrR   rR   rS   r"    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LLr5   r*   r~   i   l        )r}   r  r  r   is_c_literalr   unsignedlongnessr   modifiers_and_name_to_typer   widest_numeric_typer  c_long_typer   int_type)rV   ranksuitable_typerR   rR   rS   r_    s2   


z$IntNode.find_suitable_type_for_valuec              	   C   s   | j |u r| S |js|tju r.|  r$t| jdt| j |t	| jdS t| j| j
|tdS |jrF|jsFt| j| j
| j|d| j| jd}|S |jr[t| j| j
| jtjd| j| jd}nt| j| j
| j| j| jd}t|||S )Nz%d.0rH  T)r   r}   r   rb  rc  rd  F)r   r}   rc  rd  )r   r  r   
float_typer   rK  r   r~   r}   r   r   r  
is_numericr  r;  rc  rd  rn   rh  rD  r  rV   r  rq   r   rR   rR   rS   r    s2   
zIntNode.coerce_toc                 C   s    t | j| j| jtj| j| jdS )N)r   r}   r   rc  rd  )r;  r   r   r}   r   r  rc  rd  r   rR   rR   rS   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   rn   r   r[  r   rZ  ru   rY  
get_py_intrd  result_coder  )rV   r   r   	formatterplain_integer_stringrR   rR   rS   ry    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*   0ra  L)	rc  rd  value_as_c_integer_stringr   r  ri  r   c_longlong_typerg  )rV   rc  rd  literalrR   rR   rS   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 )Nr5   r  r   rr  r*   rs  oOxX0123456789oObBz0x%X)	r   r   isdigitru   r   r[  r~   rc  rd  )rV   r   neg_signliteral_typerR   rR   rS   ru    s,   
z!IntNode.value_as_c_integer_stringc                 C   r   rK   ro  rU   rR   rR   rS   r   ;  r;  zIntNode.calculate_result_codec                 C   s   t | j| _d S rK   )r   r[  r   r}   rU   rR   rR   rS   r  >  r   z!IntNode.calculate_constant_resultc                 C      t | jS rK   )r   r[  r   r  rR   rR   rS   r  A  r)  zIntNode.compile_time_value)rY   rZ   r[   rc  rd  rb  r  r\  r^  r"  r_  r  r)  ry  r  ru  r   r  r  rR   rR   rR   rS   r;    s$    

r;  c                   @   sB   e Zd ZejZdd Zdd Zdd Zdd Z	d	d
 Z
dd ZdS )rK  c                 C   rV  rK   )r   r   r}   rU   rR   rR   rS   r  G  r  z#FloatNode.calculate_constant_resultc                 C   sN   t | j}d| d}t| j}||t|dfvr%t| jd|  |S )Nz%.330frs  zEUsing this floating point value with DEF may lose precision, using %r)	r   r   stripr   normalise_float_reprreprlstripr   r   )rV   r  float_valuestr_float_value	str_valuerR   rR   rS   r  J  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 rT  )rn   r   r  rK  r   r   r}   r   rk  rD  r  r>  rR   rR   rS   r  R  s   zFloatNode.coerce_toc                 C   r   rK   r~  rU   rR   rR   rS   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|   ru   r  r   )rV   strvalcmpvalrR   rR   rS   r  b  s   z$FloatNode.get_constant_c_result_codec                 C   s.   |   }| jjr|| j|| _d S || _d S rK   )r  r   rn   get_py_floatr   ro  )rV   r   c_valuerR   rR   rS   ry  o  s   
z"FloatNode.generate_evaluation_codeN)rY   rZ   r[   r   c_double_typer   r  r  r  r   r  ry  rR   rR   rR   rS   rK  D  s    rK  c           
   	   C   sl  t | }|d ur|jr|S | }|| }|r-|jr-|j}|r)|js'|jr)|S |p,|}ddlm} t	ddt |d |d |d d f}z|d|  |d j
|d	}W n	 ty]   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 )
Nr*   )TreeFragmentTignorer   r5      
sizeof(%s))ro   initial_pos)r   parse_basic_typein_c_type_contextglobal_scoper  is_typer   rn   r  r   filenamer   rootstatsexprr|   SizeofTypeNoder  arg_type)
ro   r   rq   r  r  global_entryr   r  declarationsizeof_noderR   rR   rS   _analyse_name_as_typew  sP   










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 )rL  Tc                 C   rP  rK   r  rU   rR   rR   rS   r    r)  z#BytesNode.calculate_constant_resultNc                 C   s,   t | j||| | jj}t| j||dS Nr  )r	   bytes_literalr   encodingrL  r   )rV   r   r   r   r   rR   rR   rS   as_sliced_node  s   zBytesNode.as_sliced_nodec                 C   r,  rK   )r   
byteencoder  rR   rR   rS   r    rK  zBytesNode.compile_time_valuec                 C   s   t | jd| j|S )Nz	ISO8859-1)r  r   decoder   r   rR   rR   rS   rA       zBytesNode.analyse_as_typec                 C      t | jdkS r8  r   r   rU   rR   rR   rS   can_coerce_to_char_literal  rJ  z$BytesNode.can_coerce_to_char_literalc                 C      t | j}t| j||dS r  r*  r   r  r   rV   rq   r  rR   rR   rS   r)    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   rW  rL  r}   rn   r   r   r   r  r   r/   rl   rk   rm   c_void_ptr_typeCastNoder  r   is_constrD  r  rm  rR   rR   rS   r    s@   


zBytesNode.coerce_toc                 C   sP   | j jr|| j}n| j jr|| j}n| j }t| j tj	|}|| _
d S rK   )r   rn   get_py_string_constr   r  get_string_constas_c_string_literalr0   r   r  ro  )rV   r   r   rw  rR   rR   rS   ry    s   

z"BytesNode.generate_evaluation_codec                 C   r   rK   rR   rU   rR   rR   rS   r    rX   z$BytesNode.get_constant_c_result_codec                 C   r   rK   r~  rU   rR   rR   rS   r     r;  zBytesNode.calculate_result_coderK   )rY   rZ   r[   r  r   r   r  r  r  rA  r  r)  r  ry  r  r   rR   rR   rR   rS   rL    s    
&rL  c                       s   e Zd ZdZdZdZeZd fdd	Zdd Z	dd Z
dd	d
Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Z  ZS )rM  TNc                    sB   t  j|||d |d ur|| _|d ur|tur|| _d S d S d S r  )rM   r"  bytes_valuer   r   )rV   r   r   r  r   rP   rR   rS   r"    s   
zUnicodeNode.__init__c                 C   rP  rK   r  rU   rR   rR   rS   r    r)  z%UnicodeNode.calculate_constant_resultc                 C   s   t | j| j|S rK   )r  r   r   r   rR   rR   rS   rA    r  zUnicodeNode.analyse_as_typec                 C   sX   t | j||| | jj}| jd ur"t | j||| | jj}nd }t| j||dS )N)r   r  )r	   encoded_stringr   r  r  r  rM  r   )rV   r   r   r   r   r  rR   rR   rS   r  
  s   
zUnicodeNode.as_sliced_nodec              	   C   sV  || j u r	 | S |jr'|  st| jd | S t| j}t| j|t||dS |j	r3t
| j| j|dS |js|jsF|jsF|jsF|jr|jjr| jd urWt| j| jd||S |jd r~z| j|jd }W n ttfyr   Y nw t| j|d||S | j rt| jt| jdd||S t| jd | S |tur| 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:  r]   re   zUnicode literals do not support coercion to C types other than Py_UCS4/Py_UNICODE (for characters), Py_UNICODE* (for strings) or char*/void* (for auto-encoded strings).Tr  )r   r  r  r   r   rW  r   r;  ru   rv  rM  rn   ru  is_cpp_stringr  r  r  r^  r  rL  r  ri   encodeUnicodeEncodeErrorLookupErrorisasciir	   BytesLiteralr   r  )rV   r  rq   	int_valuebyte_stringrR   rR   rS   r    sR   
"



zUnicodeNode.coerce_toc                 C   r  r8  r  rU   rR   rR   rS   r  :  rJ  z&UnicodeNode.can_coerce_to_char_literalc                 C   r  r  r  r  rR   rR   rS   r)  =     
zUnicodeNode.coerce_to_booleanc                 C   s8   | j  rdS tt| j }|dkrdS |dkrdS dS )N      i  i )r   r  rW  max)rV   max_charvalrR   rR   rS   estimate_max_charvalA  s   
z UnicodeNode.estimate_max_charvalc                 C   r  rK   )r	   string_contains_surrogatesr   rU   rR   rR   rS   contains_surrogatesM  r)  zUnicodeNode.contains_surrogatesc              
   C   s   | j jrat| jrL|d| _|t| j	d}|
| j}|d u r(d S || j |d| j|||| j| jf  || jd| j  d S | jrX|| 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   rn   r	   string_contains_lone_surrogatesr   get_py_constro  r  r  r  get_cached_constants_writerrs  r   r   r   put_error_if_negis_identifierintern_identifierr  get_pyunicode_ptr_const)rV   r   
data_cname
const_coderR   rR   rS   ry  P  s2   z$UnicodeNode.generate_evaluation_codec                 C   r   rK   r~  rU   rR   rR   rS   r   k  r;  z!UnicodeNode.calculate_result_codec                 C   r   rK   r:  r  rR   rR   rS   r  n  r;  zUnicodeNode.compile_time_valueNNrK   )rY   rZ   r[   r  r  r  r   r   r"  r  rA  r  r  r  r)  r  r  ry  r   r  r\   rR   rR   rP   rS   rM    s"    

&rM  c                   @   s   e Zd ZdZdS )IdentifierStringNodeTN)rY   rZ   r[   r  rR   rR   rR   rS   r  r  s    r  c                   @   sN   e Zd ZejZdd Zdd Zdd Zdd Z	d	d
 Z
dZdd Zdd ZdS )ImagNodec                 C   s   t dt| j| _d S Ng        )complexr   r   r}   rU   rR   rR   rS   r  ~  r  z"ImagNode.calculate_constant_resultc                 C   s   t dt| jS r  )r  r   r   r  rR   rR   rS   r    r  zImagNode.compile_time_valuec                 C   s   | j | | S rK   )r   create_declaration_utility_coder   rR   rR   rS   r       zImagNode.analyse_typesc                 C   rT   rP  rR   rU   rR   rR   rS   r    rX   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   rn   r   r   complex_typer6  r  rm  rR   rR   rS   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   rn   r   
from_partsr   r   rU   rR   rR   rS   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   rn   r   r   r   r   r   r   r  rk  rR   rR   rS   rt    s   zImagNode.generate_result_codeN)rY   rZ   r[   r   c_double_complex_typer   r  r  r  r  r  gil_messager   rt  rR   rR   rR   rS   r  w  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)cppclassrA  r   r   r   r1   r   	cpp_checkget_constructor
class_typer   )rV   rq   r   constructorrR   rR   rS   r     s   
zNewExprNode.infer_typec                 C   s   | j d u r
| | | S rK   )r   r   r   rR   rR   rS   r    s   

zNewExprNode.analyse_typesc                 C   rT   rP  rR   rU   rR   rR   rS   r    rX   zNewExprNode.may_be_nonec                 C   r   rK   rR   rk  rR   rR   rS   rt    rX   z NewExprNode.generate_result_codec                 C   s   d| j   S )Nznew )r  empty_declaration_coderU   rR   rR   rS   r     rJ  z!NewExprNode.calculate_result_code)	rY   rZ   r[   r   r   r  r  rt  r   rR   rR   rR   rS   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Zdd Zdd	 Zd
d Zdd Zdd Z fddZdQddZdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Z d(Z!dQd)d*Z"d+d, Z#d-d. Z$d/d0 Z% fd1d2Z&d3d4 Z'd5d6 Z(d7d8 Z)d9d: Z*d;d< Z+d=d> Z,d?d@ Z-dAdB Z.dCdD Z/		dRdEdFZ0dGdH Z1dIdJ Z2dQdKdLZ3dMdN Z4dOdP Z5  Z6S )Sr  TFNr   r  c                 C   r   rK   )cython_attributerU   rR   rR   rS   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 NrR   )r   r  ro   r   is_unspecifiedr   rR   rR   rS   r/    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t
u rJ| j | j jj krJ| jdv rJt	S | j jjr]| j jjrVtS t| j jS | j jjrp| jrp| jjrm| j jsp| jS | j jS )N)rv   
basestring)r   r  ro   r   r2   inferred_typer   is_extension_typeis_builtin_typer   r   r4  r  is_builtin_scoper   CPtrTypern   r  might_overflowr   rR   rR   rS   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  ro   rE  r   r   r  rR   rR   rS   r    s
   zNameNode.compile_time_valuec                 C   s   | j r| j jjr
d S | j jS rK   )r   r   rn   r   rU   rR   rR   rS   r    s   z#NameNode.get_constant_c_result_codec                    sp   |t u r1| j}|r1|jr1|j}|r1|jr|jr||j| j}t	| j| jd}||_|
| |S t ||S )Nro   )r   r   r4  as_variable
is_builtinr  declare_builtinro   r   r  analyse_rvalue_entryrM   r  )rV   r  rq   r   	var_entryr   rP   rR   rS   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.
        NrR   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?r5   )is_cdef
visibilitypytyping_modifiers)ro   r  r   lookup_hereis_module_scoper  r  ri   is_py_class_scoper   analyse_type_annotationr2   rB  rC  rD  r+   r   r   r1   is_c_dataclass_scopern   can_coerce_to_pyobjectis_c_class_scoper  r   declare_var)
rV   rq   	as_targetro   r  r   	modifiersatyper  	is_frozenrR   rR   rS   declare_from_annotation6  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 rK   )r   r  ro   	as_moduleknown_standard_library_importr   'get_known_standard_library_module_scoper  )rV   rq   r   r  rR   rR   rS   r?  v  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}|rE|jrE|j}|jrC|jrC|j}|S | jdkrLtS |jsat| jrat| jd| j| jf  d S )NobjectzOFound C type name '%s' in a Python annotation. Did you mean to use 'cython.%s'?)r  r   r  r  ro   r   r  r  r  r    get_known_standard_library_entryr   rn   equivalent_typer   r   r   r2  rR   rR   rS   rA    s,   

zNameNode.analyse_as_typec                 C   s:   | j }|s|| j}|r|jr|jjs|jjr|jS d S rK   )r   r  ro   r  r   r  r  rV   rq   r   rR   rR   rS   rG    s   
z"NameNode.analyse_as_extension_typec                 C      | j |ddS )NFis_assignment_expression_analyse_target_declarationr   rR   rR   rS   r    rJ  z#NameNode.analyse_target_declarationc                 C   r  )NTr  r  r   rR   rR   rS   r    rJ  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_targetro   r  r  r  r  r  is_inheritedr   r   ri   r   r2   r   $declare_assignment_expression_targetr
  is_declared_genericr	  r  is_variable)rV   rq   r  is_dataclassr   rR   rR   rS   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)ri   initialized_checkr   r  ro   r  r   r  r  r   r   r1   r   r  	is_bufferr  r$  used_buffer_aux_varsr  rV   rq   r   r$  rR   rR   rS   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| _|  s9t| j	d| j
  tj| _d|_|jjrKddlm} || | S )NTr  zAssignment to non-lvalue '%s'r*   r#  )analyse_entryr   r4  r  is_overridabler   r   fused_cfunctionr   r   ro   r   r1   r  r&  r  r$  r'  r(  rR   rR   rS   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   rb  r  rR   rR   rS   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  rL  r-  r  rR   rR   rS   rM  	  s   zNameNode.nogil_checkz"Accessing Python global or builtinc                 C   sd   |    | j}|j}|s|jr| jr| jjr| j}|| _|jjr.|js&|j	r0|
d| _d S d S d S Nr  )check_identifier_kindr   r   rn   r  r  r  r  r-  is_cclass_var_entryname_in_module_statemodule_state_lookup)rV   rq   r  r   r   rR   rR   rS   r*   	  s   zNameNode.analyse_entryc                 C   s   | j }|jr|jjr|| _|jr0|jjs|jjr0|jr0t	| j
d t}d|_| j j|_|| _ d S |jsX|jsZ|js\|js^|js`| j jrJ| j j| _ d S | jsbt| 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_enumcreate_wrapperr   Entryro   r   r-  r  r  r   r  r4  r   r  is_cython_moduler   r   )rV   r   py_entryrR   rR   rS   r0  /	  s*   

zNameNode.check_identifier_kindc                 C   s0   | j s| jrdS | jp|| j}|jo|j S rP  )r8  r  r   r  ro   r  r   r  rR   rR   rS   "is_cimported_module_without_shadowC	  s   z+NameNode.is_cimported_module_without_shadowc                 C   rT   r8  rR   rU   rR   rR   rS   r  I	     zNameNode.is_simplec                    sl   | 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  S )N_none_checkingFT)	r   r   rn   r   r   r<  r   r  rM   )rV   r  
assignmentrP   rR   rS   r  M	  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   r5  r   
in_closureis_localis_argr  is_readonlyrV   r   rR   rR   rS   r5  b	  s   

zNameNode.nonlocally_immutablec                 C   r   rK   rR   r   rR   rR   rS   calculate_target_resultsj	  rX   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  r4  r  r   rQ  rC  rR   rR   rS   r   m	  s   zNameNode.check_constc                 C   s(   | j }|js|js|js|   dS dS r  )r   
is_cglobalr4  r  rS  rC  rR   rR   rS   rT  x	  s
   zNameNode.check_const_addrc                 C   s"   | j jo| j j p| j jo| j jS rK   )r   r   rB  r4  r+  rU   rR   rR   rS   r   	  s   zNameNode.is_lvaluec                 C   s   | j jo| jj S rK   )r   r   r   r   rU   rR   rR   rS   r   	  r   zNameNode.is_addressablec                 C   rT   r   rR   rU   rR   rR   rS   r   	  r@  zNameNode.is_ephemeralc                 C   s2   | j }|sdS | j jr| jsd|j S | j|j S )N<error>(*%s))r   is_cpp_optionalr  r   r3  rC  rR   rR   rS   r   	  s   
zNameNode.calculate_result_codec                 C   st  | 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r2|jjr2|jjsJ d|	| j j
}|jjr|jtdd |d|  |||  | jf  n/||j}| j jj}|jtdd |d|  |rdnd||||  | jf  | | d S |jsC|jsC|jsC|jjr| jsK| joN| j  }|jjoV| j!}|j"o]| j!}	|	ri|j#|j$}
n|j%|j$}
|
r|r|jjs|s|	r|j&| j|| j'|
d d S d S d S d S |j(r|j"r| j!r|j#|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); %sz(PyObject*)r  unbound_check_code))r   utility_coder   r   r  r  is_pyclass_attrr   rn   r  ro   r   builtins_cnamer  namespace_cnamer  r   r   r   r   r   r   r  r  r-  namespace_cname_in_module_statenamespace_cname_is_typer@  r?  from_closurer   r  
allow_nullr%  rH   cpp_optional_check_for_null_coder   check_for_null_codeput_error_if_unboundrp  rE  )rV   r   r   interned_cname	namespacerU  rW  raise_unboundmemslice_checkoptional_cpp_checkrQ  rR   rR   rS   rt  	  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j}	d}
|jrQd}d}
|jtdd n.|jjr^d}|tj}n!|jry| jd	krhd
nd}|jt|d d| }nJ t||	r|
sd| d}|
r|	sJ || jd|||| f  trtd td|  || | | d S | jj!r| "|| n
| jj#r| $|| d}| jj%rd}| jj
r1| j&r1|'| |j(p| j j)p| j j*}|r| j+|dd d}|j(r| ,||-| .  n"| j/s'| j0r| 1||-| .  n| ,||-| .  nd}|r1|2| | jj!s|s|rl|3 }|dkr`t4|| jd| 5 |f | jj
rY| 5 nd || j6 n:|7d| 5 |f  n.|8| . }t9| jr|7d| 5 | 5 |f  n|| 5 kr|7d| 5 |f  trtd td|  |:| n
|; r|:| | | d S )Nz?Literal list must be assigned to pointer at time of declarationrI  F__Pyx_SetItemOnTypeDictTSetItemOnTypeDictzExtensionTypes.cPyDict_SetItemrN   SetNewInClassSetNameInClassrM  __Pyx_z((PyObject*))z%s(%s, %s, %s)z"NameNode.generate_assignment_code:z"...generating disposal code for %s)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-  rn   r  ro   rV  r  rW  	is_memberr   r   r   r   r  r2  r   moddict_cnamerS  r  r  r   r   printr  r  r    generate_acquire_memoryviewslicer&  generate_acquire_bufferr  rb  rl  rE  r?  rX  r  r  r   r  r  r  r  r  r   r   r   rp  r   r  r<   r  rV  )rV   r   r   r  r   r   r   r]  r^  namespace_is_typenamespace_needs_typesetternassignedis_external_refr   rR   rR   rS   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   rn  first_assignmentN)r  r  put_acquire_memoryviewslicer   r   r   rp  r  )rV   r   r   r  rR   rR   rS   rq  n
  s   
z)NameNode.generate_acquire_memoryviewslicec                 C   s   t |tp| }|r||  }n|jj| jjdd}|	d|||  f  ddl
m} |j|  || j| j | j|d |sS|	d|  |j| d S d S )NFr[  ri  r*   r#  )is_initializedr   r   r  )r|   r  rV  r   r  r`  ra  r   r   r   r  r$  put_assign_to_bufferr   rl  r   rh  )rV   r   r   
pretty_rhsrhstmpr$  rR   rR   rS   rr  ~
  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 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 }PyObjectSetAttrStrrM  !__Pyx_PyObject_DelAttrStr(%s, %s)zjif (unlikely(%s < 0)) { if (likely(PyErr_ExceptionMatches(PyExc_AttributeError))) PyErr_Clear(); else %s }T)r  r  rm  z!Deletion of C names not supported) r   rS  r  rU  r  ro   r   r   r   r-  r   r   r   r   r   module_cnamer  r   rn   r   r  r  r\  rp  r?  r  put_xdecref_clearr   r  r   r  r   )rV   r   r  r^  r]  key_error_codedel_coderR   rR   rS   r  
  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*   r5   )py_callzpython function (%s))c_callzc function (%s)size)r   r   r   ro   r   rn   r  r6   )rV   r   r   styletextrR   rR   rS   r  
  s   *
&zNameNode.annotatec                 C   s   | j r| j jS d S rK   )r   r  rU   rR   rR   rS   r	  
  s   z*NameNode.get_known_standard_library_importr
  r  )7rY   rZ   r[   r   r8  r  rl  r.  r   r4  r  r  rY  r   r  r3  r  r/  r   r  r  r  r  r?  rA  rG  r  r  r  r  r'  r  rM  r  r*  r0  r:  r  r  r5  rD  r   rT  r   r   r   r   rt  r  rq  rr  r  r  r	  r\   rR   rR   rP   rS   r    sl    !
@#

	^
x
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 )
BackquoteNoder  c                 C   s&   | j || _ | j || _ d| _| S r8  )r  r  r  r   r   rR   rR   rS   r  
  s   zBackquoteNode.analyse_typeszBackquote expressionc                 C      t | jj| _d S rK   )r  r  r}   rU   rR   rR   rS   r  
  r   z'BackquoteNode.calculate_constant_resultc              	   C   s:   | d|  | j ||  | jf  | | d S )Nz%s = PyObject_Repr(%s); %s)r   r   r  r   r   r   r  rk  rR   rR   rS   rt  
  s   z"BackquoteNode.generate_result_codeN)
rY   rZ   r[   r   r   r   r  r  r  rt  rR   rR   rR   rS   r  
  s    r  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s/J  jr@ j	|}|
| _ S d jjv rbt jj fddttj jjdD d	| _ S )N
py2_importr   r  c                    s   g | ]
}t  jj|d qS r:  )r  r  r   r_   partrU   rR   rS   r          z,ImportNode.analyse_types.<locals>.<listcomp>r   )r{   r  parent_moduleri   r7   absolute_importcontextfuture_directivesr  r  r  r  r  r   	TupleNoder   mapr	   r  r  r  )rV   rq   r  r  rR   rU   rS   r    s*   

zImportNode.analyse_typeszPython importc              	   C   s  | 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 }|d|  |||  | jf  | | d S )Nr   ImportDottedModulezImportExport.c__Pyx_ImportDottedModuleImportDottedModuleRelFirst __Pyx_ImportDottedModuleRelFirst
%s(%s, %s)rG  Importz__Pyx_Import(%s, %s, %d)rs  %s = %s; %s)r  r  r   r{   r  get_top_level_moduler  r   r   r   r   r   r   r   r   r   r   r  )rV   r   r  rR  helper_funcimport_coderR   rR   rS   rt  (  s8   
zImportNode.generate_result_codec                 C   r%  rK   )r  r   rU   rR   rR   rS   r	  H  rE  z,ImportNode.get_known_standard_library_import)rY   rZ   r[   r   r   r  r  r   r   r  r  rt  r	  rR   rR   rR   rS   r  
  s     r  c                       sZ   e Zd Zg ZdZdZdddZdd Zdd Zd	d
 Z	dd Z
 fddZdd Z  ZS )ScopedExprNodeNTc                 C   s<   |d ur	|| _ d S | jrt|| _ d S | j sd | _ d S d S rK   )
expr_scopehas_local_scoper   ComprehensionScope)rV   outer_scoper  rR   rR   rS   
init_scope[  s   

zScopedExprNode.init_scopec                 C      |  | d S rK   )r  r   rR   rR   rS   analyse_declarationsc  rJ  z#ScopedExprNode.analyse_declarationsc                 C   r   rK   rR   r   rR   rR   rS   analyse_scoped_declarationsf  r;  z*ScopedExprNode.analyse_scoped_declarationsc                 C   r9  rK   rR   r   rR   rR   rS   r  j  r;  zScopedExprNode.analyse_typesc                 C   r9  rK   rR   r   rR   rR   rS   analyse_scoped_expressionsn  r;  z)ScopedExprNode.analyse_scoped_expressionsc                    s>  t  j}| jr| jjs|| d S |d g }tdd | jj D D ]\}}|j	s8|j
jr8|jr8|| q%|sF|| |d d S | }| }|| | || |d}|| |j|fgtt| | D ]\}	}
||	r||	 | || ||
 qq|| |d || ||_d S )Nz{ /* enter inner scope */c                 s   s    | ]	}|d  r|V  qdS )r   NrR   r   rR   rR   rS   rc   |  s    z:ScopedExprNode.generate_evaluation_code.<locals>.<genexpr>z} /* exit inner scope */
exit_scope)rM   ry  r  r  var_entriesr   sortedentriesitemsr?  r   rn   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)rV   r   generate_inner_evaluation_code
py_entries_r   old_loop_labelsold_error_labelr  label	old_labelrP   rR   rS   ry  r  sB   
"











z'ScopedExprNode.generate_evaluation_codec                 C   s6   |D ]}|j r|| ||d q|| qd S )Nr<  )rE  put_var_gotrefput_var_decref_setput_var_xdecref_clear)rV   r   r  r   rR   rR   rS   r    s   
z%ScopedExprNode._generate_vars_cleanuprK   )rY   rZ   r[   r   r  r  r  r  r  r  r  ry  r  r\   rR   rR   rP   rS   r  L  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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   r3  r  ru  r   CppIteratorNoder   is_reversed_cpp_iteration	arg_tupler   r  r  r   r   r  r   )rV   rq   r  rR   rR   rS   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   ro   r   r  CoercionNoder  r   r   )rV   funcr  rR   rR   rS   r    s   z&IteratorNode.is_reversed_cpp_iterationc                 C   s   | j | jp|S rK   )r  r/  r  r   rR   rR   rS   r/    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   r3  r  r   r  r  r   return_typern   r   )rV   rq   sequence_typer  rR   rR   rS   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  | | || j d|   d ||| j| j | 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_SIZEz%s = %s(%s);#if !CYTHON_ASSUME_SAFE_SIZE#endifz--%s;r  
%s = NULL;} else {z	%s = -1; %s = PyObject_GetIter(%s); %sT = (CYTHON_COMPILING_IN_LIMITED_API) ? PyIter_Next : __Pyx_PyObject_GetIterNextFunc(); r   )r  r   r   r3  r  r   r   r   r  r  may_be_a_sequencer   r   r   r`  ra  r   r<  counter_cnameerror_goto_if_negr   _func_iternext_typeiter_func_ptrputr   r  )rV   r   r  is_builtin_sequencelen_funcrR   rR   rS   rt    sp   





z!IteratorNode.generate_result_codec                 C      | d d S Nz;;r  rk  rR   rR   rS   generate_for_loop_header3  rJ  z%IteratorNode.generate_for_loop_headerc                 C   s  | j sJ d|dv sJ d| d|   d}d}| jjr@t| jj}| jjd u r/|}d}nt| jjjt	r@|| jjj }d}|rM|
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kr|
| d|   d| j  d n1|
d |
| d|   d| j  d |
d |
| d|   d| j  d |
d |
| | j  d d S )Nz/internal error: counter_cname temp not prepared)ListTuple__Pyx_Pyz
_GET_SIZE(rh  FTzif (%s >= %s) break;{zPy_ssize_t %s = %s;r  r  r   z--++r  z = __Pyx_PyList_GetItemRef(, );<#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFSz! = __Pyx_NewRef(PyTuple_GET_ITEM());#elsez = __Pyx_PySequence_ITEM(;)r  r   r  r   r   r   r   r|   r}   r~   r   r   quick_temp_cnamer  r   r  )rV   	test_nameresult_namer   
final_sizesize_is_safe
item_countinc_decrR   rR   rS   generate_next_sequence_item6  s<   



$
"
"
z(IteratorNode.generate_next_sequence_itemc                 C   s  | j j}| jr|d| j d |tu r.| d|| |||| j |	|t
 d S |tu rK| d|| |||| j |	|t
 d S | jr|d| j  |d|    | d|| |d | d|| |d |||| j |d	 |d
 || d| j d|   d |d|  |d |d ||d| j |d |d |d |d |d |	|t
 d S )Nzif (z < 0) break;r  r  zif (likely(!%s)) {z$if (likely(PyList_CheckExact(%s))) {r  r   z} else r   = (r  rJ  z&PyObject* exc_type = PyErr_Occurred();zif (exc_type) {zA!__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)rK  break;)r  r   r  r   r  r   r  r   r   r  r   r   r  r  r   r  r   )rV   r  r   r  rR   rR   rS   generate_iter_next_result_code\  sD   



"






z+IteratorNode.generate_iter_next_result_codec                 C   s>   | j r
|j| j  | jr|j| j d | _t| | d S rK   )r  r`  rh  r  r   r  rk  rR   rR   rS   r    s   zIteratorNode.free_temps)rY   rZ   r[   r   r   r  r  r  is_asyncr  r   r  r  r   r  	CFuncTypeCFuncTypeArgr  r  r/  r   rt  r  r  r  r  rR   rR   rR   rS   r    s.    ?&&r  c                   @   sn   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d ZdS )r  Nr  r  TFr  c                 C   s   | j sdS dS )N)r  end)rbeginrend)r  rU   rR   rR   rS   get_iterator_func_names  rJ  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  r4  r   r   r   r1   r  r   ri   extra_dereferencelookup_operator_for_types)rV   rq   r  
begin_nameend_namer  r  	iter_typerR   rR   rS   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   ri   r`  ra  cpp_sequence_cnamer   )rV   r   r  r  r  	temp_typerR   rR   rS   rt    s2   

z$CppIteratorNode.generate_result_codec                 C   sF   |   \}}|d| j|  | jp| j | j|| j|  f  d S )Nz; %s%s != %s%s%s(); ++%s%s)r  r  r  r   r  r  r  )rV   r   r  r  rR   rR   rS   r    s   z(CppIteratorNode.generate_for_loop_headerc                 C   s   | d|| j|  f  d S )Nz%s = *%s%s;)r   r  r   )rV   r  r   rR   rR   rS   r    s
   z.CppIteratorNode.generate_iter_next_result_codec                 C      | j sd S t| | d S rK   )r  r   rw  rk  rR   rR   rS   rw        z.CppIteratorNode.generate_subexpr_disposal_codec                 C   r  rK   )r  r   rx  rk  rR   rR   rS   rx    r  z"CppIteratorNode.free_subexpr_tempsc                 C   s.   | j st| | t| | t| | d S rK   )r  r   rw  rx  r  rk  rR   rR   rS   r    s   z&CppIteratorNode.generate_disposal_codec                 C   s$   | j r
|j| j  t| | d S rK   )r  r`  rh  r   r  rk  rR   rR   rS   r    s   zCppIteratorNode.free_temps)rY   rZ   r[   r  r  r  r   r  r   r  r  rt  r  r  rw  rx  r  r  rR   rR   rR   rS   r    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 rK   r6  r"  r   iteratorrV   r   rR   rR   rS   r"  %     
zNextNode.__init__c                 C   r   rK   rR   r   rR   rR   rS   rM  )  r;  zNextNode.nogil_checkc                 C   r'  rK   )r   r/  r   rR   rR   rS   r/  -  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  r7  )r   r   r  r3  r  r   r  r   r   r  r   remove_cv_refr:  r  r;  r<  )rV   rq   iterator_type	item_typefake_index_noderR   rR   rS   r   0  s    
zNextNode.infer_typec                 C   s   |  || jj| _d| _| S r8  )r   r   r   r   r   rR   rR   rS   r  B  s   zNextNode.analyse_typesc                 C   s   | j |  | d S rK   )r   r  r   rk  rR   rR   rS   rt  G  r  zNextNode.generate_result_coderK   )	rY   rZ   r[   r"  rM  r/  r   r  rt  rR   rR   rR   rS   r    s    
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S )AsyncIteratorNoder  Tr*   Fc                 C   rB  rK   r   r   rR   rR   rS   r   Y  rX   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   rn   r   r   r  r   rR   rR   rS   r  \  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  rk  rR   rR   rS   rt  e     z&AsyncIteratorNode.generate_result_codec                 C   r  r  r  rk  rR   rR   rS   r  m  rJ  z*AsyncIteratorNode.generate_for_loop_headerN)rY   rZ   r[   r   r  r   r   r   r  r   r  rt  r  rR   rR   rR   rS   r*  K  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  rK   r  r!  rR   rR   rS   r"  |  r"  zAsyncNextNode.__init__c                 C   rB  rK   r+  r   rR   rR   rS   r     rX   zAsyncNextNode.infer_typec                 C   r9  rK   rR   r   rR   rR   rS   r    rX   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  rk  rR   rR   rS   rt    r/  z"AsyncNextNode.generate_result_codeN)
rY   rZ   r[   r   r   r   r"  r   r  rt  rR   rR   rR   rS   r0  q  s    r0  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  r2  r   r  r   r   r   rR   rR   rS   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[  PyObjectCallrM  z'%s = __Pyx_PyObject_Call(%s, %s, NULL);r  T)source_cnamedecref_sourceri  z%s = __Pyx_PyObject_IsTrue(%s);r   )test_if_runr   	with_statexit_varr   ry  r`  ra  r   rs  r   r   r   r   r   r   r  r  r  r   r  r2  r   r  r_  rc  r  rh  )rV   r   
result_varrR   rR   rS   ry    sB   

z)WithExitCallNode.generate_evaluation_code)rY   rZ   r[   r   r7  r2  r  ry  rR   rR   rR   rS   r1    s    r1  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 rK   r   r"  )rV   r   rR   rR   rS   r"    r  zExcValueNode.__init__c                 C   
   || _ d S rK   var)rV   r?  rR   rR   rS   set_var  rK  zExcValueNode.set_varc                 C   r   rK   r>  rU   rR   rR   rS   r     r;  z"ExcValueNode.calculate_result_codec                 C   r   rK   rR   rk  rR   rR   rS   rt    rX   z!ExcValueNode.generate_result_codec                 C   r9  rK   rR   r   rR   rR   rS   r    rX   zExcValueNode.analyse_typesN)
rY   rZ   r[   r   r   r"  r@  r   rt  r  rR   rR   rR   rS   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 r8  )r   r"  r   rn   r   r	  r   )rV   r   r   rq   rR   rR   rS   r"    s
   
zTempNode.__init__c                 C   r9  rK   rR   r   rR   rR   rS   r    rX   zTempNode.analyse_typesc                 C   
   d| _ d S r=  r)  r   rR   rR   rS   r    rK  z#TempNode.analyse_target_declarationc                 C   r   rK   rR   rk  rR   rR   rS   rt    rX   zTempNode.generate_result_codec                 C   s   |j j| jdd| _d S )NTr[  )r`  ra  r   
temp_cnamerk  rR   rR   rS   allocate  r  zTempNode.allocatec                 C   s   |j | j d | _d S rK   )r`  rh  rC  rk  rR   rR   rS   release   r"  zTempNode.releasec                 C   s   z| j W S    J d)NFz-Remember to call allocate/release on TempNode)rC  rU   rR   rR   rS   r     s   zTempNode.resultc                 C   r   rK   rR   rk  rR   rR   rS   rc    rX   zTempNode.allocate_temp_resultc                 C   r   rK   rR   rk  rR   rR   rS   ri    rX   zTempNode.release_temp_resultrK   )rY   rZ   r[   r   r"  r  r  rt  rD  rE  r   rc  ri  rR   rR   rR   rS   rA    s    	
rA  c                   @      e Zd Zdd ZdS )
PyTempNodec                 C   s   t | |tj| d S rK   )rA  r"  r   r   )rV   r   rq   rR   rR   rS   r"    r  zPyTempNode.__init__NrY   rZ   r[   r"  rR   rR   rR   rS   rG        rG  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   r"  r   )rV   r   r   r   rR   rR   rS   r"    s   
zRawCNameExprNode.__init__c                 C   r9  rK   rR   r   rR   rR   rS   r     rX   zRawCNameExprNode.analyse_typesc                 C   r=  rK   r   )rV   r   rR   rR   rS   	set_cname#  rK  zRawCNameExprNode.set_cnamec                 C   r   rK   rK  rU   rR   rR   rS   r   &  r;  zRawCNameExprNode.resultc                 C   r   rK   rR   rk  rR   rR   rS   rt  )  rX   z%RawCNameExprNode.generate_result_coder  )	rY   rZ   r[   r   r"  r  rL  r   rt  rR   rR   rR   rS   rJ    s    
rJ  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 rR   )r  r  )r_   vrx   rR   rS   r   B      z/JoinedStrNode.analyse_types.<locals>.<listcomp>)rN  r   rR   rx   rS   r  A  s   zJoinedStrNode.analyse_typesc                 C   rT   rP  rR   rU   rR   rR   rS   r  E  r;  zJoinedStrNode.may_be_nonec              
      s  | | j t| j}|dk }t }d}| jD ]%}t|tr&t|| }qt|t	r1|j
jjr1qt|tr7q|| qg }i  t|g}| jD ]A}|| t|tr]tt|j
}	nd|  d}	||v rt|d|  d |	 v r |	  d7  < qI||	 d |	< qI|r|jjttj|dd}
n,|jjttjdd}
|d	|
|f  |d
|
  |d|| j  |d t| jD ]\}}|d|
|| f  q̇ fdd|D }| | j | | |jt dd |d| ! |
|d"|d"|f  |s|d|
  |j#|
 ||$|  | j | %| | jD ]}|&| |'| q3d S )N    r  z__Pyx_PyUnicode_GET_LENGTH(rh  z__Pyx_PyUnicode_MAX_CHAR_VALUE(r*   Fr[  z7%s = (PyObject **) PyMem_Calloc(%d, sizeof(PyObject*));rJ  zPyErr_NoMemory(); %sr   z%s[%d] = %s;c                    s.   g | ]} | d kr| d |  n|qS )r*   z * rR   r  countsrR   rS   r   ~  s     z:JoinedStrNode.generate_evaluation_code.<locals>.<listcomp>JoinPyUnicodeStringTools.cz*%s = __Pyx_PyUnicode_Join(%s, %d, %s, %s); +  | zPyMem_Free(%s);)(rs  r   r   rN  setr|   rM  r  r  FormattedValueNoder   r   rl  	CloneNodeaddru   ry  r   r   r`  ra  r   c_array_typer   r  r   r   	enumeraterc  r   r   r   r   r   joinrh  r   r  r  r  )rV   r   	num_itemsuse_stack_memoryunknown_nodesmax_char_valuer   length_partscharval_partslength_partvalues_arrayirR   rS  rS   ry  I  s|   
















z&JoinedStrNode.generate_evaluation_codeN)rY   rZ   r[   r   r   r   r  r   r  r  ry  rR   rR   rR   rS   rM  4  s    rM  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 )rZ  r   format_specTNzString formattingPyObject_StrPyObject_ReprPyObject_ASCII__Pyx_PyNumber_Long)sradc                 C   rT   rP  rR   rU   rR   rR   rS   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)ri  rn  )r   r  ri  r  r   default_format_speccan_coerce_to_pystringc_format_specr  conversion_charr   r  )rV   rq   rt  rR   rR   rS   r    s   
z FormattedValueNode.analyse_typesc           	      C   st  | 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sqJ 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_FormatSimplern  z(invalid conversion character found: '%s'%s(%s)PyObjectFormatAndDecrefrV  	AndDecrefPyObjectFormatPyObjectFormatSimple%s = %s(%s, %s); %s)rt  r   r   rn   convert_to_pystringr   r   r   r   r  r   r   r  ri  r2  r   empty_unicoderu  find_conversion_funcr   r   r   r   )	rV   r   convert_func_callvalue_resultvalue_is_unicodeformat_funcri  ru  fnrR   rR   rS   rt    sX   






z'FormattedValueNode.generate_result_code)rY   rZ   r[   r   r   r   r   rt  r  rh   r  r  r  rt  rR   rR   rR   rS   rZ    s     rZ  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=  rU  r   rR   rR   rS   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  z%s = 1;r  r   r   rk  rR   rR   rS   rt    s   

z1ParallelThreadsAvailableNode.generate_result_codec                 C   r   rK   r   rU   rR   rR   rS   r     r;  z#ParallelThreadsAvailableNode.resultN
rY   rZ   r[   r5  r   
c_int_typer   r  rt  r   rR   rR   rR   rS   r    s    	r  c                   @   r  )	ParallelThreadIdNodez/
    Implements cython.parallel.threadid()
    c                 C   r  r=  rU  r   rR   rR   rS   r  #  r  z"ParallelThreadIdNode.analyse_typesc                 C   sB   | d | d| j  | d | d| j  | d d S )Nr  z%s = omp_get_thread_num();r  r  r  r  rk  rR   rR   rS   rt  (  s
   

z)ParallelThreadIdNode.generate_result_codec                 C   r   rK   r  rU   rR   rR   rS   r   /  r;  zParallelThreadIdNode.resultNr  rR   rR   rR   rS   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fv S rK   )r8  r   r   r   r   r   rU   rR   rR   rS   r   ?  s   z_IndexingBaseNode.is_ephemeralc                 C   s   | j  o	| j S rK   )r8  rT  r9  r   rU   rR   rR   rS   rT  E  r$  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  r3  r  rU   rR   rR   rS   r   H  s   
z_IndexingBaseNode.is_lvalueN)rY   rZ   r[   r   rT  r   rR   rR   rR   rS   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:  r8  r9  NTFc                 C   s   | j j| jj | _d S rK   )r8  r}   r9  rU   rR   rR   rS   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 rK   )r8  r  r9  r  r  )rV   r  r8  r9  r  rR   rR   rS   r  k  s   
zIndexNode.compile_time_valuec                 C   s.   | j }| o| j o|jo|jjp|jjS rK   )r8  r  r9  r   r  r3  rV   r8  rR   rR   rS   r  s  s   zIndexNode.is_simplec                 C   sH   | j j}|r|jrdS |tttfv rdS t| jtr|j	rdS t
| S rP  )r8  r   ru  r   r   r   r|   r9  	SliceNoder  r   r  rV   r  rR   rR   rS   r  x  s   
zIndexNode.may_be_nonec                 C   r   rK   rR   r   rR   rR   rS   r    rX   z$IndexNode.analyse_target_declarationc              	   C   s  | j  }|d urp|dv rp| j|}|d u r$t| j jd| d d S |dkr-t|S |dk}| }|jrV|j	rE|rCt| j jd d}|j
rS|rQt| j jd d}|j}|jrgt| j jd	| d
| d tj||| d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s| jjrddlm} |||jj | jjr| jgnt| jj}	t||||	S |js| j |}
|
d urzt!|
}
W n t"t#fy   Y nw t$||
S t| jd d S )N)pointerconstvolatilezinvalid use of 'z', argument is not a typer  r  zDuplicate 'const'TzDuplicate 'volatile'z(Cannot declare memory view variable as 'z'. Did you mean 'z[item_type][:]' ?)r  is_volatile)r   positional_argskeyword_args)r  r*   r  z*Array size must be a compile time constant)%r8  r  r9  rA  r   r   r   r  r  r  r  r  r   c_const_or_volatile_typer   python_type_constructor_namer   r   r   TemplatedTypeNodeanalyser   r  r  r   get_view_utility_coder  shared_utility_qualified_namer   MemoryViewSliceTypeget_axes_specsrn   r  r~   r   r   
CArrayType)rV   rq   modifierr  r  r  template_values	type_noder  axesr9  rR   rR   rS   rA    sv   


zIndexNode.analyse_as_typec                 C   sR   g }| }|j r'|j|}|r!|jr!|jr!|| rdn|j |j}|j s|S Nztyping.Optional)r  r8  rA  r  modifier_namer   allows_noner9  )rV   rq   r  modifier_nodemodifier_typerR   rR   rS   analyse_pytyping_modifiers  s   
z$IndexNode.analyse_pytyping_modifiersc                 C      | j || j| S rK   )r8  r/  r9  r   rR   rR   rS   r/    r  zIndexNode.type_dependenciesc                 C   sJ  | j |}| jjr&|jrtS |jrtS |tttt	t
fv r|S |jr$|S tS | j|}|r1|js7t| jtr|tu r>tjS |tu sG| j tu rJtjS |t
t	fv rat|| j | j|d}|d ur`|S nT|jsg|jrj|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u r#|S tS )
Nr   r   r*   r  r7  c                   @   rF  )z)IndexNode.infer_type.<locals>.FakeOperandc                 [   r2  rK   )__dict__update)rV   r`  rR   rR   rS   r"  "  r  z2IndexNode.infer_type.<locals>.FakeOperand.__init__NrH  rR   rR   rR   rS   FakeOperand!      r  )r   r   []),r8  r   r9  r   ru  r   rv  r   r   r   r   r   r   r  r|   r;  r   c_py_ucs4_typec_uchar_typer   r  r3  r  r  r   r}   r  r  ndimr  r  r  r   r   r:  r   r   r   lookup_operatorr   r  r<   rH   rB   )rV   rq   r  
index_typer(  r9  r  rp  r  operands
index_funcindex_with_typerR   rR   rS   r     s   







zIndexNode.infer_typec                 C   r  )NTgetting)analyse_base_and_index_typesr   rR   rR   rS   r  8  rJ  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!  rR   rR   rS   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*   rz   )r   r  z'Attempting to index non-array type '%s')*r8  r  r   r  r   r1   r9  r   ri   r   r   r   r|   r;  r   long_literalr   r  r   rL  ru  r  r3  analyse_as_buffer_operationr   r4  original_index_typer   r  r  r   r   r}   rn   analyse_as_pyobjectanalyse_as_c_arrayr   analyse_as_cppanalyse_as_c_functionr  analyse_as_c_tupler   )	rV   rq   r  r  analyse_baser   is_memslicereplacement_noder  rR   rR   rS   r  C  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| _nW| jjj	r|tu r|rtj| _nGtj| _nB|r|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*   rz   boundscheckr  r   r  &'NoneType' object is not subscriptable)#r8  r   r9  r  r   r   r   r  r   r  ri   r   r   r   signedr|   r;  r   r}   r  r   r<  r,  r  create_to_py_utility_coder   r  r  r  r   r   r  rn   r   wrap_in_nonecheck_node)rV   rq   r   r  r  r  r(  rR   rR   rS   r    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')r8  r   r  r   r   CReferenceTyper9  rn   r  r<  r  r   r   )rV   rq   r   r  rR   rR   rS   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'rF  TCppExceptionConversionr~  r   z#Can't set non-reference result '%s')r8  r   r  r9  r   r   r   r1   ro  r  r  r   r   r   r   r   r   r   r  r   r  r   )rV   rq   r  r  r  	func_typerR   rR   rS   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)r8  r   rB  parse_indexed_fused_cdefparse_index_as_typestype_indicesr9  	templatesr   r   r1   r   rD  dictr  rV   rq   r  rR   rR   rS   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  )r8  r   r|   r9  r;  r   r}   r  r  r   r   r   r1   r  r  )rV   rq   r  r  r  r9  rR   rR   rS   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  )indicesr8  Tc                    r.  rR   r$  r_   r9  rx   rR   rS   r   1  r0  z9IndexNode.analyse_as_buffer_operation.<locals>.<listcomp>c                 s   s&    | ]}|j jp|jp|j jV  qd S rK   )r   r  r   r<   r  rR   rR   rS   rc   3  s
    
z8IndexNode.analyse_as_buffer_operation.<locals>.<genexpr>r   r   r   c                 s   s    | ]}|j jV  qd S rK   r   r  r  rR   rR   rS   rc   =  rd   )r|   r9  r  r   r8  r   r   r  r  r  merged_indicesunellipsifyr  MemoryViewSliceNoder   MemoryViewIndexNoder&  r<   r   allr^  r   SliceIntNoder   r   r   r  BufferIndexNoder[  )rV   rq   r  r  r8  r  r  r  r  have_slicesnewaxesr  do_replacementrh  r9  rR   rx   rS   r    sP   


z%IndexNode.analyse_as_buffer_operationc                 C   s*   |j d r
| j sd S | jd| _d S )N	nonecheckr  )ri   r8  r  r  rV   rq   r  rR   rR   rS   r  G  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 )Nr  znot parsable as a type)r|   r9  r  r   r   rA  r   r   )rV   rq   requiredr  r  r9  rR   rR   rS   r  L  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 rR   )r  r^   specific_typerR   rS   r     r0  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   r1   r   is_fused_indexr8  r9  r   r  r   r   r|   r  r   r  r  r   r  r   r   r  r^  specialize_fusedget_fused_typesr   r  rj   typesr  r  rD  rB  r  r  r  r   )rV   rq   r  	positionsr  specific_typesrh  r   fused_typesr`   r   
fused_typerC  r  rR   r  rS   r  Z  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__Pyx_PyList_GET_ITEM(%s, %s)z__Pyx_PyTuple_GET_ITEM(%s, %s)z5((unsigned char)(__Pyx_PyByteArray_AsString(%s)[%s]))Fz$unexpected base type in indexing: %sz%s<%s>,c                 S      g | ]}|  qS rR   )r  )r_   paramrR   rR   rS   r         z3IndexNode.calculate_result_code.<locals>.<listcomp>r   z%s.f%szInvalid use of pointer slicez(%s[%s]))r8  r   r   r   r   r4  r   r_  r  r  r9  r}   r  r  r3  r   r   )rV   
index_coder9  rR   rR   rS   r     s.   

zIndexNode.calculate_result_codec                 C   s   | j jjrG| 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 }| j }d| j | jj	r<dp=d| jj||||f S dS )Nr  r   r  z, %s, %d, %s, %d, %d, %d, %dr*   r  )r9  r   r  r8  r   r*  r   ri   r  r  r|   r}   r~   rp  r  to_py_function)rV   r   is_listr  r  has_gilrR   rR   rS   extra_index_params  s$   

zIndexNode.extra_index_paramsc                 C   sB  | j sd S | jj}d }d }| jjrbd}| jjjr/|tu rd}n	|tu r&d}nd}t	dd}nz|t
u r<d}t	dd}nm|tu rO| jjtu rOd	}t	dd}nZd
}|jt	dd t	dd}nG| jjr||tu r|| jjjsqJ d}d}t	dd}n-|tu r| jjjsJ | jjsJ d}d}t	dd}n|jr| jsJ d| j|| jf |d ur|j| | jjjr| j }n| j }|jr| jrt|| jd|  | j | j f | jjr|  nd | j| j n(|dkrdnd| }|d|  || j || ||||   | jf  | jjr| | d S d S )NrG  __Pyx_GetItemInt_List__Pyx_GetItemInt_Tuple__Pyx_GetItemInt
GetItemIntrM  __Pyx_PyDict_GetItemDictGetItem__Pyx_PyObject_Dict_GetItem__Pyx_PyObject_GetItemObjectGetItem__Pyx_GetItemInt_Unicodez(Py_UCS4)-1GetItemIntUnicoderV  __Pyx_GetItemInt_ByteArrayz-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   r8  r   rn   r9  r  r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r   r   rp  r   r   r   r  )rV   r   r  rR  error_valuer  r  error_checkrR   rR   rS   rt    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SetItemIntByteArrayrV  __Pyx_SetItemInt_ByteArray
SetItemIntrM  __Pyx_SetItemIntrd  PyObject_SetItemz%s(%s, %s, %s%s))r9  r   r  r8  r   r   r   r   r   r   r   r   r   r  r   r   )rV   
value_coder   r  r  rR   rR   rS   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   ri  )rr  r   rn   r  r   r8  r   _check_byte_valuer   r   r   r   r   r   rp  r   r   rw  rx  r  r  )rV   r   r   r  r   r   r  rR   rR   rS   r  P  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sY| rY|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*   rz   z%s < 0z%s > 255if (unlikely(%s)) {z || zFPyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)"); %sr   z((unsigned char)%s))r   r  r  r   r   r}   r   r   r   r  r   r   r  r   rV  r   c_schar_typer   r_  r   )rV   r   r   r  
needs_cast
conditionsrR   rR   rS   r  q  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
DelItemIntrM  PyDict_DelItemPyObject_DelItemz%s(%s, %s%s))rr  r9  r   r  r   r   r   r   r   r   r8  r   r   r  r   r   rw  rx  )rV   r   r  r  r  rR   rR   rS   r    s,   





z IndexNode.generate_deletion_code)FFTTr  r
  )$rY   rZ   r[   r   r  r  r  r  r  r  r  r  rA  r  r/  r   r  r'  r  r  r  r  r  r  r  r  r  r  r  r   r   rt  r  r  r  r  rR   rR   rR   rS   r:  X  sL    
CZ
H:5
[I!
!$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
    r8  r  TFrR   c                 C   s   | j |dd d S NFr  r$  r   rR   rR   rS   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  )r8  r   r<   r   r   r   r1   r   writabler  r&  
buffer_auxnone_error_messageanalyse_buffer_indexr  r  rR   rR   rS   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 rR   r  )r_   idxrR   rR   rS   r     r0  z8BufferIndexNode.analyse_buffer_index.<locals>.<listcomp>T)r<   r8  r   r  rH   rB   r,  r  buffer_typern   r   )rV   rq   r  index_with_type_listrR   rR   rS   r(    s   

z$BufferIndexNode.analyse_buffer_indexc                 C   rT   )zk
        Called by IndexNode when this node is assigned to,
        with the rhs of the assignment
        NrR   rV   r   rR   rR   rS   analyse_assignment  s    z"BufferIndexNode.analyse_assignmentc                 C   s,   |j d r
| j sd S | j| j| _d S )Nr  )ri   r8  r  r  r'  r   rR   rR   rS   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   rn   r   r   r1   r   rR   rR   rS   rM    s   
zBufferIndexNode.nogil_checkc                 C   s
   d| j  S NrG  )buffer_ptr_coderU   rR   rR   rS   r     rK  z%BufferIndexNode.calculate_result_codec                 C   s    | j }| j jr
|j}|j|S rK   )r8  is_nonecheckr  r   	get_entryr  rR   rR   rS   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[  ri  )
r`  ra  r   rf  r   r  c_ssize_t_typec_size_t_typer   r   )rV   r   ivarretrR   rR   rS   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 j  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 accessc                    s   g | ]}  |qS rR   )r7  r_   r5  r   rV   rR   rS   r         z6BufferIndexNode.buffer_lookup_code.<locals>.<listcomp>r*   r#  negative_indicesc                 S   s   g | ]}|j jqS rR   )r   r  r8  rR   rR   rS   r   "  r  )r   index_signedsindex_cnamesri   r   r   r;  rp  )rp  r  r  r   ri   r,   r   r  index_tempsr  r$  r2  r   r&  r;  buffer_defaultsput_buffer_lookup_code)rV   r   r>  r$  r2  r;  rR   r9  rS   buffer_lookup_code  s&   

z"BufferIndexNode.buffer_lookup_codec                 C   sB   |  | | || | | | | || || d S rK   )rr  generate_buffer_setitem_coderw  rx  r  r  rV   r   r   r  rR   rR   rS   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);rj  z%s%s %s= %s;ri  z*%sz%__Pyx_INCREF(%s); __Pyx_XDECREF(*%s);z*%s %s= %s;)r8  r   r<   r:   r`  ra  rH   rD   r   r  rA   r  rh  rA  r*  r  rn   buf_ptr_typer   r  r  )
rV   r   r   opr  r  r2  ptrexprptrr   rR   rR   rS   rB  1  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 )NrD  new (&%s) decltype(%s){%s%s};z%s = (PyObject *) *%s;z'if (unlikely(%s == NULL)) %s = Py_None;z__Pyx_INCREF((PyObject*)%s);)r<   r8  r   r   r   r  rA   r  rA  r/  rn   )rV   r   resr2  rR   rR   rS   rt  [  s"   z$BufferIndexNode.generate_result_codec                    s.   | j D ]}|j| qd| _ t | d S r  )r>  r`  rh  rM   rx  )rV   r   temprP   rR   rS   rx  p  s   
z"BufferIndexNode.free_subexpr_tempsr#  r
  )r  )rY   rZ   r[   r5  r   r  r  r>  r'  r  r(  r-  r  rM  r   r2  r7  rA  r  rB  rt  rx  r\   rR   rR   rP   rS   r    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   s<  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 ]\}}||}|jrd| _|	| |d qh| jjj|
 \}}|
d7 }
|jrd| _|jjr|||f n||df dD ]}t||}|js|||}t||| |	| qqh|jjs|jj r|jj rt!|jd	| d| _"|||}|||< |	| qht| _t|jd
|j  |   S | j"o| j | _"|	| _|| _#|j$| _$| %|||}|&| |S )Nr*   r  Tz&Too many indices specified for type %sr   )directstridedrM  r  z/Index should be typed for more efficient accessz/Invalid index for memoryview specified, type %s)'r  r  r@   is_pythran_moder  r  r8  r   r  r  r   r  r   r   memslice_indexr   r<  r1   r   r   r^  r  r  r  r   r  r   r   r   r  setattrr  rn   r,   r  original_indicesr   analyse_operationr  )rV   rq   r  r  r  r  r  r  r  new_indicesaxis_idxrh  r9  accesspackingattrr   r   rR   rR   rS   r  |  st   







z!MemoryViewIndexNode.analyse_typesc                 C   s   d| _ | || | S )Nz"Cannot index None memoryview slice)r'  r(  )rV   rq   r  r  rR   rR   rS   rR    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  rV   r   lhsrR   rR   rS   analyse_broadcast_operation  s   
z/MemoryViewIndexNode.analyse_broadcast_operationc                 C   s   |  |}|r|j|_|S | S rK   )r-  r  rX  rR   rR   rS   $analyse_as_memview_scalar_assignment  s
   
z8MemoryViewIndexNode.analyse_as_memview_scalar_assignmentNr#  )	rY   rZ   r[   r  r  r  rR  rZ  r[  rR   rR   rR   rS   r  w  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 rK   )r   r   r  r   r   r  rR   rR   rS   rc     s
    
z<MemoryViewSliceNode.analyse_ellipsis_noop.<locals>.<genexpr>N)r  r  is_ellipsis_noopr8  r   r  rR   rR   rS   analyse_ellipsis_noop  s   
z)MemoryViewSliceNode.analyse_ellipsis_noopc                 C   s   ddl m} |sd| _d| _nd| _| || | jr| S d | _d| _d| _|	| j
|s2t| _| S t| jjj|| _| j sM| j sM| j|| _| S )Nr*   r  Tz&Cannot assign to None memoryview slicez"Cannot slice None memoryview slice)r  r  r  r'  r]  r\  r9  r   rb  validate_axesr   r1   r   r   r  r8  r  r  rV  r  )rV   rq   r  r  r  rR   rR   rS   rR    s$   z%MemoryViewSliceNode.analyse_operationc                 C   s8   |j js| j j|j s|j jrt| j| S t| j| S rK   )r   r   r  r  rn   MemoryCopyScalarr   MemoryCopySlicer,  rR   rR   rS   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   )rQ  r^  r   r   r  r   r   r   r   r  r   r8  r  )rV   r  rS  rh  rn  rR   rR   rS   r    s*   
z"MemoryViewSliceNode.merged_indicesc                 C   s"   | j r| j p| j S |  S rK   )r\  r8  r  rV  rU   rR   rR   rS   r  <  s   zMemoryViewSliceNode.is_simplec                 C   r,  )z3This is called in case this is a no-op slicing node)r8  r   rU   rR   rR   rS   r   C  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)rn  r  ri   )r\  r2  rp  iterr  rQ  r   r   r  nextr   r   r   generate_buffer_slice_coder   r   r   ri   )rV   r   r2  rn  r  r  r9  rR   rR   rS   rt  G  s.   






z(MemoryViewSliceNode.generate_result_codec                 C   sp   | j r	| | n| | | jr| || n| || | j r'| | n| | || || d S rK   )	r\  rr  ry  is_memview_scalar_assignment+generate_memoryviewslice_assign_scalar_code&generate_memoryviewslice_setslice_coderw  r  r  rC  rR   rR   rS   r  c  s   


z,MemoryViewSliceNode.generate_assignment_codeNr
  )rY   rZ   r[   r  r\  rd  r  r  r]  rR  r-  r  r  r   rt  r  rR   rR   rR   rS   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  | || _|j| _d S rK   )rM   r"  rh  r   rV   r   rh  rP   rR   rS   r"    s   zMemoryCopyNode.__init__Fc                 C   sH   | j | | || | j | | j | || || d S rK   )rh  ry  _generate_assignment_coder  r  rC  rR   rR   rS   r    s   
z'MemoryCopyNode.generate_assignment_coder
  )rY   rZ   r[   r5  r   r"  r  r\   rR   rR   rP   rS   rg  w  s
    rg  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))rh  r   assert_direct_dimsr   r   r  copy_slice_cnamer   r  r  rn   )rV   r  r   rh  rR   rR   rS   rj    s   
z)MemoryCopySlice._generate_assignment_codeN)rY   rZ   r[   r5  r  rm  rj  rR   rR   rR   rS   r`    s
    r`  c                       rI   )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  || |jj| _d S rK   )rM   r"  r   r  ri  rP   rR   rS   r"    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  rh  r   rl  r   r  r   begin_blockr   r   rV  r  rQ  r|   r  r   r  r   r   
slice_iterr  start_loopsrn   	end_loops	end_block)rV   scalarr   r  r  	type_decl
slice_decldst_tempro  r  r)  slice_iter_objprR   rR   rS   rj    sB   



z*MemoryCopyScalar._generate_assignment_code)rY   rZ   r[   r5  r"  rj  r\   rR   rR   rP   rS   r_    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)r8  r   r   sliceFNc                 C   sZ   | j |}|js|jrtS |jrtS |ttttt	fv r|S |j
s$|jr+t|jd S tS rK   )r8  r   ru  r   r   rv  r   r   r   r   r  r3  r   r]  r  r   r  rR   rR   rS   r     s   zSliceIndexNode.infer_typer   c                 C   s6   |t ur| jr| j r|| jj7 }nt }| j|S rK   )r  r   r   r}   r8  r>  r=  rR   rR   rS   r>    s
   
z"SliceIndexNode.inferable_item_nodec                 C   s6   | j j}|r|jrdS |tttttfv rdS t	| S rP  )
r8  r   ru  r   r   r   r   r   r   r  r  rR   rR   rS   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 rK   )r   r}   r   r8  )rV   r   r   rR   rR   rS   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   )r8  r  r   r   r  r  )rV   r  r8  r   r   r  rR   rR   rS   r    s   

z!SliceIndexNode.compile_time_valuec                 C   r   rK   rR   r   rR   rR   rS   r  '  rX   z)SliceIndexNode.analyse_target_declarationc                 C   s    | j |dd}|jjrt|_|S r$  )r  r   rn   r   r!  rR   rR   rS   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  )r9  r8  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)	UtilNodesr~  r  CondExprNoder   r;  r{  r~   r  r  PrimaryCmpNoder  r  analyse_result_type)r   default_valuerq   r~  r  node_refnew_exprc_intrR   rS   
allow_noneo  s,   

z0SliceIndexNode.analyse_types.<locals>.allow_noners  r%  r*   )%r8  r  r   r&  r<   r   r  r   r  r   r   r:  r  ri   r   r3  r   r  r  ru  r  ry   rv  r   r  r  r   r  r  r   r%   deepcopyr|  r<  rn   r  r   )rV   rq   r  	none_noder9  r   r  r  rR   r  rS   r  1  s   




zSliceIndexNode.analyse_typesc                 C   sr   | j |}|r7| js7| js7ddlm} |||jj	 t
| j}t| j|||d}t||||gS d S )Nr*   r  r  )r8  rA  r   r   r  r  r   r  r  r  r  r   r  r   r  r  )rV   rq   r  r  r  
slice_noderR   rR   rS   rA    s(   
zSliceIndexNode.analyse_as_typec                    s   |j | _ t |S rK   )r   rM   rM  r   rP   rR   rS   rM    s   zSliceIndexNode.nogil_checkzSlicing Python objectSliceObjectrM  rU  Get)r  Setc                    s   | j jjs
| j jjr)|tttfv r)|tu r&|jd s&t| j	d| j j|f  || _|j
r>| j jj
r>| js>| js>| j ||S t ||S )Nr]   :default encoding required for conversion from '%s' to '%s')r8  r   ru  r  r   r   r   ri   r   r   r3  r   r   r  rM   r>  rP   rR   rS   r    s   
zSliceIndexNode.coerce_toc                 C   s  | j jst| jd| j   d S | jj }|  }|  }|  }|jrd| j	t
j}| j tu r1d}n| j tu r9d}n| j j }| jd u rQd| d| d| d}nd| d| d| d	| d
| d}n|jr| j	t
j}|jtdd | jd u rd| d| d}nd| d| d	| d
| d	}n|tu r| j }|jtdd d| d	| d	| d}n| j tu r| j }|  \}	}
}}}}}t|jjd }|j| j d| d	| d	| d	| d	| d	| d	|	dd	|
dd	|dd}n9| j }|tu r|jtdd d}n|tu r&|jtdd d}nd}| d| d	| d	| d}| | d| d|!|| j  | "| d S )Nz,Slicing is not currently supported for '%s'.	ByteArrayUnicoder  z_FromString(rW  rh  z_FromStringAndSize(r  z - pyunicode_from_unicoderV  z__Pyx_PyUnicode_FromUnicode(z%__Pyx_PyUnicode_FromUnicodeAndLength(PyUnicode_Substringz__Pyx_PyUnicode_Substring(r  z__Pyx_PyObject_GetSlice(rq  SliceTupleAndListrM  __Pyx_PyList_GetSlice__Pyx_PyTuple_GetSlicePySequence_GetSlicer  r  z; )#r   rn   r   r   r8  r   
start_code	stop_coderu  r   r   rl   r   r   ro   titler   rv  c_const_py_unicode_ptr_typer   r   r   r   r   r   get_slice_configr*  ri   get_slice_utility_coder   r   r   r   r   r  )rV   r   r  r   r  r  base_result	type_namecallhas_c_start
has_c_stopc_startc_stoppy_startpy_stoppy_slicer  cfuncrR   rR   rS   rt    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  rs  z%s - %sIncludeStringHrV  z,memcpy(&(%s[%s]), %s, sizeof(%s[0]) * (%s));)rr  r   rn   r   r   set_slice_utility_coder  r  r   r8  r   r*  ri   r   r  r3  r  generate_slice_guard_coder  r   r   r   r   rw  rx  r  r  )rV   r   r   r  r   r   r  r  r  r  r  r  r  start_offsetarray_lengthrR   rR   rS   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  )r8  r   rn   r   r   rr  r   r   r  r  r  r   r*  ri   rw  rx  )
rV   r   r  r  r  r  r  r  r  r  rR   rR   rS   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)Frs  rG  &%srG  )r   r   rn   r   r   r   r|  )rV   r  r  r  r  r  r  r  rR   rR   rS   r  >  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   )r8  r   r3  r  r~   r   r   r   r   r|   r   r   r   r   r   r   r   )
rV   r   target_size
slice_sizetotal_lengthr   r   runtime_checkcompile_time_checkint_target_sizerR   rR   rS   r  Q  s   







z(SliceIndexNode.generate_slice_guard_codec                 C   s   | j r| j  S dS )Nrs  )r   r   rU   rR   rR   rS   r    s   
zSliceIndexNode.start_codec                 C   s(   | j r| j  S | jjjr| jjjS dS )Nr%  )r   r   r8  r   r3  r  rU   rR   rR   rS   r    s
   


zSliceIndexNode.stop_codec                 C   rT   )Nz<unused>rR   rU   rR   rR   rS   r     r;  z$SliceIndexNode.calculate_result_coder  r#  r  r
  )rY   rZ   r[   r   r   r|  r   r>  r  r  r  r  r'  r  rA  rM  r  r   loadr  r  r  rt  r  r  r  r  r  r  r   r\   rR   rR   rP   rS   r{    s@    	
	

`

G

"Rr{  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 )r  r  Tr*   c                 C      t | jj| jj| jj| _d S rK   r|  r   r}   r   r   rU   rR   rR   rS   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 rK   r   r  r   r   r|  r  r  rV   r  r   r   r   r  rR   rR   rS   r       zSliceNode.compile_time_valuec                 C   rT   rP  rR   rU   rR   rR   rS   r    rX   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   )rV   rq   r   r   r   rR   rR   rS   r    s   zSliceNode.analyse_typesz Constructing Python slice objectc                 C   r   rK   r~  rU   rR   rR   rS   r     r;  zSliceNode.calculate_result_codec                 C   s   | j r$t| j| f}|jd|d| _|| j}|d u rd S || j |d| 	 | j
 | j | j || 	 | jf  | | | j rQ| | d S d S )Nr|  	dedup_keyz %s = PySlice_New(%s, %s, %s); %s)r   r   r   r  ro  r  rs  r   r   r   r   r   r   r   r   r  r  )rV   r   r  rR   rR   rS   rt    s(   
zSliceNode.generate_result_codeN)rY   rZ   r[   r   r   r    r   r   r  r  r  r  r  r   rt  rR   rR   rR   rS   r    s    	r  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  rK   r  rU   rR   rR   rS   r    r  z&SliceIntNode.calculate_constant_resultc              
   C   r  rK   r  r  rR   rR   rS   r  
  r  zSliceIntNode.compile_time_valuec                 C   rT   rP  rR   rU   rR   rR   rS   r    rX   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   rR   rR   rS   r    s   zSliceIntNode.analyse_typesc                 C   r   rK   rR   rU   rR   rR   rS   r   '  rX   z"SliceIntNode.calculate_result_codec                 C   s.   | j | j| jfD ]}t|tr|j  qd S rK   )r   r   r   r|   r[  r  r   )rV   r   rp  rR   rR   rS   rt  *  s
   

z!SliceIntNode.generate_result_codeN)
rY   rZ   r[   r   r  r  r  r  r   rt  rR   rR   rR   rS   r    s    		r  c                   @   s^   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d ZdZdS )CallNodeNc           
         sx  | j }| }t|trt|jS |tu r?|jr0|j	 }|j
r0t||j}|tur0|S t|dd }|d ur?|jp>|}|jrE|j}|jrwt| j dd rtt| drt fdd| jD }| j j |}|rt|j}|jrq|j}|jS |jS |tu r|jr|jr|jjr|jj}|jr|S |j
r|jj}	|	dkrtjS |	dkrtjS |	tjv r|S | j  }|r|j s|j!r|S tS )Nr   r   c                    r.  rR   r   r_   r  rx   rR   rS   r   K  r0  z'CallNode.infer_type.<locals>.<listcomp>r   r*  )"r  r   r|   r  r   r  r  r   r  r  r  r   "find_return_type_of_builtin_methodr  r   r   r  r  r4  r  r   r   best_function_matchr  r   r   r  ro   r  r  #types_that_construct_their_instancerA  is_struct_or_unionr   )
rV   rq   r  r  method_obj_typeresult_typer   	arg_types
func_entry	func_namerR   rx   rS   r   5  sV   



zCallNode.infer_typec                 C   r'  rK   )r  r/  r   rR   rR   rS   r/  e  r
  zCallNode.type_dependenciesc                 C   rT   rP  rR   rU   rR   rR   rS   r  j  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 rP  )may_return_noner  r   r   r   r   r  r  ro   r   r  r   r  )rV   r  r   rR   rR   rS   r  q  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 |jr}|jj jr}|jj }t||j}|tu | _|jro|| _ d S |jrx|j| _ d S t| _ d S t| _ d S )Nr   F)r   r   r   r   r   r  ro   r  r   r  r	  builtin_typesr   r  r4  r  r  r  r  r  rn   r  )rV   r  r  r  r  rR   rR   rS   set_py_result_type~  s<   








zCallNode.set_py_result_typec           
   	      s(  | j  }|rI|jrI|  \}}g }t||jjD ]\}}|t|j	t
|j	|jd|d q|r7||j7 }t| j	|d}| | }|S |r|jr fdd| jD | _|jd}	|	sqt| j j	d| j j  t| _| S t| j j	|	j| _ |	| j _| j |  |   || _| S dS dS )	z4
        Returns a replacement node or None
        r:  keyr   key_value_pairsc                    r.  rR   r$  r  rx   rR   rS   r     r0  z8CallNode.analyse_as_type_constructor.<locals>.<listcomp>z<init>z'no constructor found for C++  type '%s'N)r  rA  r  explicit_args_kwdsr  r  r  r   DictItemNoder   rM  ro   r  DictNoder  r  r   r   r  r   r1   r   rJ  r   rL  r  analyse_c_function_call)
rV   rq   r   r   r`  r  r  memberr   r  rR   rx   rS   analyse_as_type_constructor  s2   
$


z$CallNode.analyse_as_type_constructorc                 C   s   | j j}|jr
|j}|S rK   )r  r   r  r  rV   r  rR   rR   rS   function_type  s   zCallNode.function_typec                 C   r%  rK   )r   r   rU   rR   rR   rS   r     rE  zCallNode.is_lvaluec                 C   s@   |   }|jr|   d S |jst|dds|   d S d S d S )Nr   F)r  rn   rL  r  r   )rV   rq   r  rR   rR   rS   rM    s   zCallNode.nogil_checkzCalling gil-requiring functionrK   )rY   rZ   r[   r  r   r/  r  r  r  r  r  r   rM  r  rR   rR   rR   rS   r  0  s    0
$
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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 fddZdd Z  ZS )r  )rV   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                    r.  rR   r  r  r  rR   rS   r     r0  z5SimpleCallNode.compile_time_value.<locals>.<listcomp>)r  r  r   r  r  )rV   r  r  r   r  rR   r  rS   r    s   
z!SimpleCallNode.compile_time_valuec                 C   s   | j jr?| j jjrA| j j}t|st|rC|j}| j jj	}|r$|j
nt	|jj}t||rEdd | jD }|| | _d S d S d S d S d S )Nc                 S      g | ]}|j qS rR   r}   r  rR   rR   rS   r          z<SimpleCallNode.calculate_constant_result.<locals>.<listcomp>)r  r  r  r   r}   r$   	isbuiltinismethodrY   r   ro   __self__r   is_safe_compile_time_methodr   )rV   methodr   object_typeobject_type_namer   rR   rR   rS   r    s   
z(SimpleCallNode.calculate_constant_resultc                 C   sP   |j }||j}|sJ d||jf t||j||jd}| |||gd}|S )Nz Getter not found in scope %s: %s)ro   r   r   r  )r  r  ro   r  r  r   )rO   r   r  r   property_scopegetter_entryr  r   rR   rR   rS   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 )Nr  r*   zonly one type allowed.r   zUnknown typetypeof)r  r  r   r   r   r   rA  r   r  r  r   )rV   rq   rW  r   operandrR   rR   rS   rA    s   

zSimpleCallNode.analyse_as_typec                 C   s
   | j d fS rK   r  rU   rR   rR   rS   r    rK  z!SimpleCallNode.explicit_args_kwdsc                    s  | j r| S d| _ |   }d ur|S d| j_| j | _| j}|jr5|jr5|jjr5|j| _	t
| j	|_|  }d| _t rk|jrkt|rkd}t| j| jd| _| j | _| jjD ]}|t|M }q]t|| _| 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*   Fr  )function_cnamer  r   c                    r.  rR   r$  r  rx   rR   rS   r   J  r0  z0SimpleCallNode.analyse_types.<locals>.<listcomp>r   )#analysedr  r  r  r  r  r   
is_cmethodr  rV   r[  r  is_numpy_call_with_exprsr@   r  rE   r  r   r   r  rC   r*  add_include_filerF   NumPyMethodCallNoder  rG   rH   r=   rn   r  r  r   r  r   )rV   rq   as_type_constructorr  r  has_pythran_argsr  rR   rx   rS   r  !  sT   


zSimpleCallNode.analyse_typesc              
   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 }|rz|j|dd |D ddd |D d	}W n' tjy } zt|}|rt| j| tj| _d| _W Y d }~d S d }~ww 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| _|rq|jrq|j	rq|jsq|j	d }|d }|jr5| 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rS|j!rCt"| j}nt#| j}|$|j| }| _%n|jj&rm|$|j|}|jj&rmt'|t(rmd|_)||d< d}t*t+||
D ]T}|j	| }|j}|| $||}|jr|d}|, r|dkrd}n'|jj-r|j.s|dkr| jd urn|/ rn|dkrd}|0|}|||< qzt*||
D ]B}|| }|jj-r	|jt1u rtj2}n|j3 }|d u rt| j	|d  jd n
|$|| ||< }|, r|dkrd}q|rgt*|
d D ]F}|dkr/| jd ur/q || }|/ r:q |jj
rAq |j.rL|jj-rLq |dks\|dkre| jd uret4|jdd  nq || j	d d < t'| j t5r~t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| _|j8jErd|F| j j|j8jG_|j@dkrtH|r|ItJKdd |jLd | _Md S )Nz4Cannot call a static method on an instance variable.z
operator()rF  r   c                 S   r  rR   r  r  rR   rR   rS   r   t  r  z:SimpleCallNode.analyse_c_function_call.<locals>.<listcomp>Tc                 S   r  rR   )r   r  rR   rR   rS   r   v  r  )fail_if_emptyarg_is_lvalue_arrayzCalling non-function type '%s'r*   r   )'NoneType' object has no attribute '%{}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)Nr  r   r1   r4  is_static_methodrV   r  r   r   r   r   r  r  r   ro  r  r   r  r  r  NoMatchFoundru   r  r  r   optional_arg_counthas_optional_argsr   r  not_noner  r   ro   accept_builtin_subtypesCMethodSelfCloneNoder[  r  r  r  r|   r  exact_builtin_typerangeminrV  rn   r   r5  r  r   r/   default_coerced_ctyper   r  r  r  r  r   r  rR  utility_code_definitionr   r	  r   r   r   r   CFakeReferenceTyper  r  declare_tuple_typer  r   r   r   r   ri   r  )rV   rq   r  r   overloaded_entryr   excr  	max_nargsexpected_nargsactual_nargs
formal_argr  some_args_in_tempsrh  formal_type	arg_ctyper  rR   rR   rS   r  Q  s8  




















 



z&SimpleCallNode.analyse_c_function_callc                 C   rW  rK   )c_call_coderU   rR   rR   rS   r   !  rE  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 )NrF  rG  r  rx  r  )r  r   r   r1   r4  r   r   r  r   r  r  r   r+  ru   r~   wrapper_callr  r   is_unbound_cmethodopt_arg_structr   r   r_  )rV   r  formal_argsarg_list_coder   r  r  r  r  
actual_argarg_codeoptional_argsr   rR   rR   rS   r  $  s.   




zSimpleCallNode.c_call_codec                 C   s$   |   }|jd u s|jdkrdS dS )Nr   FT)r  r   r   r  rR   rR   rS   r  B  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rd| jjrdt | d S | jjrn| jjd nd }| j| j||f}|D ]}|d ur|| qz|| 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*   PyObjectCallNoArgrM  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   rn   r   r  r   rM   ry  rV   r  rs  r   rc  r   r   r  r  r  )rV   r   r  abs_function_cnamesis_signed_intr  r   subexprrP   rR   rS   ry  H  st   








z'SimpleCallNode.generate_evaluation_codec              
   C   s~  |   }|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| 	   n| j j#r| j!sJ |
"| j $| 	  n|j%d	kr=|j&}|j%}|d ur|j'(|}|j'j)r|jtd
d |
"d| 	  d| d| 	  d n|
"| 	  d|  |r=|r8|
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!sD|
r| 0 }| 	 rdd| 	  }| j!rc| j jrct1t2| j |}nd}|j%d	krt3|| jd||f | j jr~| 	 nd |j&| n|
r|4d5|
| j}nd}|d|||f  | j jr| 	 r| | | jr|j6| j d S d S d S )Nr4  rM  z*%s = __Pyx_PyObject_Call(%s, %s, NULL); %sTr[  %s.%s = %s;rv  r  r   r  rV  zmemcmp(&z, &	, sizeof(z)) == 0z == r   )function_namevoid_returnis_callis_from_pxdr   r   r   r   z%s = r  z%s%s;z && z%s%s; %s)7r  rn   r  r   r   r   r   r   r   r   r  r   r   r  r4  r`  	gil_ownedr  r   r   r  ra  op_arg_structr  r  r   pyrex_prefixr   r  opt_arg_cnamero   r   r   r   r   r   error_conditionr   r   r  	cast_coder  r   r   write_noexcept_performance_hintr  r^  defined_in_pxdr  r0   r   r   r   r_  rh  )rV   r   r  r#  r   r  r  r   r  r"  
exc_checksexc_val	exc_checktyped_exc_valperf_hint_entryr   rY  
goto_errorrR   rR   rS   rt    s   








(





Gz#SimpleCallNode.generate_result_code)rY   rZ   r[   r   rV   r  r  r  r  r   r  r  r  r  r  r  rA  r  r  r  r   r  r  ry  rt  r\   rR   rR   rP   rS   r    s0    
	0 Q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 functionrD  z!new (&%s) decltype(%s){%s{}(%s)};r  c                 s       | ]}|  V  qd S rK   )r  )r_   rp  rR   rR   rS   rc     rd   z?NumPyMethodCallNode.generate_evaluation_code.<locals>.<genexpr>)rs  r   rc  r  r   r   ry  r   r   r  r_  )rV   r   r   r  rR   rR   rS   ry    s   

z,NumPyMethodCallNode.generate_evaluation_codeN)rY   rZ   r[   r   r   r  ry  rR   rR   rR   rS   r    s
    r  c                       s   e Zd Zg dZdZdZdZdZdZ fddZ	dd Z
ed	d
 ZedddZedd ZdefddZdd Zdd Zdd Zdd Zdd Z  ZS )PyMethodCallNode)r  r  kwdictkwargs_key_value_pairsTFNc                    sV   t  j|fi | |  rd| _| jj| _| jr'| jjr)| jj	| _
d | _d S d S d S r=  )rM   r"  can_avoid_attribute_lookupuse_method_vectorcallr  r  function_objrF  r  r  rG  )rV   r   kwrP   rR   rS   r"    s   


zPyMethodCallNode.__init__c                 C   sL   | j rt| j tsdS | j}|jsdS |jsdS |jrdS t|s$dS dS r  )	rF  r|   r  r  r  
is_py_attris_special_lookuprE  attribute_is_likely_method)rV   r  rR   rR   rS   rH    s   
z+PyMethodCallNode.can_avoid_attribute_lookupc                 C   s   | j }|jr|jjrdS dS r  )r  r   r   r-  )rW  r  rR   rR   rS   rN  $  s   z+PyMethodCallNode.attribute_is_likely_methodc                 C   sH   t | tsdS | jrdS | jrt| jdkrdS t| js"|p!| S dS )z~
        Test whether the positional args given are compatible with
        being translated into a PyMethodCallNode.
        Fr*   T)r|   r  r   r   r   r   )r  
has_kwargshas_explicit_kwargsrR   rR   rS   can_be_used_for_posargs+  s   


z(PyMethodCallNode.can_be_used_for_posargsc                    sj   d}| j r| jr| jjjrd}|S | jr3| j}|jjrd}|S |jr3tttf t	 fdd|jD }|S )zo
        Test whether the function passed is suitable to be translated
        into a PyMethodCallNode
        TFc                 3   s$    | ]}|j ot|j   V  qd S rK   )r   r|   )r_   r=  non_method_nodesrR   rS   rc   O  s
    
z<PyMethodCallNode.can_be_used_for_function.<locals>.<genexpr>)
r  r   r   r4  r   cf_assignmentsPyCFunctionNode	ClassNodePy3ClassNoderj   )r  may_be_a_methodr   rR   rR  rS   can_be_used_for_function=  s    
z)PyMethodCallNode.can_be_used_for_functionreturnc                 C   s   | j r$| j| || d| j  d ||t || jj	S || d | j| | j
 r<| j S |jjtdd}| j| |d|| j f  | j| | j| |S )Nr  r  z = NULL;Tr[  	%s = %s; )rI  rJ  ry  r   r   rj  r   r  r  r  rV  r   r`  ra  rl  r  r  )rV   r   self_argr  rR   rR   rS   generate_evaluate_functionT  s   

z+PyMethodCallNode.generate_evaluate_functionc                 C   sd   | j r| j| | j| d S | j r$| j| | j| d S ||t |j	| d S rK   )
rI  rJ  r  r  r  rV  r  r   r`  rh  rV   r   r  rR   rR   rS   generate_dispose_functionk  s   
z*PyMethodCallNode.generate_dispose_functionc                 C   s.  | j s| jsd S | jjr| | jrdnd}n.| jjrC| jjrC| jjD ]}|j}|r?|jr?|jj	r?|jj	j
r?| |r?d} nq#d}nd}|d |d||f  || d| d |d| d |d| d ||t |d	t ||td	 || d
 |d |d d S )Nlikelyunlikelyz#if CYTHON_UNPACK_METHODSzif (%s(PyMethod_Check(%s))) {z = PyMethod_GET_SELF(r  zassert(z2PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx__functionz = 0;r   r  )rI  unpackr  r  rN  r   r   r   r  r   rn   r   rj  r   r  )rV   r   r\  space_for_selfarg_var
method_objlikely_methodr=  r   rR   rR   rS   &generate_runtime_method_unpacking_codev  s4   


z7PyMethodCallNode.generate_runtime_method_unpacking_codec                 C   s   | | dt| d||| j  ||t t|D ]>\}}|jjt	j
u o.|j  }|| jd|r8dnd d|j  d|j  d| dtj dt|d	  d|d
d qd S )Nz# = __Pyx_MakeVectorcallBuilderKwds(r  __Pyx_VectorcallBuilder_AddArgr  _Checkr  r  r   r*   rq  rh  )r   r   r   r   r  r   r^  r  r   r   r   r  r  r   r   r   callargs_cname)rV   r   r   rG  kwnames_temprv  keyvalue
key_is_strrR   rR   rS   generate_keyvalue_args  s2   
z'PyMethodCallNode.generate_keyvalue_argsc                 C   s`   | j r| jrd}d}nd}d}n| jrd}d}n| jr d}d}nd}d	}|jt|d
 |S )N!PyObjectVectorCallMethodKwBuilder-__Pyx_Object_VectorcallMethod_CallFromBuilderPyObjectFastCallMethod__Pyx_PyObject_FastCallMethodPyObjectVectorCallKwBuilder'__Pyx_Object_Vectorcall_CallFromBuilderPyObjectFastCall__Pyx_PyObject_FastCallDict__Pyx_PyObject_FastCallrM  )rI  rG  rF  r   r   r   r   )rV   r   ro   r  rR   rR   rS   select_utility_code  s$   
z$PyMethodCallNode.select_utility_codec                 C   s  | | j | | | j}| j}|jjtdd}| ||}| j	j
}| j	jd u s+J |D ]}|| q-|rB|D ]}|| q9n|rI|| |jjtjdd}	||	 d| jr\dnd d | j|||	|d | |}
|d	 |rd
dd |D nd}|rdt| dnd}|dtj d|rt|d ndd| d| d
| d
 d}|r|jjtdd}| |||| n|r| }||   d|
 d| d
tj d|	 dt|d dd|	 d| jrdn|	 d|rd
nd | d ||t ||	fD ]	}|j| q|D ]}|| || q|r?|D ]}|| || q$||t |j| n|rL|| || | || |||  | j |  | |d d S ) NTr[  Fr  rs  1r  )r\  rd  re  r  r  c                 s   rD  rK   r   r  rR   rR   rS   rc     rd   z<PyMethodCallNode.generate_evaluation_code.<locals>.<genexpr>rG  z + ((CYTHON_VECTORCALL) ? z : 0)r  
PyObject *[r*   r5   rq  z] = {};r  r   z, (rr  z) | (z&*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)r  r   )!rs  r   rc  rG  rF  r`  ra  r   r]  r  r   r   ry  r   r4  r   rI  rg  rx  r_  r   r   rj  rn  r   r  rh  r  r  r  r_  r   r  )rV   r   rG  rF  r\  r  r   r  rl  space_for_selfargfunction_caller	args_listextra_keyword_argskeyword_variabletmpkw_noderR   rR   rS   ry    s   

 

4





z)PyMethodCallNode.generate_evaluation_coder
  )rY   rZ   r[   r   r   rI  rF  rG  rJ  r"  rH  rO  rN  rQ  rY  ru   r]  r_  rg  rn  rx  ry  r\   rR   rR   rP   rS   rE    s*    	

$rE  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   r2  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  rR   rR   rS   can_be_inlined,  s   z%InlinedDefNodeCallNode.can_be_inlinedc                    s  | j  | _  fdd| jD | _| jj}t| j}d}t|D ]8}|j| j}| j| | }|	 r=|dkr<d}n|jj
rT jsT| rIn|dkrOd}| }|| j|< q!|rt|d D ]'}| j| }| rnqb|jjrsqb jr{|jj
r{qb|dkrt|jdd  | S qb| S )Nc                    r.  rR   r$  r  rx   rR   rS   r   9  r0  z8InlinedDefNodeCallNode.analyse_types.<locals>.<listcomp>Fr   Tr*   r  )r2  r  r   r  r  r   r  r   r  rV  rn   r   r5  r  r   r   r   )rV   rq   r  r  r  rh  r  r  rR   rx   rS   r  6  sD   


z$InlinedDefNodeCallNode.analyse_typesc              
   C   s>  | j  }| jjjsI|d |d |dtj d| d ||tj d| j	 |d |dtj d| d |d	 tj}|g}| jj}t
| j|jD ]\}}|jjri|||j qW||  qWd
|}|d|  | jjjj|||  | j	f  | jjjs|d | | d S )Nr  ##if CYTHON_COMPILING_IN_LIMITED_APIr{  z = PyCFunction_GetSelf(r  z == NULL && PyErr_Occurred()r  z = PyCFunction_GET_SELF(r  r  %s = %s(%s); %sr   )r2  r   r  r  is_cyfunctionr   r   r  r   r   r  r   r   rn   r   r   r   r_  r   pyfunc_cnamer   r  )rV   r   	self_coder#  r  r  	proto_argrR   rR   rS   rt  o  sF   










z+InlinedDefNodeCallNode.generate_result_code)rY   rZ   r[   r   r   r   r   r  r2  r  r  rt  rR   rR   rR   rS   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)ro   r   r   rR  r<  )rV   r   py_namer   r  rR  rR   rR   rS   r"    s   
zPythonCapiFunctionNode.__init__c                 C   r9  rK   rR   r   rR   rR   rS   r    rX   z$PythonCapiFunctionNode.analyse_typesc                 C   s   | j r|j| j  d S d S rK   )rR  r   r   rk  rR   rR   rS   rt    s   z+PythonCapiFunctionNode.generate_result_codec                 C   r   rK   rK  rU   rR   rR   rS   r     r;  z,PythonCapiFunctionNode.calculate_result_coderK   )rY   rZ   r[   r   r"  r  rt  r   rR   rR   rR   rS   r    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)rR  )r  r   r	  r  r  r  r"  )rV   r   r2  r  rR  r  r  rR   rR   rS   r"    s   zPythonCapiCallNode.__init__r  )rY   rZ   r[   r  r"  rR   rR   rR   rS   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  j|j||||j|jd d S )N)r  r   r   r  r   )rM   r"  r   r  r   )rV   	call_noder  r   r   rP   rR   rS   r"    s   
z$CachedBuiltinMethodCallNode.__init__c                 C   s   | j d ur| j S t| S rK   )r  r   r  rU   rR   rR   rS   r    s   

z'CachedBuiltinMethodCallNode.may_be_nonec              	   C   st   | j jj}| j  }dd | jD }|j|d||| j|}|	d| 
 ||| 
 | jf  | | d S )Nc                 S   r  rR   rz  r  rR   rR   rS   r     r  zDCachedBuiltinMethodCallNode.generate_result_code.<locals>.<listcomp>r  r  )r  r   typeptr_cnamer   r   r   cached_unbound_method_call_coder2  r   r   r   r   r   r  )rV   r   
type_cname	obj_cnamer   	call_coderR   rR   rS   rt    s   


z0CachedBuiltinMethodCallNode.generate_result_code)	rY   rZ   r[   r   r   r"  r  rt  r\   rR   rR   rP   rS   r    s    r  c                   @   sN   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d ZdS )GeneralCallNode)r  r  r  c              
   C   sf   | j |}| j|}| j|}z||i |W S  ty2 } z| | W Y d }~d S d }~ww rK   )r  r  r  r  r  r  )rV   r  r  r  r  r  rR   rR   rS   r    s   z"GeneralCallNode.compile_time_valuec                 C   s   | j jrB| j jjrD| j j}t|st|rF|j}| j jj	}|r$|j
nt	|jj}t||rH| jj}| jj}||i || _d S d S d S d S d S rK   )r  r  r  r   r}   r$   r  r  rY   r   ro   r  r   r  r  r  )rV   r  r   r  r  r   r  rR   rR   rS   r    s   
z)GeneralCallNode.calculate_constant_resultc                 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.)r  r  r  r   r   r   r   rU   rR   rR   rS   r    s   z"GeneralCallNode.explicit_args_kwdsc                 C   s   |  | }d ur|S | j|| _| jjjsY| jjjr!t| _| S t| jdrR|  }|d ur8|| ur8||S | jj	j
rE| j|| _n|| u rPt| jd n		 n| j|| _| jrc| j|| _| j|| _| j|| _| | j d| _| S )Nr   zRNon-trivial keyword arguments and starred arguments not allowed in cdef functions.r*   )r  r  r  r   rn   r  r1   r  map_to_simple_call_noder   r  r  r   r   r  r  r  r   )rV   rq   r  r   rR   rR   rS   r  
  s6   




zGeneralCallNode.analyse_typesc                    sj  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 } 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 rP n| r\|| qG||}|| || qG|rq|}	|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 rR   r  r  rR   rR   rS   r   L  s    z:GeneralCallNode.map_to_simple_call_node.<locals>.<setcomp>r   Fzargument '%s' passed twiceT)r~  
LetRefNodec                    s&   i | ]\}}|j j|t  |fqS rR   )r  r   r   r_   rh  r  pos_argsrR   rS   
<dictcomp>p  s    z;GeneralCallNode.map_to_simple_call_node.<locals>.<dictcomp>z(C function call is missing argument '%s'r  c                 S   s   g | ]\}}|qS rR   rR   r  rR   rR   rS   r     r  z;GeneralCallNode.map_to_simple_call_node.<locals>.<listcomp>z/C function got unexpected keyword argument '%s'r  )!r|   r  r  r  r  r  r   r   r  r  r4  r   r  r   r   r   r   rY  r  r  r   r\  r  ro   r   r  r~  r  r^  r  r  r  r  )rV   r  r   r  r  declared_argsmatched_argsunmatched_argsmatched_kwargs_countr   seen
has_errorsr  ro   decl_argr~  r  tempskeywordsfirst_missing_keywordr   rK  
final_args	new_tempsfirst_temp_arg	arg_valuer   rR   r  rS   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 )NrG  r4  rM  z(%s = __Pyx_PyObject_Call(%s, %s, %s); %s)r   r  r  r   r   r   r   r   r   r   r  r  r   r   r  )rV   r   r  rR   rR   rS   rt    s"   
z$GeneralCallNode.generate_result_codeN)rY   rZ   r[   r   r   r   r-   rL  rM  r  r  r  r  r  rt  rR   rR   rR   rS   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 )AsTupleNoder  r*   c                 C   r  rK   )r   r  r}   rU   rR   rR   rS   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 rK   )r  r  r   r  r  )rV   r  r  r  rR   rR   rS   r    s   
zAsTupleNode.compile_time_valuec                 C   s6   | j ||| _ | j jtu r| j dS t| _| S Nr  )r  r  r  r   r   r  r   rR   rR   rS   r    s
   zAsTupleNode.analyse_typesc                 C   rT   rP  rR   rU   rR   rR   rS   r    rX   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  )
r  r   r   r   r   r   r   r   r   r  )rV   r   r  rR   rR   rS   rt    s   
z AsTupleNode.generate_result_codeN)rY   rZ   r[   r   r   r  r  r  r  r-   rL  rM  r  rt  rR   rR   rR   rS   r    s    r  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 )MergedDictNoder  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 rK   r  r_   r  r   rR   rR   rS   rc     s    z;MergedDictNode.calculate_constant_result.<locals>.<genexpr>$duplicate keyword argument found: %s)reject_duplicatesr  r  r  r}   	iteritemsr   )rV   r   r  r   r  r  r   rR   rR   rS   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 rR   r  r  r  rR   rS   r     s    z5MergedDictNode.compile_time_value.<locals>.<listcomp>r  )	r  r  r  r  r  r  r   r  r  )	rV   r  r   r  r   r  r  r   r  rR   r  rS   r    s&   


z!MergedDictNode.compile_time_valuec                 C   rT   r  rR   r   rR   rR   rS   r/  "  rX   z MergedDictNode.type_dependenciesc                 C   rB  rK   r   r   rR   rR   rS   r   %  rX   zMergedDictNode.infer_typec                    rO  )Nc                    "   g | ]}|   d qS )z1argument after ** must be a mapping, not NoneTyper  r  r  r  rx   rR   rS   r   )      z0MergedDictNode.analyse_types.<locals>.<listcomp>)r  r   rR   rx   rS   r  (  s   
zMergedDictNode.analyse_typesc                 C   rT   rP  rR   rU   rR   rR   rS   r  2  rX   zMergedDictNode.may_be_noneConstructing Python dictc              
   C   sD  | | j | | t| j}t|}|| |jtur'|	d|
   |jrB|| |	d|  |
 f  || n[| ru|	d |	d|
   |	d|  |
 f  || |	d |	d |	d |	d|  |
 ||  |jf  | | || | r|	d	 |jtur|	d
 |jtdd |	d|  |
 ||  | jf  | | || |	d	 || t }|D ]}|jr<|jD ]R}|| | jr|	d|  |j
 f  |d |	d|j
 || jf  |	d	 ||jjd|  |j
 |j
 f  || || qq|| | jrZ|d ||jd|  |
 f  n)|d |	d|  |
 f  |	d|
   |	||j |	d	 || || qt |D ]}|jt|d qd S )Nz$if (likely(PyDict_CheckExact(%s))) {ri  zB#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_APIzif (Py_REFCNT(%s) == 1) {z} elser  r  z%s = PyDict_Copy(%s); %sr   r  r+  rM  z?%s = __Pyx_PyObject_CallOneArg((PyObject*)&PyDict_Type, %s); %s(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)!rs  r   rc  ra  r  rb  ry  r   r   r   r   r  rl  r   r  rV  r   r  r  r   r   r   r   r  rY  r  r  r  r\  r   r  r   r  )rV   r   r   r   helpersr  helperrR   rR   rS   ry  7  s   
































z'MergedDictNode.generate_evaluation_codec                 C      | j D ]}|| qd S rK   )r  r  rV   r   r   rR   rR   rS   r       
zMergedDictNode.annotateN)rY   rZ   r[   r   r   r   r   r  r  r  r/  r   r  r  r  ry  r  rR   rR   rR   rS   r    s    
^r  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  r8  r  r  )rV   cyrR   rR   rS   r    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*   r}  r  PyMethodNew2ArgrM  r  rV   __Pyx_PyMethod_New2Arg)r2  r  r   rR  )r   r   r4  r  r   analyse_as_python_attributer  r   r   r   r  r~  r  r	  r   r  r   r   r   r	  r
  r  r   r  )rV   r  rq   r   r~  r  obj_nodeunbound_noderR  r  binding_callcomplete_callrR   rR   rS   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}   )rV   rW  rR   rR   rS   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   r  r  )rV   r  rW  r  r  rR   rR   rS   r    s   z AttributeNode.compile_time_valuec                 C   r'  rK   )r  r/  r   rR   rR   rS   r/    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   r4  r   r  analyse_as_type_attributer  r   analyse_attributer  r   r  )rV   rq   r   r  rR   rR   rS   r     s   
zAttributeNode.infer_typec                 C   rB  r=  r)  r   rR   rR   rS   r    rK  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!  rR   rR   rS   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   r1   ri   r%  r  r  "analyse_as_ordinary_attribute_noder  r   r   r  wrap_obj_in_nonecheck)rV   rq   r  r   rR   rR   rS   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  rE  r4  r  r  as_name_noder:  r   r   )rV   rq   r  module_scoper   rR   rR   rS   r  1  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 jdrjdrd S tjdjf  d S )Nc                    s   g | ]	} | qS rR   )_create_unbound_cmethod_entry)r_   overloaded_alternativerq   rV   r   rR   rS   r   V  s    z;AttributeNode.analyse_as_type_attribute.<locals>.<listcomp>Fr  z%s not a known value of %sr  )r  r  rA  r  r  r   r  r  r  r  r   r4  r  r  overloaded_alternativesr  r  r5  rN  r   enum_valuesro   r   r   r  r  )rV   rq   r   
ubcm_entryrR   r  rS   r  C  s:   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 %srV   r   %s->%sr*   )
func_cnamer   r7  r  parent_scopeis_cpp_class_scoper   r   r   ro   r   r1   r%   r   r
  vtabptr_cnamer   r   r7  r4  r  r  )rV   r   r   rq   r   r  r  rR   rR   rS   r  i  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  rA  r   r  )rV   rq   r  r  rR   rR   rS   rA    s   zAttributeNode.analyse_as_typec                 C   s@   | j |}|r|| j}|r|jr|jjs|jjr|jS d S rK   )r  r?  r  r  r  r   r  r  rV   rq   r  r   rR   rR   rS   rG    s   
z'AttributeNode.analyse_as_extension_typec                 C   s0   | j |}|r|| j}|r|jr|jS d S rK   )r  r?  r  r  r  r  rR   rR   rS   r?    s   
zAttributeNode.analyse_as_modulec                 C   s8   t j| | j|d}|r||}n||}d|j_|S )N)ro   r   r*   )r  r  r  r'  r  r   r  )rV   rq   r   r  r   rR   rR   rS   r    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  r  r   r  r  rL  r   r   r	  r   r  r   r   is_cpropertyr  r  )rV   rq   r  rR   rR   rS   r    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  r  TTz/Cannot select attribute of incomplete type '%s'__weakref__z,Illegal use of special attribute __weakref__)(rL  r  r  r  r   ru  rv  r  r   r  r3  r  rF  r  r  r   is_fake_referencehas_attributesattributes_knownr  r  r   is_memslice_transposer   rb  	transposer   declare_attributern  r   r   r1   r   ro   r  r   r,  r  r   r  )rV   rq   r  immutable_objr   rR   rR   rS   r    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   rL  rn   r  ru  r  r&  r   rl  r  r  	is_structr  r4  r   r  r   r  r   r   )rV   rq   r  r  rR   rR   rS   r    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  rR   r  r  r   r  z&Cannot transpose None memoryview slicez5Cannot access '%s' attribute of None memoryview slicer  r  )ri   r  r   r  needs_none_checkrL  r   r   r  r   r  r  r  ro   r  )rV   rq   r  r  r   rR   rR   rS   r  (  s*   



z#AttributeNode.wrap_obj_in_nonecheckc                 C   s   | j r	|   d S d S rK   )rL  rL  r   rR   rR   rS   rM  @  s   zAttributeNode.nogil_checkzAccessing Python attributec                 C   r'  rK   )r  r:  r   rR   rR   rS   r:  F  r)  z0AttributeNode.is_cimported_module_without_shadowc                 C   s"   | j r|  p| j  S t| S rK   )r  rV  r  r  rU   rR   rR   rS   r  I  s   
zAttributeNode.is_simplec                 C   s   | j rdS t| S r=  )r  r  r   rU   rR   rR   rS   r   O  s   
zAttributeNode.is_lvaluec                 C   s   | j r| j  S t| S rK   )r  r   r  rU   rR   rR   rS   r   U  s   

zAttributeNode.is_ephemeralc                 C   s(   |   }| jr| jjr| jsd| }|S r.  )calculate_access_coder   rH  r  )rV   r   rR   rR   rS   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_cnamerF  vtabslot_cnamer_  r  upperr  r   r;  r   )rV   r  obj_coderR   rR   rS   r  a  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| 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PyObjectLookupSpecialrM  __Pyx_PyObject_LookupSpecialPyObjectGetAttrStr__Pyx_PyObject_GetAttrStrr}  rH  z=Transposing not supported for slices with indirect dimensionsri  Trm  z__pyx_memslice_transpose(&%s)zeif (unlikely(!%s.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");%s}rP  )#rL  rM  r   r   r   r   r   r   r  r   r  r  r   r   r  r   r   r  r  r   ro  r  r%  r   r   rH  r  r   r  rZ  r\  rp  r  r  r,  )rV   r   lookup_func_namerU  rV  r  undereferenced_resultrQ  rR   rR   rS   rt    sh   




z"AttributeNode.generate_result_codec                 C   s>   | j r| jjr| jr|j|  | jdd d S t| | d S )NTrm  )r   r   r   r  r  r   r   r  rk  rR   rR   rS   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  rM  z%__Pyx_PyObject_SetAttrStr(%s, %s, %s)z__Pyx_SET_C%s%s(%s, %s);r*   r  ri  )#r  ry  rL  r   r   r   r   r  r   r   r  r  r  r  r   r  r   r  r  implementation_suffixr   r  r   rn   rb  rl  r  r  
put_decrefr   r  r  put_assign_to_memviewslicer  r  )rV   r   r   r  r   r   select_coder  rR   rR   rS   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  rM  r  z+Cannot delete C attribute of extension type)r  ry  rL  r   r  is_property_scoper  r   r   r   r   r  r   r   r  r  r   r  r  r  rR   rR   rS   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)r  )rL  r  r   r6   r   r   r  )rV   r   r  r  rR   rR   rS   r      s   
(zAttributeNode.annotatec                 C   s&   | j  }|rtd|| jf S d S )Nr  )r  r	  r	   r  r  )rV   r  rR   rR   rS   r	     s   
z/AttributeNode.get_known_standard_library_importr  rK   rP  r  r
  )-rY   rZ   r[   r  r   r   r  r  r  rM  rL  r  r  r  r  r/  r   r  r'  r  r  r  r  rA  rG  r?  r  r  r  r  r  rM  r  r:  r  r   r   r   r  rt  r  r  r  r  r	  rR   rR   rR   rS   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<  )rV   r   r  rR   rR   rS   r"  &   r$  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   rR   rR   rS   r  )   s   z)StarredUnpackingNode.analyse_declarationsc                 C   r'  rK   )r  r   r   rR   rR   rS   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   rR   rR   rS   r  1   s
   
z"StarredUnpackingNode.analyse_typesc                 C   r2  rK   )r  r  r   rR   rR   rS   r  8   r  z/StarredUnpackingNode.analyse_target_declarationc                 C   s   | j || _ | j j| _| S rK   )r  r'  r   r   rR   rR   rS   r'  ;   s   
z)StarredUnpackingNode.analyse_target_typesc                 C   rT   r/  rR   rU   rR   rR   rS   r   @   rX   z*StarredUnpackingNode.calculate_result_codec                 C   r   rK   rR   rk  rR   rR   rS   rt  C   rX   z)StarredUnpackingNode.generate_result_codeN)rY   rZ   r[   r   r   r   r   r   r  r"  r  r   r  r  r'  r   rt  rR   rR   rR   rS   r     s    r  c                
       s   e Zd ZddgZdZdZdZdZdZdd Z	dd	 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                    r.  rR   r  r  r  rR   rS   r   \   r0  z8SequenceNode.compile_time_value_list.<locals>.<listcomp>r  r  rR   r  rS   compile_time_value_list[   r$  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   rV   r   r  rR   rR   rS   replace_starred_target_node^   s   

z(SequenceNode.replace_starred_target_nodec                 C   s"   |    | jD ]}|| qd S rK   )r  r   r  rV   rq   r  rR   rR   rS   r  l   s   
z'SequenceNode.analyse_target_declarationc                 C   s   t | jD ]\}}|s||}||| j|< q| jr1| j|}|jjs+||}||| _d| _|j	sA|j
sA|jrD|jj	rDd| _| S Nr*   T)r^  r   r  r  r   r   r  r,  r   r  r	  r  r  slow)rV   rq   skip_childrenrh  r  r   rR   rR   rS   r  q   s"   

zSequenceNode.analyse_typesc                    s   t j|dd}| 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 )NTr#  zHtrying to coerce sequence to ctuple of wrong length, expected %d, got %dc                    s   g | ]
\}}| | qS rR   )r  )r_   r  r   rx   rR   rS   r      rQ  z1SequenceNode.coerce_to_ctuple.<locals>.<listcomp>)r   r   r   )r   r&  r   r   r   r   r  r   r   r  r  r  rV   r  rq   coerced_argsrR   rx   rS   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 rK   )r   r  rR   rR   rS   rc          z?SequenceNode._create_merge_node_if_necessary.<locals>.<genexpr>r   r  Tr  r   )inplacer   r   )_flatten_starred_argsrj   r   r   r   r  r   r  r  MergedSequenceNoder   r   
binop_noder  )rV   rq   r   rN  r  r   rR   rR   rS   _create_merge_node_if_necessary   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 rK   )r   r   r  r   r   r   r   r  rR   rR   rS   r&     s   
z"SequenceNode._flatten_starred_argsc                 C   rT   rP  rR   rU   rR   rR   rS   r     rX   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   rG  r  r   )rV   rq   rh  r  unpacked_itemcoerced_unpacked_itemrR   rR   rS   r'     s,   
z!SequenceNode.analyse_target_typesc                 C   r  rK   generate_operation_coderk  rR   rR   rS   rt     rJ  z!SequenceNode.generate_result_codec                 C   sF  |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 sI| jt	u r| j
sO| jr|st| jdkr| jt	u rjd}|jtdd nd	}|d
||t| jddd | jD ||| jf  ||t d| _n| jjrt| jD ]\}}	|d|||	  f  qn| jt	u rd\}
}n| jtu rd\}
}ntd| j t| j}|d||
||||| jf  ||t |rtj}|d|  |dkr|}nd||f }|d||||f  d| _nd}t|D ]A}| j| }	|s#|	 s-| |	  |	!  |	"| |d|||rD|rDd||f pH|pH||	# |$| jf  q|rc|d |d |d ur|jj%r|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)__Pyx_PyList_PackListPackrM  PyTuple_Packz%s = %s(%d, %s); %sr  c                 s   rD  rK   rz  r  rR   rR   rS   rc      rd   z>SequenceNode.generate_sequence_packing_code.<locals>.<genexpr>Tz%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) != (0)) %s;z%s + %sr   z5{ PyObject* %s = PyNumber_InPlaceMultiply(%s, %s); %sri  )'r   r   r   r  r|   r}   r~   r  r   r   r   r  r   r   r   r   r   r   r   r_  r   r   r  r   needs_subexpr_disposalr  r^  r   r   r  r  rV  rj  r  r  r   r   rn   r  )rV   r   r  plainsize_factorc_multr   	pack_namerh  r  create_funcset_item_func	arg_countcounteroffsetrR   rR   rS   generate_sequence_packing_code   s   













"


z+SequenceNode.generate_sequence_packing_codec                    sF   | j rt | d S | jD ]}|| q| jr!| j| d S d S rK   )r8  rM   rw  r   r  r   r  rV   r   r  rP   rR   rS   rw  4!  s   
z+SequenceNode.generate_subexpr_disposal_codec                 C   sD   | j r
| || n| || | jD ]}|| q|| d S rK   )r   generate_starred_assignment_code!generate_parallel_assignment_coder*  rE  r  )rV   r   r   r  r   r   r   rR   rR   rS   r  B!  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 )N   use_loopr  r   )r*  rD  r   r   r   r   r  r   (generate_special_parallel_unpacking_coder   (generate_generic_parallel_unpacking_coder+  ry  r  r   r  )rV   r   r   r   special_unpacklong_enough_for_a_loop
value_noderh  rR   rR   rS   rE  R!  s0   







z.SequenceNode.generate_parallel_assignment_codec              
   C   sF  d}d|   }|jtu rdg}d}| r|}n)|jtu r*dg}d}| r)|}nddg}d}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 ]E\}
}|d dkr||  d|
 d ||| | j || |  q||  d|
 d || |  qt|dkrW|d t| jD ]H\}
}|d dkr9||  d|
 d ||| | j || |  q	||  d|
 d || |  q	|d |d |st| jD ]!\}
}|d| |
|| | jf  || |j qdnJ|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 ).Nry  zlikely(%s != Py_None)r  r  r  r  __Pyx_PySequence_SIZEzlikely(PyTuple_CheckExact(%s))zPyList_CheckExact(%s)z(%s) || (%s)r3  zPyObject* sequence = %s;zPy_ssize_t size = %s(sequence);zif (unlikely(size != %d)) {RaiseTooManyValuesToUnpackrM  z1if (size > %d) __Pyx_RaiseTooManyValuesError(%d);RaiseNeedMoreValuesToUnpackz9else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);r   r  r5   z(if (likely(Py%s_CheckExact(sequence))) {r   z% = __Pyx_PyList_GetItemRef(sequence, r  z = PyTuple_GET_ITEM(sequence, r  r*   r  z,%s = __Pyx_PySequence_ITEM(sequence, %d); %sr  zPy_ssize_t i;PyObject** temps[%s] = {%s};r  c                 S      g | ]}d |   qS r  r   r   rR   rR   rS   r   !  r:  zISequenceNode.generate_special_parallel_unpacking_code.<locals>.<listcomp>zfor (i=0; i < %s; i++) {z7PyObject* item = __Pyx_PySequence_ITEM(sequence, i); %sr   z*(temps[i]) = item;r  RaiseNoneIterErrorz%__Pyx_RaiseNoneNotIterableError(); %srG  )r   r   r   r  r   r   r   r   r   r   r   r   r   r   r^  r*  r   r   r  r  rj  r  r_  r   r  rJ  )rV   r   r   rH  sequence_type_test
none_checkr4   get_size_functuple_check
list_checkrh  r   rR   rR   rS   rI  l!  s   






















z5SequenceNode.generate_special_parallel_unpacking_codeTc              	   C   sH  |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| d |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 )NrP  rM  
IterFinishzPy_ssize_t index = -1;rQ  r  c                 S   rR  rS  rT  r   rR   rR   rS   r   !  r:  zISequenceNode.generate_generic_parallel_unpacking_code.<locals>.<listcomp>Tr[  r  Fr  r  unpacking_failedrx  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_  r`  ra  r   r   r   r   r  r  r  r  r  r  r^  r   r  r  r  r  r   rh  )rV   r   r   r*  rH  	terminateiterator_tempiternext_funcunpacking_error_labelunpack_coderh  r   unpacking_done_labelrR   rR   rS   rJ  !  s   














z5SequenceNode.generate_generic_parallel_unpacking_codec                 C   s^  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||sw|
 rw|jttfv rwd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 ]E\}\}	}|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)rH  r_  r   r  __Pyx_PySequence_ListKeepNewPySequence_ListrP  rM  r[  z%s = __Pyx_PyList_GET_SIZE(%s);zif (unlikely(%s < %d)) {z)__Pyx_RaiseNeedMoreValuesError(%d+%s); %sr  z#if CYTHON_COMPILING_IN_CPYTHONz!%s = PyList_GET_ITEM(%s, %s-%d); z((PyVarObject*)%s)->ob_size--;r  z'%s = __Pyx_PySequence_ITEM(%s, %s-%d); r  z #if !CYTHON_COMPILING_IN_CPYTHONz*%s = PySequence_GetSlice(%s, 0, %s-%d); %s%s = %s; %s = NULL;zCYTHON_UNUSED_VAR(%s);)#r^  r   r   r*  rD  r   rJ  r+  ry  r   rV  r   r   r   r   r   r   r  r  r`  rh  r  r   r   r   r   ra  r   r<  r   r   r  r  r  r  )rV   r   r   rh  r  starred_targetunpacked_fixed_items_leftunpacked_fixed_items_rightr`  r   rM  target_listlength_tempcoerced_argsublist_temprR   rR   rS   rD  "  s   

















z-SequenceNode.generate_starred_assignment_codec                 C   sP   | j D ]}|| q| jr$| jD ]}|| q| jD ]	}|| qd S d S rK   )r   r  r*  r+  rC  rR   rR   rS   r  n"  s   


zSequenceNode.annotater
  rP  r  r#  )"rY   rZ   r[   r   r   r*  r   r  r8  r  r  r  r  r!  r)  r&  r  r'  rt  rB  rw  r  r   r  r	  r   r
  r  rE  rI  rJ  rD  r  r\   rR   rR   rP   rS   r  G   s@    	
	
f

eITr  c                   @   sr   e Zd ZeZdZdZdd ZdddZdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )r  Fr  c                    sJ   | j s| jstS  fdd| jD }tdd |D rtS  | j|jS )Nc                    r.  rR   r  r  rx   rR   rS   r   "  r0  z(TupleNode.infer_type.<locals>.<listcomp>c                 s   s(    | ]}|j p|jp|jp|jV  qd S rK   )rn   r   r  rB  )r_   r   rR   rR   rS   rc   "  s     z'TupleNode.infer_type.<locals>.<genexpr>)r   r   r   rj   r  r   r   )rV   rq   r  rR   rx   rS   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 rK   )r   r   rn   r   rB  r  rR   rR   rS   rc   "  s    &z*TupleNode.analyse_types.<locals>.<genexpr>c                 s   r"  rK   r  r  rR   rR   rS   rc   "  r#  r*   r$  c                 s   r"  rK   )r   )r_   childrR   rR   rS   rc   "  r#  )r   is_partly_literalr   r   r   r^  r   r  r  r   rj   r  r   r   r  r)  r   r  r|   r}   r~   rn   r  r  )rV   rq   r  rh  r  r   rR   rR   rS   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                    r.  rR   )rA  r  rx   rR   rS   r   "  r0  z-TupleNode.analyse_as_type.<locals>.<listcomp>c                 s   s    | ]}|d u V  qd S rK   rR   r^   rR   rR   rS   rc   "  rd   z,TupleNode.analyse_as_type.<locals>.<genexpr>)r   rj   r  r   r   )rV   rq   r   r   rR   rx   rS   rA  "  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                    r.  rR   )r  r  rx   rR   rS   r   "  r0  z'TupleNode.coerce_to.<locals>.<listcomp>r*   )r   r   r   r   Tr$  )r   r  r  r!  r   r   r   r  r   r   r  r  r  r  r  rR   rx   rS   r  "  s$   zTupleNode.coerce_toc                 C   0   t | j| j| jd}t| jtrt| j|_|S N)r   r   )rk  r   r   r   r|   r}   r   r   rV   r`   rR   rR   rS   as_list"     zTupleNode.as_listc                 C   rT   r=  rR   rU   rR   rR   rS   r  "  r;  zTupleNode.is_simplec                 C   rT   r=  rR   rU   rR   rR   rS   r5  "  r;  zTupleNode.nonlocally_immutablec                 C   r   rK   r~  rU   rR   rR   rS   r   "  r;  zTupleNode.calculate_result_codec                 C      t dd | jD | _d S )Nc                 S   r  rR   r  r  rR   rR   rS   r   "      z7TupleNode.calculate_constant_result.<locals>.<listcomp>)r   r   r}   rU   rR   rR   rS   r  "     z#TupleNode.calculate_constant_resultc              
   C   sF   |  |}zt|W S  ty" } z| | W Y d }~d S d }~ww rK   )r  r   r  r  rV   r  rN  r  rR   rR   rS   r  "  s   

zTupleNode.compile_time_valuec              
   C   sV  t | jdkr|tj| _d S | js| jrt| j	| jr| j
nd g| j }|jd|d}||}|d urL|| j | j||| j d ||t | jrT|| _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   r  )r9  PySequenceMultiplyrM  z*%s = __Pyx_PySequence_Multiply(%s, %s); %sz"%s = PyNumber_Multiply(%s, %s); %sT)r   r   r2  r   empty_tuplero  r   rp  r   r   r   r  r  rs  r   rB  r  r   r  r   r   r   r   r   r   r   r  r   r   r  )rV   r   r  tuple_targetr  rR   rR   rS   r0  "  s:    




z!TupleNode.generate_operation_codeNr
  )rY   rZ   r[   r   r   rp  r  r   r  rA  r  rt  r  r5  r   r  r  r0  rR   rR   rR   rS   r  x"  s    
	+
r  c                   @   st   e Zd Zg ZeZdZdZdd Zdd Z	dd Z
d	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )rk  FzConstructing Python listc                 C   rT   r  rR   r   rR   rR   rS   r/  #  rX   zListNode.type_dependenciesc                 C   rB  rK   )r   r   rR   rR   rS   r   "#  r;  zListNode.infer_typec                 C   s.   | j D ]}|jrd|_qt| |}||S r=  )r   r   r  r  r%  r  )rV   rq   r  r   rR   rR   rS   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 )NTr  )
r   r   r   original_argsr  r  obj_conversion_errorsr  rm  r)  )rV   rq   errorsr   rR   rR   rS   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*   )$rn   r~  r   r   r  r   r   r3  r  r  r   c_void_typer   r   r   r|   r}   r~   r  r  r}  r  r  r  r   TypecastNoder   r  r  r  r   r^  r  r  r!  r1   )	rV   r  rq   rr   r  r  rh  r  r  rR   rR   rS   r  7#  sX   

'


 
zListNode.coerce_toc                 C   r9  rK   rR   rU   rR   rR   rS   rt  f#  rX   zListNode.as_listc                 C   rq  rr  )r  r   r   r   r|   r}   r   r   rs  rR   rR   rS   as_tuplei#  ru  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   r3  rm  r`  ra  r   r  rc  rk  rR   rR   rS   rc  o#  s   
zListNode.allocate_temp_resultc                 C   s"   | j rt dd | jD | _d S )Nc                 S   r  rR   r  r  rR   rR   rS   r   #  rw  z6ListNode.calculate_constant_result.<locals>.<listcomp>)r   r   r   r}   rU   rR   rR   rS   r  }#  s
   z"ListNode.calculate_constant_resultc                 C   s$   |  |}| jr|| j|9 }|S rK   )r  r   r  )rV   r  lrR   rR   rS   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}++) {{)rh  countz+ (%d * %s)r  r  rV  z'memcpy(&(%s[%s%s]), %s, sizeof(%s[0]));z%s[%s%s] = %s;r   r0  zList type never specified)r   rn   r~  r   rB  r3  r   r   r   r  r   r   r   r   r^  r   r   r   r   r  r  r  r  r   r   )rV   r   rr   rA  rh  r  r  rR   rR   rS   r0  #  sN   







z ListNode.generate_operation_codeN)rY   rZ   r[   r~  r   r   rm  r  r/  r   r%  r  r  rt  r  rc  r  r  r0  rR   rR   rR   rS   rk  #  s     
/rk  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   rK   r  r   rR   rR   rS   r   #  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 rK   )
r   r  r  r|   r  r   _ForInStatNoder   r  ForFromStatNoder   rR   rR   rS   r  #  s   
z&ComprehensionNode.analyse_declarationsc                 C   r2  rK   )r  r  r   rR   rR   rS   r  #  r  z-ComprehensionNode.analyse_scoped_declarationsc                 C   s   | j s
| j|| _| S rK   r  r  r%  r   rR   rR   rS   r  #     zComprehensionNode.analyse_typesc                 C   s   | j r
| j|| _| S rK   r  r   rR   rR   rS   r  #  r  z,ComprehensionNode.analyse_scoped_expressionsc                 C   rT   rP  rR   rU   rR   rR   rS   r  #  rX   zComprehensionNode.may_be_nonec                 C   r  rK   r/  rk  rR   rR   rS   rt  #  rJ  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)rV   r   create_coderR   rR   rS   r0  #  s   
z)ComprehensionNode.generate_operation_codec                 C   r2  rK   )r  r  rk  rR   rR   rS   r  #  r  zComprehensionNode.annotateN)rY   rZ   r[   r   r   r  r}   r   r  r  r  r  r  rt  r0  r  rR   rR   rR   rS   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 rK   )r  r%  r   rn   r  r   rR   rR   rS   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  ry  r   r   r   r   r  r  r^  rR   rR   rS   r  #  s(   


z/ComprehensionAppendNode.generate_execution_codec                 C   s   | j || d S rK   )r  r  r  rR   rR   rS   r  $  r   z5ComprehensionAppendNode.generate_function_definitionsc                 C   r2  rK   )r  r  rk  rR   rR   rS   r  $  r  z ComprehensionAppendNode.annotate)rY   rZ   r[   r   r  r   r  r   r%  r  r  r  rR   rR   rR   rS   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 rK   )r  r%  r   rn   r  r  r   rR   rR   rS   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  ry  r  r   r   r  r   r   r  r  rk  rR   rR   rS   r  "$  s   
z3DictComprehensionAppendNode.generate_execution_codec                 C   s    | j || | j|| d S rK   )r  r  r  r  rR   rR   rS   r  /$     z9DictComprehensionAppendNode.generate_function_definitionsc                 C      | j | | j| d S rK   )r  r  r  rk  rR   rR   rS   r  3$     z$DictComprehensionAppendNode.annotateN)rY   rZ   r[   r   r%  r  r  r  rR   rR   rR   rS   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                    sf   |j j}d|_|d ur%|tttfv sJ |||_|jt||t	j
|d t j|fd|i| d S )NT)r  r   r  )r  gbody
is_inlinedr   r   r   inlined_comprehension_typer  rJ  r   retval_cnamerM   r"  )rV   r   r  comprehension_typer  r  rP   rR   rS   r"  I$  s   z'InlinedGeneratorExpressionNode.__init__c                 C   s
   | j dvS )N)rj   r  r  )	orig_funcrU   rR   rR   rS   r  U$  rK  z*InlinedGeneratorExpressionNode.may_be_nonec                 C   r   rK   r  r   rR   rR   rS   r   X$  r;  z)InlinedGeneratorExpressionNode.infer_typec                 C   r*  rK   )r  r%  r   rR   rR   rS   r  [$  r+  z,InlinedGeneratorExpressionNode.analyse_typesc              	   C   s:   | d|  | j ||  | jf  | | d S )Nz-%s = __Pyx_Generator_GetInlinedResult(%s); %s)r   r   r  r   r   r  rk  rR   rR   rS   rt  _$  s
   z3InlinedGeneratorExpressionNode.generate_result_coderK   )rY   rZ   r[   r   r  r  r   r   r   r"  r  r   r  rt  r\   rR   rR   rP   rS   r  8$  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   rk  r   r   r   r   r"  )rV   r   r   r   rR   rR   rS   r"  r$  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"  rK   r  r  rR   rR   rS   rc   $  r#  z?MergedSequenceNode.calculate_constant_result.<locals>.<genexpr>)r   r   r   r}   r  r   r   r   rY  r   r   r   )rV   r   r   r  rR   rR   rS   r  y$  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 rK   r  r  r  rR   rS   rc   $  s    z8MergedSequenceNode.compile_time_value.<locals>.<genexpr>)r   r   r   r  r  r   r   r   rY  r  r  r   r   r   )rV   r  r   r   r  r  rR   r  rS   r  $  s.   




z%MergedSequenceNode.compile_time_valuec                 C   rT   r  rR   r   rR   rR   rS   r/  $  rX   z$MergedSequenceNode.type_dependenciesc                 C   r   rK   r  r   rR   rR   rS   r   $  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                    r  )z2argument after * must be an iterable, not NoneTyper  r  rx   rR   rS   r   $  r  z4MergedSequenceNode.analyse_types.<locals>.<listcomp>r*   r   )r   r   r   r   r   r   )rV   rq   r   rR   rx   rS   r  $  s   
z MergedSequenceNode.analyse_typesc                 C   rT   rP  rR   rU   rR   rR   rS   r  $  rX   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  || n1|d|  |rJdn| rW|jttfv rWdnd| ||  | jf  | | || || t }|rd}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 r0|d |dtj|  f  ||  t |d|  tj||  | jf  | | |d t|D ]}	|j t!j"|	  q4d S )Nri  r  	PySet_Newre  rf  r  __Pyx_PySet_Updater  __Pyx_PyList_Extend)r  r  r  )PySet_Updatez
Builtins.c)
ListExtendr  r  z"PyObject *%s = PyList_AsTuple(%s);r  r   )#rs  r   rc  r   r   ra  r   rb  ry  r  r   r   r   r   r   r  rV  r   r   r  r  r  rY  r   r\  r  r   r   r  r  r  r   r   r   r   )
rV   r   is_setr   r   r  add_funcextend_funcr  r  rR   rR   rS   ry  $  s   





















z+MergedSequenceNode.generate_evaluation_codec                 C   r  rK   )r   r  r  rR   rR   rS   r  %  r  zMergedSequenceNode.annotateN)rY   rZ   r[   r5  r   r   r  r"  r  r  r/  r   r  r  ry  r  rR   rR   rR   rS   r'  f$  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 r8  )r  r   r   r  r  r   r   r   )rV   rq   rh  r  rR   rR   rS   r  %  s   

zSetNode.analyse_typesc                 C   rT   rP  rR   rU   rR   rR   rS   r  #%  rX   zSetNode.may_be_nonec                 C   s   dd | j D | _d S )Nc                 S   s   h | ]}|j qS rR   r  r  rR   rR   rS   r   '%  r  z4SetNode.calculate_constant_result.<locals>.<setcomp>)r   r}   rU   rR   rR   rS   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                    r.  rR   r  r  r  rR   rS   r   *%  r0  z.SetNode.compile_time_value.<locals>.<listcomp>)r   rY  r  r  ry  rR   r  rS   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   ry  rc  r   r   r   r   r  r  r   r  r  rC  rR   rR   rS   ry  0%  s$   




z SetNode.generate_evaluation_codeN)rY   rZ   r[   r5  r   r   r   r  r  r  r  r  r  ry  rR   rR   rR   rS   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_   krP  r   rR   rS   r   T%  s    z'DictNode.from_pairs.<locals>.<listcomp>r  rR   )rO   r   pairsrR   r  rS   
from_pairsR%  s   
zDictNode.from_pairsc                 C   rv  )Nc                 S   r  rR   r  r   rR   rR   rS   r   X%  rw  z6DictNode.calculate_constant_result.<locals>.<listcomp>)r  r  r}   rU   rR   rR   rS   r  W%  rx  z"DictNode.calculate_constant_resultc              
      r  )Nc                    s$   g | ]}|j  |j fqS rR   )r  r  r   r   r  rR   rS   r   \%  s    z/DictNode.compile_time_value.<locals>.<listcomp>)r  r  r  r  )rV   r  r  r  rR   r  rS   r  [%  s   

zDictNode.compile_time_valuec                 C   rT   r  rR   r   rR   rR   rS   r/  c%  rX   zDictNode.type_dependenciesc                 C   rB  rK   r  r   rR   rR   rS   r   f%  r;  zDictNode.infer_typec                    sJ   t dd} fdd| jD | _W d    n1 sw   Y  || _| S )NTr  c                    r.  rR   r$  r   rx   rR   rS   r   l%  s    z*DictNode.analyse_types.<locals>.<listcomp>)r   r  r~  )rV   rq   r  rR   rx   rS   r  j%  s   

zDictNode.analyse_typesc                 C   rT   rP  rR   rU   rR   rR   rS   r  s%  rX   zDictNode.may_be_nonec                    s  t j|dd}|jr>|   | jjr.t|st| j	d|  t
| j	 fdd| jD dS | j|s<t| j	d|  | S |jr|| _|jsWt| jdkrWt| j	d	|  n|jrnt| jt|jjk rnt| j	d
| d | jD ]R}t|jtr~|jj|_|jjst|jj	d t|jj	tdd|_qqt|jj}|j|}|st|jj	d||f  qq|j}t|tr|j}||j |_qq| S t | S )NTr#  z-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   rx   rR   rS   r   }%  s    
z&DictNode.coerce_to.<locals>.<listcomp>r  z"Cannot interpret dict as type '%s'r*   z<Exactly one field must be specified to convert to union '%s'z%Not all members given for struct '%s'zInvalid struct field identifierrF  r:  zstruct '%s' has no field '%s')r   r&  rn   release_errorsr   r  r   r  r   r   r  r  r  r   r  r  r   r|   r  r  r  r  rM  r	   r  ru   r   r  r  rM   )rV   r  rq   r   r  r  r   rP   rx   rS   r  v%  sD   




zDictNode.coerce_toc                 C   s   | j D ]}t| qg | _ d S rK   )r~  r   )rV   rr   rR   rR   rS   r  %  s   


zDictNode.release_errorsr  c                 C   s  | | 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	 nR||jj}	|	d usJ d
|jj d|	j}
|j }|jjjr!|jtdd |d|   d|
 d| d| d	 n||   d|
 d| d || | | qA|rK|jtdd d S d S )Nz%%s = __Pyx_PyDict_NewPresized(%d); %sFr3  r  Tr  r  r  r   zstruct member z1 not found, error was not handled during coercionr  rV  zmemcpy(r  r  r1  r  r  r  r  r  )!rs  r   rc  r   rn   r  r   r   r   r  r   r  r  rY  ry  exclude_null_valuesr   r   r  r  r  r\  r   r  r  r   r3  r   r   r   r   r  r  )rV   r   is_dictstruct_scope	keys_seenkey_typeneeds_error_helperr   r  r  	key_cnamevalue_cnamerR   rR   rS   ry  %  s   











* 

z!DictNode.generate_evaluation_codec                 C   r  rK   )r  r  r  rR   rR   rS   r  %  r  zDictNode.annotatec                 C   s   dd | j D S )Nc                 S   s   i | ]\}}|j |qS rR   r:  r  rR   rR   rS   r  %  r:  z+DictNode.as_python_dict.<locals>.<dictcomp>r  rU   rR   rR   rS   as_python_dict%     zDictNode.as_python_dict)rY   rZ   r[   r   r   r  r   r   r  r  r~  r  r  r  r  r/  r   r  r  r  r  r  ry  r  r  r\   rR   rR   rP   rS   r  A%  s,    
	'R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 rK   )r  r}   r   rU   rR   rR   rS   r  	&  s   
z&DictItemNode.calculate_constant_resultc                 C   s<   | j || _ | j|| _| j || _ | j|| _| S rK   )r  r  r   r  r   rR   rR   rS   r  &  s
   zDictItemNode.analyse_typesc                 C   r  rK   )r  ry  r   rk  rR   rR   rS   ry  &  r  z%DictItemNode.generate_evaluation_codec                 C   r  rK   )r  r  r   rk  rR   rR   rS   r  &  r  z#DictItemNode.generate_disposal_codec                 C   r  rK   )r  r  r   rk  rR   rR   rS   r  &  r  zDictItemNode.free_tempsc                 C   s   t | j| jgS rK   )ra  r  r   rU   rR   rR   rS   __iter__ &  r  zDictItemNode.__iter__)rY   rZ   r[   r   rM  r  r  ry  r  r  r  rR   rR   rR   rS   r   &  s    r  c                   @   s6   e Zd ZdgZdZdd Zdd Zdd Zd	d
 ZdS )SortedDictKeysNoder  Tc                 C   s   t j| |j|d tj| _d S r   )r   r"  r   r   r   r   rV   r  rR   rR   rS   r"  *&  s   zSortedDictKeysNode.__init__c                 C   s,   | j |}|jtju r|d}|| _ | S r  )r  r  r   r   r   r  r  rR   rR   rS   r  .&  s   z SortedDictKeysNode.analyse_typesc                 C   rT   rP  rR   rU   rR   rR   rS   r  6&  rX   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PyObjectCallMethod0rM  keysz+%s = __Pyx_PyObject_CallMethod0(%s, %s); %sz"if (unlikely(!PyList_Check(%s))) {zPySequence_List(%s)r   zPyList_Sort(%s))r  r   r   r   r   r   r   r   r   r  r   r   r   r   r  r	   r  r  r  )rV   r   dict_result
keys_cnamerR   rR   rS   rt  9&  s0   





z'SortedDictKeysNode.generate_result_codeN)	rY   rZ   r[   r   r   r"  r  r  rt  rR   rR   rR   rS   r  $&  s    r  c                   @   r?  )SortedListNodez0Sorts a newly created Python list in place.
    c                 C   s&   | |d| j  d| j d S )NzPyList_Sort(rh  )r   r  r  r   r   rk  rR   rR   rS   rt  W&  s   &z#SortedListNode.generate_result_codeN)rY   rZ   r[   r5  r   r   rt  rR   rR   rR   rS   r  R&  s    r  c                   @   s   e Zd Zdd Zdd ZdS )ModuleNameMixinc                 C      |j | jddS NT
identifier)r  r  rk  rR   rR   rS   get_py_mod_name\&     zModuleNameMixin.get_py_mod_namec                 C   r  r  )r  qualnamerk  rR   rR   rS   get_py_qualified_name`&  r  z%ModuleNameMixin.get_py_qualified_nameN)rY   rZ   r[   r  r  rR   rR   rR   rS   r  [&  s    r  c                   @   sF   e Zd ZdgZeZdZdd Zdd Zdd Z	d	d
 Z
dZdd ZdS )rV  docTc                 C   r   rK   rR   r   rR   rR   rS   r   s&  rX   zClassNode.analyse_annotationsc                 C   rB  rK   r+  r   rR   rR   rS   r   v&  r;  zClassNode.infer_typec                 C   s8   | j r| j || _ | j || _ |tdd | S )NCreateClassrM  )r  r  r  r   r   r   r   rR   rR   rS   r  z&  s
   zClassNode.analyse_typesc                 C   rT   r=  rR   rU   rR   rR   rS   r  &  rX   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 )Nr  r5  z.%s = __Pyx_CreateClass(%s, %s, %s, %s, %s); %s)class_def_noder  ro   r  r  r   r  r   r	   r  r  r  r   r   basesr   r  )rV   r   r  r   py_mod_namer  rR   rR   rS   rt  &  s4   

	zClassNode.generate_result_codeN)rY   rZ   r[   r   r   r   r   r   r   r  r  r  rt  rR   rR   rR   rS   rV  e&  s    
rV  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 )rW  FTc                 C   rB  rK   r+  r   rR   rR   rS   r   &  r;  zPy3ClassNode.infer_typec                 C   r9  rK   rR   r   rR   rR   rS   r  &  rX   zPy3ClassNode.analyse_typesc                 C   rT   r=  rR   rU   rR   rR   rS   r  &  rX   zPy3ClassNode.may_be_noner  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:  r  )r  r  r   r  ro   stringr_   r   rR   rR   rS   r   &  s    z4Py3ClassNode.analyse_annotations.<locals>.<listcomp>r  __annotations__r  )rY  r   r   )AutoDocTransformsr  r  r   r  rN  r  r  r	   r  r  ro   r
  r   r   r.   r  bodyr  insert)rV   rq   r  position
dict_itemsannotations_dictrY  r   rR   rR   rS   r   &  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Py3ClassCreaterM  rG  z((PyObject*)&PyType_Type)z$((PyObject*)&__Pyx_DefaultClassType)z9%s = __Pyx_Py3ClassCreate(%s, %s, %s, %s, %s, %d, %d); %s)r   r   r   r   r  ro   r  mkwr   	metaclass
force_typer   r   r  r  calculate_metaclassallow_py2_metaclassr   r   r  )rV   r   r   r  r  r  rR   rR   rS   rt  &  s.   z!Py3ClassNode.generate_result_codeN)rY   rZ   r[   r   r   r   r  r   r   r  r  r  r   rt  rR   rR   rR   rS   rW  &  s    rW  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   rR   rR   rS   r  &  s   z"PyClassMetaclassNode.analyse_typesc                 C   rT   r=  rR   rU   rR   rR   rS   r  &  rX   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Py3MetaclassGetrM  z__Pyx_Py3MetaclassGet(%s, %s)CalculateMetaclassz"__Pyx_CalculateMetaclass(NULL, %s)r  )r  r  r  r   r   r   r   r   r   r   r   r  )rV   r   r  r  r  rR   rR   rS   rt  &  s.   

z)PyClassMetaclassNode.generate_result_codeNrY   rZ   r[   r   r  r  rt  rR   rR   rR   rS   r  &  s
    r  c                   @   *   e Zd ZdgZdd Zdd Zdd ZdS )	PyClassNamespaceNoder  c                 C   s*   | j r| j ||| _ t| _d| _| S r8  )r  r  r  r   r   r   r   rR   rR   rS   r  '  s
   z"PyClassNamespaceNode.analyse_typesc                 C   rT   r=  rR   rU   rR   rR   rS   r  '  rX   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)r  ro   r  r  r  r  r   r  r   r  r   r  r   r   r  )
rV   r   r   r  r  r  nulldoc_coder  r  rR   rR   rS   rt   '  s,   

z)PyClassNamespaceNode.generate_result_codeNr  rR   rR   rR   rS   r  '  s
    r  c                   @   s4   e Zd ZdZeZg ZdZdd Zdd Z	dd Z
d	S )
ClassCellInjectorNodeTFc                 C   r9  rK   rR   r   rR   rR   rS   r%  >'  rX   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  rk  rR   rR   rS   rt  A'  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))r  r   r   r   r   r  r   r   )rV   r   classobj_cnamerR   rR   rS   generate_injection_codeI'  s   


z-ClassCellInjectorNode.generate_injection_codeN)rY   rZ   r[   r   r   r   r   r  r%  rt  r  rR   rR   rR   rS   r  7'  s    r  c                   @   s,   e Zd Zg ZdZdZeZdd Zdd Z	dS )ClassCellNodeTFc                 C   r9  rK   rR   r   rR   rR   rS   r  X'  rX   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;zUif (!%s) { PyErr_SetString(PyExc_RuntimeError, "super(): empty __class__ cell"); %s })
is_generatorr   r   r   
self_cnamegenerator_cnamer   r   rj  r   rk  rR   rR   rS   rt  ['  s    


z"ClassCellNode.generate_result_codeN)
rY   rZ   r[   r   r   r  r   r   r  rt  rR   rR   rR   rS   r  Q'  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
e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Zdd Zdd Zdd Zdd ZdS )rU  )defaults_tupledefaults_kwdictr  FNr*   c                 C   s    | |j ||jj|p|j|jdS )N)r  pymethdef_cnamebindingspecialized_cpdefs)r   r   r  r  )rO   r   r  rR   rR   rS   from_defnode'  s   zPyCFunctionNode.from_defnodec                 C   r%  rK   )r  code_objectrU   rR   rR   rS   r  '  rZ  zPyCFunctionNode.code_objectc                 C   s   | j r| | | S rK   )r  analyse_default_argsr   rR   rR   rS   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|r4| }
g }|D ]}|j	}|jr|j}|| q|dd |D 7 }|
| j|| _| jj	j}tt |j!" }dd |D }g | _#t$|| |D ]\}}|j%|_&| j#||f qt'|| _(| j#D ]\}}dt)j*|j%f |_+q |j| j_,|s:|r| jdu rn|rXt-| jdd |D d	}||.|| _/|rmt0| jd
d |D d}||| _1nr| j2s|rt3| j|| jj	j}nt4| j}|rt5| j|| jj	j}nt4| j}t6j7| jg ddt6j8| jt9t-| j||gd	ddtdd}| }
t6j:;||
}|<|
 |=|
}|j>}|j>=|j?|_>d|_@d|_A|| j_B|rt0| jdd |D d}||| _CdS dS )zB
        Handle non-literal function's default arguments.
        TrZ  c                 S   r  rR   r  r  rR   rR   rS   r   '  r  z8PyCFunctionNode.analyse_default_args.<locals>.<listcomp>c                 S   s   g | ]\}}| d r|qS r!  )r  )r_   ro   r  rR   rR   rS   r   '  s    r  Nc                 S   r  rR   )rp   r  rR   rR   rS   r   '  rw  r  c                 S   s*   g | ]}t |jt|j|jd |jdqS r  )r  r   r  ro   rp   r  rR   rR   rS   r   '  s    r  )r  r   __defaults__)r   r  r  r  
decoratorsro   Fc                 S   s(   g | ]\}}}t |t||d |dqS r  )r  r  )r_   r   ro   r   rR   rR   rS   r   (  s    )Dr	  r  
is_wrapperr  r   rp   r   DefaultLiteralArgNoder   r   r  
is_dynamicrn   r   r  kw_onlyr  r  ro   r  r  r  return_type_annotationr	   r  r  r&  r8  declare_defaults_c_classdefaults_entryr  r  r   r  r  defaultsr  r   defaults_class_keyr   defaults_pyobjectsr   dynamic_args_cnamer  defaults_structr  r  r  r  r  r  DefaultsTupleNoder  DefaultsKwDictNoder   DefNodeReturnStatNoder   CompilerDirectivesNodefor_internalr  r%  r  local_scopepy_wrapper_requiredpymethdef_requireddefaults_getterr  )rV   rq   nonliteral_objectsnonliteral_otherdefault_argsdefault_kwargsannotationsmust_use_constantsr  r  r  r  r  defaults_class_scopearg_entriesr   r  r  r  directives_noder  rR   rR   rS   r  '  s   












	


z$PyCFunctionNode.analyse_default_argsc                 C   rT   rP  rR   rU   rR   rR   rS   r  (  rX   zPyCFunctionNode.may_be_nonezConstructing Python functionc                 C   rT   )NrG  rR   rU   rR   rR   rS   closure_result_code (  rX   z#PyCFunctionNode.closure_result_codec                 C   s"   | j r
| | d S | | d S rK   )r  generate_cyfunction_codegenerate_pycfunction_coderk  rR   rR   rS   rt  #(  s   z$PyCFunctionNode.generate_result_codec                 C   sH   |  |}|d|  | j|  |||  | jf  | | d S )Nz'%s = PyCFunction_NewEx(&%s, %s, %s); %s)r  r   r   r  r!  r   r   r  )rV   r   r  rR   rR   rS   r#  )(  s   
z)PyCFunctionNode.generate_pycfunction_codec           
      C   sv  | j r	| j d }n| j}| j s| jr|jtdd d}n|jtdd d}g }|jr6|d n|j	r>|d |j
jjrL|jjsL|d	 |jrT|d
 |r\d|}nd}|tj}| j| |d|  || j|| ||  | ||| j ||  | jf
  | | |j r|j!sJ d|j!d }|d|j" |  f  | j#r|d|  || j$j%j&|'| jf  d| j$j%j(|  f }| j#D ]\}}	|j)|d||	j*f d q| j+r|d|  | j+ f  | j s7| j,r|d|  | j, f  |j-r#|d|  |j-jj.f  | j/r9|d|  | j/ f  d S d S d S )Nr   FusedFunctionr  __pyx_FusedFunction_NewCythonFunction__Pyx_CyFunction_New__Pyx_CYFUNCTION_STATICMETHOD__Pyx_CYFUNCTION_CLASSMETHOD__Pyx_CYFUNCTION_CCLASS__Pyx_CYFUNCTION_COROUTINErX  rs  z(%s = %s(&%s, %s, %s, %s, %s, %s, %s); %szpyclass_stack is emptyr  zPyList_Append(%s, %s);z.if (!__Pyx_CyFunction_InitDefaults(%s, %s)) %sz(__Pyx_CyFunction_Defaults(struct %s, %s)r  r  z*__Pyx_CyFunction_SetDefaultsTuple(%s, %s);z+__Pyx_CyFunction_SetDefaultsKwDict(%s, %s);z+__Pyx_CyFunction_SetDefaultsGetter(%s, %s);z,__Pyx_CyFunction_SetAnnotationsDict(%s, %s);)0r  r  is_specializationr   r   r   r   is_staticmethodr   is_classmethodr  r  r	  r   is_anonymousis_coroutiner_  r2  r   ro  r  rt  r   r   r  r  r!  r  r   r   r   r  requires_classobjpyclass_stack
class_cellr	  r  r   r  r   objstruct_cnamer  r   r  r  r  r  r  )
rV   r   r  r  flagsro  
class_noder	  r  r   rR   rR   rS   r"  5(  s   








z(PyCFunctionNode.generate_cyfunction_code)rY   rZ   r[   r   r  r  r	  r  r  r  r  r   r   r   r  r,  r  r  r  r  r  r  r  r  r!  rt  r#  r"  rR   rR   rR   rS   rU  k'  s4    

	
 rU  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)rG  )needs_closure_coder   cur_scope_cnamerU   rR   rR   rS   r!  (  r  z%InnerFunctionNode.closure_result_codeN)rY   rZ   r[   r  r8  r!  rR   rR   rR   rS   r7  (  s    r7  c                   @   sP   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdd Zedd Zed	d
 ZdS )DefFuncLikeNodez\
    Adapter for CFuncDefNode to give it the same attributes as DefNode in CodeObjects.
    Fr   Nc                 C   s.   |j j| _|j j| _|j| _|j| _|| _d S rK   )r   ro   r  r  r   r   _cfuncdef_node)rV   cfuncdef_noderR   rR   rS   r"  (  s
   


zDefFuncLikeNode.__init__c                 C   r%  rK   )r;  node_positionsrU   rR   rR   rS   r=  (  rZ  zDefFuncLikeNode.node_positionsc                 C   r%  rK   )r;  node_positions_to_offsetrU   rR   rR   rS   r>  (  rZ  z(DefFuncLikeNode.node_positions_to_offset)rY   rZ   r[   r5  r  r0  is_asyncgenis_generator_expressionnum_posonly_argsr  r  r  r"  r  r=  r>  rR   rR   rR   rS   r:  (  s    
r:  c                   @   sP   e Zd ZdgZdZdZdd Zedd Zdd	 Z	dd
dZ
dd Zdd ZdS )CodeObjectNodevarnamesFNc                 C   sF   t j| |j|d t|j}dd |jjD }dd || D | _d S )N)r  c                 S   s   g | ]}|j r|qS rR   r  r  rR   rR   rS   r   (  r0  z+CodeObjectNode.__init__.<locals>.<listcomp>c                 S   s   g | ]
}t |j|jd qS r  )r  r   ro   r  rR   rR   rS   r   (  r  )r   r"  r   r   r   r  r  rC  )rV   r  r   
local_varsrR   rR   rS   r"  (  s   
zCodeObjectNode.__init__c                 C   s   | t |S rK   )r:  )rO   r<  rR   rR   rS   	for_cfunc(  s   zCodeObjectNode.for_cfuncc                 C   rT   rP  rR   rU   rR   rR   rS   r  (  rX   zCodeObjectNode.may_be_nonec                 C   s   | j d u r|| | _ | j S rK   ro  get_py_codeobj_constrk  rR   rR   rS   r   (  s   
z$CodeObjectNode.calculate_result_codec                 C   s   | j d u r|| | _ d S d S rK   rF  rk  rR   rR   rS   rt  (  s   
z#CodeObjectNode.generate_result_codec                 C   s   | j }| jd }|j|jdd}|jd  }tj|r$|jd  }t	
t| }||}|jrMt	t|j|dd}||}	t|}
nd}	d}
ddg}|jr]|d	 |jre|d
 |jrn|d n|jrw|d n|jr|d |jrd}nt|j}|j}|j}t| j}dd| pd}| d | d||  d| d| d| d| d| d|
 d | jD ]}|!| qdd | jD pdg}| dd|  | jD ]}|"| |#| q| | j$ d| d| d|	 d| j$ d| d | d d S )Nr*   Tr  r   z	iso8859-1rG  CO_OPTIMIZEDCO_NEWLOCALS
CO_VARARGSCO_VARKEYWORDSCO_ASYNC_GENERATORCO_COROUTINECO_GENERATORz(unsigned int)(%s)|rs  r  z5const __Pyx_PyCode_New_function_description descr = {r  r}  c                 S   r  rR   rz  r_   r?  rR   rR   rS   r   )  r  z3CodeObjectNode.generate_codeobj.<locals>.<listcomp>z"PyObject* const varnames[] = {%s};z% = __Pyx_PyCode_New(descr, varnames, z", tuple_dedup_map); if (unlikely(!z)) goto r  r   )%r  r   r  ro   get_filenametable_entryr&   rd  isabsrf  r	   r  r'   Pathas_posixr=  r  r#   r  r  r   r  r   r  r?  r0  r  r@  r   rA  r  rC  r_  r   ry  r  r  ro  )rV   r   r  r  first_linenofunc_name_result	file_pathfile_path_result
line_tableline_table_resultline_table_lengthr5  argcountrA  kwonly_argcountnlocalsr?  rC  rR   rR   rS   generate_codeobj(  s   












zCodeObjectNode.generate_codeobjrK   )rY   rZ   r[   r   r   ro  r"  r  rE  r  r   rt  r_  rR   rR   rR   rS   rB  (  s    


rB  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                    s.   t  | || _|j| _| jj| _d| _d S rP  )rM   r"  r  r}   r   	evaluatedr#  rP   rR   rS   r"  9)  s
   

zDefaultLiteralArgNode.__init__c                 C   r9  rK   rR   r   rR   rR   rS   r  @)  rX   z#DefaultLiteralArgNode.analyse_typesc                 C   r   rK   rR   rk  rR   rR   rS   rt  C)  rX   z*DefaultLiteralArgNode.generate_result_codec                 C   s    | j s| j| d| _ d S d S r=  )r`  r  ry  rk  rR   rR   rS   ry  F)  s   
z.DefaultLiteralArgNode.generate_evaluation_codec                 C   s   | j | j S rK   )r   r;  r  r   rU   rR   rR   rS   r   K)  r   zDefaultLiteralArgNode.result)rY   rZ   r[   r   r   r   r"  r  rt  ry  r   r\   rR   rR   rP   rS   r  0)  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  | || _|| _d S rK   )rM   r"  r  r  )rV   r   r  r  rP   rR   rS   r"  T)  s   
z!DefaultNonLiteralArgNode.__init__c                 C      | j j| _d| _| S rP  )r  r   r   r   rR   rR   rS   r  Y)     
z&DefaultNonLiteralArgNode.analyse_typesc                 C   r   rK   rR   rk  rR   rR   rS   rt  ^)  rX   z-DefaultNonLiteralArgNode.generate_result_codec                 C   s"   d| j jtj| j | jjjf S )Nz,__Pyx_CyFunction_Defaults(struct %s, %s)->%s)r  ro   r   r  r  r  r
  r   rU   rR   rR   rS   r   a)  s   
zDefaultNonLiteralArgNode.result)	rY   rZ   r[   r   r"  r  rt  r   r\   rR   rR   rP   rS   ra  O)  s    ra  c                       s*   e Zd Z fddZd fdd	Z  ZS )r  c                    sH   g }|D ]}|j jst|||}n|j }|| qt j||d d S )Nr  )rp   r   ra  r   rM   r"  )rV   r   r	  r  r   r  rP   rR   rS   r"  j)  s   zDefaultsTupleNode.__init__Fc                    s   t  |||S rK   )rM   r  r  )rV   rq   r  rP   rR   rS   r  t)  r$  zDefaultsTupleNode.analyse_typesr
  rY   rZ   r[   r"  r  r\   rR   rR   rP   rS   r  g)  s    
r  c                       s   e Zd Z fddZ  ZS )r  c                    sd   g }|D ]#}t |j|jd}|jjst|||}n|j}|t|j||d qt j	||d d S )Nr:  r  r  )
r  r   ro   rp   r   ra  r   r  rM   r"  )rV   r   r	  r  r  r  ro   rP   rR   rS   r"  {)  s   zDefaultsKwDictNode.__init__)rY   rZ   r[   r"  r\   rR   rR   rP   rS   r  x)  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  next_idrg  r  no_assignment_synthesisr  r  r  r   r  add_lambda_defr   rR   rR   rS   r  )  s   
zLambdaNode.analyse_declarationsc                    s   | j || _ t |S rK   )r  r%  rM   r  r   rP   rR   rS   r  )  s   zLambdaNode.analyse_typesc                    s   | j | t | d S rK   )r  r  rM   rt  rk  rP   rR   rS   rt  )  r  zLambdaNode.generate_result_code)rY   rZ   r[   r   r	   r  ro   r  r  rt  r\   rR   rR   rP   rS   re  )  s    

re  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  j|g|R i | g | _d S rK   )rM   r"  rn  )rV   r   r   r`  rP   rR   rS   r"  )  s   
z GeneratorExpressionNode.__init__c                    s   t | drd S |d| _t | d| j_d| j_d| j_t	j
| jj_t| jtjr?t| jjts5J | jjd | d S t| jtjsHJ d S )Ngenexpr_namerm  F)r  ri  ro  rM   r  r  r  r  r  r3   pyfunction_noargsr   r  r|   r  r   r  r   r  r  r  r   rP   rR   rS   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  rR   rT  )r_   cprR   rR   rS   r   )  r  z@GeneratorExpressionNode.generate_result_code.<locals>.<listcomp>r  r  )r!  rn  r_  r   r   r  r   r  r   r   r  )rV   r   args_to_callrR   rR   rS   rt  )  s   
z,GeneratorExpressionNode.generate_result_code)rY   rZ   r[   r	   r  ro   r  re  r   r   r"  r  rt  r\   rR   rR   rP   rS   rl  )  s    
	rl  c                   @   sR   e Zd ZdgZeZdZdZdZdZ	dZ
dd Zdd Zd	d
 Zdd Zdd ZdS )YieldExprNoder  r   Fyieldc                 C   sZ   | j r	| jr| jrt| jd| j  d| _| jd ur+| j|| _| jj	j
s+| | | S )Nz'%s' not supported herer*   )	label_numis_yield_fromin_async_genr   r   expr_keywordr   r  r  r   rn   coerce_yield_argumentr   rR   rR   rS   r  )  s   


zYieldExprNode.analyse_typesc                 C      | j || _ d S rK   r  r  r   rR   rR   rS   ry  )  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 Nri  )r  ry  rl  r   r   r  r   r   r  r  put_init_to_py_nonegenerate_yield_coderk  rR   rR   rS   ry  )  s   
z&YieldExprNode.generate_evaluation_codec                 C   st  | | 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|jjd }	|jjd }
|	sf|
ro|jtj| jd	 |tjt |  |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  || |	s|
r|| j |D ];\}}}dtj|f }|j
rd| }|d||f  |jr|d|  | || q|j!r|d||f  q| "|tj# | j$r8| %| |&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	linetracer  Nz"__Pyx_Coroutine_SwapException(%s);z+__Pyx_Coroutine_ResetAndClearException(%s);z*/* return from %sgenerator, %sing value */zasync r  awaitrt  z%s->resume_label = %d;z,return __Pyx__PyAsyncGenValueWrapperNew(%s);z
return %s;r  ri  r  z"%s.memview = NULL; %s.data = NULL;r[  ))new_yield_labelrx  replace	use_labelr`  closure_tempsresettemps_in_usera  r   r   r   r   r   r   r  r   r   r9  ri   put_trace_yieldr  r   r   put_finish_refcount_contextcurrent_exceptr  rw  is_awaitr  put_trace_resumern   r  r   !generate_sent_value_handling_codesent_value_cnamer_  rc  r  r   rj  )rV   r   ru  resume_labelsavedr   r   r\  
save_cnamer  r  rR   rR   rS   r~  *  sn   




z!YieldExprNode.generate_yield_codec                 C   s   | ||| j d S rK   )r   r   r   rV   r   r  rR   rR   rS   r  L*  r  z/YieldExprNode.generate_sent_value_handling_codeN)rY   rZ   r[   r   r   r   ru  rv  r  rw  rx  r  ry  ry  r~  r  rR   rR   rR   rS   rs  )  s    
Ers  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  rK   )NotImplementedErrorrk  rR   rR   rS   yield_from_funcQ*  r;  z(_YieldDelegationExprNode.yield_from_funcNFc                 C   s  |d u r
| j | |jjtjdd}|d|| |tj	|d u r&| j 
 n|tjf  |d u r>| j | | j | n|rF||t |d|  |tjt |j| | | |d|  |tjt | jrv| | n|tjt |d | | |d d S )NFr[  z%s = %s(%s, %s, &%s);zif (likely(%s == PYGEN_NEXT)) {z(} else if (likely(%s == PYGEN_RETURN)) {r  r   )r  ry  r`  ra  r   PySendResult_typer   r  r   r  r   r  r  r  r  r   r  rh  r~  r_  fetch_iteration_resultpropagate_exception)rV   r   r5  r6  result_temprR   rR   rS   ry  T*  s6   


z1_YieldDelegationExprNode.generate_evaluation_codec                 C   s$   | tjt ||| j d S rK   )r  r   r  r   r   r   r   rk  rR   rR   rS   r  s*  s   z,_YieldDelegationExprNode.propagate_exceptionc                 C   s    | d|  tjtjf  d S )Nrg  )r   r   r   r  rk  rR   rR   rS   r  x*  s
   z/_YieldDelegationExprNode.fetch_iteration_resultrP  )rY   rZ   r[   r  ry  r  r  rR   rR   rR   rS   r  P*  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)r  r   ru  r   r   r  r   rR   rR   rS   ry  *  s   
z'YieldFromExprNode.coerce_yield_argumentc                 C      |j tdd dS )NGeneratorYieldFromr.  __Pyx_Generator_Yield_Fromr   r   r   r   rk  rR   rR   rS   r  *     z!YieldFromExprNode.yield_from_funcN)rY   rZ   r[   rv  rx  ry  r  rR   rR   rR   rS   r  *  s
    r  c                   @   r  )AwaitExprNodeTr  c                 C   s    | j d ur| j || _ d S d S rK   r{  r   rR   rR   rS   ry  *  s   
z#AwaitExprNode.coerce_yield_argumentc                 C   r  )NCoroutineYieldFromr.  __Pyx_Coroutine_Yield_Fromr  rk  rR   rR   rS   r  *  r  zAwaitExprNode.yield_from_funcN)rY   rZ   r[   r  rx  ry  r  rR   rR   rR   rS   r  *  s
    r  c                       s,   e Zd Zdd Z fddZdd Z  ZS )AwaitIterNextExprNodec                 C   s6   | d | d | d | d | d d S )Nz8PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();zif (unlikely(exc_type && (exc_type == PyExc_StopAsyncIteration || ( exc_type != PyExc_StopIteration && exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopAsyncIteration))))) {rK  r  r   )r   rk  rR   rR   rS   _generate_break*  s
   



z%AwaitIterNextExprNode._generate_breakc                    s   |  | t | d S rK   )r  rM   r  rk  rP   rR   rS   r  *  r  z)AwaitIterNextExprNode.propagate_exceptionc                 C   sF   |j sJ d|d|  | | ||| j |d d S )Nz1AwaitIterNextExprNode outside of 'async for' looprJ  r   )break_labelr   r  r   r   r  rR   rR   rS   r  *  s
   
z7AwaitIterNextExprNode.generate_sent_value_handling_code)rY   rZ   r[   r  r  r  r\   rR   rR   rP   rS   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 rK   )r   r   globals_utility_coder   rR   rR   rS   r  *  r  zGlobalsExprNode.analyse_typeszConstructing globals dictc                 C   rT   rP  rR   rU   rR   rR   rS   r  *  rX   zGlobalsExprNode.may_be_nonec                 C   s2   | d|  ||  | jf  | | d S )Nz%s = __Pyx_Globals(); %s)r   r   r   r   r  rk  rR   rR   rS   rt  *  s
   z$GlobalsExprNode.generate_result_codeN)
rY   rZ   r[   r   r   r   r  r  r  rt  rR   rR   rR   rS   r  *  s    r  c                   @   rF  )LocalsDictItemNodec                 C   sT   | j || _ | j|| _| j || _ | jj|r%| j|| _| S d | _| S rK   )r  r  r   r  r   r  r   rR   rR   rS   r  *  s   z LocalsDictItemNode.analyse_typesN)rY   rZ   r[   r  rR   rR   rR   rS   r  *  r  r  c                       s$   e Zd Zdd Z fddZ  ZS )FuncLocalsExprNodec                    s@   t dd |j D } fdd|D }tj|  |dd d S )Nc                 S   s   g | ]}|j r|j qS rR   r  r  rR   rR   rS   r   *  s
    z/FuncLocalsExprNode.__init__.<locals>.<listcomp>c              
      s,   g | ]}t  t |d t |dddqS )r:  T)ro   rY  r  )r  r  r  rP  r  rR   rS   r   *  s    
T)r  r  )r  r  rN  r  r"  )rV   r   rq   rD  r  rR   r  rS   r"  *  s   


zFuncLocalsExprNode.__init__c                    s"   t  |}dd |jD |_|S )Nc                 S   s   g | ]	}|j d ur|qS rK   r:  )r_   rh  rR   rR   rS   r   *  s    
z4FuncLocalsExprNode.analyse_types.<locals>.<listcomp>)rM   r  r  r!  rP   rR   rS   r  *  s   z FuncLocalsExprNode.analyse_typesrd  rR   rR   rP   rS   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 rK   )r6  r"  pyclass_dict)rV   r   r  rR   rR   rS   r"  *     
zPyClassLocalsExprNode.__init__c                 C   rb  rP  )r  r   r   r   rR   rR   rS   r  *  rc  z#PyClassLocalsExprNode.analyse_typesc                 C   rT   rP  rR   rU   rR   rR   rS   r  *  rX   z!PyClassLocalsExprNode.may_be_nonec                 C   r,  rK   )r  r   rU   rR   rR   rS   r   *  rK  zPyClassLocalsExprNode.resultc                 C   r   rK   rR   rk  rR   rR   rS   rt  +  rX   z*PyClassLocalsExprNode.generate_result_codeN)rY   rZ   r[   r"  r  r  r   rt  rR   rR   rR   rS   r  *  s    r  c                 C   s*   |j rt| S |jrt| |jS t| |S rK   )r  r  r  r  r  r  )r   
scope_noderq   rR   rR   rS   LocalsExprNode+  s
   
r  )not~rr  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 rK   )compile_time_unary_operatorsr
   r  r}   rV   r  rR   rR   rS   r  *+     
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  rh   r
   r   r   r  r  r  r  )rV   r  r  r  r  rR   rR   rS   r  .+  s   
zUnopNode.compile_time_valuec                 C   s<   | j |}|js|jr|| j}|d ur|S | ||S rK   )r  r   r   r  find_cpp_operation_typer
   infer_unop_type)rV   rq   operand_typecpp_typerR   rR   rS   r   :+  s   zUnopNode.infer_typec                 C   s   |j r|jstS |S rK   )rn   r  r   rV   rq   r  rR   rR   rS   r  B+  s   zUnopNode.infer_unop_typec                 C   s,   | j jr| j jjr| j jturdS t| S rP  )r  r   r  r   r   r  rU   rR   rR   rS   r  H+  s   
zUnopNode.may_be_nonec                 C   s~   | j || _ | |rtt| j| j j| _d| _| S |  r-| 	| t
| _d| _| S |  r8| | | S | | | S r8  )r  r  is_pythran_operationrH   r?   r
   r   r   is_py_operationcoerce_operand_to_pyobjectr   is_cpp_operationanalyse_cpp_operationanalyse_c_operationr   rR   rR   rS   r  N+  s   
	


zUnopNode.analyse_typesc                 C   r,  rK   r  r   rU   rR   rR   rS   r   ]+  rK  zUnopNode.check_constc                 C   s   | j jjp	| j jjS rK   )r  r   rn   r  rU   rR   rR   rS   r  `+  r$  zUnopNode.is_py_operationc                 C   s    t |}| jj}|o|jp|jS rK   )r@   r  r   r&  r<   )rV   rq   
np_pythranop_typerR   rR   rS   r  c+  s   zUnopNode.is_pythran_operationc                 C      |   r
|   d S d S rK   r  rL  r   rR   rR   rS   rM  h+     zUnopNode.nogil_checkc                 C   s   | j j}|jS rK   )r  r   r   r  rR   rR   rS   r  l+  s   zUnopNode.is_cpp_operationc                 C   rz  rK   )r  r  r   rR   rR   rS   r  p+  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 unaryoprD  rI  r   %s = %s %s;)r   r<   r   r   r
   r  r  rn   generate_py_operation_coder   r  r   r   r   r   rp  rk  rR   rR   rS   rt  s+  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^  rR   rR   rS   r  +  s   
z#UnopNode.generate_py_operation_codec                 C   s0   | j jjst| jd| j| j jf  tj| _d S )Nz"Invalid operand type for '%s' (%s))r  r   r  r   r   r
   r   r1   rU   rR   rR   rS   
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  )r  z '%s' operator not defined for %s)r  r   is_inc_dec_op	is_prefixr   r   r  r  r   r
   r  r   r   r   r   r   r   r   r  r   )rV   rq   overload_checkoperand_typesr   r  rR   rR   rS   r  +  s:   




zUnopNode.analyse_cpp_operationNr#  )rY   rZ   r[   r   infixr  r  r  r   r  r  r  r   r  r  rM  r  r  rt  r  r  r  rR   rR   rR   rS   r  +  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 rK   )r  r}   rU   rR   rR   rS   r  +  r  z!NotNode.calculate_constant_resultc              
   C   sF   | j |}z| W S  ty" } z| | W Y d }~d S d }~ww rK   )r  r  r  r  )rV   r  r  r  rR   rR   rS   r  +  s   zNotNode.compile_time_valuec                 C      t jS rK   )r   r  r  rR   rR   rS   r  +  r;  zNotNode.infer_unop_typec                 C   s<   | j || _ | j j}|jr| | | S | j || _ | S rK   )r  r  r   r   r  r)  r  rR   rR   rS   r  +  s   
zNotNode.analyse_typesc                 C      d| j   S )Nz(!%s)r  r   rU   rR   rR   rS   r   +  rJ  zNotNode.calculate_result_codeN)rY   rZ   r[   r
   r   r  r   r  r  r  r  r   rR   rR   rR   rS   r  +  s    	r  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 rK   )r   rf  r  r   r  r   rR   rR   rS   r  +  s   

z!UnaryPlusNode.analyse_c_operationc                 C   rT   )NPyNumber_PositiverR   rk  rR   rR   rS   r  +  rX   z#UnaryPlusNode.py_operation_functionc                 C   s    |   rd| j  S | j S )Nz(+%s))r  r  r   rU   rR   rR   rS   r   +  s   
z#UnaryPlusNode.calculate_result_codeN)rY   rZ   r[   r
   r  r  r   rR   rR   rR   rS   r  +  s
    r  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )UnaryMinusNoderr  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 rP  )
r  r   rl  r   rf  r  r  r  r  r  r   rR   rR   rS   r  +  s   




z"UnaryMinusNode.analyse_c_operationc                 C   rT   )NPyNumber_NegativerR   rk  rR   rR   rS   r  +  rX   z$UnaryMinusNode.py_operation_functionc                 C   s0   | j r
d| j  S d| jjd| j f S )N(-%s)rx  rr  )r  r  r   r   unary_oprU   rR   rR   rS   r   +  s   z$UnaryMinusNode.calculate_result_codec                 C   s   | j  }|rd| S d S )Nr  )r  r  )rV   r   rR   rR   rS   r  ,  s   
z)UnaryMinusNode.get_constant_c_result_codeN)rY   rZ   r[   r
   r  r  r   r  rR   rR   rR   rS   r  +  s    r  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 rK   )r  r   r  r   rf  r  r  r  r   rR   rR   rS   r  ,  s   



zTildeNode.analyse_c_operationc                 C   rT   )NPyNumber_InvertrR   rk  rR   rR   rS   r  ,  rX   zTildeNode.py_operation_functionc                 C   r  )Nz(~%s)r  rU   rR   rR   rS   r   ,  rJ  zTildeNode.calculate_result_codeN)rY   rZ   r[   r  r  r   rR   rR   rR   rS   r  
,  s    	r  c                   @   rF  )	CUnopNodec                 C   rT   rP  rR   rU   rR   rR   rS   r  ,  rX   zCUnopNode.is_py_operationN)rY   rZ   r[   r  rR   rR   rR   rS   r  ,  s    r  c                   @   r  )	DereferenceNoder   c                 C   s   |j r|jS tjS rK   )r  r  r   r1   r  rR   rR   rS   r  ',  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 rK   )r  r   r  is_cppr   r  r  r  r   rR   rR   rS   r  -,  s
   
z#DereferenceNode.analyse_c_operationc                 C   r  r.  r  rU   rR   rR   rS   r   6,  rJ  z%DereferenceNode.calculate_result_codeN)rY   rZ   r[   r
   r  r  r   rR   rR   rR   rS   r  ",  s
    	r  c                   @   r  )	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  r  r   r   r
   r   r1   rU   rR   rR   rS   r  >,  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 rK   )r  r   rl  r   rf  r  r  r  r   rR   rR   rS   r  H,  s   



z*DecrementIncrementNode.analyse_c_operationc                 C   s.   | j rd| j| j f S d| j | jf S )Nz(%s%s))r  r
   r  r   rU   rR   rR   rS   r   Q,  s   z,DecrementIncrementNode.calculate_result_codeN)rY   rZ   r[   r  r  r  r   rR   rR   rR   rS   r  :,  s
    
	r  c                    s    fddS )Nc                    s   t | f d|S )Nr  r
   )r  )r   r`  r  rR   rS   <lambda>X,  r0  z%inc_dec_constructor.<locals>.<lambda>rR   r  rR   r  rS   inc_dec_constructorW,  rJ  r  c                   @   r  )AmpersandNoder  c                 C   s
   t |S rK   )r   
c_ptr_typer  rR   rR   rS   r  a,  rK  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)r  z'Cannot take address of memoryview slicez&Taking address of non-lvalue (type %s)z Cannot take address of Python %szvariable '%s'zobject attribute '%s'r  )r  r  r   r   r  r4  r   r   r   r   rn   r   ro   r  r  r   r  )rV   rq   argtyperR   rR   rS   r  d,  s(   
zAmpersandNode.analyse_typesc                 C   r,  rK   )r  rT  rU   rR   rR   rS   r   y,  rK  zAmpersandNode.check_constc                 C      t | j| tj| _d| _d S NrF  r   r   r   r1   r   ro  rV   messrR   rR   rS   r   |,     
zAmpersandNode.errorc                 C   r  )Nz(&%s)r  rU   rR   rR   rS   r   ,  rJ  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   r  )r  r   r   r   r   r   r   r
   rn   r   rp  rk  rR   rR   rS   rt  ,  s   z"AmpersandNode.generate_result_codeN)
rY   rZ   r[   r
   r  r  r   r   r   rt  rR   rR   rR   rS   r  [,  s    r  )r   rr  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 )Nrr  )r   r   rd  rc  z+-zAPython has no increment/decrement operator: %s%sx == %s(%sx) == x      )r
   r  )r|   r;  r   ru   r   r[  r   rd  rc  r  r
   r   unop_node_classes)r   r
   r  rR   rR   rS   	unop_node,  s   $r  c                   @   s   e Zd ZdgZd Z ZZdd Zdd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd ZdddZdd Zdd Zdd ZdS )r  r  Nc                 C   rT   r  rR   r   rR   rR   rS   r/  ,  rX   zTypecastNode.type_dependenciesc                 C   s0   | j d u r| j|}| j||\}| _ | j S rK   )r   r  r  
declarator)rV   rq   r  r  rR   rR   rS   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  r  r  r  r   r  r4  r   r   r   r1   r  r  r)  rn   r   rl  r   r   r  r  r  r   r	  r  r  r^  r  r   r,  create_from_py_utility_code	typecheckr  r|   r{  r  rB  r   )rV   rq   r  r  to_pyfrom_pyr  rR   rR   rS   r  ,  sz   






"zTypecastNode.analyse_typesc                 C   r,  rK   )r  r  rU   rR   rR   rS   r  ,  r  zTypecastNode.is_simplec                 C   r,  rK   )r  r   rU   rR   rR   rS   r   ,  r  zTypecastNode.is_ephemeralc                 C   s   | j p| j S rK   )r   r  r5  rU   rR   rR   rS   r5  ,  r  z!TypecastNode.nonlocally_immutablec                 C   s,   | j r| j jr| jr|   d S d S d S d S rK   )r   rn   r   rL  r   rR   rR   rS   rM  -  s   zTypecastNode.nogil_checkc                 C   r,  rK   r  rU   rR   rR   rS   r   -  rK  zTypecastNode.check_constc                 C   s   |  | jj| _d S rK   )r   r  r}   rU   rR   rR   rS   r  -  r$  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 Nrs  r  )	r  r   r   r  	real_typer;  	real_code	imag_coder  )rV   operand_result	real_part	imag_partrR   rR   rS   r   -  s&   


z"TypecastNode.calculate_result_codec                 C   s   | j  }|r| j|S d S rK   )r  r  r   r;  )rV   r  rR   rR   rS   r  -  s   
z'TypecastNode.get_constant_c_result_codec                 C   s&   | j jr| js| j|S t| |S rK   )r   rn   r   r  r   r   r  rR   rR   rS   r   $-  s   zTypecastNode.result_asc                 C   s>   | j r|d|  | j f  ||  |   d S d S )Nz%s = (PyObject *)%s;)r   r   r   r  rj  r  rk  rR   rR   rS   rt  +-  s   z!TypecastNode.generate_result_coderK   )rY   rZ   r[   r   r  r  r   r/  r   r  r  r   r5  rM  r   r  r   r  r   rt  rR   rR   rR   rS   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|2|j3j4 | S )Nr*   r  zunexpected base type %s foundz/Expected %d dimensions, array has %d dimensionsr6  r   zExpected an integer literalfortran)rL  follow)rL  contigr  )5r  r  r  r  array_dtypebase_type_noder  r  r1   r   r	  r   r  r3  r   r   ERR_NOT_POINTERr   r  r  r  r^  ERR_BASE_TYPEr^  r   r  	ERR_STARTr   r;  ru   r   r  ERR_NOT_STOPr  
shape_typer   r  r   r  r  r  	ERR_STEPSmoder   r  r  validate_memslice_dtypeget_cython_array_typeuse_cython_array_utility_coder   get_typeinfo_to_format_coder  r  )rV   rq   r  r	  r  r  r  array_dimension_sizesaxis_noaxisdimsizeshapefirst_or_lastrR   rR   rS   r  Z-  s   






zCythonArrayNode.analyse_typesc                 C   s$   | j rtd|j| jd| _ d S )Nztemp allocated multiple timesT)r   r]  r`  ra  r   rk  rR   rR   rS   rc  -  s   z$CythonArrayNode.allocate_temp_resultc                 C   r#  rK   )r	  r   rR   rR   rS   r   -  rK  zCythonArrayNode.infer_typec                 C   s   |j j}|  |jdjS )Narray)r  cython_scopeload_cythonscope	viewscoper  r   )rV   rq   r	  rR   rR   rS   r	  -  s   z%CythonArrayNode.get_cython_array_typec                    s  ddl m} fddjD }jj} jtd} jtd} jtd}d|	  }|
 |}	jjjrX dj    d   jj  d	  d
||	 |jf   |t dt| }
 d||
d| |jf   |t  d  d|| |jf   d  d||f   d  d |||jj   jf     fdd}|| ||  j| d S )Nr*   r#  c                    s   g | ]
} j | qS rR   )r	  r;  r   )r_   r	  rU   rR   rS   r   -  s    z8CythonArrayNode.generate_result_code.<locals>.<listcomp>Tr  z
if (!%s) {zQPyErr_SetString(PyExc_ValueError,"Cannot create cython.array from NULL pointer");r   z(%s = __pyx_format_from_typeinfo(&%s); %sz __PYX_BUILD_PY_SSIZE_T z&%s = Py_BuildValue("(" %s ")", %s); %sr  r  z%s = PyBytes_AsString(%s); %sr  z%s = PyBytes_AS_STRING(%s);r  z7%s = __pyx_array_new(%s, %s, %s, "%s", (char *) %s); %sc                    s     | t  j|  d S rK   )r  r   r`  rh  )rK  )r   rR   rS   dispose
.  r  z5CythonArrayNode.generate_result_code.<locals>.dispose)r  r$  r	  r  r  r`  ra  r   r/   r  get_type_information_cnamer  r   r  r   r   r   r   r   r  r   r_  r	  r  rh  )rV   r   r$  r	  r  shapes_tempformat_tempformat_ptr_tempitemsize	type_infobuildvalue_fmtr	  rR   r9  rS   rt  -  sb   







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  ry  T)r   rb  r  )r  r	  )r	  r  r	  )r   r   r  r3  r   r  r  r;  r   r   MemoryViewSliceTypeNoder  r  )	rO   src_noderq   r   r  r  r  memslicenoder   rR   rR   rS   r  .  s&   
zCythonArrayNode.from_carray)rY   rZ   r[   r5  r   r	  r   r	  r	  r   r<  r	  r  rc  r   r	  rt  r  r  rR   rR   rR   rS   r  <-  s    j@r  c                   @   s"   e Zd ZejZdd Zdd ZdS )
SizeofNodec                 C   rT   r=  rR   rU   rR   rR   rS   r   /.  rX   zSizeofNode.check_constc                 C   r   rK   rR   rk  rR   rR   rS   rt  2.  rX   zSizeofNode.generate_result_codeN)rY   rZ   r[   r   r4  r   r   rt  rR   rR   rR   rS   r(	  *.  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 rK   )r  module_pathr  r  r  r   r  ro   SizeofVarNoder  r  r  r  
check_type)
rV   rq   rd  r  r  rW  r   r  r  r  rR   rR   rS   r  ?.  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  rn   r  r   r   r^  is_complete)rV   r  rR   rR   rS   r+	  S.  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  )rV   r#  rR   rR   rS   r   ^.  s
   
z$SizeofTypeNode.calculate_result_code)rY   rZ   r[   r   r  r  r+	  r   rR   rR   rR   rS   r  6.  s    r  c                   @   r  )	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  rA  r  rB  rD  rC  r+   r   r   r  rQ   r+	  r  )rV   rq   operand_as_typerR   rR   rS   r  o.  s    zSizeofVarNode.analyse_typesc                 C   r  )Nr.	  r  rU   rR   rR   rS   r   .  rJ  z#SizeofVarNode.calculate_result_codec                 C   r   rK   rR   rk  rR   rR   rS   rt  .  rX   z"SizeofVarNode.generate_result_codeN)rY   rZ   r[   r   r  r   rt  rR   rR   rR   rS   r*	  h.  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   sD   |}|j s|j}|j r|d| j}|d}ttj|jddS )Nzlibcpp.typeinfor#	  T)r  )	r  r  find_moduler   r  r   r  r  r   )rV   rq   
env_moduletypeinfo_moduletypeinfo_entryrR   rR   rS   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   r1   r  r5	  r   r  rF  r  r  r  rn   r^  r,	  r   r   r   )rV   rq   r#	  as_typerR   rR   rS   r  .  s:   







zTypeidNode.analyse_typesc                 C   r  r  r  r  rR   rR   rS   r   .  r  zTypeidNode.errorc                 C   rT   r=  rR   rU   rR   rR   rS   r   .  rX   zTypeidNode.check_constc                 C   r   rK   r  rU   rR   rR   rS   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   rp  )rV   r   r#  rR   rR   rS   rt  .  s   
zTypeidNode.generate_result_code)rY   rZ   r[   r   r  r   r   r5	  cpp_messager  r   r   r   rt  rR   rR   rR   rS   r0	  .  s     r0	  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 )
TypeofNodeNrw  c                 C   sH   | j || _ tt| j j}t| j|d}||}||| _	| S )Nr:  )
r  r  r	   r  ru   r   rM  r   r  rw  )rV   rq   r   rw  rR   rR   rS   r  .  s   
zTypeofNode.analyse_typesc                 C   s   | j || _ | j jS rK   )r  r  r   r   rR   rR   rS   rA  .  s   zTypeofNode.analyse_as_typec                 C   rT   rP  rR   rU   rR   rR   rS   r  .  rX   zTypeofNode.may_be_nonec                 C   r2  rK   )rw  ry  rk  rR   rR   rS   ry  .  r  z#TypeofNode.generate_evaluation_codec                 C   r,  rK   )rw  r   rU   rR   rR   rS   r   .  rK  z TypeofNode.calculate_result_code)rY   rZ   r[   rw  r   r   r   r  rA  r  ry  r   rR   rR   rR   rS   r8	  .  s    r8	  c                 C   s.   z| j }W n ty   |j}Y nw || |S rK   )
__matmul__r   __rmatmul__)rp  br  rR   rR   rS   matmul_operator.  s   


r<	  <<===r  >=>r  is_notr   r  ///<<%r   rO  **c                 C   s   | |v S rK   rR   xseqrR   rR   rS   r  /      rf  c                 C   s   | |vS rK   rR   rH	  rR   rR   rS   r  /  rK	  )>>rr  ^@innot_inc                 C   s&   t | j}|st| jd| j  |S )Nz4Binary '%s' not supported in compile-time expression)compile_time_binary_operatorsrh   r
   r   r   )r   r  rR   rR   rS   get_compile_time_binop/  s   rR	  c                       s   e Zd ZddgZdZdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Z fd$d%Zd&d' Zd(d) Z  ZS )*	BinopNoder  r  Fc                 C   s"   t | j }|| jj| jj| _d S rK   )rQ	  r
   r  r}   r  r  rR   rR   rS   r  6/  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 rK   )rR	  r  r  r  r  r  )rV   r  r  r  r  r  rR   rR   rS   r  </  s   zBinopNode.compile_time_valuec                 C   s   |  | j|| j||S rK   )r  r  r   r  r   rR   rR   rS   r   E/  s   zBinopNode.infer_typec                 C   s&   | j || _ | j|| _| |S rK   )r  r  r  rR  r   rR   rR   rS   r  I/  s   
zBinopNode.analyse_typesc                 C   s   |  |r| | jj| jj|| _| jjsJ d| _| S |  rG| | | | jj| jj|| _d| _| jj	sE| jt
}| _| ||S | S |  rR| | | S | | | S r8  )r  r  r  r   r  r<   r   r  coerce_operands_to_pyobjectsrn   r   r  r  r  r  )rV   rq   original_typerR   rR   rS   rR  N/  s,   





zBinopNode.analyse_operationc                 C   s   |  | jj| jjS rK   )is_py_operation_typesr  r   r  rU   rR   rR   rS   r  f/  r$  zBinopNode.is_py_operationc                 C   s   |j p|j p|jp|jS rK   )rn   r  rV   type1type2rR   rR   rS   rV	  i/  r  zBinopNode.is_py_operation_typesc                 C   s   |  | jj| jj|S rK   )is_pythran_operation_typesr  r   r  r   rR   rR   rS   r  l/  r  zBinopNode.is_pythran_operationc                 C   s(   t |ot|ot|ot|pt|S rK   )r@   r;   r<   )rV   rX	  rY	  rq   rR   rR   rS   rZ	  o/  s
   z$BinopNode.is_pythran_operation_typesc                 C      | j jjp	| jjjS rK   r  r   r   r  rU   rR   rR   rS   r  u/  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
   r  r  r  r   r   r   r   r   r   r   r   r  r  r   r   r  r  )rV   rq   r   r  rR   rR   rS   r  y/  s$   
zBinopNode.analyse_cpp_operationc                 C   s   |  |||rtt| j||S | ||rS|jrtj}n|jr#tj	}|jr*tj}n|jr0tj	}|j
s6|j
rQ||u rE|turE| jdv rE|S | ||}|d urQ|S tS |jsY|jr\tjS | ||S )Nz**%+|&^)rZ	  rH   r>   r
   rV	  ru  r   r   rv  r   r  r   infer_builtin_types_operationr   r  r   r1   compute_c_result_type)rV   rX	  rY	  rq   r  rR   rR   rS   r  /  s*   zBinopNode.result_typec                 C   r   rK   rR   rW	  rR   rR   rS   r]	  /  rX   z'BinopNode.infer_builtin_types_operationc                 C   r  rK   r  r   rR   rR   rS   rM  /  r  zBinopNode.nogil_checkc                 C   s    | j || _ | j|| _d S rK   )r  r  r  r   rR   rR   rS   rT	  /  r  z&BinopNode.coerce_operands_to_pyobjectsc                 C      | j  o	| j S rK   r  r   r  rU   rR   rR   rS   r   /  r$  zBinopNode.check_constc                    s   t   p| j p| j S rK   )rM   r   r  r  rU   rP   rR   rS   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 binoprD  rG	  zBnew (&%s) decltype(%s){pythonic::numpy::functor::power{}(%s, %s)};z!new (&%s) decltype(%s){%s %s %s};z	, Py_Noner  r  r   ri  )r  r   r  r<   r   r   r
   r  rn   r  r   r   r   r  r   r  r   r   r   r   rp  )rV   r   rX	  rY	  r  
extra_args
op1_result
op2_resultrR   rR   rS   rt  /  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))	r  r   r  r  r   r   r
   r   r1   rU   rR   rR   rS   r  /  s   

zBinopNode.type_error)rY   rZ   r[   r   r%  r  r  r   r  rR  r  rV	  r  rZ	  r  r  r  r]	  rM  rT	  r   r   rt  r  r\   rR   rR   rP   rS   rS	  &/  s,    	,rS	  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 rK   )rS	  r  r  r   r1   r   r!  rR   rR   rS   r  /  s   zCBinopNode.analyse_typesc                 C   rT   r/  rR   rk  rR   rR   rS   r  /  rX   z CBinopNode.py_operation_functionc                 C   s   d| j  | j| j f S N
(%s %s %s))r  r   r
   r  rU   rR   rR   rS   r   /  s
   z CBinopNode.calculate_result_codec                 C   sD   d }|j s|jr|| j|}|d u r |j s|jr || j|}|S rK   )r   r  r  r
   )rV   rX	  rY	  r  rR   rR   rS   r^	  0  s   z CBinopNode.compute_c_result_typeN)rY   rZ   r[   r  r  r   r^	  rR   rR   rR   rS   re	  /  s
    re	  c                    s    fdd}|S )Nc                    s   t | fd i|S )Nr
   )re	  )r   r  r
   rR   rS   make_binop_node0  r$  z,c_binop_constructor.<locals>.make_binop_noderR   )r
   ri	  rR   rh	  rS   c_binop_constructor0  s   rj	  c                       s   e Zd ZdZdZdZd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)r  r   r  r^	  r  r  r  r  ri   r
   overflow_op_namesr   overflow_checkoverflow_foldoverflow_check_binopr  r   rl  r  rV   rq   rX	  rY	  rR   rR   rS   r  0  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   rf  r  r
   r  rV   rX	  rY	  widest_typerR   rR   rS   r^	  20  s   

z"NumBinopNode.compute_c_result_typec                 C   s   |j r	t||S t||S rK   )r  r    result_type_of_builtin_operationrW	  rR   rR   rS   r]	  @0  s   z*NumBinopNode.infer_builtin_types_operationc                    sD   | j r	| j jr	dS | jj }| jj }|r|jr|r|jrdS t  S rP  )r   r  r  r  rM   r  rW	  rP   rR   rS   r  F0  s   
zNumBinopNode.may_be_nonec                 C   s0   | j  }| j }|r|rd|| j|f S d S rf	  )r  r  r  r
   )rV   value1value2rR   rR   rS   r  S0  s
   

z'NumBinopNode.get_constant_c_result_codec                 C      |j s|jo|j p|jS rK   )rl  r  rW	  rR   rR   rS   rr	  [0     
zNumBinopNode.c_types_okayc                    s   | j r| | _|jjtjdd| _|d| j  t 	| | j rE|d| j  |d ||
| j |d |j| j d S d S )NFr[  r  r  z8PyErr_SetString(PyExc_OverflowError, "value too large");r   )rn	  overflow_bit_noder`  ra  r   r  overflow_bitr   rM   ry  r   r   rh  rk  rP   rR   rS   ry  `0  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)rg	  z'binary operator %s not supported for %sr  )rz	  r  r  r   r  r{	  r   r   r  r<   r  r
   	binary_opr   r   )rV   result1result2r  rR   rR   rS   r   m0  s(   

z"NumBinopNode.calculate_result_codec                 C      |j p|j pt| ||S rK   )r  rS	  rV	  rW	  rR   rR   rS   rV	  0  
   z"NumBinopNode.is_py_operation_typesc                 C   s"   | j | j }| jr|dd}|S )N	PyNumber_PyNumber_InPlace)py_functionsr
   r%  r  )rV   r   r2  rR   rR   rS   r  0  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)rO  rM	  r  rE	  rL	  r   rr  r   rN	  rC	  rD	  rF	  rG	  r\  r  mullshift)r   rr  r   rE	  )rY   rZ   r[   r  rn	  rz	  r  r^	  r]	  r  r  rr	  ry  r   rV	  r  r	  rm	  r\   rR   rR   rP   rS   rk	  0  sB    rk	  c                   @   rF  )IntBinopNodec                 C   rx	  rK   )r  r  rW	  rR   rR   rS   rr	  0  ry	  zIntBinopNode.c_types_okayN)rY   rZ   r[   rr	  rR   rR   rR   rS   r	  0  rI  r	  c                   @   r  )BitwiseOrNodec                 C   s   | j js| jjrdgS d S r  )r  r  r  r   rR   rR   rS   r  0  s   z(BitwiseOrNode.analyse_pytyping_modifiersc                 C   sn   | d ||}W d   n1 sw   Y  |sdS | s5|jr,| s,|jS t|jd|  |S )z=Analyse annotations in form `[...] | None` and `None | [...]`FNz)'[...] | None' cannot be applied to type )new_c_type_contextrA  can_be_optionalr  r  r   r   )rV   rq   operand_nodettyperR   rR   rS   _analyse_bitwise_or_none0  s   z&BitwiseOrNode._analyse_bitwise_or_nonec                 C   s0   | j jr| || jS | jjr| || j S d S rK   )r  r  r	  r  r   rR   rR   rS   rA  0  s
   zBitwiseOrNode.analyse_as_typeN)rY   rZ   r[   r  r	  rA  rR   rR   rR   rS   r	  0  s    r	  c                       s8   e Zd Zdd Z f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 r8  )ru  rv  rk	  rV	  rW	  rR   rR   rS   rV	  0  s   zAddNode.is_py_operation_typesc                    sB   t ttf}||v r||v r|t|||| S t ||S rK   )r   r   r   r  r9  rM   r]	  )rV   rX	  rY	  string_typesrP   rR   rS   r]	  0  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 rK   )r  r3  r  r  rk	  r^	  rW	  rR   rR   rS   r^	  0  s   zAddNode.compute_c_result_typec                    s   | j j| jj}}d }|tu s|tu rE|tu r|tu rd}nt| j ts*t| jtr-d}nd}|rE| js9| j  rC|j	t
dd d}|rc| jsO| j  rS|d7 }| j  s]| j ra|d7 }|S t |S )NTFUnicodeConcatInPlacerM  __Pyx_PyUnicode_ConcatInPlaceSafe)r  r   r  r   r|   rZ  r%  rV  r   r   r   r   r  rM   r  )rV   r   rX	  rY	  r  is_unicode_concatrP   rR   rS   r  0  s*   
zAddNode.py_operation_function)rY   rZ   r[   rV	  r]	  r^	  r  r\   rR   rR   rP   rS   r	  0  s
    	
r	  c                   @   rF  )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 rK   )r  r3  r  r  r   c_ptrdiff_t_typerk	  r^	  rW	  rR   rR   rS   r^	  
1  s   zSubNode.compute_c_result_typeN)rY   rZ   r[   r^	  rR   rR   rR   rS   r	  1  rI  r	  c                       sh   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 fddZ  ZS )MulNodeFc                 C   s   | j || _ | j|| _|  | _| jrQ| j }| j}|jr+|jd u r+| |||S |jr:|jd u r:| |||S |jt	v rF|
|| _n|jt	v rQ|
|| _ | |S rK   )r  r  r  calculate_is_sequence_mulis_sequence_mulr   r   analyse_sequence_mulr   r"   r  rR  rV   rq   r  r  rR   rR   rS   r  1  s   



zMulNode.analyse_typesc                 C   s   | j o
| tv o
| tuS rK   )r  r"   r!   r  rR   rR   rS   is_builtin_seqmul_type,1  r]  zMulNode.is_builtin_seqmul_typec                 C   s\   | j j}| jj}|tju s|jr||}}|tju s|jr,|js#|jr%dS | |r,dS dS r>  )	r  r   r  r   rh  r  ru  r  r	  rW	  rR   rR   rS   r	  01  s   

z!MulNode.calculate_is_sequence_mulc                 C   s.   |j d u sJ ||}|||_ ||S rK   )r   r  r  r  )rV   rq   rJ	  multrR   rR   rS   r	  =1  s   

zMulNode.analyse_sequence_mulc                    sN   | j r| jjjr| j|| _d S | jjjr| j|| _d S t | d S rK   )r	  r  r   r  r  r  rM   rT	  r   rP   rR   rS   rT	  C1  s   

z$MulNode.coerce_operands_to_pyobjectsc                    s   | j p	t ||S rK   )r	  rM   rV	  rW	  rP   rR   rS   rV	  M1  r$  zMulNode.is_py_operation_typesc                    s8   | j r|jtdd | jjjrdS dS t 	|S )Nrz  rM  __Pyx_PySequence_Multiply__Pyx_PySequence_Multiply_Left)
r	  r   r   r   r   r  r   rn   rM   r  rk  rP   rR   rS   r  P1  s   
zMulNode.py_operation_functionc                    sJ   |j r|j r| |r|S | |r|S |jr|S |jr|S t ||S rK   )r  r	  r  rM   r]	  rW	  rP   rR   rS   r]	  W1  s   

z%MulNode.infer_builtin_types_operation)rY   rZ   r[   r	  r  rO  r	  r	  r	  rT	  rV	  r  r]	  r\   rR   rR   rP   rS   r	  1  s    

r	  c                       s,   e Zd Zdd Zdd Z fddZ  ZS )MatMultNodec                 C   rT   r=  rR   rW	  rR   rR   rS   rV	  k1  rX   z!MatMultNode.is_py_operation_typesc                 C   r   rK   rR   rW	  rR   rR   rS   r]	  n1  r;  z)MatMultNode.infer_builtin_types_operationc                    s$   |j tdd t | d S )NMatrixMultiplyrM  )r   r   r   r   rM   ry  rk  rP   rR   rS   ry  r1  s   z$MatMultNode.generate_evaluation_code)rY   rZ   r[   rV	  r]	  ry  r\   rR   rR   rP   rS   r	  h1  s    r	  c                       s   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 fddZdd Zdd Zdd Zdd Zdd Zdd Z  ZS )DivNodeNFc                 C   s>   t | j }| jdkr| jd u rt|trt|trt d }|S )NrC	  rD	  )rQ	  r
   truedivisionr|   r~   rV   op1op2r  rR   rR   rS   !find_compile_time_binary_operator1  s
   
z)DivNode.find_compile_time_binary_operatorc                 C   s,   | j j}| jj}| ||}|||| _d S rK   )r  r}   r  r	  r	  rR   rR   rS   r  1  s   z!DivNode.calculate_constant_resultc              
   C   sb   | j |}| j|}| ||}z|||W S  ty0 } z| | W Y d }~d S d }~ww rK   )r  r  r  r	  r  r  )rV   r  r  r  r  r  rR   rR   rS   r  1  s   zDivNode.compile_time_valuec                 C   s&   | j s|jd rd| _d S | j| _d S )N	cdivisionF)r	  ri   ctruedivisionr	  r   rR   rR   rS   _check_truedivision1  s   
zDivNode._check_truedivisionc                 C   s(   |  | | | j|| j||S rK   )r	  r  r  r   r  r   rR   rR   rS   r   1  s
   

zDivNode.infer_typec                    sl   t  ||}|d ur4| jdkr4| js| jr*|tju rtjS |j	r(t
tj|S |S |tju s2|j	r4d }|S NrC	  )rM   r]	  r
   r	  r	  r   rh  r   r  r  rf  )rV   rX	  rY	  r  rP   rR   rS   r]	  1  s   
z%DivNode.infer_builtin_types_operationc                 C   s   |  | t| |}|  rd| _| jjsD| jd u o,|jd  o,| j	  p,| jj
dk| _| js6|jd rD| j|| _| j|| _|S )NTr	  r   cdivision_warnings)r	  rk	  rR  r  r	  r   rn   ri   r  r   r}   zerodivision_checkr  r,  r  rR   rR   rS   rR  1  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 r	  )	r
   r	  r   r  r   rf  r  rk	  r^	  rs	  rR   rR   rS   r^	  1  s   zDivNode.compute_c_result_typec                 C      | j jrdS dS )N"integer division or modulo by zerozfloat divisionr  rU   rR   rR   rS   zero_division_message1     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   rn   r  r	  r   ri   r  rl  r  r  r   r   r   rD  rk	  ry  generate_div_warning_coderk  rR   rR   rS   ry  1  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 )Nrx  zeroz%s == 0r  z/PyErr_SetString(PyExc_ZeroDivisionError, "%s");r   rF	  UnaryNegOverflowsr)  r5   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	  rC	  CDivisionWarningr	  z$if (unlikely((%s < 0) ^ (%s < 0))) {z1__Pyx_cdivision_warning(%(FILENAME)s, %(LINENO)s))FILENAMELINENOr   zint %s;T)r  ri  zif (unlikely(%s)) )rp  r   rn   r	  r  r  r  r   r   r   r	  r   r   r   r  r  r
   r   r   r   r   r  r  ri   r   filename_cnamelineno_cnameset_error_infor  r  r  )rV   r   in_nogil	zero_testminus1_checktype_of_op2warning_codero  rR   rR   rS   r	  1  sz   





#z!DivNode.generate_div_warning_codec              	   C   s   | j js|  rt| S | j }| j }| j jr)| j	dkr)d| d| dS | j
s/| jrU| j
rL| j | jj kr?| j |}| j | jj krL| j |}d| d| dS | j }d| j   d| d| dt|dd	S )	NrD	  zfloor(z / rh  r  
__Pyx_div_r  rq  )r   r  r  rk	  r   r  r   r  r  r
   r	  r	  r;  r   specialization_namer*  rV   r	  r	  b_is_constantrR   rR   rS   r   !2  s   



*zDivNode.calculate_result_code)rY   rZ   r[   r	  r	  r	  r	  r	  r	  r  r  r	  r   r]	  rR  r^	  r	  ry  r	  r   r\   rR   rR   rP   rS   r	  w1  s$    	?r	  s'   %(?:%|(?:\([^)]+\))?[-+#,0-9 ]*([a-z]))>      E   F   G   X   a   b   c   d   e   f   g   i   o   u   xc                       sP   e Zd Zdd Z fddZdd Zdd Zd	d
 Zdd Z fddZ	  Z
S )ModNodec                 C   r	  rK   )ru  rk	  rV	  rW	  rR   rR   rS   rV	  G2  r	  zModNode.is_py_operation_typesc                    s6   |t ttfv r|js|jr| j s|S t ||S rK   )	r   r   r   r  rn   r  r  rM   r]	  rW	  rP   rR   rS   r]	  L2  s   z%ModNode.infer_builtin_types_operationc                 C   r	  )Nr	  zfloat divmod()r  rU   rR   rR   rS   r	  S2  r	  zModNode.zero_division_messagec                 C   s`   t | |}| jjs.| jd u r|jd p| jj | _| js.| jjs.| jjs.t	| j
d| j  |S )Nr	  z(mod operator not supported for type '%s')r	  rR  r   rn   r	  ri   r  r  r  r   r   r  rR   rR   rS   rR  Y2  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ModIntr	  ModFloat)math_h_modifier)r   rn   r	  r  r   r   r   r   rD  r	  rk	  ry  r	  rk  rR   rR   rS   ry  e2  s   
z ModNode.generate_evaluation_codec              	   C   s   | j  }| j }| jr(| jjrd| jj d| d| dS d| d| dS | j }d| j  d| d| dt	|dd	S )Nfmodr  r  rh  z % 
__Pyx_mod_rq  )
r  r   r  r	  r   r  r	  r   r	  r*  r	  rR   rR   rS   r   r2  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
 |S )N__Pyx_PyUnicode_FormatSafePyUnicode_Format)r  r   r  r   r  r  r  r   r|   r  rM   r  )rV   r   rX	  rY	  rP   rR   rS   r  2  s   
zModNode.py_operation_function)rY   rZ   r[   rV	  r]	  r	  rR  ry  r   r  r\   rR   rR   rP   rS   r	  D2  s    r	  c                       st   e Zd ZdZdZdd Z fddZ fddZ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_cpowri   r   rR   rR   rS   _check_cpow2  s   
zPowNode._check_cpowc                       |  | t |S rK   )r	  rM   r   r   rP   rR   rS   r   2     
zPowNode.infer_typec                    r	  rK   )r	  rM   r  r   rP   rR   rS   r  2  r	  zPowNode.analyse_typesc                 C   r   rK   rR   rW	  rR   rR   rS   r]	  2  r;  z%PowNode.infer_builtin_types_operationc                 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 )NrG	  z complex int powers not supportedrF  powz__Pyx_pow_%sr  r  IntPowr	  r*   r   )r  r   r  z1got unexpected types for C power operator: %s, %s)rk	  r  r   r  r  r  r  r  r  r|	  pow_funcr   r   r	  r  r  r  r   r   r   rD  r  r  r   rR   rR   rS   r  2  s0   


zPowNode.analyse_c_operationc                    s(  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
rSt ||}| j sRt| jjt	oQ| jjdk }n6|sW|r}t ||}| j so|joh|j}|rnd| _nt| jjt	o{| jjdk }n| ||rtj}d| _|rt|tj}|S )Nr   )RealFT)numbersr	  r  r   r}   r  r  r  r|   r~   r	  rM   r^	  type_was_inferredrr	  r   r  rf  r  )rV   rX	  rY	  r	  c_result_typeop1_is_definitely_positivetype2_is_intneeds_wideningrP   rR   rS   r^	  2  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 rK   )r   r   r;  r  rU   rR   rS   r0   2  s   z/PowNode.calculate_result_code.<locals>.typecastr  )r	  r  r  )rV   r0   rR   rU   rS   r   2  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 |S )Nr5   PyNumberPow2r  __Pyx_PyNumber_InPlacePowerOf2__Pyx_PyNumber_PowerOf2)r   rn   r  r}   r|   r~   r  r   r   r   r   r   r%  rM   r  rk  rP   rR   rS   r  2  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 ||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  r  )r  r	  check_typesrR   rS   r	  3  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  r	  rR   rR   rS   r	  3  s   zan integer C numeric typec                 S   rT   )Nr  rR   r	  rR   rR   rS   r	  3  rX   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	  r	  r  r  r   r  r  r  r   r   r  r  rM   )	rV   r  rq   
msg_detail	check_op1r	  	check_op2r	  r   rP   r	  rS   r  2  s8   


zPowNode.coerce_to)rY   rZ   r[   r	  r	  r	  r   r  r]	  r  r^	  r   r  r  r\   rR   rR   rP   rS   r	  2  s    *r	  c                   @   s   e Zd ZdZddgZdZdZdZdZdd Z	dd	 Z
d
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdZdd  Zd!d" Zd#d$ Zd%d& ZdS )'BoolBinopNodeag  
    Short-circuiting boolean operation.

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

    operator  string                              "and"/"or"
    operand1  BoolBinopNode/BoolBinopResultNode   left operand
    operand2  BoolBinopNode/BoolBinopResultNode   right operand
    r  r  TNc                 C   s$   | j |}| j|}t||S rK   )r  r   r  r   independent_spanning_typerq	  rR   rR   rS   r   ;3  s   zBoolBinopNode.infer_typec                 C   s(   | j dkr
| j S | j p| j S )Nor)r
   r  r  r  rU   rR   rR   rS   r  @3  s   

zBoolBinopNode.may_be_nonec                 C   s6   | j j}| jj}| jdkr|o|| _d S |p|| _d S Nand)r  r}   r  r
   )rV   r  r  rR   rR   rS   r  F3  s
   
z'BoolBinopNode.calculate_constant_resultc                 C   s2   | j |}| j|}| jdkr|o|S |p|S r
  )r  r  r  r
   )rV   r  r  r  rR   rR   rS   r  N3  s
   
z BoolBinopNode.compile_time_valuec                 C      | j  p	| j S rK   )r  r   r  rU   rR   rR   rS   r   V3  r$  zBoolBinopNode.is_ephemeralc                 C   sJ   | j |}| j|}t|j|j| _| ||| _ | ||| _| S rK   )r  r  r  r   r
  r   _wrap_operandr	  rR   rR   rS   r  Y3  s   zBoolBinopNode.analyse_typesc                 C   s    t |ttfst|| j|}|S rK   )r|   r
  BoolBinopResultNoder   )rV   r  rq   rR   rR   rS   r	
  e3  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)r	
  r  r  r   rR   rR   rS   wrap_operandsj3  s   zBoolBinopNode.wrap_operandsc                 C   r  rK   r  r   r  r   rR   rR   rS   r)  r3  rJ  zBoolBinopNode.coerce_to_booleanc                 C   s2   | j ||}| j||}tj| || j||dS )N)r   r
   r  r  )r  r  r  r
  r  r
   )rV   r  rq   r  r  rR   rR   rS   r  u3  s   zBoolBinopNode.coerce_toc           
   	   C   s   | | j ||f}| jdkr|d }	}n|d }	}| j|||||||	 |\}}||	 | j||||||| d S )Nr
  next_andnext_or)rs  r   r
   r  r  generate_bool_evaluation_coder  r  )
rV   r   final_result_tempfinal_result_type	and_labelor_label	end_labelfall_throughouter_labelsmy_labelrR   rR   rS   r
  }3  s   

z+BoolBinopNode.generate_bool_evaluation_codec              	   C   sX   |  | | jjrtjn| j}d  }}|d}| ||  ||||| || d S )Nbool_binop_done)	rc  r   rn   r   r   r  r
  r   r  )rV   r   r  r
  r
  r
  rR   rR   rS   ry  3  s   

z&BoolBinopNode.generate_evaluation_codeTruth-testing Python objectc                 C   r_	  rK   r`	  rU   rR   rR   rS   r   3  r$  zBoolBinopNode.check_constc                 C   r   rK   rR   rk  rR   rR   rS   rw  3  rX   z,BoolBinopNode.generate_subexpr_disposal_codec                 C   r   rK   rR   rk  rR   rR   rS   rx  3  rX   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   rn   r`  ra  r   r  r   r  r   r  r   r   rV   r   test_resultrR   rR   rS   generate_operand1_test3  s   
z$BoolBinopNode.generate_operand1_test)rY   rZ   r[   r5  r   r   r
   r  r  r   r  r  r  r   r  r	
  r
  r)  r  r
  ry  r  r   rw  rx  r
  rR   rR   rR   rS   r
  *3  s0    
r
  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 )r

  a  
    Intermediate result of a short-circuiting and/or expression.
    Tests the result for 'truthiness' and takes care of coercing the final result
    of the overall expression to the target type.

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

    arg     ExprNode    the argument to test
    value   ExprNode    the coerced result value node
    r  r   TNc                    s8   | |}t|}t j|j||t|||d d S )N)r  r   r   )r,  	ProxyNoderM   r"  r   r[  r  )rV   r  r  rq   rP   rR   rS   r"  3  s   

zBoolBinopResultNode.__init__c                 C   r  rK   r
  r   rR   rR   rS   r)  3  rJ  z%BoolBinopResultNode.coerce_to_booleanc                 C   s(   | j j }|tju r||}t|||S rK   )r  r   r  r)  r

  )rV   r  rq   r  rR   rR   rS   r  3  s   

zBoolBinopResultNode.coerce_toc                 C   r   rK   rR   r   rR   rR   rS   rM  3  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
  )r  r   rn   r`  ra  r   r  r   r   r  r   r   r
  rR   rR   rS   generate_operand_test3  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 )Nr  r  zif (%s%s) {r  ri  r   )rs  r   r  ry  r 
  r  r   r`  rh  r  r   rl  r   r  r  )rV   r   r
  r
  r
  r
  r
  r
  r
  	uses_tempsenserR   rR   rS   r
  3  sF   





z1BoolBinopResultNode.generate_bool_evaluation_codec                 C   r9  rK   rR   r   rR   rR   rS   r  4  rX   z!BoolBinopResultNode.analyse_types)rY   rZ   r[   r5  r   r   r  r   r"  r)  r  rM  r 
  r
  r  r\   rR   rR   rP   rS   r

  3  s    	7r

  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 ) r  NT)r  r  r  c                 C   r  rK   )r  r/  r  r   rR   rR   rS   r/  04  r  zCondExprNode.type_dependenciesc                 C   s   t | j|| j|S rK   )r   r
  r  r   r  r   rR   rR   rS   r   34  s   

zCondExprNode.infer_typec                 C   s$   | j jr| jj| _d S | jj| _d S rK   )r  r}   r  r  rU   rR   rR   rS   r  84  rS  z&CondExprNode.calculate_constant_resultc                 C   r
  rK   )r  r   r  rU   rR   rR   rS   r   >4  r$  zCondExprNode.is_ephemeralc                 C   s4   | j || _ | j|| _| j|| _| |S rK   )r  r-  r  r  r  r  r   rR   rR   rS   r  A4  s   
zCondExprNode.analyse_typesc                 C   s   | j j}| jj}t||| _| jjrt| jj| _| jjr#t	| _
n| jjr?| j  r3t| j jd | j r?t| jjd |jsI|jsI| jjre|| jkrW| j | j|| _ || jkre| j| j|| _| jjrm|   | S )NzPUnsafe C derivative of temporary Python reference used in conditional expression)r  r   r  r   r
  r   r  r  rn   r   r	  r  r   r   r   r  r  r  )rV   rq   true_val_typefalse_val_typerR   rR   rS   r  G4  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 rK   )	r  r   r  r  r  r	  r  rM   r  )rV   rq   outrP   rR   rS   r  `4  s   



zCondExprNode.coerce_to_indexc                    s   | j j|kr| j ||| _ | jj|kr| j||| _d | _| |}|j|kr>|| u r8tt|||}|S |||}|S rK   )r  r   r  r  r	  r  rM   r  )rV   r  rq   r%
  rP   rR   rS   r  q4  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))r  r   r  r  r   r   r   r1   rU   rR   rR   rS   r  4  s
   zCondExprNode.type_errorc                 C   s   | j  o| j o| j S rK   )r  r   r  r  rU   rR   rR   rS   r   4  s
   
zCondExprNode.check_constc                 C   s   | | j | | | j| |d| j   | || j |d | || j	 |d | j
| | j| d S )Nr3  r  r   )rs  r   rc  r  ry  r   r   eval_and_getr  r  r  r  rk  rR   rR   rS   ry  4  s   


z%CondExprNode.generate_evaluation_codec                 C   s`   | | | jjr|| n|| |d|  ||  f  |	| |
| d S r|  )ry  r   r   rq  rl  r   r   r   r  r  r  )rV   r   r  rR   rR   rS   r&
  4  s   

 
zCondExprNode.eval_and_getc                 C   r   rK   rR   rk  rR   rR   rS   rw  4  rX   z+CondExprNode.generate_subexpr_disposal_codec                 C   r   rK   rR   rk  rR   rR   rS   rx  4  rX   zCondExprNode.free_subexpr_temps)rY   rZ   r[   r  r  r   r   r/  r   r  r   r  r  r  r  r  r   ry  r&
  rw  rx  r\   rR   rR   rP   rS   r  #4  s&    
r  Py_LTPy_LEPy_EQPy_NEPy_GTPy_GE)	r=	  r>	  r?	  r  z<>rA	  r@	  rO	  rP	  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   rB  rK   r+  r   rR   rR   rS   r   4  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rO	  rP	  rP	  )rQ	  r
   r  r}   r|   any_string_typer   rk  r  r  r   cascader  r  r  )rV   operand1_resultr  operand2_resultrR   rR   rS   "calculate_cascaded_constant_result4  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 rK   )rR	  r  r  r  r  r0
  cascaded_compile_time_value)rV   r  r  r  r  r   r  r0
  rR   rR   rS   r4
  4  s   
z#CmpNode.cascaded_compile_time_valuec                 C   r[	  rK   r\	  rU   rR   rR   rS   is_cpp_comparison4  r$  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  )	rV   rq   rF  r  r  rX	  rY	  type1_can_be_inttype2_can_be_intrR   rR   rS   find_common_int_type4  s,   zCmpNode.find_common_int_typec           	      C   s  | j }|j}|j}d }|js|jrO|dvr*|js|jr*|js!|jr*t| jd t}nA|jr9|t	j
r6t	j
nt}n2|jrH|t	j
rEt	j
nt}n#t||}n|jr\|jr\t||}n|d u sc|jsk| ||||}|d u r|jsu|jrxt}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rt|tst|trt}|d u s|jr|}nt||}| jr| j|| j||}|S )Nr?	  r  zcomplex types are unordered)r  r   r  rl  r   r   r1   rn   r  r   r  r   r   rf  r8
  r  ru  r  r  invalid_types_errorr|   rL  r   r  spanning_typer0
  find_common_typer
   )	rV   rq   rF  r  common_typer  rX	  rY	  new_common_typerR   rR   rS   r<
  
5  sv   

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   )rV   r  rF  r  rR   rR   rS   r:
  W5  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_operandsr0
  is_python_comparisonr
   rU   rR   rR   rS   rD
  [5  s   
zCmpNode.is_python_comparisonc                 C   s:   | j }|j|kr|||| _ | jr| j|| d S d S rK   )r  r   r  r0
  coerce_operands_to)rV   r  rq   r  rR   rR   rS   rE
  b5  s   
zCmpNode.coerce_operands_toc                 C   s@   |   r| jd u r| jdvr|   r|   p| jo| j S )N)r  rB	  rO	  rP	  )rC
  special_bool_cmp_functionr
   rB
  rA
  r0
  is_python_resultrU   rR   rR   rS   rG
  i5  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
   r  r   r  r  ru  r   r  r   rU   rR   rR   rS   rB
  q5  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
   r  r   r  r3  ru  )rV   container_typerR   rR   rS   rA
  x5  s   
zCmpNode.is_ptr_containsFc           	      C   s  | j dv ri|j| jj}}|s|jrg|jrg|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 |rgdd	lm} || j d
krQdnd| tj|| j}|rg|\| _	| _| _}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 )Nr9
  UnicodeEqualsrV  __Pyx_PyUnicode_EqualsTBytesEquals__Pyx_PyBytes_Equalsr*   )optimise_numeric_binopr?	  EqNer.
  r  PyDictContainsrM  __Pyx_PyDict_ContainsTFPySetContains__Pyx_PySet_ContainsTFPyUnicodeContains__Pyx_PyUnicode_ContainsTFPySequenceContains__Pyx_PySequence_ContainsTFF)r
   r   r  r  r   r   r   r   special_bool_cmp_utility_coderF
  r   OptimizerM
  r   r  special_bool_extra_argsr   r  r   rn   r  )	rV   rq   r  result_is_boolrX	  rY	  rM
  r   r  rR   rR   rS   "find_special_bool_compare_function~5  sd   


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); PyBoolOrNullFromLongrM  __Pyx_PyBoolOrNull_FromLong__Pyx_PyBool_FromLongr  r  c                 S   r  rR   rT  )r_   	extra_argrR   rR   rS   r   5  s    z3CmpNode.generate_operation_code.<locals>.<listcomp>z%s = %s(%s(%s, %s, %s)); %s%s)r  rB	  r.
  z-%s = PyObject_RichCompare%s(%s, %s, %s); %s%sBoolz%s = %s(%s%s(%s, %s));r  r  eqz%s = %s(%s %s %s);r   )!r   rn   r   rF
  r   r   r   r   r  r   r   r_  rZ
  rX
  r   richcmp_constantsr   r   r  r  r  r  r  r   rl  rf  r   
c_operatorr5
  r   r   r   rp  )rV   r   ro  r  rF  r  error_clausegot_refcoerce_resultr}	  r~	  special_bool_extra_args_resultrX	  rY	  r=
  code1code2	statementrR   rR   rS   r0  5  s   






	
	

zCmpNode.generate_operation_codec                 C   s   |dkrdS |dkrdS |S )Nr  r?	  rB	  r  rR   )rV   rF  rR   rR   rS   rd
  6  s
   zCmpNode.c_operatorrK   r
  )rY   rZ   r[   rF
  rX
  rZ
  r   r3
  r4
  r5
  r8
  r<
  r:
  rD
  rE
  rG
  rB
  rA
  r\
  r0  rd
  rR   rR   rR   rS   r-
  4  s&    
M
4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 )$r  )r  r  coerced_operand2r0
  rZ
  NFc                 C   sN   | j |}| j|}t|st|r%t|r%t|r%tt| j||S tS rK   )	r  r   r  r<   r:   rH   r>   r
   r   rq	  rR   rR   rS   r   )6  s   zPrimaryCmpNode.infer_typec                 C   rT   r  rR   r   rR   rR   rS   r/  46  rX   z PrimaryCmpNode.type_dependenciesc                 C   s   | j rJ | | jj d S rK   )r0
  r3
  r  r}   rU   rR   rR   rS   r  76  r  z(PrimaryCmpNode.calculate_constant_resultc                 C   s   | j |}| ||S rK   )r  r  r4
  )rV   r  r  rR   rR   rS   r  ;6  s   z!PrimaryCmpNode.compile_time_valuec                 C   s$   | j }|r| j|_|j }|sd S d S rK   )r0
  r   )rV   cdrrR   rR   rS   unify_cascade_type?6  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'.PyUCS4InUnicoderV  BytesContainsz+argument of type 'NoneType' is not iterablez?Cascading comparison not supported for 'val in sliced pointer'.Tr*   ),r  r  r  r5
  analyse_cpp_comparisonr0
  r   r   r   r<   r:   rH   r>   r
   is_pycmp"analyse_memoryviewslice_comparisonrB
  r   r   r   r   r   r  r  r   r   r  rA
  r  r\
  rn   r  r   r<
  r  rE
  r,   coerce_cascaded_operands_to_tempoptimise_comparisonrl
  rG
  rn
  rF
  r   )rV   rq   rX	  rY	  r=
  r  rR   rR   rS   r  E6  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?
  rF  r   Tr  r~  r*   r   )r  r   r  rr
  r  r
   r   r   r   r1   ro  r  r  r   r   r   r   r   r   r   r   r   r  r  )rV   rq   rX	  rY	  r   r  rR   rR   rS   rq
  6  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  r  rB	  FT)
r  r  r  r   r   r
   rr
  r   r  is_memslice_nonecheck)rV   rq   	have_none
have_sliceopsrR   rR   rS   rs
  6  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*   )rr
  r\
  r  r   r  r   r   r0
  ru
  r  rl
  rn
  r   r)  )rV   rq   r  rR   rR   rS   r)  6  s    
z PrimaryCmpNode.coerce_to_booleanc                 C   r[	  rK   )r  r   rn   r  rU   rR   rR   rS   rC
  6  r  z"PrimaryCmpNode.has_python_operandsc                 C   s&   | j r	|   dS | j o| j S rP  )r0
  rQ  r  r   r  rU   rR   rR   rS   r   6  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  r  r  z(%s%s(%s, %s))r?	  __Pyx_UnicodeContainsUCS4__Pyx_BytesContainsrP	  ((PyObject *) %s.memview)rg	  )r  r  r   r  r
   r|	  r   rB
  r   r<   r  rv
  r   rd
  )rV   r  r  negationr  r}	  r~	  rR   rR   rS   r   6  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)r  ry  r  rZ
  r   rc  r0  r   r
   r0
  rl
  r  r  )rV   r   r`
  rR   rR   rS   ry  7  s&   

z'PrimaryCmpNode.generate_evaluation_codec                 C   r  rK   )r  r  r  rk  rR   rR   rS   rw  7     z-PrimaryCmpNode.generate_subexpr_disposal_codec                 C   r  rK   )r  r  r  rk  rR   rR   rS   rx   7  r
  z!PrimaryCmpNode.free_subexpr_tempsc                 C   s2   | j | | j| | jr| j| d S d S rK   )r  r  r  r0
  rk  rR   rR   rS   r  &7  s
   zPrimaryCmpNode.annotate)rY   rZ   r[   r   r0
  rl
  rv
  r   r/  r  r  rn
  r  rq
  rs
  r)  rC
  r   r   ry  rw  rx  r  rR   rR   rR   rS   r  6  s*    T*r  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)r  rl
  r0
  rZ
  Nc                 C   rB  rK   r+  r   rR   rR   rS   r   >7  r;  zCascadedCmpNode.infer_typec                 C   rT   r  rR   r   rR   rR   rS   r/  B7  rX   z!CascadedCmpNode.type_dependenciesc                 C   r  rK   r  rU   rR   rR   rS   r   E7  r  z#CascadedCmpNode.has_constant_resultc                 C   s&   | j || _ | jr| j|| _| S rK   )r  r  r0
  r   rR   rR   rS   r  I7  s   zCascadedCmpNode.analyse_typesc                 C   
   | j jjS rK   )r  r   rn   rU   rR   rR   rS   rC
  O7  rK  z#CascadedCmpNode.has_python_operandsc                 C   rT   rP  rR   rU   rR   rR   rS   r5
  R7  r;  z!CascadedCmpNode.is_cpp_comparisonFc                 C   sZ   |  |||rd| _tj| _|jjs||}| jr+| j| j	||}|| j	ur+|| _
|S rP  )r\
  rr
  r   r  r   rn   r  r0
  ru
  r  rl
  )rV   r  rq   r[
  r  rR   rR   rS   ru
  V7  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  )r  r  r   r   r
   r  r0
  rT	  r   rR   rR   rS   rT	  b7  s   z,CascadedCmpNode.coerce_operands_to_pyobjectsc                 C   s(   | j r| j|| _| j | d S d S rK   )r0
  r  r,  rt
  r   rR   rR   rS   rt
  i7  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)) {r3  r~
  r   )r   rn   r   r  ry  r  rZ
  r0  r
   r0
  rl
  r  r  )rV   r   r   r  r
  r`
  rR   rR   rS   ry  o7  s.   




z(CascadedCmpNode.generate_evaluation_codec                 C   s&   | j | | jr| j| d S d S rK   )r  r  r0
  rk  rR   rR   rS   r  7  s   zCascadedCmpNode.annotater
  )rY   rZ   r[   r   r0
  rl
  r  r}   r   r/  r   r  rC
  r5
  ru
  rT	  rt
  ry  r  rR   rR   rR   rS   r
  -7  s     


r
  )r
  r
  rO  rM	  r  rE	  rL	  r   rr  r   rN	  rC	  rD	  rF	  rG	  Fc                 K   s   t | | f||||d|S )N)r
   r  r  r%  )binop_node_classes)r   r
   r  r  r%  r  rR   rR   rS   r(  7  s   r(  c                       s>   e Zd ZdgZeZ fddZdd Zdd Zdd	 Z	  Z
S )
r  r  c                    s2   t  |j || _trtd| | jf  d S d S )Nz%s Coercing %s)rM   r"  r   r  r   rp  r  rP   rR   rS   r"  7  s
   zCoercionNode.__init__c                 C   r   rK   rR   rU   rR   rR   rS   r  7  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])r  tagr  )r  r  r   r   r6   )rV   r   filelinecolrR   rR   rS   r  7  s   zCoercionNode.annotatec                 C   r9  rK   rR   r   rR   rR   rS   r  7  rX   zCoercionNode.analyse_types)rY   rZ   r[   r   r  r}   r"  r  r  r  r\   rR   rR   rP   rS   r  7  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 r  )r   r   r  r"  r   rb  r  r  rV   r  r  rq   rR   rR   rS   r"  7  s   
z!CoerceToMemViewSliceNode.__init__c                 C   s(   | | j| j |  | j| d S rK   )r   r   from_py_call_coder  r   r   r   rk  rR   rR   rS   rt  7  s   

z-CoerceToMemViewSliceNode.generate_result_codeN)rY   rZ   r[   r5  r"  rt  rR   rR   rR   rS   r  7  s    
r  c                   @   rd	  )
r  c                 C   r  rK   )r  r"  r   )rV   r  new_typerR   rR   rS   r"  7  r  zCastNode.__init__c                 C   r,  rK   r-  rU   rR   rR   rS   r  7  rK  zCastNode.may_be_nonec                 C   s   | j | jS rK   )r  r   r   rU   rR   rR   rS   r   7  rJ  zCastNode.calculate_result_codec                 C   r   rK   rR   rk  rR   rR   rS   rt  7  rX   zCastNode.generate_result_codeN)rY   rZ   r[   r"  r  r   rt  rR   rR   rR   rS   r  7  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$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  r"  r  r	  r  )rV   r  r  rq   r  rR   rR   rS   r"  8  s   

zPyTypeTestNode.__init__zPython type testc                 C   r9  rK   rR   r   rR   rR   rS   r  8  rX   zPyTypeTestNode.analyse_typesc                 C   s   | j rdS | j S rP  )r  r  r  rU   rR   rR   rS   r  8  s   
zPyTypeTestNode.may_be_nonec                 C   r,  rK   r.  rU   rR   rR   rS   r  8  rK  zPyTypeTestNode.is_simplec                 C   r,  rK   r/  rU   rR   rR   rS   rV  8  rK  zPyTypeTestNode.result_in_tempc                 C   r,  rK   )r  r   rU   rR   rR   rS   r   !8  rK  zPyTypeTestNode.is_ephemeralc                 C   r,  rK   r0  rU   rR   rR   rS   r5  $8  rK  z#PyTypeTestNode.nonlocally_immutablec                 C   r*  rK   )r  r  r   rR   rR   rS   r  '8  r+  zPyTypeTestNode.coerce_to_tempc                 C   sT   | j | jj ks| j s| S | j  s| S | j r'| jr'| jd| j j S | jS )Nz!Cannot convert NoneType to %.200s)r   r  rV  typeobj_is_availabler  r  r  ro   rU   rR   rR   rS   	reanalyse+8  s   
zPyTypeTestNode.reanalysec                 C   r   rK   rR   rU   rR   rR   rS   r  48  r;  z(PyTypeTestNode.calculate_constant_resultc                 C   r,  rK   r1  rU   rR   rR   rS   r   88  rK  z$PyTypeTestNode.calculate_result_codec                 C   s   | j  rN| j }| j jr(| j j|jj| j || j	d}|j
tdd n| j |jj| j |}|j
tdd |d||| jf  d S t| jd d S )N)exactRaiseUnexpectedTypeErrorrM  ExtTypeTestzif (!(%s)) %szICannot test type of extern C class without type object name specification)r   r
  r  r  type_test_coder`  r  r  r   r  r   r   r   r   r   r   r   r   )rV   r   r  	type_testrR   rR   rS   rt  ;8  s0   


z#PyTypeTestNode.generate_result_codec                 C   r2  rK   r3  rk  rR   rR   rS   r  U8  r  z,PyTypeTestNode.generate_post_assignment_codec                 C   r   rK   rR   rk  rR   rR   rS   rc  X8  rX   z#PyTypeTestNode.allocate_temp_resultc                 C   r   rK   rR   rk  rR   rR   rS   ri  [8  rX   z"PyTypeTestNode.release_temp_resultc                 C   r2  rK   r4  rk  rR   rR   rS   r  ^8  r  zPyTypeTestNode.free_tempsc                 C   r2  rK   )r  rx  rk  rR   rR   rS   rx  a8  r  z!PyTypeTestNode.free_subexpr_tempsNr
  )rY   rZ   r[   r  r"  r-   rL  rM  r  r  r  r  rV  r   r5  r  r
  r  r   rt  r  rc  ri  r  rx  rR   rR   rR   rS   r  7  s*    

	r  c                       st   e Zd ZdZdZ	d fdd	Z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  ZS )r  TNrR   c                    s@   t  |j| |j| _| | _|| _|| _t|pd| _	d S r  )
rM   r"  r   r   r  r	  exception_type_cnameexception_messager   exception_format_args)rV   r  r
  r
  r
  rP   rR   rS   r"  m8  s   
zNoneCheckNode.__init__c                 C   r9  rK   rR   r   rR   rR   rS   r  x8  r@  zNoneCheckNode.analyse_typesc                 C   rT   rP  rR   rU   rR   rR   rS   r  }8  rX   zNoneCheckNode.may_be_nonec                 C   s0   | j jr	| j S | j jrd| j  S td)Nr|
  zunsupported type)r   rn   r  r   r   r   r  rU   rR   rR   rS   	condition8  s
   
zNoneCheckNode.conditionr   Fc                 C   s"   | ||||}||_ || d S rK   )rp  put_nonecheck)rO   r  r   r
  r
  r
  rp  r   rR   rR   rS   generate8  s   zNoneCheckNode.generatec                 C   s$   |  r| |||||| d S d S rK   )r  r
  )rO   r  r   r
  r
  r
  rp  rR   rR   rS   generate_if_needed8  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
  )ru   r  r  escaperR   rS   r   8  s    z/NoneCheckNode.put_nonecheck.<locals>.<listcomp>zPyErr_SetString(%s, "%s");r   )r   r
  rp  r   r	   escape_byte_stringr
  r
  r
  r  r_  r   r   r   rk  rR   r
  rS   r
  8  s0   


zNoneCheckNode.put_nonecheckc                 C   r  rK   )r
  rk  rR   rR   rS   rt  8  rJ  z"NoneCheckNode.generate_result_code)rR   )r   rR   F)rY   rZ   r[   r0  r   r"  rM  r  r  r
  r  r
  r
  r
  rt  r\   rR   rR   rP   rS   r  e8  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]   r  )r   r  r   r   r  r,  r  r"  r   ru  r  ry   rv  r  r   r   r  target_typer   r   ri   )rV   r  rq   r   rR   rR   rS   r"  8  s0   

zCoerceToPyTypeNode.__init__zConverting to Python objectc                 C   rT   rP  rR   rU   rR   rR   rS   r  8  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*  )r  r   r   r  rn   ro   r  r  )rV   rq   r  rR   rR   rS   r)  8  s   


z$CoerceToPyTypeNode.coerce_to_booleanc                 C   r'  rK   )r  r  r   rR   rR   rS   r  8  r)  z"CoerceToPyTypeNode.coerce_to_indexc                 C   r9  rK   rR   r   rR   rR   rS   r  8  r;  z CoerceToPyTypeNode.analyse_typesc                 C   sH   | d| jj| j |  | j||  | jf  | | d S )Nz%s; %s)	r   r  r   to_py_call_coder   r
  r   r   r  rk  rR   rR   rS   rt  8  s   z'CoerceToPyTypeNode.generate_result_codeN)rY   rZ   r[   r   r   r
  r   r"  r  r  r)  r  r  rt  rR   rR   rR   rS   r  8  s    r  c                   @   r
  )r  r*   c                 C   s"   | |}t| | tj| _d S rK   )r,  r  r"  r   r   r   rV   r  rq   rR   rR   rS   r"  8  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)r  r   r   r   r   r  r  r  r   r   r   r`  ra  r   rh  r  )rV   r   r  
arg_resultrK  rR   rR   rS   rt  9  s8   


z)CoerceIntToBytesNode.generate_result_codeN)rY   rZ   r[   r   r"  rt  rR   rR   rR   rS   r  8  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 valuerz   a  Py_UNICODE* has been removed in Python 3.12. This conversion to a Py_UNICODE* will no longer compile in the latest Python versions. Use Python C API functions like PyUnicode_AsWideCharString if you need to obtain a wchar_t* on Windows (and free the string manually after use).)r  r"  r   r   r  r   r   ru  rv  r  r   r   r-  r   )rV   r  r  rq   rR   rR   rS   r"  '9  s(   

zCoerceFromPyTypeNode.__init__c                 C   r9  rK   rR   r   rR   rR   rS   r  ;9  r;  z"CoerceFromPyTypeNode.analyse_typesc                 C   s   | j jo| j j o| j S rK   )r   r  r3  r  r   rU   rR   rR   rS   r   ?9  s   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   ru  r  r   r
  r  r   r  r
  r   r
  r   r   r   r
  rn   r  )rV   r   r
  rR   rR   rS   rt  B9  s   
z)CoerceFromPyTypeNode.generate_result_codec                 C   r  )Nz0Coercion from Python not allowed without the GILr  r   rR   rR   rS   rM  R9  r  z CoerceFromPyTypeNode.nogil_check)	rY   rZ   r[   r
  r"  r  r   rt  rM  rR   rR   rR   rS   r   9  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  r  r  __Pyx_PySet_GET_SIZE__Pyx_PyBytes_GET_SIZE__Pyx_PyByteArray_GET_SIZE__Pyx_PyUnicode_IS_TRUEc                 C   s"   t | | |jjrd| _d S d S r8  )r  r"  r   rn   r   r
  rR   rR   rS   r"  g9  s   
zCoerceToBooleanNode.__init__c                 C   s2   | j jjr| j| j jd u r|   d S d S d S rK   )r  r   rn   _special_builtinsrh   rL  r   rR   rR   rS   rM  l9  s   zCoerceToBooleanNode.nogil_checkr
  c                 C   s   | j r	|   dS | j S rP  )r   rQ  r  r   rU   rR   rR   rS   r   r9  s   
zCoerceToBooleanNode.check_constc                 C   r  )Nz	(%s != 0)r1  rU   rR   rR   rS   r   x9  rJ  z)CoerceToBooleanNode.calculate_result_codec              	   C   s   | j sd S | j| jj}|d urJ| j rd| j  gng }|d|| j f  |d| 	 d
|f  ||d| 	  | j d S |d| 	 | j || 	 | jf  d S )Nz(%s != Py_None)z(%s(%s) != 0)ri  z&&z(((!CYTHON_ASSUME_SAFE_MACROS) && %s < 0)r
  )r   r
  rh   r  r   r  r   r   r   r   r_  r   r   r  )rV   r   	test_funcchecksrR   rR   rS   rt  {9  s"   
z(CoerceToBooleanNode.generate_result_codec                 C   r9  rK   rR   r   rR   rR   rS   r  9  rX   z!CoerceToBooleanNode.analyse_typesN)rY   rZ   r[   r   r  r   r   r   r   r   frozenset_typer   r   r   r
  r"  rM  r  r   r   rt  r  rR   rR   rR   rS   r  V9  s"    
r  c                   @   rd	  )
r  c                 C   s2   |j jr	||}|| _ t| | || d S rK   )r   r  r,  r  r"  r  r
  rR   rR   rS   r"  9  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 r  )r  r   r  r  r   r  r  )rV   r  r 	  rR   rR   rS   r   9  s   

z)CoerceToComplexNode.calculate_result_codec                 C   r   rK   rR   rk  rR   rR   rS   rt  9  rX   z(CoerceToComplexNode.generate_result_codec                 C   r9  rK   rR   r   rR   rR   rS   r  9  rX   z!CoerceToComplexNode.analyse_typesN)rY   rZ   r[   r"  r   rt  r  rR   rR   rR   rS   r  9  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*   )HasNoGilNoder   rn  r  T)r   r   r   __Pyx_SoftComplexToDoubleSoftComplexToDoublez	Complex.c)rR  r   )r  r
  r   r	  r  r
  r  r  r  r   r   r   r  r   r  )r  r  rq   r
  
cfunc_typer  rR   rR   rS   r  9  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 r8  )
r  r"  r  r   as_argument_typer}   r   rn   r   r	  r
  rR   rR   rS   r"  9  s   

zCoerceToTempNode.__init__z#Creating temporary Python referencec                 C   r9  rK   rR   r   rR   rR   rS   r  9  r;  zCoerceToTempNode.analyse_typesc                 C   r,  rK   r-  rU   rR   rR   rS   r  9  rK  zCoerceToTempNode.may_be_nonec                 C   s4   | j || _ | j  r| j S | j j| _| j| _| S rK   )r  r)  r  r   r	  r   rR   rR   rS   r)  9  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 )Nri  rm  )r   r   r  r   r  rb  r   r   rj  ro  rp  rk  rR   rR   rS   rt  9  s   
z%CoerceToTempNode.generate_result_codeN)	rY   rZ   r[   r"  r  r  r  r)  rt  rR   rR   rR   rS   r  9  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  | |j| _|   d S rK   )rM   r"  r}   update_type_and_entryr  rP   rR   rS   r"  9  s   zProxyNode.__init__c                 C   s   | j || _ |   | S rK   )r  r%  r
  r   rR   rR   rS   r  9  s   zProxyNode.analyse_typesc                 C   r'  rK   r(  r   rR   rR   rS   r   :  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   r  r   r	  r   )rV   r   	arg_entryrR   rR   rS   r
  :  s   

zProxyNode.update_type_and_entryc                 C   r2  rK   )r  rt  rk  rR   rR   rS   rt  :  r  zProxyNode.generate_result_codec                 C   r,  rK   r1  rU   rR   rR   rS   r   :  rK  zProxyNode.resultc                 C   r,  rK   r.  rU   rR   rR   rS   r  :  rK  zProxyNode.is_simplec                 C   r,  rK   r-  rU   rR   rR   rS   r  :  rK  zProxyNode.may_be_nonec                 C   r2  rK   )r  ry  rk  rR   rR   rS   ry  :  r  z"ProxyNode.generate_evaluation_codec                 C   r2  rK   )r  r  rk  rR   rR   rS   r  :  r  z ProxyNode.generate_disposal_codec                 C   r2  rK   r4  rk  rR   rR   rS   r  !:  r  zProxyNode.free_temps)rY   rZ   r[   r5  rM  r"  r  r   r
  rt  r   r  r  ry  r  r  r\   rR   rR   rP   rS   r
  9  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 r
  )r  r"  r}   r   r   r	  r   )rV   r  r   r
  rR   rR   rS   r"  /:  s   
zCloneNode.__init__c                 C   r,  rK   r1  rU   rR   rR   rS   r   ::  rK  zCloneNode.resultc                 C   r,  rK   r-  rU   rR   rR   rS   r  =:  rK  zCloneNode.may_be_nonec                 C   r'  rK   )r  r/  r   rR   rR   rS   r/  @:  r)  zCloneNode.type_dependenciesc                 C   r'  rK   r(  r   rR   rR   rS   r   C:  r)  zCloneNode.infer_typec                 C   s6   | j j| _| j j| _d| _t| j dd }|r|| _| S )Nr*   r   )r  r   r	  r   r   r   )rV   rq   r
  rR   rR   rS   r  F:  s   

zCloneNode.analyse_typesc                    s$   | j jr| j ||S t ||S rK   )r  r   r  rM   )rV   	dest_typerq   rP   rR   rS   r  O:  s   zCloneNode.coerce_toc                 C   rT   r=  rR   rU   rR   rR   rS   r  T:  rX   zCloneNode.is_simplec                 C   r   rK   rR   rk  rR   rR   rS   ry  W:  rX   z"CloneNode.generate_evaluation_codec                 C   r   rK   rR   rk  rR   rR   rS   rt  Z:  rX   zCloneNode.generate_result_codec                 C   r   rK   rR   rk  rR   rR   rS   r  ]:  rX   z CloneNode.generate_disposal_codec                 C   s"   | j r||  |   d S d S rK   )r   rj  r   r  rk  rR   rR   rS   r  `:  s   z'CloneNode.generate_post_assignment_codec                 C   r   rK   rR   rk  rR   rR   rS   r  f:  rX   zCloneNode.free_temps)rY   rZ   r[   r   rM  r"  r   r  r/  r   r  r  r  ry  rt  r  r  r  r\   rR   rR   rP   rS   r[  $:  s     	r[  c                       sJ   e Zd ZdZdZedd Z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%  rK   r&  rU   rR   rR   rS   r   p:  rZ  zCppOptionalTempCoercion.typec                 C   r  r.  r1  rU   rR   rR   rS   r   t:  rJ  z-CppOptionalTempCoercion.calculate_result_codec                 C   r   rK   rR   rk  rR   rR   rS   rt  w:  rX   z,CppOptionalTempCoercion.generate_result_codec                 O   r  )NziUsing C++ classes in boolean binary operators with the 'cpp_locals' directive is not currently supported.r  )rV   r   r`  rR   rR   rS   r
  z:  r  z5CppOptionalTempCoercion.generate_bool_evaluation_codec                    s   t  j|ddS )NFr   )rM   r   r   rP   rR   rS   r   :  r  z-CppOptionalTempCoercion._make_move_result_rhsr
  )rY   rZ   r[   r5  r   r  r   r   rt  r
  r   r\   rR   rR   rP   rS   r
  j:  s    
r
  c                   @   rF  )r  c                 C   s$   |j r| j|r| S t| ||S rK   )r  r   r  r[  r  r>  rR   rR   rS   r  :  s   zCMethodSelfCloneNode.coerce_toN)rY   rZ   r[   r  rR   rR   rR   rS   r  :  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   r9  rK   rR   r   rR   rR   rS   r  :  rX   zModuleRefNode.analyse_typesc                 C   rT   rP  rR   rU   rR   rR   rS   r  :  rX   zModuleRefNode.may_be_nonec                 C   r  rK   )r   r  rU   rR   rR   rS   r   :  r;  z#ModuleRefNode.calculate_result_codec                 C   r   rK   rR   rk  rR   rR   rS   rt  :  rX   z"ModuleRefNode.generate_result_codeN)rY   rZ   r[   r   r   r   r   r  r  r   rt  rR   rR   rR   rS   r
  :  s    r
  c                   @   s2   e Zd ZdgZeZdZdd Zdd Zdd Z	d	S )
DocstringRefNoder  Tc                 C   s"   t | | |jjsJ || _d S rK   )r   r"  r   rn   r  )rV   r   r  rR   rR   rS   r"  :  s   
zDocstringRefNode.__init__c                 C   r9  rK   rR   r   rR   rR   rS   r  :  rX   zDocstringRefNode.analyse_typesc              
   C   sH   | d|  | j |td||  | jf  | | d S )Nz%s = __Pyx_GetAttr(%s, %s); %sr5  )	r   r   r  r  r	   r  r   r   r  rk  rR   rR   rS   rt  :  s   z%DocstringRefNode.generate_result_codeN)
rY   rZ   r[   r   r   r   r   r"  r  rt  rR   rR   rR   rS   r
  :  s    r
  c                   @   s@   e Zd Zg ZdZdddZdd Zdd Zd	d
 ZdddZ	dS )AnnotationNodeFNc                 C   sR   t | | |du r!ddlm} t|dd|}t||d}|| _|| _	dS )z6string is expected to already be a UnicodeNode or NoneNr*   r  r  )descriptionr:  )
r   r"  r  r  r	   r  writerM  r  r  )rV   r   r  r  r  string_valuerR   rR   rS   r"  :  s   
zAnnotationNode.__init__c                 C   r9  rK   rR   r   rR   rR   rS   r  :  rX   zAnnotationNode.analyse_typesc                 C   s   |  |d S r8  )r  r   rR   rR   rS   rA  :  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*   rz   z+Unknown type declaration '%s' in annotationz0Unknown type declaration in annotation, ignoringN)r|   r{  r8  r   r  ro   r   r   r  r   r  r  r8  r?  r  r  r   pxd_file_loaded)rV   rq   r  r  rR   rR   rS   _warn_on_unknown_annotation:  s6   





z*AnnotationNode._warn_on_unknown_annotationc           
      C   s  | 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
W ||}|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st|t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*   rz   )r   s   typeT)r  s   ctypez9Duplicate type declarations found in signature annotationzTTuples cannot be declared as simple tuples of types. Use 'tuple[type1, type2, ...]'.)r  zWStrings should no longer be used for type declarations. Use 'cython.int' etc. directly.zOPython type declaration in signature annotation does not refer to a Python type)untypedr  r  r   r   r  r  r   r|   r  r	  rA  r
  rn   r  r  r  r  r	  r  )
rV   rq   assigned_valuer  explicit_pytypeexplicit_ctypero   r   r  r  rR   rR   rS   r  :  sd   




 
z&AnnotationNode.analyse_type_annotationrK   )
rY   rZ   r[   r   r
  r"  r  rA  r
  r  rR   rR   rR   rS   r
  :  s    

r
  c                       s   e Zd ZdZdgZddgZdZdZdZ fddZ	e
dd	 Ze
d
d Zdd Zdd Zdd Z fddZdd Zdd Z  ZS )AssignmentExpressionNodez
    Also known as a named expression or the walrus operator

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

    Attributes
    rhs        - ExprNode
    assignment - SingleAssignmentNode
    r   r=  FNc                    s>   t  j|fi | t|| _t| j}t|||dd| _d S )NT)rY  r   r  )rM   r"  r
  r   r[  r.   r=  )rV   r   rY  r   r`  assign_expr_rhsrP   rR   rS   r"  C;  s   

z!AssignmentExpressionNode.__init__c                 C   r%  rK   )r   r   rU   rR   rR   rS   r   J;  rZ  zAssignmentExpressionNode.typec                 C   r
  rK   )r=  rY  ro   rU   rR   rR   rS   target_nameN;  r  z$AssignmentExpressionNode.target_namec                 C   r'  rK   )r   r   r   rR   rR   rS   r   R;  r)  z#AssignmentExpressionNode.infer_typec                 C   r2  rK   )r=  r  r   rR   rR   rS   r  U;  r  z-AssignmentExpressionNode.analyse_declarationsc                 C   sz   | j || _ | j j s$| j jjs| j j|| j _nt| j | j_ | j|| _| jj	r;t
| jj tr;d| jj _| S rP  )r   r  r  rV  r   r  r%   r=  r   r   r|   r[  r   r   rR   rR   rS   r  X;  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
 ||S rK   )r=  r   r   r  r|   r  r  r
  r  r[  rM   )rV   r  rq   old_rhs_argrhs_argrP   rR   rS   r  };  s   

z"AssignmentExpressionNode.coerce_toc                 C   r,  rK   )r   r   rU   rR   rR   rS   r   ;  rK  z.AssignmentExpressionNode.calculate_result_codec                 C   r2  rK   )r=  r  rk  rR   rR   rS   rt  ;  r  z-AssignmentExpressionNode.generate_result_code)rY   rZ   r[   r5  r   r   r   r=  
clone_noder"  r  r   r
  r   r  r  r  r   rt  r\   rR   rR   rP   rS   r
  /;  s$    

%r
  c                   @   s,   e Zd ZdgZdZejZdd Zdd Z	dS )#FirstArgumentForCriticalSectionNode	name_nodeNc                 C   sV   t | jjdk rt| jd d S t| j| jjd  d| _| j| | jj	| _	d S )Nr*   zbcritical_section directive can only be applied to a function with one or more positional argumentsr   r  )
r   	func_noder   r   r   r  declared_namer
  r  r   r   rR   rR   rS   r  ;  s   z8FirstArgumentForCriticalSectionNode.analyse_declarationsc                 C   s   | j r	| j |S | S rK   )r
  r%  r   rR   rR   rS   r%  ;  s   z7FirstArgumentForCriticalSectionNode.analyse_expressions)
rY   rZ   r[   r   r
  r   r   r   r  r%  rR   rR   rR   rS   r
  ;  s    r
  rR   r  r
  (0  cythondeclarer  r%   r$   r
   os.pathr&   r'   r(   r)   Errorsr   r   r   r   r   r   r+   r,   Coder   r   	LineTabler#   r  r	   r   r   r-   r.   r   r/   r   r0   r1   r2   r3   r   r   r   r   r   r   r   r   r   r    r4   r"   r!   r   r   Annotater6   r7   	Debuggingr8   
DebugFlagsr   r   Pythranr9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rs   ru   r/
  rJ   r  r  rl   rk   rm   c_py_unicode_ptr_typer  cy_pymutex_typecy_pythread_type_lock_typerg   r   ry   r   r   r   r   r   r   r   r   r   r  r6  r7  r  r@  rD  r  rJ  r   r;  rK  r  rL  rM  r  r  r  r  r  r  r  r  r  r  r*  r0  r1  r;  rA  rG  rJ  rM  rZ  r  r  r  r:  r  r  r  rg  r`  r_  r{  r  r  r  r  r  rE  r  r  r  r  r  r  r  r  r  r  r  rk  r  r  r  r  r'  r  r  r  r  r  r  rV  rW  r  r  r  r  rU  r7  r:  rB  r  ra  r  r  re  rl  rs  r  r  r  r  r  r  r  r  r  not_invnegr   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
	  r	  r	  r	  r		  r  r(	  r  r*	  r0	  r8	  matmulr<	  r   ltlerb
  negegtis_rB	  r\  and_truedivfloordivr	  modr	  or_r	  rshiftr  xorrQ	  rR	  rS	  re	  rj	  rk	  r	  r	  r	  r	  r	  r	  r	  compilefindall_find_formatting_types	frozenset_safe_bytes_formatsr	  r	  r
  r

  r  rc
  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
  rR   rR   rR   rS   <module>   s  $		





(4D








	
       9;"	 3!X 8$      #V[ e .&<0hc      \ Jn 7   ZC7 (      ,x  k* )    ~3    5  <)". ,0 @$.	
:J$*  $y#3s1 "2  o2 K&
	



	 K 	:T @H  s 
  \  b
fNE(6:+6Fsj