U
    {h"	                 *   @   s  d dl Z e jeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed( d dlZd dl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 ddlmZmZmZmZmZmZmZmZ ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZm Z  ddlm!Z! ddl!m"Z"m#Z#m$Z$m%Z%m&Z& ddlm'Z' ddl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z3m4Z4 ddlm(Z( ddlm5Z5 ddlm6Z6 ddl7m8Z8 ddlm9Z9 ddl:m;Z; ddl<m=Z=m>Z> ddl?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZN ddl!mOZO ePeQfZRG dd dZSeS ZTe ZUe.e/fde.e!j"fde.e!jVfde.e!jWfde.e!jXfde/e.fde/e!jYfde/e!jZfde!j"e.fd e!jVe.fd e!jWe.fd e!jXe.fd e!j[e!j[fd!e!j\e!j\fd"iZ]d#d$ Z^d%d& Z_d'd( Z`dd)d*Zad+d, Zbd-d. Zcd/d0 Zdd1d2 Zed3d4 Zfd5d6 ZgG d7d8 d8eZhG d9d: d:ehZiG d;d< d<ehZjG d=d> d>ejZkG d?d@ d@ekZlG dAdB dBekZmG dCdD dDejZnG dEdF dFenZoG dGdH dHenZpG dIdJ dJenZqG dKdL dLenZrG dMdN dNenZsdOdP ZtG dQdR dRenZuG dSdT dTenZvG dUdV dVevZwG dWdX dXejZxG dYdZ dZejZyG d[d\ d\ejZzG d]d^ d^ehZ{G d_d` d`ehZ|G dadb dbehZ}G dcdd dde}Z~G dedf dfehZG dgdh dhejZG didj dje}ZG dkdl dlejZG dmdn dnehZG dodp dpejZG dqdr drehZG dsdt dteZG dudv dvehZG dwdx dxehZG dydz dzehZG d{d| d|ejZG d}d~ d~ejZG dd dehZG dd deZG dd deZG dd deZG dd deZG dd dehZG dd deZG dd deZG dd dehZG dd dehZG dd deZG dd dehZG dd deZG dd dehZG dd deZG dd deZG dd dehZG dd deZG dd deZG dd deZG dd dehZG dd dehZG dd dehZG dd dehZG dd dehZG dd deZG dd deZG dd de}ZG dd deZG dd deZG dd dehZG dd dehZG dd dehZG dd dehZG ddĄ dehZG ddƄ dehZG ddȄ deiZG ddʄ dʃZG dd̄ deheZG dd΄ dehZG ddЄ dehZG dd҄ deheZG ddԄ dehZG ddք dehZG dd؄ deheZG ddڄ deZG dd܄ d܃ZG ddބ dehZG dd dehZG dd dehZG dd deZG dd deZG dd deZG dd deZG dd dehZG dd deZG dd deÃZG dd deÃZG dd deŃZG dd dejZG dd deZG dd deZG dd dejZdd ZejejejejdZG d d dehZG dd deуZG dd deуZG dd deуZG dd	 d	eуZG d
d deуZG dd deփZG dd deփZؐdd ZG dd deփZeeeՐdZېdd ZG dd dehZݐdZސdZߐdZdZdZG dd dehZG d d! d!ehZG d"d# d#eZG d$d% d%eZG d&d' d'ehZG d(d) d)ehZz
ejZW n" ek
rL   d*d+ ZY nX ejejejejejejejejejejejejejejejejejejejejed,d- d.d- d/Z d0d1 ZG d2d3 d3ehZG d4d5 d5eZd6d7 ZG d8d9 d9eZG d:d; d;eZG d<d= d=eZG d>d? d?eZG d@dA dAeZ	G dBdC dCeZ
G dDdE dEeZG dFdG dGeZe	dHjZedIdJdKdLdMdNdOdPdQdRdSdTdUdVdWhZG dXdY dYeZG dZd[ d[eZG d\d] d]ehZG d^d_ d_ehZG d`da daehZdbdcdddededfdgdddedh	ZG didj djZG dkdl dleheZG dmdn dneeZeeeeeeeee	e
eeeeedoZddqdrZG dsdt dtehZG dudv dveZG dwdx dxeZG dydz dzeZ G d{d| d|ei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 dehZ-G dd dehZ.G dd dehZ/G dd dehZ0G dd dehZ1dS (      N)(errorwarningZ	warn_onceInternalErrorCompileErrorUtilityCodeTempitaUtilityCodeStringEncodingoperatorlocal_errorsreport_errorNamingNodes
PyrexTypespy_object_type	list_type
tuple_typeset_type	dict_typeunicode_type
bytes_type	type_typeBuiltinSymtabUtilsfind_coercion_errordebug_disposal_codeZdebug_temp_allocdebug_coercionbytearray_type
slice_typememoryview_typebuiltin_sequence_typesbuild_line_tableinspectcopyospathlibresys)Optional   )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                       s(   e Zd ZdZ fddZdd Z  ZS )NotConstantNc                    s   t jd krt | t _t jS N)rH   _objsuper__new__)cls	__class__ =/tmp/pip-unpacked-wheel-fhl22ezh/Cython/Compiler/ExprNodes.pyrL   C   s    
zNotConstant.__new__c                 C   s   dS )Nz<NOT CONSTANT>rP   selfrP   rP   rQ   __repr__I   s    zNotConstant.__repr__)__name__
__module____qualname__rJ   rL   rT   __classcell__rP   rP   rN   rQ   rH   @   s   rH   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                    s~   t  }|d kr|S |jd rvt fddtjtjtjtjfD rv d j	rT|S |jd dkrf|S d d j
 S n|S d S )Nc_string_encodingc                 3   s   | ]}| kV  qd S rI   rP   .0t
type_tuplerP   rQ   	<genexpr>l   s     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)r^   defaultenverrrP   r]   rQ   r   g   s    

 
r   c                 C   s   t tttd| jd S )N)bytes	bytearraystrunicodeZc_string_type)r   r   r   rc   rd   rl   rP   rP   rQ   default_str_typex   s    rs   c                  G   sB   | D ]8}|dk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noderP   rP   rQ   check_negative_indices   s    
r}   c              
      s   |j sZ|d kr| }|tkrZ|jrZt|jdkrZz|jd j}W n tk
rX   Y nX |d k	r|j r|d k	r| rz|j|j	 }W n t
ttfk
r   Y nX | S  fdd|jD }t|dkr| S d S )Nr)   r   c                    s&   h | ]}|j rt |n| qS rP   )
is_starredinfer_sequence_item_type
infer_typer[   itemrr   rP   rQ   	<setcomp>   s   z+infer_sequence_item_type.<locals>.<setcomp>)is_sequence_constructorr   r   cf_statelenrhsAttributeErrorhas_constant_resultargsrw   
ValueError	TypeError
IndexErrorpop)rl   Zseq_node
index_nodeseq_typer   
item_typesrP   rr   rQ   r      s,    


r   c                 C   s&   dd |D }d|krdS | t |fS )a  
    Recursively generate a deduplication key from a sequence of values.
    Includes Cython node types to work around the fact that (1, 2.0) == (1.0, 2), for example.

    @param outer_type: The type of the outer container.
    @param item_nodes: A sequence of constant nodes that will be traversed recursively.
    @return: A tuple that can be used as a dict key for deduplication.
    c                 S   s   g | ]}|d krt d td fnp|jrDt|j|jr6|jnd g|j nJ|jrbt|j|j|j	|j
fn,| r|j|j|jt krt|jnd fnd qS rI   )r   typer   make_dedup_key
is_literalmult_factorr   is_slicestartstopstepr   rw   r[   r|   rP   rP   rQ   
<listcomp>   s   	&
z"make_dedup_key.<locals>.<listcomp>N)tuple)Z
outer_typeZ
item_nodesZ	item_keysrP   rP   rQ   r      s    		r   c                 C   sZ   | d krdS | j tjkr&| jdkr&dS | j jrFd| jj| jjf dfS d| jj dfS d S )N)__Pyx_CppExn2PyErr();F*)r   Tzttry { throw; } catch(const std::exception& exn) {PyErr_SetString(%s, exn.what());} catch(...) { PyErr_SetNone(%s); }Fzc%s(); if (!PyErr_Occurred())PyErr_SetString(PyExc_RuntimeError, "Error converting c++ exception.");)r   r   c_char_typevalueri   entrycname)exception_valuerP   rP   rQ   get_exception_handler   s&    	r   c                 C   sF   |rB|r0| j tdd | | d| n| | d| d S )NErrOccurredWithGILExceptions.c__Pyx_ErrOccurredWithGIL()PyErr_Occurred())globalstateuse_utility_coder   load_cachedputlnerror_goto_if)codecheck_py_exceptionrz   nogilrP   rP   rQ   maybe_check_py_error   s    
r   c                 C   s   t |\}}| d | d|  |r:| | || t| ||| | d |rb| jdd | | |rx|   | | | | d d S )Ntry {z%s} catch(...) {TZdeclare_gilstate})r   r   error_goto_if_nullr   put_ensure_gilput_release_ensured_gil
error_goto)r   rz   Zinside	py_resultr   r   Zraise_py_exceptionr   rP   rP   rQ   translate_cpp_exception   s    


r   c                 C   sH   | j dkst| jd krdS | jjr(dS t| jtrD| jjdkrDdS dS )N+TFr   )exception_checkAssertionErrorr   is_namerv   CharNoder   )r|   rP   rP   rQ   needs_cpp_exception_conversion   s    
r   c                 C   s  t |\}}	t |\}
}| d | |d|  t| |	|| | d | d|  t| ||| | d |r| jdd | |
 |r|   | | | | d | d |r| jdd | | |r|   | | | | d d S )Nr   z__pyx_local_lvalue = %s;r   Tr   r   )r   r   declaration_coder   r   r   r   )r   rz   lhs_typeZlhs_coderhs_codeZlhs_exc_valZassign_exc_valr   Zhandle_lhs_excZlhc_check_py_excZhandle_assignment_excZassignment_check_py_excrP   rP   rQ   translate_double_cpp_exception
  s0    






r   c                   @   sT  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re!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 Zdddd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   s   | j S rI   )r   rR   rP   rP   rQ   child_attrs  s    zExprNode.child_attrsc                 C   s   d S rI   rP   rS   rl   rP   rP   rQ   analyse_annotations  s    zExprNode.analyse_annotationsc                 C   s"   t |d td| jj|f d S )Nznot implementedz%s.%s not implemented)r7   r   rO   rU   )rS   method_namerP   rP   rQ   not_implemented  s    
zExprNode.not_implementedc                 C   s   dS Nr   rP   rR   rP   rP   rQ   	is_lvalue  s    zExprNode.is_lvaluec                 C   s   |   o| jj S rI   )r   r   is_memoryviewslicerR   rP   rP   rQ   is_addressable  s    zExprNode.is_addressablec                 C   s   | j jo| jS rI   )r   ri   is_temprR   rP   rP   rQ   is_ephemeral  s    zExprNode.is_ephemeralc                 C   sH   g }| j D ]8}t| |}|d k	r
t|tkr8|| q
|| q
|S rI   )r   getattrr   listextendappend)rS   r{   rj   r   rP   rP   rQ   subexpr_nodes  s    

zExprNode.subexpr_nodesc                 C   s   | j r| jS |  S d S rI   )r   	temp_codecalculate_result_coderR   rP   rP   rQ   result  s    zExprNode.resultc                 C   s8   |r| j r| jjr| jjr|S d| _d|r0dnd|S )NTz{}({})Z__PYX_STD_MOVE_IF_SUPPORTEDz	std::move)r   r   is_cpp_classis_referencehas_temp_movedformatrS   r   optionalrP   rP   rQ   _make_move_result_rhs  s    zExprNode._make_move_result_rhsc                 C   s   | j |  ddS )NTr   )r   r   rR   rP   rP   rQ   move_result_rhs  s    zExprNode.move_result_rhsc                 C   s6   |  |}|js2|js2|jo | j}| j|| d}|S )Nr   )	result_asr   Zneeds_refcountingZis_rvalue_referencer   r   )rS   r   r   Zrequires_moverP   rP   rQ   move_result_rhs_as  s
    
zExprNode.move_result_rhs_asc                 C   s&   t | rt| S |d k	stt| |S rI   )rB   r8   r   )rS   type_rP   rP   rQ   pythran_result  s    zExprNode.pythran_resultc                 C   s   dS )zZ
        Subtypes may return False here if result temp allocation can be skipped.
        TrP   rR   rP   rP   rQ   is_c_result_required  s    zExprNode.is_c_result_requiredc                 C   s:   | j r&| jjr&|tkr&t|t|  S t||  |  S rI   )r   r   ri   r   r/   r   ctyperS   r   rP   rP   rQ   r     s
    zExprNode.result_asc                 C   s
   |  tS rI   )r   r   rR   rP   rP   rQ   r   "  s    zExprNode.py_resultc                 C   s   | j p
| jS rI   )result_ctyper   rR   rP   rP   rQ   r   &  s    zExprNode.ctypec                 C   s   d S rI   rP   rR   rP   rP   rQ   get_constant_c_result_code+  s    	z#ExprNode.get_constant_c_result_codec                 C   s   d S rI   rP   rR   rP   rP   rQ   calculate_constant_result6  s    
z"ExprNode.calculate_constant_resultc                 C   s   | j tk	o| j tk	S rI   rw   constant_value_not_setnot_a_constantrR   rP   rP   rQ   r   B  s    
zExprNode.has_constant_resultc                 C   s   t | jd d S )NzInvalid compile-time expressionr   rz   rS   denvrP   rP   rQ   compile_time_valueF  s    zExprNode.compile_time_valuec                 C   s   t | jd|jj|f  d S )Nz(Error in compile-time expression: %s: %s)r   rz   rO   rU   )rS   erP   rP   rQ   compile_time_value_errorJ  s     z!ExprNode.compile_time_value_errorc                 C   s2   |   r| jS |  }|d k	r"|S t| jd d S )Nz Exception value must be constant)r   rw   r   r   rz   rS   rl   r   rP   rP   rQ   as_exception_valueN  s    zExprNode.as_exception_valuec                 C   s   t | jd d S )NzCannot assign to or delete thisr   r   rP   rP   rQ   analyse_target_declaration_  s    z#ExprNode.analyse_target_declarationc                 C   s   t | jd d S )Nz=Cannot use anything except a name in an assignment expressionr   r   rP   rP   rQ   0analyse_assignment_expression_target_declarationb  s    z9ExprNode.analyse_assignment_expression_target_declarationc                 C   s   |  |}|  |S rI   )analyse_typescheck_constrS   rl   r|   rP   rP   rQ   analyse_const_expressiong  s    
z!ExprNode.analyse_const_expressionc                 C   s
   |  |S rI   r   r   rP   rP   rQ   analyse_expressionsp  s    zExprNode.analyse_expressionsc                 C   s
   |  |S rI   )analyse_target_typesrS   rl   r   rP   rP   rQ   analyse_target_expressionv  s    z"ExprNode.analyse_target_expressionc                 C   s   |  |}||}|S rI   )r   coerce_to_boolean)rS   rl   r|   boolrP   rP   rQ   analyse_boolean_expression|  s    

z#ExprNode.analyse_boolean_expressionc                 C   s   |  |}|||S rI   )r   r  coerce_to_simpler   rP   rP   rQ   analyse_temp_boolean_expression  s    
z(ExprNode.analyse_temp_boolean_expressionc                    s0   t | dd d k	rdS t fdd|  D dS )Nr   rP   c                    s   g | ]}|  qS rP   )type_dependenciesr   rr   rP   rQ   r     s     z.ExprNode.type_dependencies.<locals>.<listcomp>)r   sumr   r   rP   rr   rQ   r    s    zExprNode.type_dependenciesc                 C   s@   t | dd }|d k	r|S t | dd }|d k	r2|jS | d d S )Nr   r   r   )r   r   r   rS   rl   r   r   rP   rP   rQ   r     s    zExprNode.infer_typec                 C   s   | j p| jp| jjp| jjS rI   )r   r   r   is_arrayis_cfunctionrR   rP   rP   rQ   nonlocally_immutable  s    zExprNode.nonlocally_immutabler   c              	   C   s$   t | j| t| jt||tjddS )z
        Return a node that represents the (type) result of an indexing operation,
        e.g. for tuple unpacking or iteration.
        r   rw   r   baseindex)	IndexNoderz   IntNoderp   r   c_py_ssize_t_typerS   r  rP   rP   rQ   inferable_item_node  s    
   zExprNode.inferable_item_nodec                 C   s   d S rI   rP   r   rP   rP   rQ   analyse_as_module  s    zExprNode.analyse_as_modulec                 C   s   d S rI   rP   r   rP   rP   rQ   analyse_as_type  s    zExprNode.analyse_as_typec                 C   sX   |  |}|r>|jr>|jr>z||jW S  tk
r<   Y nX |rT|jrTt| jd |S )NzType is not specific)r  is_fusedfused_to_specific
specializeKeyErrorr   rz   )rS   rl   r   rP   rP   rQ   analyse_as_specialized_type  s    

z$ExprNode.analyse_as_specialized_typec                 C   s   d S rI   rP   r   rP   rP   rQ   analyse_as_extension_type  s    z"ExprNode.analyse_as_extension_typec                 C   s   |  d d S )Nr   r   r   rP   rP   rQ   r     s    zExprNode.analyse_typesc                 C   s
   |  |S rI   r  r   rP   rP   rQ   r    s    zExprNode.analyse_target_typesc                 C   s   | j r| j jr|   d S rI   )r   ri   	gil_errorr   rP   rP   rQ   nogil_check  s    zExprNode.nogil_checkc                 C   s   |j r| jjrt| jd d S )Nz3Assignment of Python object not allowed without gil)r   r   ri   r   rz   r   rP   rP   rQ   gil_assignment_check  s    zExprNode.gil_assignment_checkc                 C   s   |    dS NF)	not_constrR   rP   rP   rQ   r     s    zExprNode.check_constc                 C   s   t | jd d S )Nz$Not allowed in a constant expressionr   rR   rP   rP   rQ   r'    s    zExprNode.not_constc                 C   s   |    dS r&  )addr_not_constrR   rP   rP   rQ   check_const_addr  s    zExprNode.check_const_addrc                 C   s   t | jd d S )NzAddress is not constantr   rR   rP   rP   rQ   r(    s    zExprNode.addr_not_constc                 C   s   | j S rI   r   rR   rP   rP   rQ   result_in_temp  s    zExprNode.result_in_tempc                 C   s   |   S rI   r   rR   rP   rP   rQ   target_code  s    zExprNode.target_codec                 C   s   |  d d S )Nr   r"  rR   rP   rP   rQ   r     s    zExprNode.calculate_result_codec                 C   st   | j rtd| jj| jf | j}|jsj|jr6tj	}n| j
sT|jsT|  sTd | _ d S |jj|| jd| _ nd | _ d S )Nz'Temp allocated multiple times in %r: %r
manage_ref)r   RuntimeErrorrO   rU   rz   r   is_voidri   r   r   result_is_usedr   r   	funcstateallocate_tempuse_managed_ref)rS   r   r   rP   rP   rQ   allocate_temp_result  s     
zExprNode.allocate_temp_resultc                 C   s   | j st| jsd S | jr<tj| jd  f| jdd   nd}| jr`td| j| j	j
|f ntd| j	j
|f |j| j  | j | _d | _ d S )Nr   r)   z(?)z+temp %s released multiple times in %s at %rz*no temp, but release requested in %s at %r)r   r2  rz   r$   pathbasenameget_descriptionold_tempr0  rO   rU   r3  release_temp)rS   r   rz   rP   rP   rQ   release_temp_result  s"    0  
 zExprNode.release_temp_resultc                 C   s    |   s||  |   dS )z|
        Make sure we own a reference to result.
        If the result is in a temp, it is already a new reference.
        N)r+  
put_increfr   r   rS   r   rP   rP   rQ   make_owned_reference"  s    zExprNode.make_owned_referencec                 C   s&   |   s"|j|  | j| j d dS )zJ
        Make sure we own the reference to this memoryview slice.
        have_gilN)r+  put_incref_memoryviewslicer   r   in_nogil_contextr>  rP   rP   rQ   make_owned_memoryviewslice*  s    z#ExprNode.make_owned_memoryviewslicec                 C   s^   |  | || j | jr&| | | | | jrZ| jjsZ| jjsZ| 	| | 
| d S rI   ) generate_subexpr_evaluation_codemark_posrz   r   r6  generate_result_coder   	is_stringis_pyunicode_ptrgenerate_subexpr_disposal_codefree_subexpr_tempsr>  rP   rP   rQ   generate_evaluation_code3  s    



z!ExprNode.generate_evaluation_codec                 C   s   |   D ]}|| qd S rI   )r   rL  rS   r   r|   rP   rP   rQ   rE  D  s    z)ExprNode.generate_subexpr_evaluation_codec                 C   s   |  d d S )NrG  r"  r>  rP   rP   rQ   rG  H  s    zExprNode.generate_result_codec                 C   sx   | j r|jtdd | jrj| jjs0| jjrD| 	| | 
| |  rt|j|  |  | j d n
| 	| d S )NMoveIfSupportedCppSupport.cppr@  )r   r   r   r   r   r   r   rH  rI  rJ  rK  r   put_decref_clearr   rC  r>  rP   rP   rQ   generate_disposal_codeK  s    


zExprNode.generate_disposal_codec                 C   s   |   D ]}|| qd S rI   )r   rQ  rM  rP   rP   rQ   rJ  [  s    z'ExprNode.generate_subexpr_disposal_codec                 C   s   | j r| jjs| jjr,| | | | nH| jjrH|d|    n,| jj	rt|d|    |d|    | j
r|jtdd n
| | d S )N%s = 0;z%s.memview = NULL;z%s.data = NULL;rN  rO  )r   r   rH  rI  rJ  rK  ri   r   r   r   r   r   r   r   r   r>  rP   rP   rQ   generate_post_assignment_codea  s    

z&ExprNode.generate_post_assignment_codec                 C   s   d S rI   rP   )rS   r   r   overloaded_assignmentr   r   rP   rP   rQ   generate_assignment_codes  s    z!ExprNode.generate_assignment_codec                 C   s   d S rI   rP   rS   r   ignore_nonexistingrP   rP   rQ   generate_deletion_codez  s    zExprNode.generate_deletion_codec                 C   s(   | j r| jjs$| | n
| | d S rI   )r   r   r1  r<  rK  r>  rP   rP   rQ   
free_temps  s    zExprNode.free_tempsc                 C   s   |   D ]}|| qd S rI   )r   rY  )rS   r   subrP   rP   rQ   rK    s    zExprNode.free_subexpr_tempsc                 C   s   d S rI   rP   rS   rl   r   rP   rP   rQ   generate_function_definitions  s    z&ExprNode.generate_function_definitionsc                 C   s   | |  |  | d S rI   )put_decref_setr   r   rS   r   r   rP   rP   rQ   generate_decref_set  s    zExprNode.generate_decref_setc                 C   s   | |  |  | d S rI   )Zput_xdecref_setr   r   r^  rP   rP   rQ   generate_xdecref_set  s    zExprNode.generate_xdecref_setc                 C   s<   |r
| j s8|r$| jr$|r$| | n||  |   d S rI   )
cf_is_nullcf_maybe_nullgenerate_xgotref
put_gotrefr   r   )rS   r   handle_nullmaybe_null_extra_checkrP   rP   rQ   generate_gotref  s    

zExprNode.generate_gotrefc                 C   s   | |  |   d S rI   )put_xgotrefr   r   r>  rP   rP   rQ   rc    s    zExprNode.generate_xgotrefc                 C   s   | |  |   d S rI   )put_giverefr   r   r>  rP   rP   rQ   generate_giveref  s    zExprNode.generate_giverefc                 C   s   | |  |   d S rI   )put_xgiverefr   r   r>  rP   rP   rQ   generate_xgiveref  s    zExprNode.generate_xgiverefc                 C   s   |   D ]}|| qd S rI   )r   annotaterM  rP   rP   rQ   rm    s    zExprNode.annotatec                 C   s~  | }| j }| ||r| S |j}|r0|js0|j}|jr<|j}|jsH|jr|jr|js|jr|j	jr|j	}|
 D ].}||rp||_ |j j|_d|j_|   S qp|jrt| jd n|jr|jr| S t| jd t| _ | S | jd k	rt| jd| jd}||| |jrddlm} |j jsv|j jr:t|||}n:|j jrZt||||}n|jst| jd|f  nl|j jrd|_|j j|| j | j!d	sz|j j"|j"rd
}	|j |f}
nd}	|j j"|j"f}
t| j|	|
  n|jrn|j#rnr|j$d krt%|j||}nR|j jsP|t&krB|j j'rBt(||}nt)|||d}|j *|szt+|||}nt,|rt-|j r|S t,|j rt-|r|S t)|||d}n|j jr|r|j.rt/| jd|  t0|||}n|j1r||kr|2|rt3|||}nf|t4j5krD||krD|2|sDt6|||}n6|j |kszt7|j t7|ksz|2|sz| 8| |S )NTzType is not specializedz/Cannot coerce to a type that is not specialized )rj   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_typer  r  is_ptr	base_type"get_all_specialized_function_typessame_asr   usedr   rz   Zis_null_ptrr0   coercion_typeNameNode	coerce_tor   rn  rp  ri   CoerceToMemViewSliceNoder  CythonArrayNodefrom_carrayis_errorwritable_neededZconforms_tois_memview_broadcastis_memview_copy_assignmentdtypeis_nonerw   NoneNoder   is_intCoerceIntToBytesNodeCoerceToPyTypeNode
subtype_ofPyTypeTestNoder;   r9   r   r   CoerceFromPyTypeNode
is_complexassignable_fromCoerceToComplexNoder   soft_complex_typecoerce_from_soft_complexrp   fail_assignment)rS   dst_typerl   srcZsrc_typeZused_as_reference	signaturer|   rp  msgtuprP   rP   rQ   r    s    










,
zExprNode.coerce_toc                 C   s   t | dr| jjnd }| jjr0d| j  dnd}|jrJd|  dnd}|| j|}t| jd| j d| d| d| |rdnd | 
 d S )	Nr   z (alias of 'z')rn  zCannot assign type ''z to '.)	hasattrr   rj   r   Z
is_typedefresolveZassignment_failure_extra_infor   rz   )rS   r  src_nameZsrc_resolvedZdst_resolvedZextra_diagnosticsrP   rP   rQ   r  8  s    ,zExprNode.fail_assignmentc                 C   sX   |r|sd}t | j|f||}|d k	rBt| j|| j|d  dS |rT| | dS dS )Nz)Cannot assign type '%(FROM)s' to '%(TO)s')ZFROMZTOTF)r   r   r   rz   r  )rS   r  rl   failrk   messagerP   rP   rQ   rt  C  s    
z!ExprNode.check_for_coercion_errorc                 C   s   |  tj|S rI   )r  r   r   r   rP   rP   rQ   coerce_to_pyobjectO  s    zExprNode.coerce_to_pyobjectc                 C   s   |   r"t| j}t| j||dS | j}|js4|jr8| S |tj	krF| S |j
s^|js^|js^|jrht| |S |jr|jr|jdrt| jt| j| tddg d|S |jrt|jdk}t| j||dS t| jd|  | S d S )Nr   rw   zoperator bool)obj	attributefunctionr   r   z%Type '%s' not acceptable as a boolean)r   r  rw   BoolNoderz   r   is_enumr  r   c_bint_typeri   r  rx  is_floatCoerceToBooleanNoder   scopelookupSimpleCallNodeAttributeNoder   EncodedStringr   	is_ctupler   
componentsr   )rS   rl   
bool_valuer   rP   rP   rQ   r  R  s>    


  zExprNode.coerce_to_booleanc                 C   s   | j jr| S | tj|S rI   )r   r  r  r   r  r   rP   rP   rQ   coerce_to_indexq  s    zExprNode.coerce_to_indexc                 C   s   |   r| S t| |S d S rI   )r+  CoerceToTempNoder   rP   rP   rQ   coerce_to_tempu  s    zExprNode.coerce_to_tempc                 C   s   |   r| S | |S d S rI   )	is_simpler  r   rP   rP   rQ   r	  |  s    zExprNode.coerce_to_simplec                 C   s   |   S rI   )r+  rR   rP   rP   rQ   r    s    zExprNode.is_simplec                 C   s&   z
|   W S  tk
r    Y dS X d S r&  )r  	ExceptionrR   rP   rP   rQ   try_is_simple  s    
zExprNode.try_is_simplec                 C   s0   | j r| j js| j jsdS |  r,| jd k	S dS NFT)r   ri   r   r   rw   rR   rP   rP   rQ   may_be_none  s    
zExprNode.may_be_nonec                 C   s   d S rI   rP   rR   rP   rP   rQ   as_cython_attribute  s    zExprNode.as_cython_attributePyExc_TypeErrorrP   c                 C   s   |   rt| |||S | S d S rI   )r  NoneCheckNode)rS   r  r   format_argsrP   rP   rQ   as_none_safe_node  s    zExprNode.as_none_safe_nodec              	   K   sV   d  }|D ]:}||krqzt||}W n tk
r<   Y qX |||< q| |jf|S )zInstantiate this node class from another node, properly
        copying over all attributes that one would forget otherwise.
        z1cf_state cf_maybe_null cf_is_null constant_result)splitr   r   rz   )rM   r|   kwargs
attributes	attr_namer   rP   rP   rQ   	from_node  s    
zExprNode.from_nodec                 C   s   dS )z
        Gets the module.path that this node was imported from.

        Many nodes do not have one, or it is ambiguous, in which case
        this function returns a false value.
        NrP   rR   rP   rP   rQ   !get_known_standard_library_import  s    z*ExprNode.get_known_standard_library_import)F)N)N)r   )FNN)F)FT)FN)r  rP   )zrU   rV   rW   r   r   
annotationr   r:  r5  r2  is_numpy_attributeZgenerator_arg_tagr   is_dict_literalis_set_literalis_string_literalis_attributeis_subscriptr   is_buffer_accessis_memview_indexis_memview_slicer  r  r   r   	is_targetr~   r   rw   r'   implementationrj   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   r  r  r  r  r   r!  r   r  r$  r%  r   r'  r)  r(  r+  r-  r   r6  r<  r?  rD  rL  rE  rG  rQ  rJ  rS  rU  rX  rY  rK  r\  r_  r`  rg  rc  rj  rl  rm  r  r  rt  r  r  r  r  r	  r  r  r  r  r  classmethodr  r  rP   rP   rP   rQ   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  )rK   __init__rS   rz   r  rN   rP   rQ   r    s    z_TempModifierNode.__init__c                 C   s   | j jS rI   r  r   rR   rP   rP   rQ   r     s    z_TempModifierNode.typec                 C   s   | j |S rI   r  r   r   rP   rP   rQ   r     s    z_TempModifierNode.infer_typec                 C   s   | j || _ | S rI   )r  r   r   rP   rP   rQ   r     s    z_TempModifierNode.analyse_typesc                 C   s
   | j  S rI   )r  r   rR   rP   rP   rQ   r     s    z+_TempModifierNode.calculate_constant_resultc                 C   s
   | j  S rI   r  r  rR   rP   rP   rQ   r    s    z_TempModifierNode.may_be_nonec                 C   s
   | j  S rI   r  r  rR   rP   rP   rQ   r    s    z_TempModifierNode.is_simplec                 C   s
   | j  S rI   r  r+  rR   rP   rP   rQ   r+    s    z _TempModifierNode.result_in_tempc                 C   s
   | j  S rI   r  r  rR   rP   rP   rQ   r    s    z&_TempModifierNode.nonlocally_immutablec                 C   s
   | j  S rI   r  r   rR   rP   rP   rQ   r     s    z'_TempModifierNode.calculate_result_codec                 C   s   d S rI   rP   r>  rP   rP   rQ   rG    s    z&_TempModifierNode.generate_result_codec                 C   s   | j | d S rI   r  rS  r>  rP   rP   rQ   rS    s    z/_TempModifierNode.generate_post_assignment_codec                 C   s   | j |S rI   )r  r6  r>  rP   rP   rQ   r6    s    z&_TempModifierNode.allocate_temp_resultc                 C   s   | j | d S rI   r  rY  r>  rP   rP   rQ   rY    s    z_TempModifierNode.free_temps)rU   rV   rW   __doc__r   r   r  r  r   r   r   r   r  r  r+  r  r   rG  rS  r6  rY  rX   rP   rP   rN   rQ   r    s$   
r  c                   @   s    e Zd Zg Zdd Zdd ZdS )AtomicExprNodec                 C   s   d S rI   rP   r>  rP   rP   rQ   rE    s    z/AtomicExprNode.generate_subexpr_evaluation_codec                 C   s   d S rI   rP   r>  rP   rP   rQ   rJ    s    z-AtomicExprNode.generate_subexpr_disposal_codeN)rU   rV   rW   r   rE  rJ  rP   rP   rP   rQ   r    s   r  c                   @   s@   e Zd ZdZeZdZdd Zdd Zdd Z	d	d
 Z
dd ZdS )PyConstNoder)   Nc                 C   s   dS Nr)   rP   rR   rP   rP   rQ   r    s    zPyConstNode.is_simplec                 C   s   dS r&  rP   rR   rP   rP   rQ   r    s    zPyConstNode.may_be_nonec                 C   s   | S rI   rP   r   rP   rP   rQ   r     s    zPyConstNode.analyse_typesc                 C   s   | j S rI   r   rR   rP   rP   rQ   r     s    z!PyConstNode.calculate_result_codec                 C   s   d S rI   rP   r>  rP   rP   rQ   rG    s    z PyConstNode.generate_result_code)rU   rV   rW   r   r   r   r$  r  r  r   r   rG  rP   rP   rP   rQ   r    s   r  c                       s8   e Zd ZdZdZdZdd Zdd Z fdd	Z  Z	S )
r  r)   Py_NoneNc                 C   s   d S rI   rP   r   rP   rP   rQ   r   $  s    zNoneNode.compile_time_valuec                 C   s   dS NTrP   rR   rP   rP   rQ   r  '  s    zNoneNode.may_be_nonec                    s0   |j s"|js"|js"t| jd|  t ||S )NzCannot assign None to %s)ri   r   r  r   rz   rK   r  rS   r  rl   rN   rP   rQ   r  *  s    zNoneNode.coerce_to)
rU   rV   rW   r  r   rw   r   r  r  rX   rP   rP   rN   rQ   r    s   r  c                   @   s   e Zd ZdZeZdd ZdS )EllipsisNodeZPy_Ellipsisc                 C   s   t S rI   )Ellipsisr   rP   rP   rQ   r   8  s    zEllipsisNode.compile_time_valueN)rU   rV   rW   r   r  rw   r   rP   rP   rP   rQ   r  1  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   s   dS r  rP   rR   rP   rP   rQ   r  D  s    zConstNode.is_simplec                 C   s   dS r  rP   rR   rP   rP   rQ   r  G  s    zConstNode.nonlocally_immutablec                 C   s   dS r&  rP   rR   rP   rP   rQ   r  J  s    zConstNode.may_be_nonec                 C   s   | S rI   rP   r   rP   rP   rQ   r   M  s    zConstNode.analyse_typesc                 C   s   dS r  rP   rR   rP   rP   rQ   r   P  s    zConstNode.check_constc                 C   s   |   S rI   r,  rR   rP   rP   rQ   r   S  s    z$ConstNode.get_constant_c_result_codec                 C   s
   t | jS rI   )rp   r   rR   rP   rP   rQ   r   V  s    zConstNode.calculate_result_codec                 C   s   d S rI   rP   r>  rP   rP   rQ   rG  Y  s    zConstNode.generate_result_codec                 C   s   t }|tjks$|dks|dkr,|jr,t| S |js8tjr>t}n&|jrJt	}n|t
krXt}n|tkrdt}|j|kr~|| ||d}n|| |||d}|S )NNULLr   r  r   r   rw   )r  r   c_null_ptr_typerx  NullNoder  r  r  r  	FloatNoder   	BytesNoder   UnicodeNoder   )rz   r   r   rw   rM   r   rP   rP   rQ   for_type\  s*    

zConstNode.for_type)rU   rV   rW   r   r$  r  r  r  r   r   r   r   rG  staticmethodr   r  rP   rP   rP   rQ   r  <  s   r  c                   @   s2   e Zd ZejZdd Zdd Zdd Zdd Z	d	S )
r  c                 C   s   | j | _d S rI   r  rR   rP   rP   rQ   r   {  s    z"BoolNode.calculate_constant_resultc                 C   s   | j S rI   r  r   rP   rP   rQ   r   ~  s    zBoolNode.compile_time_valuec                 C   s(   | j jr| jrdS dS tt| jS d S )NZPy_TrueZPy_False)r   ri   r   rp   rx   rR   rP   rP   rQ   r     s    zBoolNode.calculate_result_codec                 C   s   || j kr| S |tkr&| j tjkr&| S |jrL| j jrLt| j| j| j	tjdS |jrr| j jrrt| j| j| j	t
jdS t| ||S Nr  )r   r   r   Z	bool_typeri   r  r  rz   r   rw   r   r  r  r  r  rP   rP   rQ   r    s&    
  zBoolNode.coerce_toN)
rU   rV   rW   r   r  r   r   r   r   r  rP   rP   rP   rQ   r  w  s
   r  c                   @   s"   e Zd ZejZdZdZdd ZdS )r  r  r   c                 C   s   | j S rI   r  rR   rP   rP   rQ   r     s    z#NullNode.get_constant_c_result_codeN)	rU   rV   rW   r   r  r   r   rw   r   rP   rP   rP   rQ   r    s   r  c                   @   s*   e Zd ZejZdd Zdd Zdd ZdS )r   c                 C   s   t | j| _d S rI   )ordr   rw   rR   rP   rP   rQ   r     s    z"CharNode.calculate_constant_resultc                 C   s
   t | jS rI   )r  r   r   rP   rP   rQ   r     s    zCharNode.compile_time_valuec                 C   s   dt | j S )Nz'%s')r   Zescape_charr   rR   rP   rP   rQ   r     s    zCharNode.calculate_result_codeN)	rU   rV   rW   r   r   r   r   r   r   rP   rP   rP   rQ   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  rn  Nc                 C   s   t tt | jS rI   )r   strip_py2_long_suffixhexstr_to_numberr   rR   rP   rP   rQ   	hex_value  s    zIntNode.hex_valuec                 C   s   t t| jS rI   )rp   r   r  r   rR   rP   rP   rQ   base_10_value  s    zIntNode.base_10_valuec                 K   s&   t j| |f| d|kr"|  | _d S )Nr   )r   r  find_suitable_type_for_valuer   )rS   rz   kwdsrP   rP   rQ   r    s    zIntNode.__init__c                 C   s   | j tkr,z|   W n tk
r*   Y nX | jsJ|  rJ| jsJ| jdkr| jdkrXdpZd}tj	| j |df }| j
rt|| j
}n>d| j   krdk rn n| j
r| j
jr| j
}qtj}ntj}|S )NLLr4   r)   rx   i   l        )rw   r   r   r   is_c_literalr   unsignedlongnessr   Zmodifiers_and_name_to_typer   widest_numeric_typer  c_long_typer   int_type)rS   rankZsuitable_typerP   rP   rQ   r    s,    
z$IntNode.find_suitable_type_for_valuec              	   C   s   | j |kr| S |js|tjkr^|  rHt| jdt| j |t	| jdS t| j| j
|tdS nv|jr|jst| j| j
| j|d| j| jd}|S |jrt| j| j
| jtjd| j| jd}nt| j| j
| j| j| jd}t|||S )Nz%d.0r  T)r   rw   r   r  r  r  F)r   rw   r  r  )r   r  r   
float_typer   r  rz   rx   rw   ry   r   r   
is_numericr  r  r  r  ri   r	  r  r  rS   r  rl   r|   rP   rP   rQ   r    s<    
     zIntNode.coerce_toc                 C   s    t | j| j| jtj| j| jdS )N)r   rw   r   r  r  )r  rz   r   rw   r   r  r  r  r   rP   rP   rQ   r     s      zIntNode.coerce_to_booleanc                 C   sV   | j jrHt| j}|dkr tnt}||}t|}||| j	| _
n
|  | _
d S )Nl     a$)r   ri   r   r  r   r  rp   r  Z
get_py_intr  result_coder   )rS   r   r   	formatterZplain_integer_stringrP   rP   rQ   rL    s    
z IntNode.generate_evaluation_codec                 C   st   | j | j }}|  }|sh|sh| jjrh|d dkrh|d dkrh| jjtjjkrTd}n| jjtjjkrhd}|| | S )Nr   -r)   0r  L)	r  r  value_as_c_integer_stringr   r  r
  r   Zc_longlong_typer  )rS   r  r  literalrP   rP   rQ   r     s    (z"IntNode.get_constant_c_result_codec                 C   s   | j }t|dkr|S d}|d dkr6d}|dd  }|d dkr|d }|rv|dkrv|dd   rvtt|}q|dkrd|dd   }q|d	krtt|dd  d}n$| r| js| js|sd
t| }|| S )Nr4   rn  r   r  r)   r  ZoOxX0123456789ZoOZbBz0x%X)	r   r   isdigitrp   r   r  rx   r  r  )rS   r   Zneg_signZliteral_typerP   rP   rQ   r     s&    z!IntNode.value_as_c_integer_stringc                 C   s   | j S rI   r  rR   rP   rP   rQ   r   <  s    zIntNode.calculate_result_codec                 C   s   t | j| _d S rI   )r   r  r   rw   rR   rP   rP   rQ   r   ?  s    z!IntNode.calculate_constant_resultc                 C   s   t | jS rI   )r   r  r   r   rP   rP   rQ   r   B  s    zIntNode.compile_time_value)rU   rV   rW   r  r  r  r  r  r   r  r  r  r  rL  r   r  r   r   r   rP   rP   rP   rQ   r    s"   

r  c                   @   sB   e Zd ZejZdd Zdd Zdd Zdd Z	d	d
 Z
dd ZdS )r  c                 C   s   t | j| _d S rI   )ry   r   rw   rR   rP   rP   rQ   r   H  s    z#FloatNode.calculate_constant_resultc                 C   sN   t | j}d| d}t| j}||t|dfkrJt| jd|  |S )Nz%.330fr  zEUsing this floating point value with DEF may lose precision, using %r)	ry   r   stripr   Znormalise_float_reprreprlstripr   rz   )rS   r   Zfloat_valueZstr_float_valueZ	str_valuerP   rP   rQ   r   K  s    
zFloatNode.compile_time_valuec                 C   sX   |j r&| jjr&t| j| j| jtjdS |jrJ| jj rJt| j| j| j|dS t	
| ||S r  )ri   r   r  r  rz   r   rw   r   r  r  r  r  rP   rP   rQ   r  S  s      zFloatNode.coerce_toc                 C   s   | j S rI   r  rR   rP   rP   rQ   r   `  s    zFloatNode.calculate_result_codec                 C   sL   | j }t|tsttt|}|dkr,dS |dkr8dS |dkrDdS |S d S )Nnanz(Py_HUGE_VAL * 0)infZPy_HUGE_VALz-infz(-Py_HUGE_VAL))r   rv   rp   r   r  ry   )rS   strvalZcmpvalrP   rP   rQ   r   c  s    z$FloatNode.get_constant_c_result_codec                 C   s,   |   }| jjr"|| j|| _n|| _d S rI   )r   r   ri   Zget_py_floatr   r  )rS   r   Zc_valuerP   rP   rQ   rL  p  s    z"FloatNode.generate_evaluation_codeN)rU   rV   rW   r   c_double_typer   r   r   r  r   r   rL  rP   rP   rP   rQ   r  E  s   r  c           
   
   C   s2  t | }|d k	r|jr|S | }|| }|rZ|jrZ|j}|rR|jsN|jrR|S |pX|}ddlm} t	dd |d |d |d d f}z|d|  |d j
|d	}W n tk
r   Y nhX |jjd j}	t|	tr$|	|}	t|	tr$|	j}|r|js
|jr|W  5 Q R  S |p"|}W 5 Q R X |S )
Nr)   )TreeFragmentTignorer   r4      
sizeof(%s))rj   Zinitial_pos)r   parse_basic_typein_c_type_contextglobal_scoper  is_typer   ri   r  r
   filenamer   rootstatsexprrv   SizeofTypeNoder   arg_type)
rj   rz   rl   r   r%  Zglobal_entryr   r  ZdeclarationZsizeof_noderP   rP   rQ   _analyse_name_as_typex  s4    



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 )r  Tc                 C   s   | j | _d S rI   r  rR   rP   rP   rQ   r     s    z#BytesNode.calculate_constant_resultNc                 C   s,   t | j||| | jj}t| j||dS Nr  )r   bytes_literalr   encodingr  rz   )rS   r   r   r   r   rP   rP   rQ   as_sliced_node  s    zBytesNode.as_sliced_nodec                 C   s
   | j  S rI   )r   Z
byteencoder   rP   rP   rQ   r     s    zBytesNode.compile_time_valuec                 C   s   t | jd| j|S )Nz	ISO8859-1)r-  r   decoderz   r   rP   rP   rQ   r    s    zBytesNode.analyse_as_typec                 C   s   t | jdkS r  r   r   rR   rP   rP   rQ   can_coerce_to_char_literal  s    z$BytesNode.can_coerce_to_char_literalc                 C   s   t | j}t| j||dS r.  r  r   r  rz   rS   rl   r  rP   rP   rQ   r    s    
zBytesNode.coerce_to_booleanc                 C   s&  | j |kr| S |jrZ|  s,t| jd | S |jrBt| jd | S t| j| jt| jdS t	| j| j| j
d}|jr|ttjfkrtj|_ n| j||dd |S |tjtjfkr||_ |S |tjtjtjfkr|tjkrtjntj|_ t||S |tjr|jr|jr||_ |S t|||S )Nz?Only single-character string literals can be coerced into ints.zRBytes literals cannot coerce to Py_UNICODE/Py_UCS4, use a unicode literal instead.r  Tr  )r   r  r4  r   rz   is_unicode_charr   r   r  r  rw   ri   r   r   r   rt  r   r.   rg   rf   rh   c_void_ptr_typeCastNoder  r   is_constr  r  r  rP   rP   rQ   r    s>    



zBytesNode.coerce_toc                 C   sP   | j jr|| j}n0| j jr,|| j}n| j }t| j tj	|}|| _
d S rI   )r   ri   get_py_string_constr   r;  get_string_constZas_c_string_literalr/   r   r9  r  )rS   r   r   r  rP   rP   rQ   rL    s    
z"BytesNode.generate_evaluation_codec                 C   s   d S rI   rP   rR   rP   rP   rQ   r     s    z$BytesNode.get_constant_c_result_codec                 C   s   | j S rI   r  rR   rP   rP   rQ   r     s    zBytesNode.calculate_result_code)N)rU   rV   rW   r  r   r   r   r1  r   r  r4  r  r  rL  r   r   rP   rP   rP   rQ   r    s   
&r  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 )r  TNc                    s:   t  j|||d |d k	r || _|d k	r6|tk	r6|| _d S r.  )rK   r  bytes_valuer   r   )rS   rz   r   r>  r   rN   rP   rQ   r    s
    zUnicodeNode.__init__c                 C   s   | j | _d S rI   r  rR   rP   rP   rQ   r     s    z%UnicodeNode.calculate_constant_resultc                 C   s   t | j| j|S rI   )r-  r   rz   r   rP   rP   rQ   r    s    zUnicodeNode.analyse_as_typec                 C   sX   t | j||| | jj}| jd k	rDt | j||| | jj}nd }t| j||dS )N)r   r>  )r   encoded_stringr   r0  r>  r/  r  rz   )rS   r   r   r   r   r>  rP   rP   rQ   r1    s     
 zUnicodeNode.as_sliced_nodec              	   C   s`  || j krnN|jrL|  s,t| jd | S t| j}t| j|t||dS |j	rdt
| j| j|dS |jsB|js|js|js|jr4|jjr4| jd k	rt| j| jd||S |jd rz| j|jd }W n ttfk
r   Y nX t| j|d||S | j r4t| jt| jdd||S t| jd n|tk	r\| j||dd	 | S )
NzhOnly single-character Unicode string literals or surrogate pairs can be coerced into Py_UCS4/Py_UNICODE.r   r   rw   r   r   r  rY   r`   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).Tr7  )r   r8  r4  r   rz   r  r   r  rp   rI  r  ri   rH  is_cpp_stringr  rx  ry  r1  r>  r  r  rd   encodeUnicodeEncodeErrorLookupErrorisasciir   BytesLiteralr   rt  )rS   r  rl   Z	int_valueZbyte_stringrP   rP   rQ   r    sN    


 
zUnicodeNode.coerce_toc                 C   s   t | jdkS r  r3  rR   rP   rP   rQ   r4  ;  s    z&UnicodeNode.can_coerce_to_char_literalc                 C   s   t | j}t| j||dS r.  r5  r6  rP   rP   rQ   r  >  s    
zUnicodeNode.coerce_to_booleanc                 C   s<   | j  rdS tt| j }|dkr(dS |dkr4dS dS d S )N      i  i )r   rF  r  max)rS   Zmax_charvalrP   rP   rQ   estimate_max_charvalB  s    
z UnicodeNode.estimate_max_charvalc                 C   s   t | jS rI   )r   Zstring_contains_surrogatesr   rR   rP   rP   rQ   contains_surrogatesN  s    zUnicodeNode.contains_surrogatesc              
   C   s   | j jrt| jr|d| _|t| j	d}|
| j}|d krPd S || j |d| j|||| j| jf  || jd| j  q| jr|| j| _q|| j| _n|| j| _d S )NZustringZunicode_escapez@%s = PyUnicode_DecodeUnicodeEscape(%s, sizeof(%s) - 1, NULL); %sz__Pyx_PyUnicode_READY(%s))r   ri   r   Zstring_contains_lone_surrogatesr   get_py_constr  r=  rG  rC  get_cached_constants_writerrF  rz   r   r   put_error_if_negis_identifierintern_identifierr<  Zget_pyunicode_ptr_const)rS   r   Z
data_cname
const_coderP   rP   rQ   rL  Q  s4     z$UnicodeNode.generate_evaluation_codec                 C   s   | j S rI   r  rR   rP   rP   rQ   r   l  s    z!UnicodeNode.calculate_result_codec                 C   s   | j S rI   r  r   rP   rP   rQ   r   o  s    zUnicodeNode.compile_time_value)NN)N)rU   rV   rW   r  rP  r>  r   r   r  r   r  r1  r  r4  r  rK  rL  rL  r   r   rX   rP   rP   rN   rQ   r    s    

&r  c                   @   s   e Zd ZdZdS )IdentifierStringNodeTN)rU   rV   rW   rP  rP   rP   rP   rQ   rS  s  s   rS  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        )complexry   r   rw   rR   rP   rP   rQ   r     s    z"ImagNode.calculate_constant_resultc                 C   s   t dt| jS rU  )rV  ry   r   r   rP   rP   rQ   r     s    zImagNode.compile_time_valuec                 C   s   | j | | S rI   )r   create_declaration_utility_coder   rP   rP   rQ   r     s    zImagNode.analyse_typesc                 C   s   dS r&  rP   rR   rP   rP   rQ   r    s    zImagNode.may_be_nonec                 C   s@   | j |kr| S t| j| jd}|jr2d|_tj|_ t	|||S )Nr  r)   )
r   rT  rz   r   ri   r   r   complex_typer  r  r  rP   rP   rQ   r    s    
zImagNode.coerce_tozConstructing complex numberc                 C   s*   | j jr|  S d| j jt| jf S d S )Nz	%s(0, %r))r   ri   r   
from_partsry   r   rR   rP   rP   rQ   r     s    zImagNode.calculate_result_codec              	   C   sB   | j jr>|d|  t| j||  | jf  | | d S )Nz'%s = PyComplex_FromDoubles(0.0, %r); %s)	r   ri   r   r   ry   r   r   rz   rg  r>  rP   rP   rQ   rG    s    zImagNode.generate_result_codeN)rU   rV   rW   r   Zc_double_complex_typer   r   r   r   r  r  gil_messager   rG  rP   rP   rP   rQ   rT  x  s   rT  c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )NewExprNodeNc                 C   s`   | j |}|d ks|js0t| jd t| _d S | | || j}|| _	|| _
|j| _| jS )Nz/new operator can only be applied to a C++ class)Zcppclassr  r   r   rz   r0   r   	cpp_checkZget_constructor
class_typer   )rS   rl   r   constructorrP   rP   rQ   r     s    
zNewExprNode.infer_typec                 C   s   | j d kr| | | S rI   )r   r   r   rP   rP   rQ   r     s    

zNewExprNode.analyse_typesc                 C   s   dS r&  rP   rR   rP   rP   rQ   r    s    zNewExprNode.may_be_nonec                 C   s   d S rI   rP   r>  rP   rP   rQ   rG    s    z NewExprNode.generate_result_codec                 C   s   d| j   S )Nznew )r]  empty_declaration_coderR   rP   rP   rQ   r     s    z!NewExprNode.calculate_result_code)	rU   rV   rW   r   r   r   r  rG  r   rP   rP   rP   rQ   r[    s   r[  c                       s  e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZd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!dRd)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/dSdEdFZ0dGdH Z1dIdJ Z2dTdKdLZ3dMdN Z4dOdP Z5  Z6S )Ur~  TFNr   rn  c                 C   s   | j S rI   )cython_attributerR   rP   rP   rQ   r    s    zNameNode.as_cython_attributec                 C   s:   | j d kr|| j| _ | j d k	r2| j jjr2| fS dS d S NrP   )r   r  rj   r   is_unspecifiedr   rP   rP   rQ   r    s
    
zNameNode.type_dependenciesc                 C   s   | j d kr|| j| _ | j d ks.| j jtkrB| jd k	r>| jS tS | j jjsV| j jjrj| j | j jj krjt	S | j jt
kr| j | j jj kr| jdkrt	S | j jjr| j jjrtS t| j jS n.| j jjr| jr| jjr| j js| jS | j jS d S )N)rq   
basestring)r   r  rj   r   r1   inferred_typer   is_extension_typeis_builtin_typer   r   r  r  Zis_builtin_scoper   CPtrTyperi   r  Zmight_overflowr   rP   rP   rQ   r     s0    



zNameNode.infer_typec                 C   s:   z| | jW S  tk
r4   t| jd| j  Y nX d S )Nz"Compile-time name '%s' not defined)r  rj   r  r   rz   r   rP   rP   rQ   r     s    zNameNode.compile_time_valuec                 C   s   | j r| j jjrd S | j jS rI   )r   r   ri   r   rR   rP   rP   rQ   r     s    z#NameNode.get_constant_c_result_codec                    sp   |t krb| j}|rb|jrb|j}|rb|jr>|jr>||j| j}t	| j| jd}||_|
| |S t ||S )Nrj   )r   r   r  as_variable
is_builtinr;  declare_builtinrj   rz   r~  analyse_rvalue_entryrK   r  )rS   r  rl   r   Z	var_entryr|   rN   rP   rQ   r  $  s    

zNameNode.coerce_toc           
      C   sf  | j }| j}| jp||}|sN|jr,dS d}|jjsB|jd sHd}n|jrTt	}n|
|\}}|dkr|r|jd dkrtnt	}nH|jr|jrz||j}W n* tk
r   t| jd| j   t}Y nX d}|jr|jdk}	|js||r|	rd	nd
}|r.|jr.|js.|js.t	}t|jdd |j||| j| ||d }| _|rb|jsb||_dS )as  Implements PEP 526 annotation typing in a fairly relaxed way.

        Annotations are ignored for global variables.
        All other annotations are stored on the entry in the symbol table.
        String literals are allowed and not evaluated.
        The ambiguous Python types 'int' and 'long' are not evaluated - the 'cython.int' form must be used instead.
        NrP   Zannotation_typinginfer_typesFzR'%s' cannot be specialized since its type is not a fused argument to this functionprivatefrozenreadonlypubliczxAnnotation ignored since class-level attributes must be Python objects. Were you trying to set up an instance attribute?r4   )Zis_cdef
visibilityZpytyping_modifiers)rj   r  r   lookup_hereis_module_scoper*  r  rd   is_py_class_scoper   analyse_type_annotationr1   r  r  r  r*   r   rz   r0   is_c_dataclass_scoperi   can_coerce_to_pyobjectis_c_class_scoper  r   declare_var)
rS   rl   	as_targetrj   r  r   	modifiersatyperr  	is_frozenrP   rP   rQ   declare_from_annotation7  s^    

    z NameNode.declare_from_annotationc                 C   sN   | j }|s|| j}|r&|jr&|jS |rJ|jrJt|j}|rJ|jrJ|S d S rI   )r   r  rj   	as_moduleknown_standard_library_importr   Z'get_known_standard_library_module_scopert  )rS   rl   r   r  rP   rP   rQ   r  w  s    


zNameNode.analyse_as_modulec                 C   s   d }| j rt| j }n|jr*t| j}|r2|S | j}|sH|| j}|rd|jsd|jrdt	
|j}|r|jr|j}|jr|jr|j}|S | jdkrtS |jst| jrt| 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$  rj   r   r  r&  r  r   Z get_known_standard_library_entryr   ri   equivalent_typer   r   rz   r  rP   rP   rQ   r    s,    

zNameNode.analyse_as_typec                 C   s:   | j }|s|| j}|r6|jr6|jjs0|jjr6|jS d S rI   )r   r  rj   r&  r   re  rf  rS   rl   r   rP   rP   rQ   r!    s    
z"NameNode.analyse_as_extension_typec                 C   s   | j |ddS )NFis_assignment_expression_analyse_target_declarationr   rP   rP   rQ   r     s    z#NameNode.analyse_target_declarationc                 C   s   | j |ddS )NTr  r  r   rP   rP   rQ   r     s    z9NameNode.analyse_assignment_expression_target_declarationc                 C   s  d| _ | js.|r || j| _n|| j| _| jr<d| j_| jsd| jd k	rd|j}| j|| d n&| jr| jj	r| jr|jrt
| jd | js|jd rt| jd| j d |jd d	krt}nt}|r|| j|| j| _n|| j|| j| _| jjrt| _| jjrd| j_d S )
NTrn  )r{  z7Cannot redeclare inherited fields in Cython dataclasseszwarn.undeclaredzimplicit declaration of '%s'r)   rm  F)r  r   Z#lookup_assignment_expression_targetrj   rs  r  r  rw  r  Zis_inheritedr   rz   rd   r   r1   r   Z$declare_assignment_expression_targetrz  is_declared_genericr   r  is_variable)rS   rl   r  Zis_dataclassr   rP   rP   rQ   r    s:    


z$NameNode._analyse_target_declarationc                 C   s   |j d | _| j}|d krf|| j}|sP|| j| j}|rP|jrP|jrPd| _	|s`t
j| _| S || _d|_|jjrddlm} || | | | S )NinitializedcheckTr)   Buffer)rd   initialized_checkr   r  rj   rk  rz   rj  r;  r   r   r0   r   r|  	is_bufferrn  r  used_buffer_aux_varsrl  rS   rl   r   r  rP   rP   rQ   r     s$    

zNameNode.analyse_typesc                 C   s   | j |dd | j}|jrP|jrP|js<|jjs<|  sP|jrP|j }| _|j| _|  srt| j	d| j
  tj| _d|_|jjrddlm} || | S )NTr  zAssignment to non-lvalue '%s'r)   r  )analyse_entryr   r  ri  is_overridabler   r   fused_cfunctionr   rz   rj   r   r0   r|  r  rn  r  r  r  rP   rP   rQ   r    s    
zNameNode.analyse_target_typesc                 C   sh   |  | | j}|jrt| _|js(|jrJ|jr<|jr<d| _nd| _d| _	n|j
jrdd| _d| _	d| _| S )Nr   r)   FT)r  r   r  r   r   is_pyglobalrj  r;  r   is_used_as_rvaluer   r   r5  r  rP   rP   rQ   rl    s    
zNameNode.analyse_rvalue_entryc                 C   s:   d| _ | jr6| j}|jr(|js6|   n|jr6|   d S r  )r   r  r   rj  r;  r#  r  r  rP   rP   rQ   r$  	  s    
zNameNode.nogil_checkz"Accessing Python global or builtinc                 C   s\   |    | j}|j}|s2|jr2| jr2| jjr2| j}|| _|jjrX|jsL|j	rX|
d| _d S Nrn  )check_identifier_kindr   r   ri   rd  rf  r  rt  r  Zis_cclass_var_entryname_in_module_statemodule_state_lookup)rS   rl   r  r   r   rP   rP   rQ   r  !	  s    zNameNode.analyse_entryc                 C   s   | j }|jr|jjr|| _|jr^|jjs0|jjr^|jr^t	| j
d t}d|_| j j|_|| _ nJ|js|js|js|js|js| j jr| j j| _ n| jst| jd| j
  d S )NTz7'%s' is not a constant, variable or function identifier)r   r&  r   re  
type_entryr  is_cpp_enumZcreate_wrapperr   Entryrj   r   r  r  r;  r  rj  r  r   ri  is_cython_moduler   rz   )rS   r   Zpy_entryrP   rP   rQ   r  0	  s&    
zNameNode.check_identifier_kindc                 C   s0   | j s| jrdS | jp || j}|jo.|j S r&  )r  r`  r   r  rj   r  r  r  rP   rP   rQ   "is_cimported_module_without_shadowD	  s    z+NameNode.is_cimported_module_without_shadowc                 C   s   dS r  rP   rR   rP   rP   rQ   r  J	  s    zNameNode.is_simplec                    sf   | j r\| jr\| jjs| jjr\t| ddr,dS d| _d}| j D ]}|j r<d} qTq<| `|S t  S )N_none_checkingFT)	r   r   ri   r   r   r  r   r  rK   )rS   r  
assignmentrN   rP   rQ   r  N	  s    

zNameNode.may_be_nonec                 C   s:   t | rdS | j}|r|jr"dS |jp8|jp8|jp8|jS NTF)r   r  r   
in_closureis_localZis_argrj  is_readonlyrS   r   rP   rP   rQ   r  c	  s    

zNameNode.nonlocally_immutablec                 C   s   d S rI   rP   r   rP   rP   rQ   calculate_target_resultsk	  s    z!NameNode.calculate_target_resultsc                 C   s8   | j }|d k	r4|js4|js4|js4|jjs4|   dS dS r  )r   r;  r  rj  r   r'  r  rP   rP   rQ   r   n	  s    zNameNode.check_constc                 C   s(   | j }|js$|js$|js$|   dS dS r  )r   
is_cglobalr  rj  r(  r  rP   rP   rQ   r)  y	  s
    zNameNode.check_const_addrc                 C   s"   | j jr| j j p | j jo | j jS rI   )r   r  r  r  r  rR   rP   rP   rQ   r   	  s    zNameNode.is_lvaluec                 C   s   | j jo| jj S rI   )r   r  r   r   rR   rP   rP   rQ   r   	  s    zNameNode.is_addressablec                 C   s   dS r   rP   rR   rP   rP   rQ   r   	  s    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   r  r  rP   rP   rQ   r   	  s    
zNameNode.calculate_result_codec                 C   sf  | j }|d krd S |jr&|j|j |jr6|jr6d S |jr|jjsNt	d|
| j j}|jrjtj}n|jj}| js|d|  ||f  |d|    |d |jtdd |d|  |f  | js|d |||  | j | | nV|jr|jjs|jjs0t	d|
| j j}|jtd	d |d
|  |||  | jf  | | n|js|jrp|jjrp|jjst	d|
| j j}|jjr|jtdd |d|  |||  | jf  n^||j}| j jj}|jtdd |d|  |rFdnd||||  | jf  | | n|js|js|js|jjr&| j s| jo| j! }|jjo| j"}|j#o| j"}	|	r|j$|j%}
n|j&|j%}
|
rb|rb|jjs|s|	rb|j'| j|| j(|
d n<|j)rb|j#rb| j"rb|j$|j%}
|j'| j|| j(|
d d S )N,Python global or builtin not a Python objectz%s = PyObject_GetItem(%s, %s);if (unlikely(!%s)) {PyErr_Clear();ZGetModuleGlobalNameObjectHandling.cz"__Pyx_GetModuleGlobalName(%s, %s);r   ZGetBuiltinNamez!%s = __Pyx_GetBuiltinName(%s); %sz%__Pyx_GetModuleGlobalName(%s, %s); %sZGetNameInClassz&__Pyx_GetNameInClass(%s, %s%s, %s); %sz(PyObject*)rn  unbound_check_code)*r   utility_coder   r   rj  r;  is_pyclass_attrr   ri   r   rQ  rj   r   Zbuiltins_cnamer  namespace_cnamera  r   r   r   r   r   rz   rg  rt  r  namespace_cname_in_module_statenamespace_cname_is_typer  r  from_closurer   rb  
allow_nullr  r   cpp_optional_check_for_null_coder   Zcheck_for_null_codeput_error_if_unboundrC  r  )rS   r   r   interned_cname	namespacer  r  Zraise_unboundZmemslice_checkZoptional_cpp_checkr  rP   rP   rQ   rG  	  s    







""zNameNode.generate_result_codec              	   C   s  | j }|d krd S | j jjr>t|tr>| js>|js>t| jd |j	r~|jj
sVtd|| j j}|| j j}| j jj}	d}
|jrd}d}
|jtdd nb|jjrd}|tj}nH|jr| jd	krd
nd}|jt|d d| }ndstt||	r|
sd| d}|
r.|	s.t|| jd|||| f  trftd td|  | | |!| n| jj"r| #|| n| jj$r| %|| d}| jj&rd}| jj
r| j'r|(| |j)p| j j*p| j j+}|r| j,|dd d}|j)r,| -||.| /  nD| j0sl| j1rT| 2||.| /  n| -||.| /  nd}|r|3| | jj"sx|sR|r|4 }|dkrt5|| jd| 6 |f | jj
r| 6 nd || j7 n|8d| 6 |f  n\|9| / }t:| jr.|8d| 6 | 6 |f  n$|| 6 krR|8d| 6 |f  trltd td|  |;| n|< r|;| |!| d S )Nz?Literal list must be assigned to pointer at time of declarationr  FZ__Pyx_SetItemOnTypeDictTZSetItemOnTypeDictzExtensionTypes.cPyDict_SetItemrL   ZSetNewInClassZSetNameInClassr  Z__Pyx_z((PyObject*))z%s(%s, %s, %s)z"NameNode.generate_assignment_code:z"...generating disposal code for %s)re  r   %s = %s;new (&%s) decltype(%s){%s};z)...generating post-assignment code for %s)=r   r   rx  rv   ListNodelhs_of_first_assignmentin_module_scoper   rz   r  ri   r   rQ  rj   r  r  r  	is_memberr   r   r   r   rt  r  r   moddict_cnamer  r  rO  r   r   printrQ  rY  r    generate_acquire_memoryviewslicer  generate_acquire_bufferr;  r5  r?  r  r  r  rg  r_  r   r   ra  rb  r`  rj  r   r   r   rC  r   r   r;   rS  r+  )rS   r   r   rT  r   r   r   r  r  Znamespace_is_typeZnamespace_needs_typesetternassignedZis_external_refr   rP   rP   rQ   rU  	  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)   ro  )Z	lhs_cnamer   Zlhs_posr   r   rA  Zfirst_assignmentN)rn  rp  Zput_acquire_memoryviewslicer   r   rz   rC  ra  )rS   r   r   rp  rP   rP   rQ   r  o
  s    z)NameNode.generate_acquire_memoryviewslicec                 C   s   t |tp| }|r&||  }n0|jj| jjdd}|	d|||  f  ddl
m} |j|  || j| j | j|d |s|	d|  |j| d S )NFr.  r  r)   r  )Zis_initializedrz   r   rR  )rv   r~  r+  r   r   r3  r4  r   r   r   rn  r  Zput_assign_to_bufferr   r  rz   r;  )rS   r   r   Z
pretty_rhsZrhstmpr  rP   rP   rQ   r  
  s     z NameNode.generate_acquire_bufferc              	   C   s  | j d krd S | j jrf| j jj}|| j j}|r8d}nd| j j }|d||||| jf  n| j j	r|j
tdd || j j}dtj|f }|r|d||| jf  n|| j| n| j jjs| j jjrr| js~| jr|s|| j| j | j | j jr(| j|d|d	 |rT| jrT|j|  |  | j d
 n|j|  |  | j d
 nt| jd d S )NzPyErr_Clear(); elsezT{ PyErr_Clear(); PyErr_Format(PyExc_NameError, "name '%%s' is not defined", "%s"); }ziif (unlikely(PyObject_DelItem(%s, %s) < 0)) { if (likely(PyErr_ExceptionMatches(PyExc_KeyError))) %s %s }PyObjectSetAttrStrr  !__Pyx_PyObject_DelAttrStr(%s, %s)zjif (unlikely(%s < 0)) { if (likely(PyErr_ExceptionMatches(PyExc_AttributeError))) PyErr_Clear(); else %s }T)re  rf  r@  z!Deletion of C names not supported) r   r  r  r  rQ  rj   r   r   rz   r  r   r   r   r   r   module_cnamerO  r   ri   r   ra  rb  r  rC  r  rg  put_xdecref_clearr   r   r   rP  r   )rS   r   rW  r  r  Zkey_error_codeZdel_coderP   rP   rQ   rX  
  sb    



 
zNameNode.generate_deletion_codec                 C   sv   t | ddrr| jd | jd | jd t| j d f}| jjrHd\}}nd\}}||t||| j t| jd d S )	N	is_calledFr   r)   r4   )Zpy_callzpython function (%s))Zc_callzc function (%s)size)r   rz   r   rj   r   ri   rm  r5   )rS   r   rz   styletextrP   rP   rQ   rm  
  s    *
zNameNode.annotatec                 C   s   | j r| j jS d S rI   )r   r  rR   rP   rP   rQ   r  
  s    z*NameNode.get_known_standard_library_import)F)F)FNN)F)7rU   rV   rW   r   r  r`  r  r  r   r  rb  ra  r  r   rd  r  r  r  r   r   r   r  r  r  r  r!  r   r   r  r   r  rl  r$  rZ  r  r  r  r  r  r  r  r   r)  r   r   r   r   rG  rU  r  r  rX  rm  r  rX   rP   rP   rN   rQ   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 r  )r  r   r  r   r   rP   rP   rQ   r   
  s    zBackquoteNode.analyse_typeszBackquote expressionc                 C   s   t | jj| _d S rI   )r  r  rw   rR   rP   rP   rQ   r   
  s    z'BackquoteNode.calculate_constant_resultc              	   C   s:   | d|  | j ||  | jf  | | d S )Nz%s = PyObject_Repr(%s); %s)r   r   r  r   r   rz   rg  r>  rP   rP   rQ   rG  
  s    z"BackquoteNode.generate_result_codeN)
rU   rV   rW   r   r   r   r   rZ  r   rG  rP   rP   rP   rQ   r  
  s   r  c                   @   sB   e Zd ZeZdZdZdZdddgZdd Z	d	Z
d
d Zdd ZdS )
ImportNodeNFTmodule_name	name_listmodule_namesc                    s    j d kr:| jr4|jd s,tj|jjkr4d _ nd _  j	|}|
| _ jjs^t jr~ j	|}|
| _nDd jjkrt jj fddttj jjdD d	| _ S )NZ
py2_importr   r  c                    s   g | ]}t  jj|d qS r  )rS  r  rz   r[   partrR   rP   rQ   r   !  s   z,ImportNode.analyse_types.<locals>.<listcomp>r   )ru   r%  parent_modulerd   r6   absolute_importcontextZfuture_directivesr  r   r  r  r   r  r   	TupleNoderz   mapr   r  r  r  )rS   rl   r  r  rP   rR   rQ   r     s*    


zImportNode.analyse_typeszPython importc              	   C   s  | j jst| j j}| jdkr| js| js| jr<| jjs<t| jdkrXt	
dd}d}nt	
dd}d}|j| d|| j  | jr| j ndf }n:|jt	
d	d d
| j  | jr| j nd| jf }|d|  |||  | jf  | | d S )Nr   ZImportDottedModulezImportExport.cZ__Pyx_ImportDottedModuleZImportDottedModuleRelFirstZ __Pyx_ImportDottedModuleRelFirst
%s(%s, %s)r  ZImportz__Pyx_Import(%s, %s, %d)r  %s = %s; %s)r  r  r   r   ru   r  get_top_level_moduler  r   r   r   r   r   r   r   r   r   rz   rg  )rS   r   r  r  Zhelper_funcZimport_coderP   rP   rQ   rG  )  s8    
zImportNode.generate_result_codec                 C   s   | j jS rI   )r  r   rR   rP   rP   rQ   r  I  s    z,ImportNode.get_known_standard_library_import)rU   rV   rW   r   r   r  r  r   r   r   rZ  rG  r  rP   rP   rP   rQ   r  
  s   
 r  c                       sZ   e Zd Zg ZdZdZdddZdd Zdd Zd	d
 Z	dd Z
 fddZdd Z  ZS )ScopedExprNodeNTc                 C   s4   |d k	r|| _ n | jr$t|| _ n| j s0d | _ d S rI   )
expr_scopehas_local_scoper   ZComprehensionScope)rS   outer_scoper  rP   rP   rQ   
init_scope\  s    zScopedExprNode.init_scopec                 C   s   |  | d S rI   )r  r   rP   rP   rQ   analyse_declarationsd  s    z#ScopedExprNode.analyse_declarationsc                 C   s   d S rI   rP   r   rP   rP   rQ   analyse_scoped_declarationsg  s    z*ScopedExprNode.analyse_scoped_declarationsc                 C   s   | S rI   rP   r   rP   rP   rQ   r   k  s    zScopedExprNode.analyse_typesc                 C   s   | S rI   rP   r   rP   rP   rQ   analyse_scoped_expressionso  s    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	sJ|j
jrJ|jrJ|| qJ|s|| |d d S | }| }|| | || |d}|| |j|fgtt| | D ]2\}	}
||	r||	 | || ||
 q|| |d || ||_d S )Nz{ /* enter inner scope */c                 s   s   | ]}|d  r|V  qdS )r   NrP   r   rP   rP   rQ   r_   }  s      z:ScopedExprNode.generate_evaluation_code.<locals>.<genexpr>z} /* exit inner scope */
exit_scope)rK   rL  r  r  var_entriesr   sortedentriesitemsr  r   ri   r|  r   Znew_loop_labelsZnew_error_label_generate_vars_cleanup	new_labelput_gotoerror_labelr   zipZget_loop_labelsZ
label_used	put_labelZset_loop_labels)rS   r   Zgenerate_inner_evaluation_code
py_entries_r   Zold_loop_labelsZold_error_labelr  labelZ	old_labelrN   rP   rQ   rL  s  s>    
"








z'ScopedExprNode.generate_evaluation_codec                 C   s6   |D ],}|j r&|| ||d q|| qd S )Nr  )r  Zput_var_gotrefZput_var_decref_setZput_var_xdecref_clear)rS   r   r  r   rP   rP   rQ   r    s
    
z%ScopedExprNode._generate_vars_cleanup)N)rU   rV   rW   r   r  r  r  r  r  r   r  rL  r  rX   rP   rP   rN   rQ   r  M  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rD| jjjsD| jj| _nz| jjjrdt| j	| jd|S | 
 r| jjjd j}t| j	|dd|S | j|| _| jjttfkr| jd| _d| _| S )N)r  r   T)r  reversed!'NoneType' object is not iterabler)   )r  r  r   r   r  rx  rH  r   CppIteratorNoderz   is_reversed_cpp_iteration	arg_tupler   r  r  r   r   r  r   )rS   rl   r  rP   rP   rQ   r     s"    
zIteratorNode.analyse_typeszIterating over Python objectitc                 C   s   t | jtr&| jjr&t| jjjdks*dS | jj}|jr~|jdkr~|j	j
sNdS | jjjd }t |tr~|jjr~|jj	}|jjS dS )z
        Returns True if the 'reversed' function is applied to a C++ iterable.

        This supports C++ classes with reverse_iterator implemented.
        r)   Fr   r   )rv   r  r  r  r   r   r  r   rj   r   rj  CoercionNoder  r   r   )rS   funcr  rP   rP   rQ   r    s    z&IteratorNode.is_reversed_cpp_iterationc                 C   s   | j | jp|S rI   )r  r  r  r   rP   rP   rQ   r    s    zIteratorNode.type_dependenciesc                 C   sN   | j |}|js|jr|S |jr@|jd}|d k	rJ|jjS n
|j	rJ|S t
S )Nbegin)r  r   r  rx  r   r  r  r   return_typeri   r   )rS   rl   sequence_typer  rP   rP   rQ   r     s    
zIteratorNode.infer_typec              	   C   s  | j j}|jrdstd|js&|jr.td|ttfk}|sL| j	rLtd|j
 | _| jrz|d| j  | j  f  |s| jr<|d|  | j  |  f  |jjtjdd| _| j	r,|tkrd}nd	}|d
| j||  f  |d ||| j| j |d |d| j  n|d| j  |s|jj| jdd| _| jr|d| j  |d |d| j  |d|  | j  ||  | jf  | | || j d|   d ||| j| j | jr|d d S )NFz+Should have been changed to CppIteratorNodez#for in carray slice not transformedzBinternal error: reversed() only implemented for list/tuple objectsz>if (likely(PyList_CheckExact(%s)) || PyTuple_CheckExact(%s)) {z%s = %s; __Pyx_INCREF(%s);r.  __Pyx_PyList_GET_SIZE__Pyx_PyTuple_GET_SIZEz%s = %s(%s);#if !CYTHON_ASSUME_SAFE_SIZE#endifz--%s;rR  
%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   r   r  rx  r   r   r   r   rf  may_be_a_sequencer   r   r   r3  r4  r   r  counter_cnameerror_goto_if_negrz   _func_iternext_typeiter_func_ptrputr   rg  )rS   r   r
  Zis_builtin_sequenceZlen_funcrP   rP   rQ   rG    sl    
 



z!IteratorNode.generate_result_codec                 C   s   | d d S Nz;;r  r>  rP   rP   rQ   generate_for_loop_header4  s    z%IteratorNode.generate_for_loop_headerc                 C   s  | j std|dkstd| d|   d}d}| jjrt| jj}| jjd kr^|}d}n"t| jjj	t
r|| jjj	 }d}|r|d| j |f  nh|d	 |d
tj|f  |d ||tj| j |d |d| j tjf  |d | jrdnd}|dkr@|| d|   d| j  d nb|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(r  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   rv   rw   rx   r   r   quick_temp_cnamer  rz   r   )rS   Z	test_nameresult_namer   Z
final_sizeZsize_is_safeZ
item_countZinc_decrP   rP   rQ   generate_next_sequence_item7  s<    




$
"
"
z(IteratorNode.generate_next_sequence_itemc                 C   s  | j j}| jr"|d| j d |tkr\| d|| |||| j |	|t
 d S |tkr| 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 )Nif (z < 0) break;r  r  zif (likely(!%s)) {z$if (likely(PyList_CheckExact(%s))) {r  r   z} else r    = (r#  r  z&PyObject* exc_type = PyErr_Occurred();zif (exc_type) {zA!__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)r  break;)r  r   r   r   r  r   r*  r   rz   rd  r   r   r  r  r   r  r   )rS   r)  r   r
  rP   rP   rQ   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 rI   )r  r3  r;  r  r   rY  r>  rP   rP   rQ   rY    s    zIteratorNode.free_temps)rU   rV   rW   r   r   r  r  r   is_asyncr  r   r   rZ  r   rg  	CFuncTypeCFuncTypeArgr  r  r  r   rG  r  r*  r/  rY  rP   rP   rP   rQ   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  rn  TFr  c                 C   s   | j s
dS dS )N)r  end)ZrbeginZrend)r   rR   rP   rP   rQ   get_iterator_func_names  s    z'CppIteratorNode.get_iterator_func_namesc                 C   s  | j j}|jr|j}|  \}}|j|}|j|}|d ksP|jjrP|jjrrt	| j
d|| j jf  t| _| S |d ks|jjr|jjrt	| j
d|| j jf  t| _| S |jj}|jr|jd rd| _|| j
d||jjgd krt	| j
d|| j jf  t| _| S || j
d|gd krFt	| j
d|| j jf  t| _| S || j
d|gd krt	| j
d|| j jf  t| _| S || _nP|jr||jjkst	| j
d	||f  || _nt	| j
d
|| j jf  t| _| S )Nzmissing %s() on %s
cpp_localsr   !=z*missing operator!= on result of %s() on %sr!  z*missing operator++ on result of %s() on %sz)missing operator* on result of %s() on %sz$incompatible types for %s() and %s()z8result type of %s() on %s must be a C++ class or pointer)r  r   rx  ry  r4  r  r  r  r   r   rz   r0   r	  r   rd   extra_dereferencelookup_operator_for_types)rS   rl   r
  
begin_nameend_namer  r3  Z	iter_typerP   rP   rQ   r     sh    

zCppIteratorNode.analyse_typesc                 C   s   | j j}|  \}}| j  rB|d|  | j  | j|f  n|}|jrXt	|j
}|jsj|jjd rpd| _|jj|dd| _|d| j|jrdnd| j  f  |d|  | j| j|f  d S )	Nz%s = %s%s%s();r5  ->Fr.  z
%s = %s%s;&rn  )r  r   r4  r  r   r   cpp_attribute_opr   r   rg  ru  rx  r   rd   r3  r4  cpp_sequence_cnamer   )rS   r   r
  r9  r  Z	temp_typerP   rP   rQ   rG    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)r4  r  r7  r   r>  r  r=  )rS   r   r  r:  rP   rP   rQ   r    s    z(CppIteratorNode.generate_for_loop_headerc                 C   s   | d|| j|  f  d S )Nz%s = *%s%s;)r   r7  r   )rS   r)  r   rP   rP   rQ   r/    s
    z.CppIteratorNode.generate_iter_next_result_codec                 C   s   | j s
d S t| | d S rI   )r>  r   rJ  r>  rP   rP   rQ   rJ    s    z.CppIteratorNode.generate_subexpr_disposal_codec                 C   s   | j s
d S t| | d S rI   )r>  r   rK  r>  rP   rP   rQ   rK    s    z"CppIteratorNode.free_subexpr_tempsc                 C   s.   | j st| | t| | t| | d S rI   )r>  r   rJ  rK  rQ  r>  rP   rP   rQ   rQ    s    z&CppIteratorNode.generate_disposal_codec                 C   s$   | j r|j| j  t| | d S rI   )r>  r3  r;  r   rY  r>  rP   rP   rQ   rY    s    zCppIteratorNode.free_temps)rU   rV   rW   r>  r=  r7  r   r   r   r4  r   rG  r  r/  rJ  rK  rQ  rY  rP   rP   rP   rQ   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   s   t | |j || _d S rI   r  r  rz   iteratorrS   rA  rP   rP   rQ   r  &  s    zNextNode.__init__c                 C   s   d S rI   rP   r   rP   rP   rQ   r$  *  s    zNextNode.nogil_checkc                 C   s   | j |S rI   )rA  r  r   rP   rP   rQ   r  .  s    zNextNode.type_dependenciesNc                 C   s   |d kr| j |}|js |jr&|jS |jrT|| jd|gjj	}t
j|dd}|S t| j| j jt| jdt
jdd}||S d S )Nr   TZremove_fakerefPY_SSIZE_T_MAXrA  r  )rA  r   rx  r  ry  r   r8  rz   r   r	  r   remove_cv_refr  r  r  r  )rS   rl   Ziterator_type	item_typeZfake_index_noderP   rP   rQ   r   1  s     zNextNode.infer_typec                 C   s   |  || jj| _d| _| S r  )r   rA  r   r   r   rP   rP   rQ   r   C  s    zNextNode.analyse_typesc                 C   s   | j |  | d S rI   )rA  r/  r   r>  rP   rP   rQ   rG  H  s    zNextNode.generate_result_code)N)	rU   rV   rW   r  r$  r  r   r   rG  rP   rP   rP   rQ   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   s   t S rI   r   r   rP   rP   rQ   r   Z  s    zAsyncIteratorNode.infer_typec                 C   sB   | j r| j }| j|| _| jjjs>t| jd | j|| _| S )Nz*async for loops not allowed on C/C++ types)r  r  r   r   ri   r   rz   r  r   rP   rP   rQ   r   ]  s    
zAsyncIteratorNode.analyse_typesc              	   C   sN   |j tdd |d|  | j ||  | j	f  | 
| d S )N	AsyncIterCoroutine.cz)%s = __Pyx_Coroutine_GetAsyncIter(%s); %s)r   r   r   r   r   r   r  r   r   rz   rg  r>  rP   rP   rQ   rG  f  s    z&AsyncIteratorNode.generate_result_codec                 C   s   | d d S r  r  r>  rP   rP   rQ   r  n  s    z*AsyncIteratorNode.generate_for_loop_headerN)rU   rV   rW   r   r0  r   r   r   r  r   r   rG  r  rP   rP   rP   rQ   rG  L  s   	rG  c                   @   s4   e Zd ZeZdZdd Zdd Zdd Zdd	 Z	d
S )AsyncNextNoder)   c                 C   s   t | |j || _d S rI   r@  rB  rP   rP   rQ   r  }  s    zAsyncNextNode.__init__c                 C   s   t S rI   rH  r   rP   rP   rQ   r     s    zAsyncNextNode.infer_typec                 C   s   | S rI   rP   r   rP   rP   rQ   r     s    zAsyncNextNode.analyse_typesc              	   C   sN   |j tdd |d|  | j ||  | j	f  | 
| d S )NrI  rJ  z*%s = __Pyx_Coroutine_AsyncIterNext(%s); %s)r   r   r   r   r   r   rA  r   r   rz   rg  r>  rP   rP   rQ   rG    s    z"AsyncNextNode.generate_result_codeN)
rU   rV   rW   r   r   r   r  r   r   rG  rP   rP   rP   rQ   rK  r  s   rK  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   rM  r   r  r   r   r   rP   rP   rQ   r     s    zWithExitCallNode.analyse_typesc                 C   sx  | j r|d| jj  | j| |jjtdd}|	| j
 |jtdd |d|| jj| j f  |j| jjtd | j| | j| |||| j
 ||t | jr| jj||dd	 |d
|| j f  | j| | j| | jr.| | |d|  |f  |j|td | jrV|| j
|   |j| | j rt|d d S )N	if (%s) {Fr.  PyObjectCallr  z'%s = __Pyx_PyObject_Call(%s, %s, NULL);rs  T)source_cnamedecref_sourcer  z%s = __Pyx_PyObject_IsTrue(%s);r   )test_if_runr   Z	with_statZexit_varr   rL  r3  r4  r   rF  rz   r   r   r   r   r   rP  rQ  rY  r   rd  rM  r   rS  r2  r6  rO  r;  )rS   r   Z
result_varrP   rP   rQ   rL    sB    
 
z)WithExitCallNode.generate_evaluation_code)rU   rV   rW   r   rR  rM  r   rL  rP   rP   rP   rQ   rL    s
   rL  c                   @   s8   e Zd ZeZdd Zdd Zdd Zdd Zd	d
 Z	dS )ExcValueNodec                 C   s   t | | d S rI   r   r  )rS   rz   rP   rP   rQ   r    s    zExcValueNode.__init__c                 C   s
   || _ d S rI   var)rS   rV  rP   rP   rQ   set_var  s    zExcValueNode.set_varc                 C   s   | j S rI   rU  rR   rP   rP   rQ   r     s    z"ExcValueNode.calculate_result_codec                 C   s   d S rI   rP   r>  rP   rP   rQ   rG    s    z!ExcValueNode.generate_result_codec                 C   s   | S rI   rP   r   rP   rP   rQ   r     s    zExcValueNode.analyse_typesN)
rU   rV   rW   r   r   r  rW  r   rG  r   rP   rP   rP   rQ   rS    s   rS  c                   @   sZ   e Zd Zg ZdddZdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd ZdS )TempNodeNc                 C   s(   t | | || _|jrt| _d| _d S r  )r   r  r   ri   r   r   r   )rS   rz   r   rl   rP   rP   rQ   r    s
    zTempNode.__init__c                 C   s   | S rI   rP   r   rP   rP   rQ   r     s    zTempNode.analyse_typesc                 C   s
   d| _ d S r  r  r   rP   rP   rQ   r     s    z#TempNode.analyse_target_declarationc                 C   s   d S rI   rP   r>  rP   rP   rQ   rG    s    zTempNode.generate_result_codec                 C   s   |j j| jdd| _d S )NTr.  )r3  r4  r   
temp_cnamer>  rP   rP   rQ   allocate  s    zTempNode.allocatec                 C   s   |j | j d | _d S rI   )r3  r;  rY  r>  rP   rP   rQ   release  s    zTempNode.releasec                 C   s(   z| j W S    dstd Y nX d S )NFz-Remember to call allocate/release on TempNode)rY  r   rR   rP   rP   rQ   r     s
    zTempNode.resultc                 C   s   d S rI   rP   r>  rP   rP   rQ   r6    s    zTempNode.allocate_temp_resultc                 C   s   d S rI   rP   r>  rP   rP   rQ   r<    s    zTempNode.release_temp_result)N)rU   rV   rW   r   r  r   r   rG  rZ  r[  r   r6  r<  rP   rP   rP   rQ   rX    s   	
rX  c                   @   s   e Zd Zdd ZdS )
PyTempNodec                 C   s   t | |tj| d S rI   )rX  r  r   r   )rS   rz   rl   rP   rP   rQ   r    s    zPyTempNode.__init__NrU   rV   rW   r  rP   rP   rP   rQ   r\    s   r\  c                   @   s:   e Zd Zg ZdddZdd Zdd Zdd	 Zd
d ZdS )RawCNameExprNodeNc                 C   s"   t j| ||d |d k	r|| _d S )Nrs  )r   r  r   )rS   rz   r   r   rP   rP   rQ   r    s    zRawCNameExprNode.__init__c                 C   s   | S rI   rP   r   rP   rP   rQ   r   !  s    zRawCNameExprNode.analyse_typesc                 C   s
   || _ d S rI   r   )rS   r   rP   rP   rQ   	set_cname$  s    zRawCNameExprNode.set_cnamec                 C   s   | j S rI   r_  rR   rP   rP   rQ   r   '  s    zRawCNameExprNode.resultc                 C   s   d S rI   rP   r>  rP   rP   rQ   rG  *  s    z%RawCNameExprNode.generate_result_code)NN)	rU   rV   rW   r   r  r   r`  r   rG  rP   rP   rP   rQ   r^    s   
r^  c                   @   s6   e Zd ZeZdZdZdgZdd Zdd Z	dd	 Z
d
S )JoinedStrNodeTzString concatenationvaluesc                    s    fdd| j D | _ | S )Nc                    s   g | ]}|   qS rP   )r   r  )r[   vrr   rP   rQ   r   C  s     z/JoinedStrNode.analyse_types.<locals>.<listcomp>)rb  r   rP   rr   rQ   r   B  s    zJoinedStrNode.analyse_typesc                 C   s   dS r&  rP   rR   rP   rP   rQ   r  F  s    zJoinedStrNode.may_be_nonec              
      s  | | j t| j}|dk }t }d}| jD ]J}t|trLt|| }q.t|t	rb|j
jjrbq.t|trnq.|| q.g }i  t|g}| jD ]}|| t|trtt|j
}	n.d|  d}	||kr|d|  d |	 kr |	  d7  < q||	 d |	< q|r:|jjttj|dd}
nX|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  |s8|d|
  |j#|
 ||$|  | j | %| | jD ]}|&| |'| qld S )N    rH  z__Pyx_PyUnicode_GET_LENGTH(r  z__Pyx_PyUnicode_MAX_CHAR_VALUE(r)   Fr.  z7%s = (PyObject **) PyMem_Calloc(%d, sizeof(PyObject*));r  zPyErr_NoMemory(); %sr   z%s[%d] = %s;c                    s.   g | ]&} | d kr&| d |  n|qS )r)   z * rP   r  countsrP   rQ   r     s   z:JoinedStrNode.generate_evaluation_code.<locals>.<listcomp>ZJoinPyUnicodeStringTools.cz*%s = __Pyx_PyUnicode_Join(%s, %d, %s, %s); +  | zPyMem_Free(%s);)(rF  rz   r   rb  setrv   r  rJ  rK  FormattedValueNoder   r   r  	CloneNodeaddrp   rL  r   r   r3  r4  r   c_array_typer   rg  r   r   	enumerater6  r   r   r   r   r   joinr;  r   rg  rQ  rY  )rS   r   Z	num_itemsZuse_stack_memoryZunknown_nodesZmax_char_valuer|   Zlength_partsZcharval_partsZlength_partZvalues_arrayirP   re  rQ   rL  J  s~    










 
 






z&JoinedStrNode.generate_evaluation_codeN)rU   rV   rW   r   r   r   rZ  r   r   r  rL  rP   rP   rP   rQ   ra  5  s   ra  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 )rk  r   format_specTNzString formattingZPyObject_StrZPyObject_ReprZPyObject_ASCIIZ__Pyx_PyNumber_Long)sradc                 C   s   dS r&  rP   rR   rP   rP   rQ   r    s    zFormattedValueNode.may_be_nonec                 C   s   | j || _ | jr| jjrL| jr*| jj n| j jj}| j jj||drL|| _| jrf| j||| _| jd kr| j || _ | js| j	r| j	dkr| j jt
kr| j  s| j S | S )N)rr  rs  )r   r   rr  r  r   Zdefault_format_specZcan_coerce_to_pystringc_format_specr  conversion_charr   r  )rS   rl   rw  rP   rP   rQ   r     s    
z FormattedValueNode.analyse_typesc           	      C   sx  | j d k	rb| jjjsb| jj| j || j }|d|  |||  | jf  | 	| d S | j
 }| jjtko| j  }| jrd}| j
 }nd}|tj}| j}|dkr|rd }|r| |}|d k	std| d||f }|jtdd |d	7 }n2| jr,|jtd
d n|jtdd |d|  |||||  | jf  | 	| d S )Nr  Z__Pyx_PyObject_FormatZ__Pyx_PyObject_FormatSimplers  z(invalid conversion character found: '%s'%s(%s)ZPyObjectFormatAndDecrefrg  Z	AndDecrefZPyObjectFormatZPyObjectFormatSimple%s = %s(%s, %s); %s)rw  r   r   ri   Zconvert_to_pystringr   r   r   rz   rg  r   r   r  rr  r  r   Zempty_unicoderx  find_conversion_funcr   r   r   r   r   )	rS   r   Zconvert_func_callZvalue_resultZvalue_is_unicodeZformat_funcrr  rx  fnrP   rP   rQ   rG    s\      






z'FormattedValueNode.generate_result_code)rU   rV   rW   r   r   r   r   rw  rZ  rc   r{  r  r   rG  rP   rP   rP   rQ   rk    s   rk  c                   @   s.   e Zd ZdZejZdd Zdd Zdd Z	dS )	ParallelThreadsAvailableNodea*  
    Note: this is disabled and not a valid directive at this moment

    Implements cython.parallel.threadsavailable(). If we are called from the
    sequential part of the application, we need to call omp_get_max_threads(),
    and in the parallel part we can just call omp_get_num_threads()
    c                 C   s
   d| _ | S r  r*  r   rP   rP   rQ   r     s    z*ParallelThreadsAvailableNode.analyse_typesc                 C   sR   | d | d| j  | d| j  | d | d| j  | d d S )N#ifdef _OPENMPz2if (omp_in_parallel()) %s = omp_get_max_threads();z else %s = omp_get_num_threads();r&  z%s = 1;r  r   r   r>  rP   rP   rQ   rG    s    

z1ParallelThreadsAvailableNode.generate_result_codec                 C   s   | j S rI   r   rR   rP   rP   rQ   r     s    z#ParallelThreadsAvailableNode.resultN
rU   rV   rW   r  r   
c_int_typer   r   rG  r   rP   rP   rP   rQ   r}     s
   	r}  c                   @   s.   e Zd ZdZejZdd Zdd Zdd Z	dS )	ParallelThreadIdNodez/
    Implements cython.parallel.threadid()
    c                 C   s
   d| _ | S r  r*  r   rP   rP   rQ   r   $  s    z"ParallelThreadIdNode.analyse_typesc                 C   sB   | d | d| j  | d | d| j  | d d S )Nr~  z%s = omp_get_thread_num();r&  rR  r  r  r>  rP   rP   rQ   rG  )  s
    

z)ParallelThreadIdNode.generate_result_codec                 C   s   | j S rI   r  rR   rP   rP   rQ   r   0  s    zParallelThreadIdNode.resultNr  rP   rP   rP   rQ   r    s
   r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )_IndexingBaseNodec                 C   s   | j  p| j jtttfkS rI   )r  r   r   r   r   r   rR   rP   rP   rQ   r   @  s
      z_IndexingBaseNode.is_ephemeralc                 C   s   | j  o| j S rI   )r  r)  r  r   rR   rP   rP   rQ   r)  F  s    z"_IndexingBaseNode.check_const_addrc                 C   s(   | j jr| j jjr$dS n| j jr$dS dS r  )r   r   ru  r  rx  rR   rP   rP   rQ   r   I  s    
z_IndexingBaseNode.is_lvalueN)rU   rV   rW   r   r)  r   rP   rP   rP   rQ   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  r  r  NTFc                 C   s   | j j| jj | _d S rI   )r  rw   r  rR   rP   rP   rQ   r   i  s    z#IndexNode.calculate_constant_resultc              
   C   sT   | j |}| j|}z
|| W S  tk
rN } z| | W 5 d }~X Y nX d S rI   )r  r   r  r  r   )rS   r   r  r  r   rP   rP   rQ   r   l  s    
zIndexNode.compile_time_valuec                 C   s.   | j }| o,| j o,|jo,|jjp,|jjS rI   )r  r  r  r   rx  r  rS   r  rP   rP   rQ   r  t  s    zIndexNode.is_simplec                 C   sH   | j j}|r>|jrdS |tttfkr(dS t| jtr>|j	r>dS t
| S r&  )r  r   rH  r   r   r   rv   r  	SliceNoderf  r   r  rS   ry  rP   rP   rQ   r  y  s    zIndexNode.may_be_nonec                 C   s   d S rI   rP   r   rP   rP   rQ   r     s    z$IndexNode.analyse_target_declarationc              	   C   s  | j  }|d k	r|dkr| j|}|d krHt| j jd| d d S |dkrZt|S |dk}| }|jr|j	r|rt| j jd d}|j
r|rt| j jd d}|j}|jrt| 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sR| jjrddlm} |||jj | jjr| jgn
t| jj}	t||||	S |js| j |}
|
d k	rzt!|
}
W n t"t#fk
r   Y nX t$||
S t| jd d S )N)pointerconstZ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)rz   positional_argskeyword_args)ry  r)   ro  z*Array size must be a compile time constant)%r  r  r  r  r   rz   r   rg  rv  r;  r  rw  r   c_const_or_volatile_typer   python_type_constructor_namer   r   r   ZTemplatedTypeNodeanalyser   rn  rp  r   get_view_utility_coder  shared_utility_qualified_namer   MemoryViewSliceTypeget_axes_specsri   r   rx   r   r   
CArrayType)rS   rl   modifierry  r;  r  Ztemplate_valuesZ	type_noderp  axesr  rP   rP   rQ   r    sx    

  


zIndexNode.analyse_as_typec                 C   sN   g }| }|j rJ|j|}|rB|jrB|jrB|| r:dn|j |j}q|S Nztyping.Optional)r  r  r  r  Zmodifier_namer   Zallows_noner  )rS   rl   r|  Zmodifier_nodeZmodifier_typerP   rP   rQ   analyse_pytyping_modifiers  s    
z$IndexNode.analyse_pytyping_modifiersc                 C   s   | j || j| S rI   )r  r  r  r   rP   rP   rQ   r    s    zIndexNode.type_dependenciesc                 C   sf  | j |}| jjrL|jrtS |jr(tS |tttt	t
fkr>|S |jrH|S tS | j|}|rb|jspt| jtr||tkr~tjS |tks| j tkrtjS |t
t	fkrt|| j | j|d}|d k	r|S n|js|jr|jS |jr>t| jtr>| j r|| jj}|dk r||j7 }d|  kr.|jk r|n n
|j| S n>|jr||jdkrR|jdkrd|jS t|j|jdd  S | jj r|jr|}| jj!D ]6}|js qt"| j#t$| j j#|d|d|}q|S |j%r&G dd d}|| j#|d|| j#|dg}	|&d	|	}
|
d k	r&|
j'j(S t)|rTt)|rT| j|f}t*t+||gS |tkrb|S tS )
Nr   r   r)   rs  r  c                   @   s   e Zd Zdd ZdS )z)IndexNode.infer_type.<locals>.FakeOperandc                 [   s   | j | d S rI   )__dict__update)rS   r  rP   rP   rQ   r  #  s    z2IndexNode.infer_type.<locals>.FakeOperand.__init__Nr]  rP   rP   rP   rQ   FakeOperand"  s   r  )rz   r   []),r  r   r  r   rH  r   rI  r   r   r   r   r   r   r  rv   r  r   c_py_ucs4_typec_uchar_typer   rx  r  ry  r  r   rw   r  r  ndimr  r  r  r   r   r  rz   r   r   lookup_operatorr   r	  r;   rG   rA   )rS   rl   ry  
index_typerF  r  rd  ru  r  operandsZ
index_funcZindex_with_typerP   rP   rQ   r     s       




zIndexNode.infer_typec                 C   s   | j |ddS )NTgetting)analyse_base_and_index_typesr   rP   rP   rQ   r   9  s    zIndexNode.analyse_typesc                 C   sH   | j |dd}|jjr"t| jd || krD| sDt| jd|j  |S )NT)settingzAssignment to const dereference%Assignment to non-lvalue of type '%s')r  r   r;  r   rz   r   r   rP   rP   rQ   r  <  s    zIndexNode.analyse_target_typesc           	      C   s  |r| j || _ | j jjr(tj| _| S | jj}|jd s\|rRt	| jj
| jj n
t	| j |st| jtrt| jjr| j|| _| j jj}|st| j ts|r| j jjs| j jjs| j jjs| j || _ | ||}|d k	r|S |j| _| j j}|jsx| j|| _| jj| _| jjr.| jj| _|jrx|rNt| jddd n| jj dkrb| j S | j || _ | j j}|j!r| "||||S |js|jr| #||S |j$r| %||S |jr| &|S |j'r| (|||S t)| jd|  tj| _| S d S )N
wraparoundz%cannot assign to Unicode string indexr)   rt   )r   r  z'Attempting to index non-array type '%s')*r  r   r   r  r   r0   r  r   rd   r}   r   r   rv   r  r   Zlong_literalr   r  r   r  rH  rx  r  analyse_as_buffer_operationr   r  original_index_typer   ru  r8  r   rz   rw   ri   analyse_as_pyobjectanalyse_as_c_arrayr   analyse_as_cppanalyse_as_c_functionr  analyse_as_c_tupler   )	rS   rl   r  r  analyse_baser   Zis_memslicereplacement_nodery  rP   rP   rQ   r  D  sd    







z&IndexNode.analyse_base_and_index_typesc                 C   s  | j j}| jjjr@|tk	r@t| jddd | j|| _d| _n| jjj	r|tk	r|r|j
d s|tttfkr| jjjr|j
d rt| jtr| j r| jjdkrd| _nd| _| jtj||| _| j| n| j|| _d| _| jjj	r|tkrtj| _n| jjj	r<|tkr<|r2tj| _ntj| _n|r^|tttttfkr^|| _npd }|ttfkr| jjj	rt|| j | j|d}|tttfkr| j d| _ |d ks|j st!| _n|| _| "|| | S )	NzItem lookup of unicode character codes now always converts to a Unicode string. Use an explicit C integer cast to get back the previous integer lookup behaviour.r)   rt   boundscheckr  r   r  &'NoneType' object is not subscriptable)#r  r   r  r8  r   r   rz   r  r   r  rd   r   r   r   signedrv   r  r   rw   r  r   r  r	  r  create_to_py_utility_coder   r  r  r  r   r   r  ri   r   wrap_in_nonecheck_node)rS   rl   r   r  r  ry  rF  rP   rP   rQ   r    sj    




   zIndexNode.analyse_as_pyobjectc                 C   sr   | j j}|j| _| jjr&t| j| _|r2|| _n<| jjjrP| jtj	|| _n| jjj
snt| jd| jj  | S )NzInvalid index type '%s')r  r   ry  r   r   CReferenceTyper  ri   r  r  r  r   rz   )rS   rl   r   ry  rP   rP   rQ   r    s    

zIndexNode.analyse_as_c_arrayc                 C   s   | j j}|d| j | jg}|d krNt| jd|| jjf  tj| _d| _| S |j}|j	r`|j
}|j| _|j| _| jr|sd| _t| r|tdd | j|jd j|| _|j| _|r|jjst| jd| j  | S )	Nr  z/Indexing '%s' not supported for index type '%s'r  TCppExceptionConversionrO  r   z#Can't set non-reference result '%s')r  r   r  r  r   rz   r   r0   r  rx  ry  r   r   r   r   r   r   r   r  r   r	  r   )rS   rl   r  ry  r  	func_typerP   rP   rQ   r    s,    zIndexNode.analyse_as_cppc                 C   s   | j j}|jr| | n| || _d | _|jd krJt| j	d t
| _nh| jd kr\t
| _nVt|jt| jkrt| j	dt|jt| jf  t
| _n|tt|j| j| _| S )Nz)Can only parameterize template functions.z7Wrong number of template arguments: expected %s, got %s)r  r   r  parse_indexed_fused_cdefparse_index_as_typestype_indicesr  Z	templatesr   rz   r0   r   r  dictr  rS   rl   ry  rP   rP   rQ   r    s"    

zIndexNode.analyse_as_c_functionc                 C   s   | j j}t| jtr| j r| jj}|j |  kr@|jk rdn n |dk rV||j7 }|j| | _nt	| j
d||f  tj| _| S | j || _ | j|||ddS d S )Nr   zIndex %s out of bounds for '%s'Fr  r  r  )r  r   rv   r  r  r   rw   r  r  r   rz   r   r0   r  r  )rS   rl   r  r  ry  r  rP   rP   rQ   r    s     
zIndexNode.analyse_as_c_tuplec                    s  t | jtr| jj}n| jg}| j}|j}d}|jrddlm} |j	rh|
|}|dk	rh|j}|j}|}|||j\}	}}
|	rt| j||d}nt| j||d}n|js|jr|jst||jkrd} fdd|D }|jrFtdd	 |D }|rXt|D ]<\}}|jrt|j|j|j|jd
}| }|||< qntdd	 |D }|rt| j||d}t | jtrt|dk	r| |}|S )zI
        Analyse buffer indexing and memoryview indexing/slicing
        Nr)   ro  )indicesr  Tc                    s   g | ]}|  qS rP   r  r[   r  rr   rP   rQ   r   2  s     z9IndexNode.analyse_as_buffer_operation.<locals>.<listcomp>c                 s   s$   | ]}|j jp|jp|j jV  qd S rI   )r   r  r   r;   r  rP   rP   rQ   r_   4  s   z8IndexNode.analyse_as_buffer_operation.<locals>.<genexpr>r   r   r   c                 s   s   | ]}|j jV  qd S rI   r   r  r  rP   rP   rQ   r_   >  s     )rv   r  r  r   r  r   r   rn  rp  r  merged_indicesunellipsifyr  MemoryViewSliceNoderz   MemoryViewIndexNoder  r;   r   allro  r   SliceIntNoder   r   r   r   BufferIndexNoderl  r   )rS   rl   r  r  r  ry  r  rp  r  have_slicesnewaxesr  Zdo_replacementrq  r  rP   rr   rQ   r    sN    



z%IndexNode.analyse_as_buffer_operationc                 C   s*   |j d r| j sd S | jd| _d S )N	nonecheckr  )rd   r  r  r  rS   rl   r  rP   rP   rQ   r  H  s    z IndexNode.wrap_in_nonecheck_nodec                 C   sb   t | jtr| jj}n| jg}g }|D ]6}||| |d d kr&|rVt|jd  d S q&|S )Nr  znot parsable as a type)rv   r  r  r   r   r  r   rz   )rS   rl   requiredr  r  r  rP   rP   rQ   r  M  s    
zIndexNode.parse_index_as_typesc                    sT  t j| _d| _| jj}g }| jjs*| jjr:|| jj	 n&t
| jtr`| jjD ]}||j	 qN| j|dd}|dkr| j|| _| jjjst| j	d n<| jjj | j_| _| jj | j_| _d| j_d| _d| j_d| _dS t|D ]\}}||||< q| }t|t|kr(t| j	dS t|t|k rV|t| }	t| j	d|	 S t|||D ]L\}
 }t fdd	|jD st|
d
  S  dks jrb dS qbtt||}||}|jrt| j	d nr| jj D ]\}| |r|| _| jjr"|j| _d| _| jj!| _!d| jj_|| j_|j| j_ qPqt"ddS )aK  
        Interpret fused_cdef_func[specific_type1, ...]

        Note that if this method is called, we are an indexed cdef function
        with fused argument types, and this IndexNode will be replaced by the
        NameNode with specific entry just after analysis of expressions by
        AnalyseExpressionsTransform.
        TF)r  Nz)Can only index fused functions with typeszToo many types specifiedzHNot enough types specified to specialize the function, %s is still fusedc                    s   g | ]}  |qS rP   )r{  rZ   Zspecific_typerP   rQ   r     s     z6IndexNode.parse_indexed_fused_cdef.<locals>.<listcomp>zType not in fused typez6Index operation makes function only partially specificz!Couldn't find the right signature)#r   r0   r   is_fused_indexr  r  r   r  r   rz   rv   r  r   r  r   r   ri  r   r   r|  ro  Zspecialize_fusedZget_fused_typesr   r  re   typesr  r  r  r  rz  r{  r  r   )rS   rl   ry  Z	positionsr  Zspecific_typesrq  r   Zfused_typesr\   rz   Z
fused_typer  r  rP   r  rQ   r  [  sr    	







z"IndexNode.parse_indexed_fused_cdefzIndexing Python objectc                 C   s  | j jtttfkr^| j jtkr$d}q| j jtkr6d}q| j jtkrHd}qdstd| j j n| j jjrd| j  ddd	 | j	D f S | j jj
r| jj}|d
k r|| j jj7 }d| j  |f S | jjs| jjr| j| j jkrt| jd d S d}|| j  | j f S )Nz__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   s   g | ]}|  qS rP   )r_  )r[   paramrP   rP   rQ   r     s     z3IndexNode.calculate_result_code.<locals>.<listcomp>r   z%s.f%szInvalid use of pointer slicez(%s[%s]))r  r   r   r   r   r   r  r   rp  r  r  r  rw   r  rx  r  r   rz   )rS   
index_coder  rP   rP   rQ   r     s.    

zIndexNode.calculate_result_codec                 C   s   | j jjr| jjtk}t|jjd oH| jj	oHt
| j jtoF| j jdk }t|jjd }| j }d| j | jj	rxdpzd| jj||||f S dS d S )Nr  r   r  z, %s, %d, %s, %d, %d, %d, %dr)   rn  )r  r   r  r  r   r  r   rd   r  r  rv   rw   rx   rC  r_  Zto_py_function)rS   r   Zis_listr  r  Zhas_gilrP   rP   rQ   extra_index_params  s*    

   zIndexNode.extra_index_paramsc                 C   sZ  | j s
d S | jj}d }d }| jjrd}| jjjr^|tkr>d}n|tkrLd}nd}t	dd}nd|t
krxd}t	dd}nJ|tkr| jjtkrd	}t	dd}n$d
}|jt	dd t	dd}n| jjr|tkr| jjjstd}d}t	dd}nj|tkr6| jjjst| jjs td}d}t	dd}n,|jrF| jsbdsbtd| j|| jf |d k	rx|j| | jjjr| j }n
| j }|jr| jrt|| jd|  | j | j f | jjr|  nd | j| j nR|dkrdnd| }|d|  || j || ||||   | jf  | jjrV| | d S )Nr  Z__Pyx_GetItemInt_ListZ__Pyx_GetItemInt_TupleZ__Pyx_GetItemIntZ
GetItemIntr  Z__Pyx_PyDict_GetItemZDictGetItemZ__Pyx_PyObject_Dict_GetItemZ__Pyx_PyObject_GetItemZObjectGetItemZ__Pyx_GetItemInt_Unicodez(Py_UCS4)-1ZGetItemIntUnicoderg  Z__Pyx_GetItemInt_ByteArrayz-1ZGetItemIntByteArrayFz5unexpected type %s and base type %s for indexing (%s)z%s = %s[%s];!%sz	%%s == %s%s = %s(%s, %s%s); %s)r   r  r   ri   r  r  r   r   r   r   r   r   r   r   r   r   r8  r   r   r   r   rz   r   r   r   r   rC  r   r  r   rg  )rS   r   ry  r  Zerror_valuer  r  Zerror_checkrP   rP   rQ   rG    s    



  

 
zIndexNode.generate_result_codec                 C   s   | j jjrT| jjtkr0|jtdd d}n|jtdd d}| j 	 }n | j 
 }| jjtkrpd}nd}||d	|| j
 ||| |f | j d S )
NZSetItemIntByteArrayrg  Z__Pyx_SetItemInt_ByteArrayZ
SetItemIntr  Z__Pyx_SetItemIntr  ZPyObject_SetItemz%s(%s, %s, %s%s))r  r   r  r  r   r   r   r   r   r   r   r   r   r  r  rz   )rS   
value_coder   r  r  rP   rP   rQ   generate_setitem_code0  s2    



	zIndexNode.generate_setitem_codec              	   C   s  |  | | jjr$| | | n| jjtkrJ| ||}| || n| jjjr| j	r| j	dkr|r|r| j
|krt|| j| j|  | | j
|| j qt|| jd|  | f | jjr|  nd | j
| j n|d|  | f  | | | | || || d S )Nr   r  )rE  r   ri   r  r   r  r   _check_byte_valuer   r   r   r   rz   r   rC  r   r   rJ  rK  rQ  rY  )rS   r   r   rT  r   r   r  rP   rP   rQ   rU  Q  s8    
    


z"IndexNode.generate_assignment_codec                 C   s  |j jstt|j | }| r`d|j  kr<dk rDn n|S d}t|jd|j dd n|j t	j
k}| jsg }|js|j jr|d|  |js| r|j t	j
t	jt	jfks|d|  |r|d	d
|  |d|| j  |d |r
d| }|S )Nr      Tz9value outside of range(0, 256) when assigning to byte: %sr)   rt   z%s < 0z%s > 255if (unlikely(%s)) {z || zFPyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)"); %sr   z((unsigned char)%s))r   r  r   r  r   r   rw   r   rz   r   r  r   r   r  r   r+  r   c_schar_typer   rp  r   )rS   r   r   r  Z
needs_castZ
conditionsrP   rP   rQ   r  r  sL     

zIndexNode._check_byte_valuec                 C   s   |  | | jjjr8d}| j }|jtdd n | j	 }| j
jtkrTd}nd}||d|| j
	 || |f | j | | | | d S )NZ__Pyx_DelItemIntZ
DelItemIntr  ZPyDict_DelItemZPyObject_DelItemz%s(%s, %s%s))rE  r  r   r  r   r   r   r   r   r   r  r   r   r  r  rz   rJ  rK  )rS   r   rW  r  r  rP   rP   rQ   rX    s,    





z IndexNode.generate_deletion_code)FFT)T)FNN)F)$rU   rV   rW   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  rZ  r   r  rG  r  rU  r  rX  rP   rP   rP   rQ   r  Y  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
    r  r  TFrP   c                 C   s   | j |dd d S NFr  r  r   rP   rP   rQ   r    s    z$BufferIndexNode.analyse_target_typesc                 C   s   | j js*t| j js*t| jd t| _| S |sd| j jjjsHt| jd nd| _	| j jj
rdd| j jj_	d| _| || | | | S )zz
        Analyse types for buffer indexing only. Overridden by memoryview
        indexing and slicing subclasses
        zCan only index buffer variableszWriting to readonly bufferTr  )r  r   r;   r   r   rz   r0   r   writabler  r  Z
buffer_auxnone_error_messageanalyse_buffer_indexr  r  rP   rP   rQ   r     s    

zBufferIndexNode.analyse_typesc                 C   st   t | jjr2dd | jD }tt| jj|| _n| j|| _| jjj| _| jj| _|rp| jj	sj| jj rpd| _
d S )Nc                 S   s   g | ]}||j fqS rP   rs  )r[   idxrP   rP   rQ   r     s     z8BufferIndexNode.analyse_buffer_index.<locals>.<listcomp>T)r;   r  r   r  rG   rA   r	  r  buffer_typeri   r   )rS   rl   r  Zindex_with_type_listrP   rP   rQ   r    s    
z$BufferIndexNode.analyse_buffer_indexc                 C   s   dS )zk
        Called by IndexNode when this node is assigned to,
        with the rhs of the assignment
        NrP   rS   r   rP   rP   rQ   analyse_assignment  s    z"BufferIndexNode.analyse_assignmentc                 C   s,   |j d r| j sd S | j| j| _d S )Nr  )rd   r  r  r  r  r   rP   rP   rQ   r    s    z&BufferIndexNode.wrap_in_nonecheck_nodec                 C   s*   | j s| jr&| jjr&t| jd t| _d S )Nz2Cannot access buffer with object dtype without gil)r  r  r   ri   r   rz   r0   r   rP   rP   rQ   r$    s    zBufferIndexNode.nogil_checkc                 C   s
   d| j  S Nr  )buffer_ptr_coderR   rP   rP   rQ   r     s    z%BufferIndexNode.calculate_result_codec                 C   s    | j }| j jr|j}|j|S rI   )r  is_nonecheckr  r   Z	get_entryr  rP   rP   rQ   buffer_entry  s    zBufferIndexNode.buffer_entryc                 C   sD   |j jt|j|jjrtjntjdd}|d||	 f  |S )NFr.  r  )
r3  r4  r   r  r   r  Zc_ssize_t_typec_size_t_typer   r   )rS   r   ivarretrP   rP   rQ   get_index_in_temp  s    z!BufferIndexNode.get_index_in_tempc                    s   j r.jsjr. jjd r.tjd j  fddjD  _}ddl	m
}  }|jjrp|jj}n
|jd }||j|dd jD | jjj |j d	fS )
z8
        ndarray[1, 2, 3] and memslice[1, 2, 3]
        r  z(Use boundscheck(False) for faster accessc                    s   g | ]}  |qS rP   )r  r[   r  r   rS   rP   rQ   r     s     z6BufferIndexNode.buffer_lookup_code.<locals>.<listcomp>r)   r  negative_indicesc                 S   s   g | ]}|j jqS rP   )r   r  r  rP   rP   rQ   r   #  s     )r   Zindex_signedsZindex_cnamesrd   rz   r   r  rC  )rC  r  r  r   rd   r+   rz   r  index_tempsrn  r  r  r   r  r  Zbuffer_defaultsZput_buffer_lookup_code)rS   r   r  r  r  r  rP   r  rQ   buffer_lookup_code  s(    

 z"BufferIndexNode.buffer_lookup_codec                 C   sB   |  | | || | | | | || || d S rI   )rE  generate_buffer_setitem_coderJ  rK  rQ  rY  rS   r   r   rT  rP   rP   rQ   rU  *  s    



z(BufferIndexNode.generate_assignment_codern  c           
      C   sL  | j j}t|rt|jr|jjtt| j jdd}|d|  |d||| j 	 f  |d|t
| j||	 f  |j| d S | |\}}| jjjr0|jj|jdd}| }	|d||f  |d| | jj |d|	|f  |d	|||	f  |d| | jj |j| n|d	||| f  d S )
NFr.  __Pyx_call_destructor(%s);r  z%s%s %s= %s;r  z*%sz%__Pyx_INCREF(%s); __Pyx_XDECREF(*%s);z*%s %s= %s;)r  r   r;   r9   r3  r4  rG   rC   r   r   r@   r  r;  r  r  r  ri   Zbuf_ptr_typer   rh  rk  )
rS   r   r   opry  r  r  Zptrexprptrr   rP   rP   rQ   r  2  s:    	
 z,BufferIndexNode.generate_buffer_setitem_codec                 C   s   t | jjrH|  }|d|  |d||| j t| jf  d S | |\}| _	| jj
r|  }|d|| j	f  |d||f  |d|  d S )Nr  new (&%s) decltype(%s){%s%s};z%s = (PyObject *) *%s;z'if (unlikely(%s == NULL)) %s = Py_None;z__Pyx_INCREF((PyObject*)%s);)r;   r  r   r   r   r   r@   r  r  r  ri   )rS   r   resr  rP   rP   rQ   rG  \  s     z$BufferIndexNode.generate_result_codec                    s.   | j D ]}|j| qd| _ t | d S ra  )r  r3  r;  rK   rK  )rS   r   temprN   rP   rQ   rK  q  s    
z"BufferIndexNode.free_subexpr_temps)T)F)rn  )rU   rV   rW   r  r   r  r  r  r  r   r  r  r  r$  r   r  r  r  rU  r  rG  rK  rX   rP   rP   rN   rQ   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   sP  ddl m} t|| _| j}||| jjj\}}}|sZd| _	| jj
sN| jjrZd| jjj_	| opt|| jjjk| _g }tj}g }	t|t| | jjjkrt| _t|| jjj jd| jj  | S d}
t|D ]:\}}||}|jrd| _|	| |d q| jjj|
 \}}|
d7 }
|jrd| _|jjrJ|||f n||df dD ]:}t||}|js\|||}t||| |	| q\q|jjs|jj r|jj rt!|jd	| d| _"|||}|||< |	| qt| _t|jd
|j  |   S q| j"o| j | _"|	| _|| _#|j$| _$| %|||}|&| |S )Nr)   ro  Tz&Too many indices specified for type %sr   )directstridedr  r  z/Index should be typed for more efficient accessz/Invalid index for memoryview specified, type %s)'rn  rp  r?   Zis_pythran_moder  r  r  r   r  r  r   r  r   r   Zmemslice_indexr   r  r0   r   rz   ro  r   r  r  r   r  r   r   r   r  setattrr  ri   r+   r  original_indicesr   analyse_operationr  )rS   rl   r  rp  r  r  r  r  r  new_indicesZaxis_idxrq  r  accesspackingattrr   r|   rP   rP   rQ   r   }  sp    









z!MemoryViewIndexNode.analyse_typesc                 C   s   d| _ | || | S )Nz"Cannot index None memoryview slice)r  r  )rS   rl   r  r  rP   rP   rQ   r    s    z%MemoryViewIndexNode.analyse_operationc                 C   s(   | j jr$| }|js|jr$d|_d|_dS )z
        Support broadcasting for slice assignment.
        E.g.
            m_2d[...] = m_1d  # or,
            m_1d[...] = m_2d  # if the leading dimension has extent 1
        TN)r   r   r  rS   r   lhsrP   rP   rQ   analyse_broadcast_operation  s
    z/MemoryViewIndexNode.analyse_broadcast_operationc                 C   s   |  |}|r|j|_|S | S rI   )r  r  r  rP   rP   rQ   $analyse_as_memview_scalar_assignment  s
    
z8MemoryViewIndexNode.analyse_as_memview_scalar_assignmentN)T)	rU   rV   rW   r  r  r   r  r  r	  rP   rP   rP   rQ   r  x  s   
Or  c                   @   sb   e Zd ZdZdZdZdZdZdd Zdd Z	dd Z
d	d
 Zdd Zdd Zdd ZdddZdS )r  TFc                 C   s*   t dd | jD | _| jr&| jj| _dS )z@Slicing operations needing no evaluation, i.e. m[...] or m[:, :]c                 s   s,   | ]$}|j o"|jjo"|jjo"|jjV  qd S rI   )r   r   r  r   r   r  rP   rP   rQ   r_     s   z<MemoryViewSliceNode.analyse_ellipsis_noop.<locals>.<genexpr>N)r  r  is_ellipsis_noopr  r   r  rP   rP   rQ   analyse_ellipsis_noop  s
    
z)MemoryViewSliceNode.analyse_ellipsis_noopc                 C   s   ddl m} |sd| _d| _nd| _| || | jr:| S d | _d| _d| _|	| j
|sdt| _| S t| jjj|| _| j s| j s| j|| _| S )Nr)   ro  Tz&Cannot assign to None memoryview slicez"Cannot slice None memoryview slice)rn  rp  r  r  r  r
  r  r   r5  Zvalidate_axesrz   r0   r   r   r  r  r  r  r+  r  )rS   rl   r  r  rp  rP   rP   rQ   r    s$    z%MemoryViewSliceNode.analyse_operationc                 C   s<   |j js,| j j|j s |j jr,t| j| S t| j| S d S rI   )r   r   r  r  ri   MemoryCopyScalarrz   MemoryCopySlicer  rP   rP   rQ   r    s    z&MemoryViewSliceNode.analyse_assignmentc                 C   s   |sdS | j dd }|dd }t| j D ]`\}}|jr~|jjrv|jjrv|jjrv|d ||< |d |s||  S q dS q,|jj	s, dS q,|rt
|t
| | jjjkrdS ||7 }|S )a  Return a new list of indices/slices with 'indices' merged into the current ones
        according to slicing rules.
        Is used to implement "view[i][j]" => "view[i, j]".
        Return None if the indices cannot (easily) be merged at compile time.
        Nr   )r   ro  r   r   r  r   r   r   r   r  r   r  r  )rS   r  r  rq  rs  rP   rP   rQ   r    s&    

z"MemoryViewSliceNode.merged_indicesc                 C   s"   | j r| j p| j S |  S rI   )r
  r  r  r+  rR   rP   rP   rQ   r  =  s    zMemoryViewSliceNode.is_simplec                 C   s
   | j  S )z3This is called in case this is a no-op slicing node)r  r   rR   rP   rP   rQ   r   D  s    z)MemoryViewSliceNode.calculate_result_codec              	   C   s   | j r
d S |  }| j }d}t| j}| jD ]N}|jrtd}|jjsNt	||_|j
js`t	||_
|jjs|t	||_q.t	| q.t|rt|j|| j|  | j|||jjd d S )NFT)rA  r  rd   )r
  r  rC  iterr  r   r   r   r  nextr   r   r   r   Zgenerate_buffer_slice_coder   r   r   rd   )rS   r   r  rA  r  r  r  rP   rP   rQ   rG  H  s4    




    z(MemoryViewSliceNode.generate_result_codec                 C   sp   | j r| | n
| | | jr0| || n| || | j rN| | n
| | || || d S rI   )	r
  rE  rL  is_memview_scalar_assignmentZ+generate_memoryviewslice_assign_scalar_codeZ&generate_memoryviewslice_setslice_coderJ  rQ  rY  r  rP   rP   rQ   rU  d  s    


z,MemoryViewSliceNode.generate_assignment_codeN)F)rU   rV   rW   r  r
  r  r  r  r  r  r  r  r  r   rG  rU  rP   rP   rP   rQ   r    s   
	r  c                       s0   e Zd ZdZdgZ fddZdddZ  ZS )	MemoryCopyNodeze
    Wraps a memoryview slice for slice assignment.

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

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

        memslice1[...] = 0.0
        memslice1[:] = 0.0
    c                    s   t  || |jj| _d S rI   )rK   r  r   r  r  rN   rP   rQ   r    s    zMemoryCopyScalar.__init__c                 C   sJ  ddl m} | jj| jj | jjj}|d}| jjd}|  |	d||
 f  | j sr| j r~| j
 }n|	d|| j
 f  d}d}| jj}	|	D ]*}
t|
tr|
jjr|
jjr|
jjsd}q|j| jj|| jjj||d	}| }|jr|	d
|  |	d||f  |jr6|	d |  |  d S )Nr)   ro  rn  z%s __pyx_temp_scalar = %s;z%s __pyx_temp_slice = %s;Z__pyx_temp_sliceFT)force_stridedzPy_DECREF(*(PyObject **) %s);z!*((%s *) %s) = __pyx_temp_scalar;zPy_INCREF(__pyx_temp_scalar);)rn  rp  r  r   r  rz   r  r   Zbegin_blockr   r   r+  r  r   rv   r  r   r  r   r   Z
slice_iterr  Zstart_loopsri   Z	end_loopsZ	end_block)rS   Zscalarr   rp  r  Z	type_declZ
slice_declZdst_tempr  r  r  Zslice_iter_objprP   rP   rQ   r    sB    

 
z*MemoryCopyScalar._generate_assignment_code)rU   rV   rW   r  r  r  rX   rP   rP   rN   rQ   r    s   r  c                       s   e Zd ZddddgZdZdZdd Zd6d
dZdd Zdd Z	dd Z
dd Zdd Zd7ddZdd Z fddZdZejddd d!id"Zejddd d#id"Z fd$d%Zd&d' Zd8d(d)Zd9d*d+Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Z  ZS ):SliceIndexNoder  r   r   sliceFNc                 C   sZ   | j |}|js|jrtS |jr&tS |ttttt	fkr<|S |j
sH|jrVt|jd S tS rI   )r  r   rH  r   r   rI  r   r   r   r   rx  r  r   rn  ry  r   r  rP   rP   rQ   r     s     zSliceIndexNode.infer_typer   c                 C   s6   |t k	r*| jr*| j r&|| jj7 }nt }| j|S rI   )r   r   r   rw   r  r  r  rP   rP   rQ   r    s
    
z"SliceIndexNode.inferable_item_nodec                 C   s6   | j j}|r,|jrdS |tttttfkr,dS t	| S r&  )
r  r   rH  r   r   r   r   r   r   r  r  rP   rP   rQ   r    s     zSliceIndexNode.may_be_nonec                 C   sF   | j d krd }n| j j}| jd kr(d }n| jj}| jj|| | _d S rI   )r   rw   r   r  )rS   r   r   rP   rP   rQ   r     s    

z(SliceIndexNode.calculate_constant_resultc              
   C   s   | j |}| jd krd}n| j|}| jd kr8d }n| j|}z||| W S  tk
r~ } z| | W 5 d }~X Y nX d S r   )r  r   r   r   r  r   )rS   r   r  r   r   r   rP   rP   rQ   r     s    

z!SliceIndexNode.compile_time_valuec                 C   s   d S rI   rP   r   rP   rP   rQ   r   (  s    z)SliceIndexNode.analyse_target_declarationc                 C   s    | j |dd}|jjrt|_|S r  )r   r   ri   r   r   rP   rP   rQ   r  +  s    z#SliceIndexNode.analyse_target_typesTc                    sh  | j || _ | j jjs,| j jjs,| j jjrzt| j}t| j| j	pD|| j
pL||d}t| j|| j d}|j||| ddS | j	r| j	|| _	| j
r| j
|| _
|jd st| j	| j
 | j j}|jr|s| j	s| j
s|| _nt|j| _nf|js|jr
t|| _nL|jrt| _n<|jr*|| _n,|jrBt|j| _n| j || _ t| _|jrr|| _| j d| _ | jtkr| j	r| j	jr^| j
r| j
jr^t| j}t| jt| j	p|t| j
p||d|| _ nztj!  fdd}| j	r*| j	jj"r|| j	d	|| _	| j	# || _	| j
r^| j
jj"rN|| j
d
|| _
| j
# || _
d| _$| S )Nr  )r  r  Fr  r  r  c              
      sz   ddl m}m} || }t| jt| j || r8t|ntd|	 |t
| j|dt| jd|d|}|||S )Nr)   EvalWithTempExprNodeResultRefNoder@  is)operand1r	   operand2)true_val	false_valtest)	UtilNodesr  r  CondExprNoderz   r  r  rx   r   r  PrimaryCmpNoder  r   analyse_result_type)r|   default_valuerl   r  r  Znode_refZnew_exprc_intrP   rQ   
allow_nonep  s.    
z0SliceIndexNode.analyse_types.<locals>.allow_noner  rD  r)   )%r  r   r   r  r;   r   r  rz   r  r   r   r  r  rd   r}   r  r   rg  ry  rH  rB  rs   rI  r   rx  r  r   rf  r  r   r#   deepcopyr  r  ri   r  r   )rS   rl   r  	none_noder  r   ry  r+  rP   r)  rQ   r   2  s    
  


zSliceIndexNode.analyse_typesc                 C   sr   | j |}|rn| jsn| jsnddlm} |||jj	 t
| j}t| j|||d}t||||gS d S )Nr)   ro  r  )r  r  r   r   rn  rp  r   r  r  r  r  rz   r  r   r  r  )rS   rl   ry  rp  r-  Z
slice_noderP   rP   rQ   r    s*    
 zSliceIndexNode.analyse_as_typec                    s   |j | _ t |S rI   )r   rK   r$  r   rN   rP   rQ   r$    s    zSliceIndexNode.nogil_checkzSlicing Python objectZSliceObjectr  r  ZGet)r  Setc                    s   | j jjs| j jjrR|tttfkrR|tkrL|jd sLt| j	d| j j|f  || _|j
r|| j jj
r|| js|| js|| j ||S t ||S )NrY   :default encoding required for conversion from '%s' to '%s')r  r   rH  rB  r   r   r   rd   r   rz   r  r   r   r  rK   r  rN   rP   rQ   r    s    
zSliceIndexNode.coerce_toc                 C   s  | j jst| jd| j   d S | jj }|  }|  }|  }|jr| j	t
j}| j tkrbd}n| j tkrrd}n| j j }| jd krd| d| d| d}n$d| d| d| d	| d
| d}n|jr6| j	t
j}|jtdd | jd krd| d| d}nd| d| d	| d
| d	}nD|tkrz| j }|jtdd d| d	| d	| d}n | j tkr| j }|  \}	}
}}}}}t|jjd }|j| j d| d	| d	| d	| d	| d	| d	|	dd	|
dd	|dd}nr| j }|tkr6|jtdd d}n(|tkrZ|jtdd d}nd}| d| d	| d	| d}| | d| d|!|| j  | "| d S )Nz,Slicing is not currently supported for '%s'.Z	ByteArrayZUnicoder  z_FromString(rh  r  z_FromStringAndSize(r"  z - Zpyunicode_from_unicoderg  z__Pyx_PyUnicode_FromUnicode(z%__Pyx_PyUnicode_FromUnicodeAndLength(ZPyUnicode_Substringz__Pyx_PyUnicode_Substring(r  z__Pyx_PyObject_GetSlice(rv  ZSliceTupleAndListr  Z__Pyx_PyList_GetSliceZ__Pyx_PyTuple_GetSliceZPySequence_GetSlicer-  r,  z; )#r   ri   r   rz   r  r   
start_code	stop_coderH  r   r   rg   r   r   rj   titler   rI  c_const_py_unicode_ptr_typer   r   r   r   r   r   get_slice_configr  rd   get_slice_utility_coder   r   r   r   r   rg  )rS   r   ry  r   r0  r1  Zbase_result	type_namecallhas_c_start
has_c_stopc_startc_stoppy_startpy_stoppy_slicer  cfuncrP   rP   rQ   rG    sl    


(
"



D




$z#SliceIndexNode.generate_result_codec                 C   s  |  | | jjrt|j| j |  \}}}}	}
}}|| jd| j	
 |
 ||	|
||||t|jjd f
  n|| jr|  nd}|jjr|jj}| || nd|  |f }|jtdd |d| j	 || | j	 |f  | | | | || || d S )Nz?__Pyx_PyObject_SetSlice(%s, %s, %s, %s, %s, %s, %s, %d, %d, %d)r  r  z%s - %sIncludeStringHrg  z,memcpy(&(%s[%s]), %s, sizeof(%s[0]) * (%s));)rE  r   ri   r   r   set_slice_utility_coder4  rO  rz   r  r   r  rd   r   r0  r  r  generate_slice_guard_coder1  r   r   r   r   rJ  rK  rQ  rY  )rS   r   r   rT  r   r   r8  r9  r:  r;  r<  r=  r>  Zstart_offsetarray_lengthrP   rP   rQ   rU  
  sF    
    	  


z'SliceIndexNode.generate_assignment_codec           
      C   s   | j jjs t| jd| j  d S | | |j| j | 	 \}}}}}}}	|
| jd| j  |||||	||t|jjd f	  | | | | d S )Nz=Deleting slices is only supported for Python types, not '%s'.z;__Pyx_PyObject_DelSlice(%s, %s, %s, %s, %s, %s, %d, %d, %d)r  )r  r   ri   r   rz   rE  r   r   rA  r4  rO  r   r  rd   rJ  rK  )
rS   r   rW  r8  r9  r:  r;  r<  r=  r>  rP   rP   rQ   rX  ,  s6    


      
z%SliceIndexNode.generate_deletion_codec                 C   s   d\}}}| j r:| j jj }|r,| j  }nd| j   }d\}}}| jrt| jjj }|rf| j }nd| j  }| jrd| j  pd}|||||||fS )N)Fr  r  &%sr  )r   r   ri   r   r   r   r  )rS   r8  r:  r<  r9  r;  r=  r>  rP   rP   rQ   r4  ?  s$    

  zSliceIndexNode.get_slice_configc           
      C   st  | j jjsd S | j jj}zt| }}W n tk
r@   d }Y nX d  }}| jr| j }z<t|}|dk r|d krd||f }q||7 }n|}d }W n tk
r   Y nX | jr4| j }z^t|}|dk r|d krd| j jj|f }n||7 }t	|tr
||8 }nd||f }d }W n tk
r2   Y nX d }d}zt|}	W n tk
rb   d }	Y nX t	|t}|r|dk r|	dkr
t
| jd nt|r|d kr|d kr|	|kr
t
| jd||f  n:|d k	r|d kr|}d||f }n|d k	r|}n|}|rp|d||f  | jr2|  |d	||f  | jrT|  ||| j |d
 d S )Nr   z%s + %dz	%s - (%s)FzAssignment to empty slice.z8Assignment to slice of wrong length, expected %s, got %sz	(%s)-(%s)zif (unlikely((%s) != (%s))) {zPyErr_Format(PyExc_ValueError, "Assignment to slice of wrong length, expected %%" CYTHON_FORMAT_SSIZE_T "d, got %%" CYTHON_FORMAT_SSIZE_T "d", (Py_ssize_t)(%s), (Py_ssize_t)(%s));r   )r  r   r  r  rx   r   r   r   r   rv   r   rz   r   r   r   r   r   )
rS   r   Ztarget_sizeZ
slice_sizetotal_lengthr   r   Zruntime_checkZcompile_time_checkZint_target_sizerP   rP   rQ   rB  R  s    










 



 z(SliceIndexNode.generate_slice_guard_codec                 C   s   | j r| j  S dS d S )Nr  )r   r   rR   rP   rP   rQ   r0    s    
zSliceIndexNode.start_codec                 C   s,   | j r| j  S | jjjr$| jjjS dS d S )NrD  )r   r   r  r   r  r  rR   rP   rP   rQ   r1    s
    


zSliceIndexNode.stop_codec                 C   s   dS )Nz<unused>rP   rR   rP   rP   rQ   r     s    z$SliceIndexNode.calculate_result_code)r   )T)FNN)F)rU   rV   rW   r   r   r  r   r  r  r   r   r   r  r   r  r$  rZ  r   loadr5  rA  r  rG  rU  rX  r4  rB  r0  r1  r   rX   rP   rP   rN   rQ   r    sH   	
	

`    G    
"
Rr  c                   @   sV   e Zd ZdddgZdZeZdZdd Zdd	 Z	d
d Z
dd ZdZdd Zdd ZdS )r  r   r   r   Tr)   c                 C   s   t | jj| jj| jj| _d S rI   r  r   rw   r   r   rR   rP   rP   rQ   r     s
    z#SliceNode.calculate_constant_resultc              
   C   sd   | j |}| j|}| j|}zt|||W S  tk
r^ } z| | W 5 d }~X Y nX d S rI   r   r   r   r   r  r  r   rS   r   r   r   r   r   rP   rP   rQ   r     s    zSliceNode.compile_time_valuec                 C   s   dS r&  rP   rR   rP   rP   rQ   r    s    zSliceNode.may_be_nonec                 C   sp   | j |}| j|}| j|}||| _ ||| _||| _| j jrl| jjrl| jjrld| _d| _| S r  )r   r   r   r   r  r   r   )rS   rl   r   r   r   rP   rP   rQ   r     s    zSliceNode.analyse_typesz Constructing Python slice objectc                 C   s   | j S rI   r  rR   rP   rP   rQ   r     s    zSliceNode.calculate_result_codec                 C   s   | j rHt| j| f}|jd|d| _|| j}|d kr<d S || j |d| 	 | j
 | j | j || 	 | jf  | | | j r| | d S )Nr  	dedup_keyz %s = PySlice_New(%s, %s, %s); %s)r   r   r   rM  r  rN  rF  rz   r   r   r   r   r   r   r   rg  rj  )rS   r   rK  rP   rP   rQ   rG    s&    
zSliceNode.generate_result_codeN)rU   rV   rW   r   r   r   r   r   r   r   r  r   rZ  r   rG  rP   rP   rP   rQ   r    s   
	r  c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )r  r   c                 C   s   t | jj| jj| jj| _d S rI   rG  rR   rP   rP   rQ   r     s
    z&SliceIntNode.calculate_constant_resultc              
   C   sd   | j |}| j|}| j|}zt|||W S  tk
r^ } z| | W 5 d }~X Y nX d S rI   rH  rI  rP   rP   rQ   r     s    zSliceIntNode.compile_time_valuec                 C   s   dS r&  rP   rR   rP   rP   rQ   r    s    zSliceIntNode.may_be_nonec                 C   s   | j || _ | j|| _| j|| _| j js@| j || _ | jjsV| j|| _| jjsl| j|| _| j jr| jjr| jjrd| _d| _| S r  )r   r   r   r   r  r  r   r   r   rP   rP   rQ   r     s    zSliceIntNode.analyse_typesc                 C   s   d S rI   rP   rR   rP   rP   rQ   r   (  s    z"SliceIntNode.calculate_result_codec                 C   s.   | j | j| jfD ]}t|tr|j  qd S rI   )r   r   r   rv   rl  r  r   )rS   r   ru  rP   rP   rQ   rG  +  s    
z!SliceIntNode.generate_result_codeN)
rU   rV   rW   r   r   r   r  r   r   rG  rP   rP   rP   rQ   r    s   		r  c                   @   s^   e Zd ZdZdd Zdd Zdd Zdd	 Zdd
dZdd Z	dd Z
dd Zdd ZdZdS )CallNodeNc           
         s  | j }| }t|tr&t|jS |tkr~|jr`|j	 }|j
r`t||j}|tk	r`|S t|dd }|d k	r~|jp||}|jr|j}|jrt| j dd rt| dr fdd| jD }| j j |}|r|j}|jr|j}|jS |jS |tkrf|jrf|jrf|jjrf|jj}|jr&|S |j
rf|jj}	|	dkrFtjS |	dkrVtjS |	tjkrf|S | j  }|r|j s|j!r|S tS )Nr   r   c                    s   g | ]}|  qS rP   r   r[   r  rr   rP   rQ   r   L  s     z'CallNode.infer_type.<locals>.<listcomp>ry   r  )"r  r   rv   r[  r   rg  r]  r   r  r  rf  r   "find_return_type_of_builtin_methodr  r   r   rx  ry  r  r  r   r   best_function_matchr	  r   r   re  rj   r  r  #types_that_construct_their_instancer  is_struct_or_unionr   )
rS   rl   r  r  method_obj_typeresult_typer   	arg_types
func_entry	func_namerP   rr   rQ   r   6  sV    





zCallNode.infer_typec                 C   s   | j |S rI   )r  r  r   rP   rP   rQ   r  f  s    zCallNode.type_dependenciesc                 C   s   dS r&  rP   rR   rP   rP   rQ   r  k  s    zCallNode.is_simplec                 C   s^   | j d k	r| j S | jj}|tkrT| jjrT| jj}|jjr<dS |jjrT|jt	j
krTdS t| S r&  )may_return_noner  r   r   r   r   re  rf  rj   r   rQ  r   r  )rS   r  r   rP   rP   rQ   r  r  s    

zCallNode.may_be_nonec                 C   s   |d kr|j }|tjkrv|jrv|jrv|jjrv|jjtjkrv|jjdkrXtj	| _ tj	| _
ntj|jj | _ t| _
d| _n|jr|jr|jj | _ t| _
d| _n\|jr|jj jr|jj }t||j}|tk| _|jr|| _ q|jr|j| _ qt| _ nt| _ d S )Nry   F)r   r   r   r   r   rj  rj   rQ  r   r  r   Zbuiltin_typesr   rX  r  r  r  rf  rO  r  ri   r  )rS   r  r  rS  rT  rP   rP   rQ   set_py_result_type  s>    




zCallNode.set_py_result_typec           
   	      s(  | j  }|r|jr|  \}}g }t||jjD ]*\}}|t|j	t
|j	|jd|d q4|rn||j7 }t| j	|d}| | }|S |r$|jr$ fdd| jD | _|jd}	|	st| j j	d| j j  t| _| S t| j j	|	j| _ |	| j _| j |  |   || _| S dS )	z4
        Returns a replacement node or None
        r  keyr   key_value_pairsc                    s   g | ]}|  qS rP   r  rN  rr   rP   rQ   r     s     z8CallNode.analyse_as_type_constructor.<locals>.<listcomp>z<init>z'no constructor found for C++  type '%s'N)r  r  rR  explicit_args_kwdsr  r  r  r   DictItemNoderz   r  rj   r]  DictNoder   r  r   r   r  r   r0   r   r^  r   r`  r_  analyse_c_function_call)
rS   rl   r   r   r  r  r  memberr|   r^  rP   rr   rQ   analyse_as_type_constructor  s0    
$

z$CallNode.analyse_as_type_constructorc                 C   s   | j j}|jr|j}|S rI   )r  r   rx  ry  rS   r  rP   rP   rQ   function_type  s    zCallNode.function_typec                 C   s   | j jS rI   )r   r   rR   rP   rP   rQ   r     s    zCallNode.is_lvaluec                 C   s6   |   }|jr|   n|js2t|dds2|   d S )Nr   F)re  ri   r#  r  r   )rS   rl   r  rP   rP   rQ   r$    s
    
zCallNode.nogil_checkzCalling gil-requiring function)N)rU   rV   rW   rX  r   r  r  r  rY  rc  re  r   r$  rZ  rP   rP   rP   rQ   rL  1  s   0
$
rL  c                       s   e Zd ZdddddgZdZdZdZdZdZdZ	dZ
dZdd	 Z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  rS   coerced_selfr  r   r  NFc              
      s\   | j  } fdd| jD }z
|| W S  tk
rV } z| | W 5 d }~X Y nX d S )Nc                    s   g | ]}|  qS rP   r   rN  r   rP   rQ   r     s     z5SimpleCallNode.compile_time_value.<locals>.<listcomp>)r  r   r   r  r   )rS   r   r  r   r   rP   rh  rQ   r     s    
z!SimpleCallNode.compile_time_valuec                 C   s~   | j jrz| j jjrz| j j}t|s.t|rz|j}| j jj	}|rH|j
n
t	|jj}t||rzdd | jD }|| | _d S )Nc                 S   s   g | ]
}|j qS rP   rw   rN  rP   rP   rQ   r     s     z<SimpleCallNode.calculate_constant_result.<locals>.<listcomp>)r  r  r  r   rw   r"   	isbuiltinismethodrU   r   rj   __self__r   is_safe_compile_time_methodr   )rS   methodr   object_typeobject_type_namer   rP   rP   rQ   r     s    
z(SimpleCallNode.calculate_constant_resultc                 C   sP   |j }||j}|s(td||jf t||j||jd}| |||gd}|S )Nz Getter not found in scope %s: %s)rj   r   r   r  )r  rs  rj   r   r  r~  r   )rM   rz   r  r   Zproperty_scopeZgetter_entryr  r|   rP   rP   rQ   for_cproperty  s    zSimpleCallNode.for_cpropertyc                 C   s   | j  }|dkrdt| jdkr0t| jjd q| jd |}|sXt| jd jd qt|S n:|dkrt| jdkrt| jjd | jd 	|}|j
S d S )Nr  r)   zonly one type allowed.r   zUnknown typeZtypeof)r  r  r   r   r   rz   r  r   rg  r   r   )rS   rl   r  r   operandrP   rP   rQ   r    s    
zSimpleCallNode.analyse_as_typec                 C   s
   | j d fS rI   r  rR   rP   rP   rQ   r^    s    z!SimpleCallNode.explicit_args_kwdsc                    s  | j r
| S d| _ |   }d k	r&|S d| j_| j | _| j}|jrj|jrj|jjrj|j| _	t
| j	|_|  }d| _t r|jrt|rd}t| j| jd| _| j | _| jjD ]}|t|M }qt|| _| jr t| tj| t|| jtt|| jjdS |jrZt| j| jd| _| j  | _d | _| || d| _ n2 fdd| jD | _| !  |j"dkrd| _ | S )	NTr)   Fr  )function_cnamer  r   c                    s   g | ]}|  qS rP   r  rN  rr   rP   rQ   r   K  s     z0SimpleCallNode.analyse_types.<locals>.<listcomp>r   )#analysedrc  r  r  r   r  r   
is_cmethodr  rS   rl  re  Zis_numpy_call_with_exprsr?   r  rD   r  rz   r   r  rB   r  Zadd_include_filerE   NumPyMethodCallNoder  rF   rG   r<   ri   r  rY  r   ra  r   )rS   rl   as_type_constructorr  r  Zhas_pythran_argsr  rP   rr   rQ   r   "  sR    

zSimpleCallNode.analyse_typesc              
   C   s  | j j}|tkrt| _d S |jrJ|jrJ| jrB| jjjrBt| jd | j	}n| jr`| jg| j	 }n| j	}|j
r| j jjd}|d krtj| _d| _d S n6t| j dr| j j}n | j jr| j jr| j jj}nd }|r~z*|j|dd |D ddd |D d	}W nT tjk
rR } z2t|}|r.t| j| tj| _d| _W Y d S d }~X Y nX d|_|j
sj|| j _|j| j _|  }n6d }|  }|jst| jd
|  tj| _d| _d S t|j	}||j }	t|}
|jr|	|
krd| _d| _|r|jr|j	r|js|j	d }|d }|jrz| jrb| jjdt|j dkrLdndd|j gd| _n|jd|j |jj gd}| jr|j!rt"| j}n
t#| j}|$|j| }| _%n4|jj&r|$|j|}|jj&rt'|t(rd|_)||d< d}t*t+||
D ]}|j	| }|j}|| $||}|jr:|d}|, rT|dkrd}nN|jj-r|j.s|dkr~| jd k	r~n$|/ rn|dkrd}|0|}|||< qt*||
D ]}|| }|jj-r"|jt1krtj2}n
|j3 }|d krt| j	|d  jd n|$|| ||< }|, r|dkrd}q|rt*|
d D ]}|dkrn| jd k	rnqP|| }|/ rnT|jj
rnH|j.r|jj-rn4|dks|dkrP| jd k	rPt4|jdd  qڐqP|| j	d d < t'| j t5rt6| j j7| _n|j8| _| j j9s$| j j:rH| j j}|rH|j;sB|j<rHd| _| jj-r`t=| _>d| _n,|j?d k	st|j@r|d| _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()r  r   c                 S   s   g | ]
}|j qS rP   rs  rN  rP   rP   rQ   r   u  s     z:SimpleCallNode.analyse_c_function_call.<locals>.<listcomp>Tc                 S   s   g | ]}|  qS rP   )r   rN  rP   rP   rQ   r   w  s     )Zfail_if_emptyZarg_is_lvalue_arrayzCalling non-function type '%s'r)   r   )'NoneType' object has no attribute '%{}s'   .30rn  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  rO  overflowcheck)Nr  r   r0   r  is_static_methodrS   re  r   rz   r   r   r  r  r   r  r  r   r  r  rP  ZNoMatchFoundrp   r|  re  r   optional_arg_counthas_optional_argsr   ru  Znot_noner  r   rj   Zaccept_builtin_subtypesCMethodSelfCloneNoderl  r  rf  rf  rv   r  exact_builtin_typerangeminr+  ri   r   r  r  r   r.   Zdefault_coerced_ctyper   r[  rg  r]  r	  r   r  r  Zutility_code_definitionr   r   r   r   r   r   CFakeReferenceTyperu  r  declare_tuple_typer  r   r   r   r   rd   r~  )rS   rl   r  r   Zoverloaded_entryr   excr  	max_nargsexpected_nargsactual_nargs
formal_argr  some_args_in_tempsrq  formal_typeZ	arg_ctyperV  rP   rP   rQ   ra  R  s,   




















 




z&SimpleCallNode.analyse_c_function_callc                 C   s   |   S rI   )c_call_coderR   rP   rP   rQ   r   "  s    z$SimpleCallNode.calculate_result_codec                 C   s  |   }| jtjks|jsdS |j}g }tt|| j}t|j}||j	 }t| j}|d | D ]\}}	|	
|j}
||
 qb|jr|tt| jp| jjj |j	r||krd}n
d| j }|| | jt|d  D ]}	||	  qd| j d|f }|S )Nr  r  rD  ry  r"  )re  r   r   r0   r  r   r   r  r   r  r   r   r  rp   rx   wrapper_callr  r   is_unbound_cmethodopt_arg_structr   r   rp  )rS   r  Zformal_argsZarg_list_coder   r  r  r  r  
actual_argarg_codeZoptional_argsr   rP   rP   rQ   r  %  s.    




zSimpleCallNode.c_call_codec                 C   s$   |   }|jd ks|jdkr dS dS )Nr   FT)re  r   r   rd  rP   rP   rQ   r   C  s    z#SimpleCallNode.is_c_result_requiredc              
      s  | j }|js|jr |j|j d}| jjo2| jj}| j	r|r|
 |kr|jtdd |d| jd 
 | jd j || jf  |jjrt| jjdks| jjr| jjrt | d S | jjr| jjd nd }| j| j||f}|D ]}|d k	r|| q|| j | js$t| | |d krx|jtdd |d	| 
 | | | 
 | jf  nD|jtd
d |d| 
 | | | | 
 | jf  | !| |D ]$}|d k	r|"| |#| qd S )N)absZlabsZ__Pyx_abs_longlongZCommon
Overflow.czif (unlikely(%s == __PYX_MIN(%s))) {                PyErr_SetString(PyExc_OverflowError,                                "Trying to take the absolute value of the most negative integer is not defined."); %s; }r   r)   ZPyObjectCallNoArgr  z%%s = __Pyx_PyObject_CallNoArg(%s); %sPyObjectCallOneArgz*%s = __Pyx_PyObject_CallOneArg(%s, %s); %s)$r  r   r  r   use_entry_utility_coder   r   r  r  r~  r   r   r   r   r   r   r_  r   rz   ri   r   r  r   rK   rL  rS   rf  rF  r   r   r6  r   r   rg  rQ  rY  )rS   r   r  Zabs_function_cnamesZis_signed_intr  r   ZsubexprrN   rP   rQ   rL  I  sr    



 
 


z'SimpleCallNode.generate_evaluation_codec              
   C   s  |   }|jrh| j }|jtdd |d| 	 | j
 ||| 	 | jf  | | n|jr|jj }| jr&t| j}t|j|j }|jj|jjdd| _|d| jtjd t| j| f  tt|j| j}||| D ].\}}	|d| j||j|	|j f  qg }
| j jrR| j!rR|
"d| 	   n:| j j#r| j!sht$|
"| j %| 	  n
|j&d	kr|j'}|j&}|d k	r|j()|}|j(j*r|jtd
d |
"d| 	  d| d| 	  d n|
"| 	  d|  |r|r|
sbt+| j
dd }t,j-| j|jj.|rH|jnd | j j/d|o\|j0d |jtdd |
"d n
|
"d | j!s|
rn| 1 }| 	 rd| 	  }| j!r| j jrt2t3| j |}nd}|j&d	krt4|| jd||f | j jr| 	 nd |j'| n4|
r8|5d6|
| j}nd}|d|||f  | j jrn| 	 rn| | | jr|j7| j d S )NrO  r  z*%s = __Pyx_PyObject_Call(%s, %s, NULL); %sTr.  %s.%s = %s;r  r  r   r@  rg  zmemcmp(&z, &	, sizeof(z)) == 0z == r   )function_nameZvoid_returnZis_callZis_from_pxdr   r   r   r   z%s = rn  z%s%s;z && z%s%s; %s)8re  ri   r  r   r   r   r   r   r   r   r  r   rz   rg  r  r3  Z	gil_ownedr  r   r   r  r4  op_arg_structry  r  r   Zpyrex_prefixr   r  Zopt_arg_cnamerj   r   r   r   r   r   r   Zerror_conditionr   r   r	  	cast_coder  r   r   Zwrite_noexcept_performance_hintr  r1  Zdefined_in_pxdr  r/   r   r   r   rp  r;  )rS   r   r  r  r   r  r  r   r  r  Z
exc_checksexc_valZ	exc_checkZtyped_exc_valZperf_hint_entryr   r  Z
goto_errorrP   rP   rQ   rG    s    

 

 






 (  



 
z#SimpleCallNode.generate_result_code)rU   rV   rW   r   rS   rf  r  r  r  r   rt  r~  r   r   r  rq  r  r^  r   ra  r   r  r   rL  rG  rX   rP   rP   rN   rQ   r    s.   
	0 Q9r  c                   @   s"   e Zd ZdgZdZdZdd ZdS )rv  r  Tc              
   C   s   | | j | | | jjd ks&t| jj}|D ]}|| q2|d |d| 	   |d| 	 | 	 | j
ddd |D f  d S )Nz.// function evaluation code for numpy functionr  z!new (&%s) decltype(%s){%s{}(%s)};r"  c                 s   s   | ]}|  V  qd S rI   )r   )r[   ru  rP   rP   rQ   r_     s     z?NumPyMethodCallNode.generate_evaluation_code.<locals>.<genexpr>)rF  rz   r6  r  r   r   r   rL  r   r   rs  rp  )rS   r   r   r  rP   rP   rQ   rL    s    

z,NumPyMethodCallNode.generate_evaluation_codeN)rU   rV   rW   r   r   rX  rL  rP   rP   rP   rQ   rv    s   rv  c                       s   e Zd Zddddg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edddZdd Zdd Zdd Zdd Zdd Z  ZS ) PyMethodCallNoder  r  kwdictkwargs_key_value_pairsTFNc                    sJ   t  j|f| |  r(d| _| jj| _| jrF| jjrF| jj	| _
d | _d S r  )rK   r  can_avoid_attribute_lookupuse_method_vectorcallr  r  function_objr  r  r]  r  )rS   rz   kwrN   rP   rQ   r    s    

zPyMethodCallNode.__init__c                 C   sL   | j rt| j tsdS | j}|js&dS |js0dS |jr:dS t|sHdS dS r  )	r  rv   r`  r  r  
is_py_attris_special_lookupr  attribute_is_likely_method)rS   r  rP   rP   rQ   r    s    
z+PyMethodCallNode.can_avoid_attribute_lookupc                 C   s   | j }|jr|jjrdS dS r  )r  r   r   r  )r  r  rP   rP   rQ   r  %  s    z+PyMethodCallNode.attribute_is_likely_methodc                 C   sH   t | tsdS | jrdS | jr0t| jdkr0dS t| jsD|pB| S dS )z~
        Test whether the positional args given are compatible with
        being translated into a PyMethodCallNode.
        Fr)   T)rv   r  r   r   r   r   )r  Z
has_kwargsZhas_explicit_kwargsrP   rP   rQ   can_be_used_for_posargs,  s    


z(PyMethodCallNode.can_be_used_for_posargsc                    sf   d}| j r | jrb| jjjrbd}nB| jrb| j}|jjr:d}n(|jrbt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 rI   )r   rv   )r[   r  Znon_method_nodesrP   rQ   r_   P  s   z<PyMethodCallNode.can_be_used_for_function.<locals>.<genexpr>)
r  r   r   r  r   Zcf_assignmentsPyCFunctionNode	ClassNodePy3ClassNodere   )r  Zmay_be_a_methodr   rP   r  rQ   can_be_used_for_function>  s    
z)PyMethodCallNode.can_be_used_for_function)returnc                 C   s   | j rH| j| || d| j  d ||t || jj	S || d | j| | j
 rx| j S |jjtdd}| j| |d|| j f  | j| | j| |S )Nr,  r'  z = NULL;Tr.  	%s = %s; )r  r  rL  r   r   r=  r   r<  r  r  r+  r   r3  r4  r?  rQ  rY  )rS   r   self_argr  rP   rP   rQ   generate_evaluate_functionU  s    

z+PyMethodCallNode.generate_evaluate_functionc                 C   s`   | j r | j| | j| n<| j rD| j| | j| n||t |j	| d S rI   )
r  r  rQ  rY  r  r+  rP  r   r3  r;  rS   r   r  rP   rP   rQ   generate_dispose_functionl  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r| jjr| jjD ]8}|j}|rF|jrF|jj	rF|jj	j
rF| |rFd} qqFd}nd}|d |d||f  || d| d |d| d |d| d ||t |d	t ||td	 || d
 |d |d d S )NZlikelyZunlikelyz#if CYTHON_UNPACK_METHODSzif (%s(PyMethod_Check(%s))) {z = PyMethod_GET_SELF(r#  zassert(z2PyObject* __pyx__function = PyMethod_GET_FUNCTION(Z__pyx__function = 0;r   r  )r  unpackr  r  r  r   r   r   r  r   ri   r   r=  r   r]  )rS   r   r  space_for_selfarg_var
method_objZlikely_methodr  r   rP   rP   rQ   &generate_runtime_method_unpacking_codew  s0    


z7PyMethodCallNode.generate_runtime_method_unpacking_codec                 C   s   | | dt| d||| j  ||t t|D ]|\}}|jjt	j
ko\|j  }|| jd|rpdnd d|j  d|j  d| dtj dt|d	  d|d
d q<d S )Nz# = __Pyx_MakeVectorcallBuilderKwds(r  Z__Pyx_VectorcallBuilder_AddArgrn  Z_Checkr-  r"  r   r)   rv  r  )r   r   r   rz   rd  r   ro  r[  r   r   r   r  rO  r   r   r   callargs_cname)rS   r   r   r  Zkwnames_tempr  keyvalueZ
key_is_strrP   rP   rQ   generate_keyvalue_args  s     Nz'PyMethodCallNode.generate_keyvalue_argsc                 C   s`   | j r | jrd}d}qHd}d}n(| jr0d}d}n| jr@d}d}nd}d	}|jt|d
 |S )NZ!PyObjectVectorCallMethodKwBuilderZ-__Pyx_Object_VectorcallMethod_CallFromBuilderZPyObjectFastCallMethodZ__Pyx_PyObject_FastCallMethodZPyObjectVectorCallKwBuilderZ'__Pyx_Object_Vectorcall_CallFromBuilderZPyObjectFastCallZ__Pyx_PyObject_FastCallDictZ__Pyx_PyObject_FastCallr  )r  r  r  r   r   r   r   )rS   r   rj   r?  rP   rP   rQ   select_utility_code  s$    
z$PyMethodCallNode.select_utility_codec                 C   s  | | j | | | j}| j}|jjtdd}| ||}| j	j
}| j	jd ksVt|D ]}|| qZ|r|D ]}|| qrn|r|| |jjtjdd}	||	 d| jrdnd d | j|||	|d | |}
|d	 |rd
dd |D nd}|rdt| dnd}|dtj d|rBt|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 ]}|| || q0|r|D ]}|| || qV||t |j| n|r|| || | || || |  | j | !| |d d S ) NTr.  Fr,  r  1r'  )r  r  r  r   r"  c                 s   s   | ]}|  V  qd S rI   r   rN  rP   rP   rQ   r_     s     z<PyMethodCallNode.generate_evaluation_code.<locals>.<genexpr>r  z + ((CYTHON_VECTORCALL) ? z : 0)rn  
PyObject *[r)   r4   rv  z] = {};r-  r   z, (r  z) | (z&*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)r#  r   )"rF  rz   r6  r  r  r3  r4  r   r  r  r   r   r   rL  r   r  r   r  r  r  rp  r   r   r  r  r   r  r;  rQ  rY  rP  r  r   rg  )rS   r   r  r  r  r  r   r  r  Zspace_for_selfargZfunction_callerZ	args_listZextra_keyword_argsZkeyword_variabletmpZkw_noderP   rP   rQ   rL    st    

 

6b




z)PyMethodCallNode.generate_evaluation_code)F)rU   rV   rW   r   r   r  r  r  r  r  r  r  r  r  r  rp   r  r  r  r  r  rL  rX   rP   rP   rN   rQ   r    s(   	

$r  c                   @   s<   e Zd ZddgZdZeZdZdZdd Z	dd Z
d	d
 ZdS )InlinedDefNodeCallNoder   r  r)   Nc                 C   s>   | j j}|js|jrdS t|jt| jkr0dS |jr:dS dS r  )r  def_nodestar_argstarstar_argr   r   num_kwonly_argsrd  rP   rP   rQ   can_be_inlined-  s    z%InlinedDefNodeCallNode.can_be_inlinedc                    s  | j  | _  fdd| jD | _| jj}t| j}d}t|D ]p}|j| j}| j| | }|	 rz|dkrd}n.|jj
r js| rn|dkrd}| }|| j|< qB|rt|d D ]N}| j| }| rq|jjrqƈ jr|jj
rq|dkrt|jdd  qq| S )Nc                    s   g | ]}|  qS rP   r  rN  rr   rP   rQ   r   :  s     z8InlinedDefNodeCallNode.analyse_types.<locals>.<listcomp>Fr   Tr)   r}  )r  r   r   r  r  r   r  r   r  r+  ri   r   r  r  r   r   rz   )rS   rl   r  r  r  rq  r  r  rP   rr   rQ   r   7  s>    


z$InlinedDefNodeCallNode.analyse_typesc              
   C   s@  | j  }| jjjs|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 ]2\}}|jjr|||j q||  qd
|}|d|  | jjjj|||  | j	f  | jjjs2|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   )r  r   r  r  is_cyfunctionr   r   r(  r   rz   r  r   r   ri   r   r   r   rp  r   pyfunc_cnamer   rg  )rS   r   Z	self_coder  r  r  Z	proto_argrP   rP   rQ   rG  p  sF    









z+InlinedDefNodeCallNode.generate_result_code)rU   rV   rW   r   r   r   r   r  r  r  r   rG  rP   rP   rP   rQ   r     s   
9r  c                   @   s2   e Zd Zg Zd
ddZdd Zdd Zdd	 ZdS )PythonCapiFunctionNodeNc                 C   s   t j| |||||d d S )N)rj   r   r   r  rT  )rS   rz   py_namer   r  r  rP   rP   rQ   r    s     zPythonCapiFunctionNode.__init__c                 C   s   | S rI   rP   r   rP   rP   rQ   r     s    z$PythonCapiFunctionNode.analyse_typesc                 C   s   | j r|j| j  d S rI   )r  r   r   r>  rP   rP   rQ   rG    s    z+PythonCapiFunctionNode.generate_result_codec                 C   s   | j S rI   r_  rR   rP   rP   rQ   r     s    z,PythonCapiFunctionNode.calculate_result_code)N)rU   rV   rW   r   r  r   rG  r   rP   rP   rP   rQ   r    s
   
r  c                   @   s   e Zd ZdZdddZdS )PythonCapiCallNodeFNc                 K   s8   |j | _| j| _t|||||d| _tj| |f| d S )N)r  )r	  r   r   r  r  r  r  )rS   rz   r  r  r  r  r  rP   rP   rQ   r    s       zPythonCapiCallNode.__init__)NN)rU   rV   rW   rX  r  rP   rP   rP   rQ   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   rX  r   )rK   r  rz   rX  r   )rS   Z	call_noder  r   r   rN   rP   rQ   r    s      z$CachedBuiltinMethodCallNode.__init__c                 C   s   | j d k	r| j S t| S rI   )rX  r   r  rR   rP   rP   rQ   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   s   g | ]}|  qS rP   r  rN  rP   rP   rQ   r     s     zDCachedBuiltinMethodCallNode.generate_result_code.<locals>.<listcomp>rn  r  )r  r   typeptr_cnamer   r   r   Zcached_unbound_method_call_coder  r   r   r   r   rz   rg  )rS   r   Z
type_cnameZ	obj_cnamer   Z	call_coderP   rP   rQ   rG    s     

    z0CachedBuiltinMethodCallNode.generate_result_code)	rU   rV   rW   r   r   r  r  rG  rX   rP   rP   rN   rQ   r    s
   r  c                   @   sP   e Zd ZeZdddgZejZdd Z	dd Z
dd	 Zd
d Zdd Zdd ZdS )GeneralCallNoder  r  r  c              
   C   sb   | j |}| j|}| j|}z|||W S  tk
r\ } z| | W 5 d }~X Y nX d S rI   )r  r   r  r  r  r   )rS   r   r  r  r  r   rP   rP   rQ   r     s    z"GeneralCallNode.compile_time_valuec                 C   s   | j jr|| j jjr|| j j}t|s.t|r||j}| j jj	}|rH|j
n
t	|jj}t||r|| jj}| jj}|||| _d S rI   )r  r  r  r   rw   r"   rj  rk  rU   r   rj   rl  r   rm  r  r  )rS   rn  r   ro  rp  r   r  rP   rP   rQ   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   rz   r   rR   rP   rP   rQ   r^    s    z"GeneralCallNode.explicit_args_kwdsc                 C   s   |  | }d k	r|S | j|| _| jjjs| jjjrBt| _| S t| jdr|  }|d k	rp|| k	rp||S | jj	j
r| j|| _q|| krt| jd qn| j|| _| jr| j|| _| j|| _| j|| _| | j d| _| S )Nr   zRNon-trivial keyword arguments and starred arguments not allowed in cdef functions.r)   )rc  r  r   r   ri   r  r0   r  map_to_simple_call_noder   ri  r  r   rz   r  r  rY  r   )rS   rl   rw  r|   rP   rP   rQ   r     s6    




zGeneralCallNode.analyse_typesc                    s  t | jts| S | jjs| S | j}t|dd}|s6| S |j}|jrH|j	}|j
sR| S | jj | j}|j}|jrx|dd }t t|krt| jdt|t f  dS dd |dt  D }|t d }d}t }	t|}
d}|jD ]4}|jj}||
krt|jd	|  d
}|
| qt||jD ]D\}}|jj}|j|krn|| |d7 }|	|j n qxq2ddlm}m} g }t|j|kr|t|	d } fddt|jD }d}|D ]}|j}||kr|s|}qn,|r|jr|   S t| jd|   dS || \}}|| |d7 }|j rT|	|j n0||j}| slt|	| |||f q|rg }g }|d d }|	D ]H}||kr q| r|| n||}|| || q|r|}	|dd t |D  }|jD ],}|jj}||krd
}t|jd|  q|rNdS t!| j||	d}|ddd D ]}|||}ql|S )z
        Tries to map keyword arguments to declared positional arguments.
        Returns self to try a Python call, None to report an error
        or a SimpleCallNode if the mapping succeeds.
        r   Nr)   zDfunction call got too many positional arguments, expected %d, got %sc                 S   s   h | ]}|j r|j qS rP   rh  rN  rP   rP   rQ   r   M  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 rP   )r[  r   r   r[   rq  r  Zpos_argsrP   rQ   
<dictcomp>q  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 rP   rP   r  rP   rP   rQ   r     s     z;GeneralCallNode.map_to_simple_call_node.<locals>.<listcomp>z/C function got unexpected keyword argument '%s'r  )"rv   r  r  r  r  r  r   r   rx  ry  r  r   ru  r   r   rz   r   rj  r]  r[  r   rm  r  rj   r   r$  r  r  ro  ri  r  r   r  r  )rS   r  r   re  r  Zdeclared_argsZmatched_argsZunmatched_argsZmatched_kwargs_countr   seenZ
has_errorsr  rj   Zdecl_argr  r  ZtempskeywordsZfirst_missing_keywordrz   r  Z
final_argsZ	new_tempsZfirst_temp_arg	arg_valuer|   rP   r  rQ   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 )Nr  rO  r  z(%s = __Pyx_PyObject_Call(%s, %s, %s); %s)r   r  r  r   r   r   r   r   r   r   r  r  r   rz   rg  )rS   r   r  rP   rP   rQ   rG    s&     
 z$GeneralCallNode.generate_result_codeN)rU   rV   rW   r   r   r   r,   r#  r$  r   r   r^  r   r  rG  rP   rP   rP   rQ   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   s   t | jj| _d S rI   )r   r  rw   rR   rP   rP   rQ   r     s    z%AsTupleNode.calculate_constant_resultc              
   C   sH   | j |}z
t|W S  tk
rB } z| | W 5 d }~X Y nX d S rI   )r  r   r   r  r   )rS   r   r  r   rP   rP   rQ   r     s
    
zAsTupleNode.compile_time_valuec                 C   s6   | j ||| _ | j jtkr,| j dS t| _| S Nr  )r  r   r  r   r   r  r   rP   rP   rQ   r     s
    zAsTupleNode.analyse_typesc                 C   s   dS r&  rP   rR   rP   rP   rQ   r    s    zAsTupleNode.may_be_noneConstructing Python tuplec              
   C   sT   | j jttfkrdnd}|d|  || j  ||  | jf  | 	| d S )NZ__Pyx_PySequence_TupleZPySequence_Tupler  )
r  r   r   r   r   r   r   r   rz   rg  )rS   r   r?  rP   rP   rQ   rG    s     z AsTupleNode.generate_result_codeN)rU   rV   rW   r   r   r   r   r   r  r,   r#  r$  rZ  rG  rP   rP   rP   rQ   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 ]T}|jr,dd |jD }n
|j }|D ](\}}|rZ||krZtd| |||< q:q|| _d S )Nc                 s   s   | ]\}}|j |j fV  qd S rI   ri  r[   r[  r   rP   rP   rQ   r_     s   z;MergedDictNode.calculate_constant_result.<locals>.<genexpr>$duplicate keyword argument found: %s)reject_duplicatesr  r  r]  rw   	iteritemsr   )rS   r   r  r   r  r[  r   rP   rP   rQ   r     s    

z(MergedDictNode.calculate_constant_resultc           	         s   i }| j }| jD ]}|jr0 fdd|jD }n|  }z2|D ](\}}|rd||krdtd| |||< qDW q tk
r } z| | W 5 d }~X Y qX q|S )Nc                    s$   g | ]\}}|  |  fqS rP   rg  r  rh  rP   rQ   r     s   z5MergedDictNode.compile_time_value.<locals>.<listcomp>r  )	r  r  r  r]  r   r  r   r  r   )	rS   r   r   r  r   r  r[  r   r   rP   rh  rQ   r     s     

z!MergedDictNode.compile_time_valuec                 C   s   dS ra  rP   r   rP   rP   rQ   r  #  s    z MergedDictNode.type_dependenciesc                 C   s   t S rI   r   r   rP   rP   rQ   r   &  s    zMergedDictNode.infer_typec                    s    fdd| j D | _ | S )Nc                    s"   g | ]}|   d qS )z1argument after ** must be a mapping, not NoneTyper   r  r  rN  rr   rP   rQ   r   *  s   z0MergedDictNode.analyse_types.<locals>.<listcomp>)r  r   rP   rr   rQ   r   )  s    
zMergedDictNode.analyse_typesc                 C   s   dS r&  rP   rR   rP   rP   rQ   r  3  s    zMergedDictNode.may_be_noneConstructing Python dictc              
   C   sN  | | j | | t| j}t|}|| |jtk	rN|	d|
   |jr|| |	d|  |
 f  || n| r|	d |	d|
   |	d|  |
 f  || |	d |	d |	d |	d|  |
 ||  |jf  | | || | r<|	d	 |jtk	r|	d
 |jtdd |	d|  |
 ||  | jf  | | || |	d	 || t }|D ]`}|jr|jD ]}|| | jr<|	d|  |j
 f  |d |	d|j
 || jf  |	d	 ||jjd|  |j
 |j
 f  || || qn|| | jr|d ||jd|  |
 f  nR|d |	d|  |
 f  |	d|
   |	||j |	d	 || || qt |D ]}|jt|d q.d S )Nz$if (likely(PyDict_CheckExact(%s))) {r  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  r  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)ZMergeKeywordsz__Pyx_MergeKeywords(%s, %s)ZRaiseMappingExpectedz*if (unlikely(PyDict_Update(%s, %s) < 0)) {zVif (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseMappingExpectedError(%s);FunctionArguments.c)!rF  rz   r6  r  r  r  rL  r   r   r   r   r  r?  r   rS  r+  r   rg  rQ  r   r   r   r   rY  rj  r]  r  r[  rm  r   rO  r   r  )rS   r   r   r   helpersr  helperrP   rP   rQ   rL  8  s    















 













 

 

z'MergedDictNode.generate_evaluation_codec                 C   s   | j D ]}|| qd S rI   )r  rm  rS   r   r   rP   rP   rQ   rm    s    
zMergedDictNode.annotateN)rU   rV   rW   r   r   r   r   r  r   r   r  r   r   r  rZ  rL  rm  rP   rP   rP   rQ   r    s   
^r  c                   @   sD  e Zd ZdZdgZdZdZdZdZdZ	dZ
dd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd ZdJddZdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( ZdKd)d*ZdLd+d,Zd-d. Zd/d0 Zd1Z d2d3 Z!d4d5 Z"d6d7 Z#d8d9 Z$d:d; Z%d<d= Z&d>d? Z'd@dA Z(dMdBdCZ)dNdDdEZ*dFdG Z+dHdI Z,dS )Or  r)   r  Nr   TFc                 C   sD   t | jtr$| jjr$| jdks$| jS | j }|r@d|| jf S d S )Nparallel%s.%s)rv   r  r~  r  r  r  )rS   cyrP   rP   rQ   r    s    
z!AttributeNode.as_cython_attributec              	   C   s  |t kr| j}|r:|jr:|jr:d| _|j| _| | | S |r|jr| jjtj	k	rddl
m}m} || j| jjd}| jj|_|| _t| ||}tdd}ttj tdtj d tdtj d g}	t| jd|	||g|d	}
|||
}||S t| ||S )
Nr)   r  rs  ZPyMethodNew2Argr  r  rS   Z__Pyx_PyMethod_New2Arg)r  r  r   r  )r   r   r  ri  r   analyse_as_python_attributer  r   r   r   r$  r  r  r   r   r  r   r   r   r1  r2  r  rz   r   )rS   r  rl   r   r  r  Zobj_nodeZunbound_noder  r  Zbinding_callZcomplete_callrP   rP   rQ   r    sB    

 

zAttributeNode.coerce_toc                 C   s2   | j }|dr|drd S t| jj|| _d S )N__)r  
startswithendswithr   r  rw   )rS   r  rP   rP   rQ   r     s    z'AttributeNode.calculate_constant_resultc              
   C   sx   | j }|dr.|dr.t| jd|  d S | j|}zt||W S  tk
rr } z| 	| W 5 d }~X Y nX d S )Nr  z6Invalid attribute name '%s' in compile-time expression)
r  r  r  r   rz   r  r   r   r  r   )rS   r   r  r  r   rP   rP   rQ   r     s    z AttributeNode.compile_time_valuec                 C   s   | j |S rI   )r  r  r   rP   rP   rQ   r    s    zAttributeNode.type_dependenciesc                 C   s   | j |dd}|d k	r>|jjr6|jjjr6t|jjS |jjS | |}|d k	rX|jjS | j|}| j	||d |j
r| jjrtS | jr| jjrtS | jS )NFtarget)obj_type)#analyse_as_cimported_attribute_noder   r   r  r   rg  analyse_as_type_attributer  r   analyse_attributerf  r   ru  )rS   rl   r|   r  rP   rP   rQ   r     s    
zAttributeNode.infer_typec                 C   s
   d| _ d S r  r  r   rP   rP   rQ   r     s    z(AttributeNode.analyse_target_declarationc                 C   sF   | j |dd}|jjr(t| jd| j  | sBt| jd| j  |S )Nr)   r  z"Assignment to const attribute '%s'r  )r   r   r;  r   rz   r  r   r   rP   rP   rQ   r    s    z"AttributeNode.analyse_target_typesc                 C   s   | j stj| _ |jd | _| ||}|d kr<|s<| |}|d kr\| ||}|d k	s\t|j	sh|j
rv|jrvd|j_|j	r|| |S )Nr  T)r   r   r0   rd   r  r  r  "analyse_as_ordinary_attribute_noder   r  r   r   r|  wrap_obj_in_nonecheck)rS   rl   r  r|   rP   rP   rQ   r   "  s    

zAttributeNode.analyse_typesc                 C   sp   | j |}|rl|| j}|rL|jsL|js>|js>|js>|jrL| 	|||S | 
|rlt| jd| j  | S d S )Nz&cimported module has no attribute '%s')r  r  rs  r  r  r  r  r&  r;  as_name_noder  r   rz   )rS   rl   r  module_scoper   rP   rP   rQ   r  2  s"    

z1AttributeNode.analyse_as_cimported_attribute_nodec                    sB  j jrd S j  r>js0js0jrjj}|r|j	sVjr|j
jrjrljsfd S |}n(| } fdd|jD |_j |ddS njsjr>jjkrjjD ]$}|jjkrʈj |dd  S qtjdjf  n6jdr(jdr(d S tjdjf  d S )Nc                    s   g | ]} | qS rP   )_create_unbound_cmethod_entry)r[   Zoverloaded_alternativerl   rS   r   rP   rQ   r   W  s   z;AttributeNode.analyse_as_type_attribute.<locals>.<listcomp>Fr  z%s not a known value of %sr  )r  r  r  re  rf  r   r  rs  r  ru  r   r  r  r   Zoverloaded_alternativesr  r  r  rb  r   Zenum_valuesrj   r   rz   r  r  )rS   rl   r   
ubcm_entryrP   r  rQ   r  D  s4    z'AttributeNode.analyse_as_type_attributec                 C   s   |j r|jjd kr|j }|jjs.|jr6|jjr6|j}q|jrZt| jd|j	|f  t
j}qt|j}|jd d  |_t
d|dd |jd< nd|j|jf }|j}t|j	||}d|_|j |_ d|_|j|_|S )Nz%s not a static member of %srS   r   %s->%sr)   )Z
func_cnamer   r  r  parent_scopeZis_cpp_class_scoper   r   rz   rj   r   r0   r#   r   r2  Zvtabptr_cnamer   r   r  r  r  r  )rS   r   r   rl   r   r   r  rP   rP   rQ   r   j  s,    z+AttributeNode._create_unbound_cmethod_entryc                 C   sV   | j |}|r|| jS | j jsR| j |}|rRt|dd d k	rR|j| jS d S )Nr  )r  r  lookup_typer  r  r  r   r  )rS   rl   r  ry  rP   rP   rQ   r    s    zAttributeNode.analyse_as_typec                 C   s@   | j |}|r<|| j}|r<|jr<|jjs6|jjr<|jS d S rI   )r  r  rs  r  r&  r   re  rf  rS   rl   r  r   rP   rP   rQ   r!    s    
z'AttributeNode.analyse_as_extension_typec                 C   s0   | j |}|r,|| j}|r,|jr,|jS d S rI   )r  r  rs  r  r  r  rP   rP   rQ   r    s    
zAttributeNode.analyse_as_modulec                 C   s8   t j| | j|d}|r"||}n
||}d|j_|S )N)rj   r   r)   )r~  r  r  r  rl  r   r|  )rS   rl   r   r  r|   rP   rP   rQ   r    s    
zAttributeNode.as_name_nodec                 C   s   | j || _ | | | jr,| jjr,| js,| jrD|sd| _t| _	nT|r`| j j
jr`t| jd n8| jr| jjr|st| j| j | j|S t| jd | S )Nr)   z'Assignment to an immutable object fieldz"Assignment to a read-only property)r  r   r  r   ru  r  r  r   r   r   r   rf  r   rz   is_cpropertyr  rq  )rS   rl   r  rP   rP   rQ   r    s    
z0AttributeNode.analyse_as_ordinary_attribute_nodec                 C   s  |d k	}d| _ | j| _|d krJ| jjjs2| jjjr@| j|| _| jj}n|jsV|jrZt}|j	sf|j
rt|j}d| _n.|js|jrd| _n|jr|jrd| _nd| _|jr| r8|j| j}|jr$|s$| jdkrd| _d| _d| _| jj| j| _d S || j|| j |j| j}|rT|jrTd }nt| jd|  tj| _d S || _ |r|jr|j!dkrt| jd |j"r|j| _d S |j#r|j$r|j%r|j| _|j&| _d S | '||| d S )	Nr   r;  r  TTz/Cannot select attribute of incomplete type '%s'__weakref__z,Illegal use of special attribute __weakref__)(r  r  rb  r  r   rH  rI  r  r   rx  r  ry  r  re  rf  r   Zis_fake_referenceZhas_attributesZattributes_knownr  rs  r   is_memslice_transposer   r5  Z	transposerz   Zdeclare_attributer  r   r   r0   r   rj   r  r  r  ru  r   r  )rS   rl   r  immutable_objr   rP   rP   rQ   r    sd    


zAttributeNode.analyse_attributec                 C   s   |d kr| j j}|| j| _| j| _t| _d| _|js|js|j	s||j
s||js||js||js||jrl||s||jr||r|s| j || _ nX|jr| j js| j jr| j jjr| j jjjjr|s| j || _ nt| jd|| jf  d S )Nr)   z)Object of type '%s' has no attribute '%s')r  r   Zmangle_class_private_namer  rb  r   r  ri   r  rH  rB  r  r   r  r  rx  	is_structr  r  r   r  r   ri  r   rz   )rS   rl   r  r  rP   rP   rQ   r    sH    z)AttributeNode.analyse_as_python_attributec                 C   s   |j d sd S d }d}| jjjrR| jrR| jsRdt| jdkrBdnd}| jf}n8| jjj	r| j
rhd}n"| jjj| j}|rd}|jf}|r| jj|d	|d
| _d S )Nr  rP   rx  ry  rz  rn  z&Cannot transpose None memoryview slicez5Cannot access '%s' attribute of None memoryview slicer{  r|  )rd   r  r   re  needs_none_checkr  r   r   r  r   r
  r  rs  rj   r  )rS   rl   r  r  r   rP   rP   rQ   r  )  s(    



z#AttributeNode.wrap_obj_in_nonecheckc                 C   s   | j r|   d S rI   )r  r#  r   rP   rP   rQ   r$  A  s    zAttributeNode.nogil_checkzAccessing Python attributec                 C   s   | j |S rI   )r  r  r   rP   rP   rQ   r  G  s    z0AttributeNode.is_cimported_module_without_shadowc                 C   s&   | j r|  p| j  S t| S d S rI   )r  r+  r  r~  rR   rP   rP   rQ   r  J  s    zAttributeNode.is_simplec                 C   s   | j r
dS t| S d S r  )r  r~  r   rR   rP   rP   rQ   r   P  s    zAttributeNode.is_lvaluec                 C   s   | j r| j  S t| S d S rI   )r  r   r~  rR   rP   rP   rQ   r   V  s    
zAttributeNode.is_ephemeralc                 C   s(   |   }| jr$| jjr$| js$d| }|S r  )calculate_access_coder   r  r  )rS   r   rP   rP   rQ   r   \  s    z#AttributeNode.calculate_result_codec                 C   s   | j }||j}| jr| jjr|jjrp| jjsp| jjr@| jjS | jjrR| jj	| _
d|jj|| j|jj| j
f S | jr|| j
S d S |jjrd| j
 |f S |jjr| jr| jjr|jj| dd}d|| j| j
f S d S )Nz((struct %s *)%s%s%s)->%sz__Pyx_C%s(%s)T)Zto_object_structz%s%s%s)r  r   r   r   ru  re  Zis_builtin_cmethodZfinal_func_cnameZ
from_fusedr   rb  Zvtabstruct_cnamer  Zvtabslot_cnamer2  r  upperrf  r  r  r   )rS   r  Zobj_coderP   rP   rQ   r  b  s.    
   z#AttributeNode.calculate_access_codec                 C   s  | j r| jr&|jtdd d}n|jtdd d}|d|  || j	 |
| j||  | jf  | | nP| jjr>| jr| jjD ]"\}}|dkrt| jd  d S q|d	|  | j f  |j|  | jd
d d|   }|||| j n&| jr|d|  || jf  n| jjr| jr| jrb|  }n| jrnt|  }| j|}|j| j| j| j |d n8| jjr| jjj!rn | jr| jj"r|j#| j d S )NZPyObjectLookupSpecialr  Z__Pyx_PyObject_LookupSpecialZPyObjectGetAttrStrZ__Pyx_PyObject_GetAttrStrrz  r  z=Transposing not supported for slices with indirect dimensionsr  Tr@  z__pyx_memslice_transpose(&%s)zeif (unlikely(!%s.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");%s}r  )$r  r  r   r   r   r   r   r   r  r   rQ  r  r   rz   rg  r   r   r
  r  r   rB  r  r  r   r   r  r  r   r   r  r  r  rC  re  ru  r  )rS   r   Zlookup_func_namer  r  r  Zundereferenced_resultr  rP   rP   rQ   rG    sb    




z"AttributeNode.generate_result_codec                 C   s<   | j r,| jjr,| jr,|j|  | jdd nt| | d S )NTr@  )r   r   r   r
  r  r   r   rQ  r>  rP   rP   rQ   rQ    s    z$AttributeNode.generate_disposal_codec              
   C   s  | j | | jrh|jtdd || jd| j 	 |
| j|	 f  || || n| j jjr|d| j | j jj| j | j j||  f  || || n|  }| jjr| jr|| || ||| j |||   n.| jjr<ddlm} | ||| | j| | jjsb|d||!|  f  |"| || | j | | j | d S )Nr  r  z%__Pyx_PyObject_SetAttrStr(%s, %s, %s)z__Pyx_SET_C%s%s(%s, %s);r)   ro  r  )#r  rL  r  r   r   r   r   rO  rz   r   rQ  r  rQ  rY  r   r  r   rb  r  Zimplementation_suffixr   r   r   ri   r5  r?  rj  rd  
put_decrefr   rn  rp  Zput_assign_to_memviewslicer   rS  )rS   r   r   rT  r   r   Zselect_coderp  rP   rP   rQ   rU    sb    







    


z&AttributeNode.generate_assignment_codec                 C   s   | j | | js*| jjjrdd| jjjkrd|jt	
dd || jd| j  || jf  nt| jd | j | | j | d S )N__del__r  r  r  z+Cannot delete C attribute of extension type)r  rL  r  r   r  Zis_property_scoper  r   r   r   r   rO  rz   r   rQ  r  r   rQ  rY  rV  rP   rP   rQ   rX    s     

z$AttributeNode.generate_deletion_codec                 C   s@   | j rd\}}nd\}}|| jt||| j t| jd d S )N)Zpy_attrzpython attribute (%s))Zc_attrzc attribute (%s)r  )r  rm  rz   r5   r   r   r  )rS   r   r  r  rP   rP   rQ   rm     s    
zAttributeNode.annotatec                 C   s&   | j  }|r"td|| jf S d S )Nr  )r  r  r   r  r  )rS   r  rP   rP   rQ   r     s    
z/AttributeNode.get_known_standard_library_import)r   )N)NF)FNN)F)-rU   rV   rW   r  r   r   r  r  r
  r  r  r  r  r   r   r  r   r   r  r   r  r  r   r  r!  r  r  r  r  r  r  r$  rZ  r  r  r   r   r   r  rG  rQ  rU  rX  rm  r  rP   rP   rP   rQ   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  rT  )rS   rz   r  rP   rP   rQ   r  '   s    zStarredUnpackingNode.__init__c                 C   s"   | j st| jd | j| d S Nz&starred expression is not allowed here)starred_expr_allowed_herer   rz   r  r  r   rP   rP   rQ   r  *   s    z)StarredUnpackingNode.analyse_declarationsc                 C   s   | j |S rI   )r  r   r   rP   rP   rQ   r   /   s    zStarredUnpackingNode.infer_typec                 C   s.   | j st| jd | j|| _| jj| _| S r  )r  r   rz   r  r   r   r   rP   rP   rQ   r   2   s
    
z"StarredUnpackingNode.analyse_typesc                 C   s   | j | d S rI   )r  r   r   rP   rP   rQ   r   9   s    z/StarredUnpackingNode.analyse_target_declarationc                 C   s   | j || _ | j j| _| S rI   )r  r  r   r   rP   rP   rQ   r  <   s    
z)StarredUnpackingNode.analyse_target_typesc                 C   s   dS r  rP   rR   rP   rP   rQ   r   A   s    z*StarredUnpackingNode.calculate_result_codec                 C   s   d S rI   rP   r>  rP   rP   rQ   rG  D   s    z)StarredUnpackingNode.generate_result_codeN)rU   rV   rW   r   r~   r   r   r   r  r  r  r   r   r   r  r   rG  rP   rP   rP   rQ   r     s   r  c                
       s   e Zd ZddgZdZdZdZdZdZdd Z	dd	 Z
d
d Zd,ddZdd Zdd Zdd Zdd Zdd Zdd Zd-ddZ fddZd.ddZeeejed ejdgZd!d" Zd#d$ Zd/d&d'Zd(d) Zd*d+ Z   Z!S )0SequenceNoder   r   r)   NFc                    s    fdd| j D S )Nc                    s   g | ]}|  qS rP   rg  rN  rh  rP   rQ   r   ]   s     z8SequenceNode.compile_time_value_list.<locals>.<listcomp>r  r   rP   rh  rQ   compile_time_value_list\   s    z$SequenceNode.compile_time_value_listc                 C   sT   d| _ g }| jD ]8}|jr>| j r,t|jd d| _ |j}d|_|| q|| _d S )NFz,more than 1 starred expression in assignmentT)starred_assignmentr   r~   r   rz   r  r   rS   r   r  rP   rP   rQ   replace_starred_target_node_   s    
z(SequenceNode.replace_starred_target_nodec                 C   s"   |    | jD ]}|| qd S rI   )r  r   r   rS   rl   r  rP   rP   rQ   r   m   s    
z'SequenceNode.analyse_target_declarationc                 C   s   t | jD ]&\}}|s ||}||| j|< q
| jrb| j|}|jjsV||}||| _d| _|j	s|j
s|jr|jj	rd| _| S Nr)   T)ro  r   r   r  r   r   r  r	  r   rt  ry  ru  r  slow)rS   rl   skip_childrenrq  r  r   rP   rP   rQ   r   r   s"    

zSequenceNode.analyse_typesc                    s   t j|dd}| j|kr| S | jr&tt| j|jkrRt| j	d|jt| jf   fddt
| j|jD }t| j	||ddS )NTrC  zHtrying to coerce sequence to ctuple of wrong length, expected %d, got %dc                    s   g | ]\}}| | qS rP   )r  )r[   r  r   rr   rP   rQ   r      s     z1SequenceNode.coerce_to_ctuple.<locals>.<listcomp>)r   r   r   )r   rE  r   r   r   r   r   r  r   rz   r  r  r  rS   r  rl   Zcoerced_argsrP   rr   rQ   coerce_to_ctuple   s    

 zSequenceNode.coerce_to_ctuplec              	   C   s   |    tdd | jD s | S g }g }| jD ]L}|jrp|rb|t|d j|dj|dd g }||j q.|| q.|r|t|d j|dj|dd t	| j|| j
}| jrt| jd|| j|d| j
dd}|S )	Nc                 s   s   | ]}|j V  qd S rI   )r~   rN  rP   rP   rQ   r_      s     z?SequenceNode._create_merge_node_if_necessary.<locals>.<genexpr>r   r  Tr  r   )inplacer   r   )_flatten_starred_argsre   r   r~   r   r  rz   r   r  MergedSequenceNoder   r   
binop_noder  )rS   rl   r   rb  r  r|   rP   rP   rQ   _create_merge_node_if_necessary   s4    
""   
  z,SequenceNode._create_merge_node_if_necessaryc                 C   sR   g }| j D ]4}|jr4|jjr4|jjs4||jj  q
|| q
|| j d d < d S rI   )r   r~   r  r   r   r   r   r  rP   rP   rQ   r"     s    
z"SequenceNode._flatten_starred_argsc                 C   s   dS r&  rP   rR   rP   rP   rQ   r     s    zSequenceNode.may_be_nonec                 C   s   | j rt| jd g | _g | _d| _t| jD ]\}}|| }| j|< |j	rx|j
tsht|jd |j
tkrxt|_
t| j|}||j
|}||k	rd| _| j| | j| q.t| _
| S )Nz#can't assign to multiplied sequenceFz2starred target must have Python object (list) typeT)r   r   rz   unpacked_itemscoerced_unpacked_itemsZany_coerced_itemsro  r   r  r~   r   r  r   r   r\  r  r   )rS   rl   rq  r  Zunpacked_itemZcoerced_unpacked_itemrP   rP   rQ   r     s,    
z!SequenceNode.analyse_target_typesc                 C   s   |  | d S rI   generate_operation_coder>  rP   rP   rQ   rG     s    z!SequenceNode.generate_result_codec                 C   sT  |d kr|   }d }}d }| jr~|s~| j}|jjr~|  }t|jtr^|jdkr^d|j }n |jjrtd||f }n
d|f }| jtks| jt	kr0| j
s| jr0|s0t| jdkr0| jt	krd}|jtdd nd	}|d
||t| jddd | jD ||| jf  ||t d| _n| jjrlt| jD ]"\}}	|d|||	  f  qDnp| jt	krd\}
}n$| jtkrd\}
}ntd| j t| j}|d||
||||| jf  ||t |r2tj}|d|  |dkr|}nd||f }|d||||f  d| _nd}t|D ]}| j| }	|s\|	 sp| |	  |	!  |	"| |d|||r|rd||f p|p||	# |$| jf  q>|r|d |d |d k	rP|jj%rP|dtj||# |tj| jf  |tjt |&|t |d|tjf  |d d S )Nrn  r   z * %sz * ((%s<0) ? 0:%s)z * (%s)Z__Pyx_PyList_PackZListPackr  ZPyTuple_Packz%s = %s(%d, %s); %sr"  c                 s   s   | ]}|  V  qd S rI   r  rN  rP   rP   rQ   r_      s     z>SequenceNode.generate_sequence_packing_code.<locals>.<genexpr>Tz%s.f%s = %s;)Z
PyList_NewZ__Pyx_PyList_SET_ITEM)ZPyTuple_NewZ__Pyx_PyTuple_SET_ITEMz'sequence packing for unexpected type %sz%s = %s(%s%s); %sz{ Py_ssize_t %s;r)   z%s * %szfor (%s=0; %s < %s; %s++) {zif (%s(%s, %s, %s) != (0)) %s;z%s + %sr   z5{ PyObject* %s = PyNumber_InPlaceMultiply(%s, %s); %sr  )'r   r   r   r  rv   rw   rx   r  r   r   r   r  r   r   r   r   r   r   r   rp  r   rz   rd  r   needs_subexpr_disposalr  ro  r   r   r(  r  r+  r=  r   rj  r   r   ri   r  )rS   r   r  plainZsize_factorZc_multr   Z	pack_namerq  r  Zcreate_funcZset_item_func	arg_countcounteroffsetrP   rP   rQ   generate_sequence_packing_code   s    





  


   
   

"


  z+SequenceNode.generate_sequence_packing_codec                    s@   | j rt | n(| jD ]}|| q| jr<| j| d S rI   )r*  rK   rJ  r   rS  r   rQ  rS   r   r  rN   rP   rQ   rJ  5!  s    
z+SequenceNode.generate_subexpr_disposal_codec                 C   sD   | j r| || n| || | jD ]}|| q&|| d S rI   )r   generate_starred_assignment_code!generate_parallel_assignment_coder&  r[  rY  )rS   r   r   rT  r   r   r   rP   rP   rQ   rU  C!  s    
z%SequenceNode.generate_assignment_coder  c                 C   s   | j D ]}|| q|jtkp6|jttfkp6|jj }t| j dk}|r\| j|||d n(|	d | j
||| j |d |	d | jD ]}|| qtt| jD ]}| j| | j| | qd S )N   use_loopr   r   )r&  rZ  r   r   r   r   rf  r   (generate_special_parallel_unpacking_coder   (generate_generic_parallel_unpacking_coder'  rL  r  r   rU  )rS   r   r   r   Zspecial_unpackZlong_enough_for_a_loop
value_noderq  rP   rP   rQ   r2  S!  s:    

  
   


 z.SequenceNode.generate_parallel_assignment_codec              
   C   sF  d}d|   }|jtkr2dg}d}| r|}nR|jtkrTdg}d}| r|}n0d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 ]\}
}|d dkr||  d|
 d ||| | j || |  n.||  d|
 d || |  qft|dkr|d t| jD ]\}
}|d dkrv||  d|
 d ||| | j || |  n.||  d|
 d || |  q|d |d |st| jD ]B\}
}|d| |
|| | jf  || |j qn|d  |d! |d"t| jd#d$d% | jD f  |d&t| j  |d'|d(| j  |d(t |d) |d |d |d* || |dkr|d nr||kr|d |j	t
d+d |d,|| j  |d n(|d | j||| j|d- |d d S ).Nr  zlikely(%s != Py_None)r  r  r  r  Z__Pyx_PySequence_SIZEzlikely(PyTuple_CheckExact(%s))zPyList_CheckExact(%s)z(%s) || (%s)rN  zPyObject* sequence = %s;zPy_ssize_t size = %s(sequence);zif (unlikely(size != %d)) {ZRaiseTooManyValuesToUnpackr  z1if (size > %d) __Pyx_RaiseTooManyValuesError(%d);RaiseNeedMoreValuesToUnpackz9else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);r   r$  r4   z(if (likely(Py%s_CheckExact(sequence))) {r   z% = __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   s   g | ]}d |   qS rD  r   r   rP   rP   rQ   r   !  s     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  ZRaiseNoneIterErrorz%__Pyx_RaiseNoneNotIterableError(); %sr4  )r   r   r   r  r   r   r   r   r   r   r   r   r   rz   ro  r&  r   r   rh  r   r=  rd  rp  r   rQ  r7  )rS   r   r   r5  Zsequence_type_testZ
none_checkr3   Zget_size_funcZtuple_checkZ
list_checkrq  r   rP   rP   rQ   r6  m!  s    


 






 











   z5SequenceNode.generate_special_parallel_unpacking_codeTc              	   C   sN  |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 }	|r6|dt|  |d|	  || |dt
 |d |d nFt|D ]<\}
}|d|
| |	| f  || || q>|r|j tdd || jd|	t|f  |d|  ||t
 |d}|| || ||t
 |d|  |d ||| j || |j| |rJ|j| d }|S )Nr9  r  Z
IterFinishzPy_ssize_t index = -1;r:  r  c                 S   s   g | ]}d |   qS r;  r<  r   rP   rP   rQ   r   !  s     zISequenceNode.generate_generic_parallel_unpacking_code.<locals>.<listcomp>Tr.  r  Fr  r#  Zunpacking_failedry  z$for (index=0; index < %s; index++) {z*PyObject* item = %s; if (unlikely(!item)) r   z*(temps[index]) = item;r   z(index = %d; %s = %s; if (unlikely(!%s)) ZUnpackItemEndCheckz$__Pyx_IternextUnpackEndCheck(%s, %d)r  Zunpacking_donezCif (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);)r   r   r   r   r   r   r&  rp  r3  r4  r   r   r   rz   rd  rQ  r  r  r  r  ro  r   rg  rO  rP  r  r   r;  )rS   r   r   r&  r5  	terminateiterator_tempZiternext_funcZunpacking_error_labelZunpack_coderq  r   Zunpacking_done_labelrP   rP   rQ   r7  !  s    














z5SequenceNode.generate_generic_parallel_unpacking_codec                 C   sf  t | jD ]<\}}|jr
| j| }| jd | }| j|d d  } qPq
dsPtd }|r|D ]}	|	| q\|d | j|||ddd}t |D ]\}}	| j| }
|
	| q|d || |
 }|d||s| r|jttfkrdnd	|p| ||| jf  || |r<||t |j| n
|| |r:|jtd
d |jjtjdd}|d||f  |d|t|f  |dt|||| jf  |d |d d d D ]}	|	| qt t |d d d | jd d d D ]\}\}	}|d |d|	 |||d 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| | qDd S )Nr)   Fr   T)r5  r=  r   r  __Pyx_PySequence_ListKeepNewPySequence_Listr9  r  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);)$ro  r   r~   r&  r   rZ  r   r7  r'  rL  r   r+  r   r   r   r   r   rz   rg  rP  r3  r;  rQ  r   r   r   r   r4  r   r  r   r   r  rd  r  rU  )rS   r   r   rq  r  Zstarred_targetZunpacked_fixed_items_leftZunpacked_fixed_items_rightr>  r   r8  Ztarget_listZlength_tempZcoerced_argZsublist_temprP   rP   rQ   r1  "  s    

   






 


   
   


   

z-SequenceNode.generate_starred_assignment_codec                 C   sL   | j D ]}|| q| jrH| jD ]}|| q"| jD ]}|| q8d S rI   )r   rm  r&  r'  r0  rP   rP   rQ   rm  o"  s    


zSequenceNode.annotate)F)NF)FNN)T)"rU   rV   rW   r   r   r&  r   r  r*  r  r  r   r   r  r%  r"  r  r  rG  r/  rJ  rU  r   rg  r1  r   r2  r  r2  r6  r7  r1  rm  rX   rP   rP   rN   rQ   r  H   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                    s   g | ]}|  qS rP   rM  rN  rr   rP   rQ   r   "  s     z(TupleNode.infer_type.<locals>.<listcomp>c                 s   s&   | ]}|j p|jp|jp|jV  qd S rI   )ri   r   rb  r  )r[   r   rP   rP   rQ   r_   "  s   z'TupleNode.infer_type.<locals>.<genexpr>)r   r   r   re   r  rz   r   )rS   rl   rU  rP   rr   rQ   r   "  s    zTupleNode.infer_typec                 C   sN  | j rd| _ | jrd| _t| jdkr6d| _d| _ | S |sjt| jD ]$\}}|jrXd|_||| j|< qD| j	st
dd | jD s|| jdd | jD j| _d| _| S tj| |dd}||}|js|S td	d |jD s|S |j	r
|j	j rt|j	jtrd|_d|_ n2|j	jjs>|j	jjs>|j	||_	d|_d|_|S )
NFr   Tc                 s   s,   | ]$}|j p"|jjp"|jjp"|jjV  qd S rI   )r~   r   ri   r   r  rN  rP   rP   rQ   r_   "  s   z*TupleNode.analyse_types.<locals>.<genexpr>c                 s   s   | ]}|j V  qd S rI   rs  rN  rP   rP   rQ   r_   "  s     r)   r   c                 s   s   | ]}|j V  qd S rI   )r   )r[   childrP   rP   rQ   r_   "  s     )r   is_partly_literalr   r   r   ro  r~   r  r   r   re   r  rz   r   r  r%  r   r  rv   rw   rx   ri   r  r  )rS   rl   r  rq  r  r|   rP   rP   rQ   r   "  sN    
zTupleNode.analyse_typesc                    sH   | j s
d S  fdd| j D }tdd |D r4d S  | j|}|jS )Nc                    s   g | ]}|  qS rP   )r  rN  rr   rP   rQ   r   "  s     z-TupleNode.analyse_as_type.<locals>.<listcomp>c                 s   s   | ]}|d kV  qd S rI   rP   rZ   rP   rP   rQ   r_   "  s     z,TupleNode.analyse_as_type.<locals>.<genexpr>)r   re   r  rz   r   )rS   rl   r   r   rP   rr   rQ   r  "  s    zTupleNode.analyse_as_typec                    s   | j jr|jr(| j j|jkr(| | S |tks8|tkrl fdd| jD }t| j|t| j	ddj
 ddS |  | S n&|jr| j	s| | S t| | S d S )Nc                    s   g | ]}|  qS rP   )r  rN  rr   rP   rQ   r   "  s     z'TupleNode.coerce_to.<locals>.<listcomp>r)   )r   r   r   r   Tr   )r   r  r  r  r   r   r   r  rz   r   r   r  r  r  r  rP   rr   rQ   r  "  s&     zTupleNode.coerce_toc                 C   s0   t | j| j| jd}t| jtr,t| j|_|S N)r   r   )r  rz   r   r   rv   rw   r   r   rS   r\   rP   rP   rQ   as_list"  s    zTupleNode.as_listc                 C   s   dS r  rP   rR   rP   rP   rQ   r  "  s    zTupleNode.is_simplec                 C   s   dS r  rP   rR   rP   rP   rQ   r  "  s    zTupleNode.nonlocally_immutablec                 C   s   | j S rI   r  rR   rP   rP   rQ   r   "  s    zTupleNode.calculate_result_codec                 C   s   t dd | jD | _d S )Nc                 S   s   g | ]
}|j qS rP   ri  rN  rP   rP   rQ   r   "  s    z7TupleNode.calculate_constant_result.<locals>.<listcomp>)r   r   rw   rR   rP   rP   rQ   r   "  s    z#TupleNode.calculate_constant_resultc              
   C   sF   |  |}z
t|W S  tk
r@ } z| | W 5 d }~X Y nX d S rI   )r  r   r  r   rS   r   rb  r   rP   rP   rQ   r   "  s
    

zTupleNode.compile_time_valuec              
   C   sT  t | jdkr |tj| _d S | js.| jr<t| j	| jr@| j
nd g| j }|jd|d}||}|d k	r|| j | j||| j d ||t | jr|| _n| j
j	jr|jtdd |d|  || j
 ||  | jf  | | n8|d|  || j
 ||  | jf  | | nd	| j	j_| | d S )
Nr   r   rJ  )r+  PySequenceMultiplyr  z*%s = __Pyx_PySequence_Multiply(%s, %s); %sz"%s = PyNumber_Multiply(%s, %s); %sT)r   r   r  r   Zempty_tupler  r   rC  r   r   r   rM  rN  rF  rz   r/  ri  r   r  r   r   r   r   r   r   r   rg  r   r   r|  )rS   r   rK  Ztuple_targetrR  rP   rP   rQ   r)  "  sB     

    
z!TupleNode.generate_operation_codeN)F)rU   rV   rW   r   r   rC  rZ  r   r   r  r  rF  r  r  r   r   r   r)  rP   rP   rP   rQ   r  y"  s   	
+
r  c                   @   st   e Zd Zg ZeZdZdZdd Zdd Z	dd Z
d	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )r  FzConstructing Python listc                 C   s   dS ra  rP   r   rP   rP   rQ   r   #  s    zListNode.type_dependenciesc                 C   s   t S rI   )r   r   rP   rP   rQ   r   ##  s    zListNode.infer_typec                 C   s.   | j D ]}|jrd|_qt| |}||S r  )r   r~   r  r  r  r  )rS   rl   r  r|   rP   rP   rQ   r  '#  s
    
zListNode.analyse_expressionsc              	   C   sN   t dd}t| j| _t| |}W 5 Q R X ||_|jr@d| _|	|}|S )NTr  )
r
   r   r   original_argsr  r   obj_conversion_errorsrt  r  r%  )rS   rl   errorsr|   rP   rP   rQ   r   .#  s    
zListNode.analyse_typesc           	      C   s&  |j r@| jD ]}t| qg | _| j|s<t| jd|  n|jsN|jr|j	t
jk	rt| j}| jrt| jjtr| jjdkrt| jd|  q|| jj9 }nt| jd|  |j	}t
||| _tt| jD ]0}| j| }t|tr|j}|||| j|< qؐn|jr0t| j| t
jd||S | jrJt| jd|  n|jrt| jt|jjkr|t| jd|  ntt| jt|jjk rt| jd| d	 tt | j|jjD ]4\}\}}t|tr|j}||j|| j|< q|| _n*|j!r| "||S t#| _t| jd|  | S )
NzCannot coerce list to type '%s'r   z4Cannot coerce non-positively multiplied list to '%s'z1Cannot coerce dynamically multiplied list to '%s')rr  r   z%Cannot coerce multiplied list to '%s'zToo many members for '%s'zToo few members for '%s'r)   )$ri   rJ  r   r   r  r   rz   r  rx  ry  r   Zc_void_typer   r   r   rv   rw   rx   r  r  rI  r  r  r  r   TypecastNoder   r  r  r  r   ro  r  r  r  r0   )	rS   r  rl   rm   rC  ry  rq  r  rb  rP   rP   rQ   r  8#  sP    




 zListNode.coerce_toc                 C   s   | S rI   rP   rR   rP   rP   rQ   rF  g#  s    zListNode.as_listc                 C   s0   t | j| j| jd}t| jtr,t| j|_|S rD  )r  rz   r   r   rv   rw   r   r   rE  rP   rP   rQ   as_tuplej#  s    zListNode.as_tuplec                 C   sP   | j jr@| jr(|jj| j dddd| _qL|jj| j ddd| _nt| | d S )NFT)r/  Zstaticreusable)r/  rN  )r   r  r  r3  r4  r   r  r6  r>  rP   rP   rQ   r6  p#  s       
  
zListNode.allocate_temp_resultc                 C   s"   | j rt dd | jD | _d S )Nc                 S   s   g | ]
}|j qS rP   ri  rN  rP   rP   rQ   r   #  s    z6ListNode.calculate_constant_result.<locals>.<listcomp>)r   r   r   rw   rR   rP   rP   rQ   r   ~#  s
    z"ListNode.calculate_constant_resultc                 C   s$   |  |}| jr || j|9 }|S rI   )r  r   r   )rS   r   lrP   rP   rQ   r   #  s    
zListNode.compile_time_valuec              
   C   sp  | j jr*| jD ]}t| q| | nB| j jr| jr|d |dtj	  |dj
tj	| j d dt| jtj	f }nd}t| jD ]h\}}|j jr|jtdd |d	|  ||| |  f  q|d
|  ||| f  q| jrl|d |d nP| j jrdt| j| j jjD ](\}}|d|  |j| f  q8ntdd S )Nr   zPy_ssize_t %s;z&for ({i} = 0; {i} < {count}; {i}++) {{)rq  countz+ (%d * %s)rn  r@  rg  z'memcpy(&(%s[%s%s]), %s, sizeof(%s[0]));z%s[%s%s] = %s;r   r  zList type never specified)r   ri   rJ  r   r/  r  r   r   r   r(  r   r   r   r   ro  r   r   r   r   r  r  r  r  r   r   )rS   r   rm   r.  rq  r  rb  rP   rP   rQ   r)  #  sR    



    



z ListNode.generate_operation_codeN)rU   rV   rW   rJ  r   r   r  rZ  r  r   r  r   r  rF  rM  r6  r   r   r)  rP   rP   rP   rQ   r  #  s   
/r  c                   @   sb   e Zd ZdgZdZeZdd Zdd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd ZdS )ComprehensionNodeloopTc                 C   s   | j S rI   rs  r   rP   rP   rQ   r   #  s    zComprehensionNode.infer_typec                 C   sh   | | j _| | t| jtjrLt| jjts:t	| jj| jjd | nt| jtj
sdt	| jd S rI   )r   r  r  rv   rR  r   _ForInStatNoderA  r  r   ForFromStatNoder   rP   rP   rQ   r  #  s    
z&ComprehensionNode.analyse_declarationsc                 C   s   | j | d S rI   )rR  r  r   rP   rP   rQ   r  #  s    z-ComprehensionNode.analyse_scoped_declarationsc                 C   s   | j s| j|| _| S rI   r  rR  r  r   rP   rP   rQ   r   #  s    zComprehensionNode.analyse_typesc                 C   s   | j r| j|| _| S rI   rU  r   rP   rP   rQ   r  #  s    z,ComprehensionNode.analyse_scoped_expressionsc                 C   s   dS r&  rP   rR   rP   rP   rQ   r  #  s    zComprehensionNode.may_be_nonec                 C   s   |  | d S rI   r(  r>  rP   rP   rQ   rG  #  s    z&ComprehensionNode.generate_result_codec              	   C   s   | j tjkrd}n2| j tjkr$d}n | j tjkr6d}ntd| j  |d|  |||  | j	f  | 
| | j| d S )NzPyList_New(0)zPySet_New(NULL)zPyDict_New()z"illegal type for comprehension: %sr  )r   r   r   r   r   r   r   r   r   rz   rg  rR  generate_execution_code)rS   r   Zcreate_coderP   rP   rQ   r)  #  s     
z)ComprehensionNode.generate_operation_codec                 C   s   | j | d S rI   )rR  rm  r>  rP   rP   rQ   rm  #  s    zComprehensionNode.annotateN)rU   rV   rW   r   r   r   rw   r   r  r  r   r  r  rG  r)  rm  rP   rP   rP   rQ   rQ  #  s   
rQ  c                   @   s<   e Zd ZdgZdZejZdd Zdd Z	dd Z
d	d
 ZdS )ComprehensionAppendNoder*  Nc                 C   s*   | j || _ | j jjs&| j || _ | S rI   )r*  r  r   ri   r  r   rP   rP   rQ   r  #  s    
z+ComprehensionAppendNode.analyse_expressionsc              	   C   s   | j jtkr&|jtdd d}n"| j jtkr8d}ntd| j j | j	
| ||d|| j  | j	 f | j | j	| | j	| d S )NListCompAppend
Optimize.c__Pyx_ListComp_Append	PySet_Addz'Invalid type for comprehension node: %sz%s(%s, (PyObject*)%s))r  r   r   r   r   r   r   r   r   r*  rL  r   r   r   rz   rQ  rY  r  rP   rP   rQ   rV  #  s(    


z/ComprehensionAppendNode.generate_execution_codec                 C   s   | j || d S rI   )r*  r\  r[  rP   rP   rQ   r\  $  s    z5ComprehensionAppendNode.generate_function_definitionsc                 C   s   | j | d S rI   )r*  rm  r>  rP   rP   rQ   rm  $  s    z ComprehensionAppendNode.annotate)rU   rV   rW   r   r  r   r  r   r  rV  r\  rm  rP   rP   rP   rQ   rW  #  s   rW  c                   @   s4   e Zd ZddgZdd Zdd Zdd Zd	d
 ZdS )DictComprehensionAppendNodekey_expr
value_exprc                 C   sP   | j || _ | j jjs&| j || _ | j|| _| jjjsL| j|| _| S rI   )r]  r  r   ri   r  r^  r   rP   rP   rQ   r  $  s    

z/DictComprehensionAppendNode.analyse_expressionsc              	   C   s|   | j | | j| ||d| j | j  | j f | j | j | | j 	| | j| | j	| d S )Nz0PyDict_SetItem(%s, (PyObject*)%s, (PyObject*)%s))
r]  rL  r^  r   r   r  r   rz   rQ  rY  r>  rP   rP   rQ   rV  #$  s    
z3DictComprehensionAppendNode.generate_execution_codec                 C   s    | j || | j|| d S rI   )r]  r\  r^  r[  rP   rP   rQ   r\  0$  s    z9DictComprehensionAppendNode.generate_function_definitionsc                 C   s   | j | | j| d S rI   )r]  rm  r^  r>  rP   rP   rQ   rm  4$  s    z$DictComprehensionAppendNode.annotateN)rU   rV   rW   r   r  rV  r\  rm  rP   rP   rP   rQ   r\  $  s
   	r\  c                       sT   e Zd ZdgZdZdZdZeZd fdd	Z	dd Z
dd	 Zd
d Zdd Z  ZS )InlinedGeneratorExpressionNodegenNTc                    sf   |j j}d|_|d k	rJ|tttfks,t|||_|jt	||t
j|d t j|fd|i| d S )NT)r  r   r`  )r  gbodyZ
is_inlinedr   r   r   r   Zinlined_comprehension_typer  r^  r   retval_cnamerK   r  )rS   rz   r`  Zcomprehension_typer  ra  rN   rP   rQ   r  J$  s    z'InlinedGeneratorExpressionNode.__init__c                 C   s
   | j dkS )N)re   r  r  )	orig_funcrR   rP   rP   rQ   r  V$  s    z*InlinedGeneratorExpressionNode.may_be_nonec                 C   s   | j S rI   rs  r   rP   rP   rQ   r   Y$  s    z)InlinedGeneratorExpressionNode.infer_typec                 C   s   | j || _ | S rI   )r`  r  r   rP   rP   rQ   r   \$  s    z,InlinedGeneratorExpressionNode.analyse_typesc              	   C   s:   | d|  | j ||  | jf  | | d S )Nz-%s = __Pyx_Generator_GetInlinedResult(%s); %s)r   r   r`  r   rz   rg  r>  rP   rP   rQ   rG  `$  s     z3InlinedGeneratorExpressionNode.generate_result_code)N)rU   rV   rW   r   rc  r  r   r   r   r  r  r   r   rG  rX   rP   rP   rN   rQ   r_  9$  s   r_  c                   @   sf   e Zd ZdZdgZdZdZdd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )r#  z
    Merge a sequence of iterables into a set/list/tuple.

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

    args    [ExprNode]
    r   TzConstructing Python collectionc                 C   sd   |t tfkrN|rN|d jrN|d jt k	rNt|d j|d jd|d jd|d< tj	| |||d d S )Nr   T)r   r   r   )r   r   )
r   r   r   r   r  rz   r   r   r   r  )rS   rz   r   r   rP   rP   rQ   r  s$  s    &zMergedSequenceNode.__init__c                 C   s   g }| j D ]L}|jr(|jr(|jjdkr(q
|js4|jrFdd |j D }n|j}|| q
| jtkrlt|}n"| jt	krt
|}n| jtkst|| _d S )Nr   c                 s   s   | ]}|j V  qd S rI   ri  rN  rP   rP   rQ   r_   $  s     z?MergedSequenceNode.calculate_constant_result.<locals>.<genexpr>)r   r   r   rw   r  r   r   r   rj  r   r   r   r   )rS   r   r   r  rP   rP   rQ   r   z$  s    




z,MergedSequenceNode.calculate_constant_resultc              
      s   g }| j D ]X}|jr,|jr,|j dkr,q
|js8|jrN fdd|j D }n
| }|| q
| jtkrzt|}W q t	k
r } z| 
| W 5 d }~X Y qX n"| jtkrt|}n| jtkst|S )Nr   c                 3   s   | ]}|  V  qd S rI   rg  rN  rh  rP   rQ   r_   $  s     z8MergedSequenceNode.compile_time_value.<locals>.<genexpr>)r   r   r   r   r  r   r   r   rj  r  r   r   r   r   r   )rS   r   r   r   r  r   rP   rh  rQ   r   $  s$    




z%MergedSequenceNode.compile_time_valuec                 C   s   dS ra  rP   r   rP   rP   rQ   r  $  s    z$MergedSequenceNode.type_dependenciesc                 C   s   | j S rI   rs  r   rP   rP   rQ   r   $  s    zMergedSequenceNode.infer_typec                    sV    fdd| j D }t|dkr8|d j| jkr8|d S | jtttfksLt|| _ | S )Nc                    s"   g | ]}|   d qS )z2argument after * must be an iterable, not NoneTyper  rN  rr   rP   rQ   r   $  s   z4MergedSequenceNode.analyse_types.<locals>.<listcomp>r)   r   )r   r   r   r   r   r   r   )rS   rl   r   rP   rr   rQ   r   $  s    
z MergedSequenceNode.analyse_typesc                 C   s   dS r&  rP   rR   rP   rP   rQ   r  $  s    zMergedSequenceNode.may_be_nonec           
   
   C   s  | | j | | | jtk}t| j}t|}|| |rF|j	sZ|s|j
r|jtkr|d|  | f  || nb|d|  |rdn| r|jttfkrdnd| ||  | jf  | | || || t }|rd}d}nd}d	}|D ]}|r(|j	s8|j
s8|j
r|js|sP|jrP|d
 |jD ]D}|| ||jd||  | f  || || qVq|r|d n
|d || ||jd||  | f  || || q| jtkrx|d |dtj|  f  ||  t |d|  tj||  | jf  | | |d t|D ]}	|j t!j"|	  qd S )Nr  r  Z	PySet_Newr?  r@  r[  Z__Pyx_PySet_UpdaterZ  Z__Pyx_PyList_Extend)rX  rY  r  )ZPySet_Updatez
Builtins.c)Z
ListExtendrY  r   z"PyObject *%s = PyList_AsTuple(%s);r  r   )#rF  rz   r6  r   r   r  r   r  rL  r  r   r   r   r   r   rS  r+  r   r   rg  rQ  rY  rj  r   rm  rO  r   r   r(  r  r  r   r   r   r   )
rS   r   is_setr   r   r  Zadd_funcZextend_funcr  r  rP   rP   rQ   rL  $  s    



















z+MergedSequenceNode.generate_evaluation_codec                 C   s   | j D ]}|| qd S rI   )r   rm  r  rP   rP   rQ   rm  %  s    
zMergedSequenceNode.annotateN)rU   rV   rW   r  r   r   rZ  r  r   r   r  r   r   r  rL  rm  rP   rP   rP   rQ   r#  g$  s   Mr#  c                   @   sJ   e Zd ZdZdgZeZdZdZdd Z	dd Z
d	d
 Zdd Zdd ZdS )SetNodez
    Set constructor.
    r   TzConstructing Python setc                 C   sH   t t| jD ](}| j| }||}||| j|< qt| _d| _| S r  )r  r   r   r   r  r   r   r   )rS   rl   rq  r  rP   rP   rQ   r   %  s    

zSetNode.analyse_typesc                 C   s   dS r&  rP   rR   rP   rP   rQ   r  $%  s    zSetNode.may_be_nonec                 C   s   dd | j D | _d S )Nc                 S   s   h | ]
}|j qS rP   ri  rN  rP   rP   rQ   r   (%  s     z4SetNode.calculate_constant_result.<locals>.<setcomp>)r   rw   rR   rP   rP   rQ   r   '%  s    z!SetNode.calculate_constant_resultc              
      sP    fdd| j D }z
t|W S  tk
rJ } z| | W 5 d }~X Y nX d S )Nc                    s   g | ]}|  qS rP   rg  rN  rh  rP   rQ   r   +%  s     z.SetNode.compile_time_value.<locals>.<listcomp>)r   rj  r  r   rG  rP   rh  rQ   r   *%  s
    
zSetNode.compile_time_valuec                 C   s   | j D ]}|| q| | |d|  ||  | jf  | | | j D ]6}|| jd|  |	 f  |
| || qTd S )Nz%s = PySet_New(0); %szPySet_Add(%s, %s))r   rL  r6  r   r   r   rz   rg  rO  r   rQ  rY  r0  rP   rP   rQ   rL  1%  s"    




z SetNode.generate_evaluation_codeN)rU   rV   rW   r  r   r   r   r  rZ  r   r  r   r   rL  rP   rP   rP   rQ   re  %  s   	re  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 rZ  )r_  )r[   krc  rz   rP   rQ   r   U%  s    z'DictNode.from_pairs.<locals>.<listcomp>r\  rP   )rM   rz   pairsrP   rh  rQ   
from_pairsS%  s    zDictNode.from_pairsc                 C   s   t dd | jD | _d S )Nc                 S   s   g | ]
}|j qS rP   ri  r   rP   rP   rQ   r   Y%  s    z6DictNode.calculate_constant_result.<locals>.<listcomp>)r  r]  rw   rR   rP   rP   rQ   r   X%  s    z"DictNode.calculate_constant_resultc              
      sP    fdd| j D }z
t|W S  tk
rJ } z| | W 5 d }~X Y nX d S )Nc                    s$   g | ]}|j  |j fqS rP   )r[  r   r   r   rh  rP   rQ   r   ]%  s   z/DictNode.compile_time_value.<locals>.<listcomp>)r]  r  r  r   )rS   r   ri  r   rP   rh  rQ   r   \%  s    

zDictNode.compile_time_valuec                 C   s   dS ra  rP   r   rP   rP   rQ   r  d%  s    zDictNode.type_dependenciesc                 C   s   t S rI   r  r   rP   rP   rQ   r   g%  s    zDictNode.infer_typec              	      s6   t dd} fdd| jD | _W 5 Q R X || _| S )NTr  c                    s   g | ]}|  qS rP   r  r   rr   rP   rQ   r   m%  s   z*DictNode.analyse_types.<locals>.<listcomp>)r
   r]  rJ  )rS   rl   rK  rP   rr   rQ   r   k%  s    
zDictNode.analyse_typesc                 C   s   dS r&  rP   rR   rP   rP   rQ   r  t%  s    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|sxt| j	d|  n$|jr|| _|jst| jdkrt| j	d	|  n.|jrt| jt|jjk rt| j	d
| d | jD ]}t|jtr|jj|_|jjs0t|jj	d t|jj	tdd|_qt|jj}|j|}|sft|jj	d||f  q|j}t|tr~|j}||j |_qnt | S | S )NTrC  z-Cannot interpret struct as non-dict type '%s'c                    s,   g | ]$}t |j|j |j d qS rf  )r_  rz   r[  r  r   r   rr   rP   rQ   r   ~%  s   
z&DictNode.coerce_to.<locals>.<listcomp>r\  z"Cannot interpret dict as type '%s'r)   z<Exactly one field must be specified to convert to union '%s'z%Not all members given for struct '%s'zInvalid struct field identifierr  r  zstruct '%s' has no field '%s')r   rE  ri   release_errorsr   rR  r   r  r   rz   r`  r]  r  r   r  r  r   rv   r[  r  r  r  r  r   r  rp   r   rs  r  rK   )rS   r  rl   r   r[  rb  r   rN   rr   rQ   r  w%  sB    




zDictNode.coerce_toc                 C   s   | j D ]}t| qg | _ d S rI   )rJ  r   )rS   rm   rP   rP   rQ   rk  %  s    

zDictNode.release_errorsr  c                 C   s  | | j | | | jj}|rf|   |d|  t| j	|
|  | jf  | | d }n| jj}t }d }d}| j	D ]}|| |r| jr|d|j   |j}| jrz|d k	r*|jsd }nT|j|krd }nD|t|jk	r|d krt|j}||j nd }n||j |d krz|d|  | f  d}|d| ||jf  |d || jd|  |j |j f  | jr|d kr|d	 | jrx|d	 n||jj}	|	d k	std
|jj d|	j}
|j }|jjjrX|jtdd |d|   d|
 d| d| d	 n ||   d|
 d| d | | |!| q|r|jtdd d S )Nz%%s = __Pyx_PyDict_NewPresized(%d); %sFrN  r  Tr  r  r  r   zstruct member z1 not found, error was not handled during coercionr@  rg  zmemcpy(r  r"  r  r%  r,  r'  r  r  )"rF  rz   r6  r   ri   rk  r   r   r   r]  r   rg  r  rj  rL  exclude_null_valuesr   r   r[  r  r  rm  r   rO  rs  r   r   r  r   r   r   r   rQ  rY  )rS   r   Zis_dictZstruct_scopeZ	keys_seenZkey_typeZneeds_error_helperr   r[  rb  Z	key_cnamevalue_cnamerP   rP   rQ   rL  %  s    







 




* 

z!DictNode.generate_evaluation_codec                 C   s   | j D ]}|| qd S rI   )r]  rm  r  rP   rP   rQ   rm  %  s    
zDictNode.annotatec                 C   s   dd | j D S )Nc                 S   s   i | ]\}}|j |qS rP   r  r  rP   rP   rQ   r  %  s      z+DictNode.as_python_dict.<locals>.<dictcomp>r\  rR   rP   rP   rQ   as_python_dict%  s    zDictNode.as_python_dict)rU   rV   rW   r   r   rl  r   r   r  r  rJ  r  rj  r   r   r  r   r   r  r  rk  rZ  rL  rm  rn  rX   rP   rP   rN   rQ   r`  B%  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 rI   )r[  rw   r   rR   rP   rP   rQ   r   
&  s     z&DictItemNode.calculate_constant_resultc                 C   s<   | j || _ | j|| _| j || _ | j|| _| S rI   )r[  r   r   r  r   rP   rP   rQ   r   &  s
    zDictItemNode.analyse_typesc                 C   s   | j | | j| d S rI   )r[  rL  r   r>  rP   rP   rQ   rL  &  s    z%DictItemNode.generate_evaluation_codec                 C   s   | j | | j| d S rI   )r[  rQ  r   r>  rP   rP   rQ   rQ  &  s    z#DictItemNode.generate_disposal_codec                 C   s   | j | | j| d S rI   )r[  rY  r   r>  rP   rP   rQ   rY  &  s    zDictItemNode.free_tempsc                 C   s   t | j| jgS rI   )r  r[  r   rR   rP   rP   rQ   __iter__!&  s    zDictItemNode.__iter__)rU   rV   rW   r   r$  r   r   rL  rQ  rY  ro  rP   rP   rP   rQ   r_  &  s   r_  c                   @   s6   e Zd ZdgZdZdd Zdd Zdd Zd	d
 ZdS )SortedDictKeysNoder  Tc                 C   s   t j| |j|d tj| _d S r  )r   r  rz   r   r   r   rS   r  rP   rP   rQ   r  +&  s    zSortedDictKeysNode.__init__c                 C   s,   | j |}|jtjkr"|d}|| _ | S r  )r  r   r   r   r   r  r  rP   rP   rQ   r   /&  s    z SortedDictKeysNode.analyse_typesc                 C   s   dS r&  rP   rR   rP   rP   rQ   r  7&  s    zSortedDictKeysNode.may_be_nonec              
   C   s  | j  }| j jtjkrJ|d|  |||  | jf  | 	| n|j
tdd |td}|d|  ||||  | jf  | 	| |d|    | |d|    |||  | j | 	| |d || jd	|    d S )
Nz%s = PyDict_Keys(%s); %sZPyObjectCallMethod0r  keysz+%s = __Pyx_PyObject_CallMethod0(%s, %s); %sz"if (unlikely(!PyList_Check(%s))) {zPySequence_List(%s)r   zPyList_Sort(%s))r  r   r   r   r   r   r   r   rz   rg  r   r   r   r   rQ  r   r  r_  rO  )rS   r   Zdict_resultZ
keys_cnamerP   rP   rQ   rG  :&  s:    
 
   


 
z'SortedDictKeysNode.generate_result_codeN)	rU   rV   rW   r   r   r  r   r  rG  rP   rP   rP   rQ   rp  %&  s   rp  c                   @   s   e Zd ZdZeZdd ZdS )SortedListNodez0Sorts a newly created Python list in place.
    c                 C   s&   | |d| j  d| j d S )NzPyList_Sort(r  )r   r  r  r   rz   r>  rP   rP   rQ   rG  X&  s    z#SortedListNode.generate_result_codeN)rU   rV   rW   r  r   r   rG  rP   rP   rP   rQ   rs  S&  s   rs  c                   @   s   e Zd Zdd Zdd ZdS )ModuleNameMixinc                 C   s   |j | jddS NT
identifier)r<  r  r>  rP   rP   rQ   get_py_mod_name]&  s     zModuleNameMixin.get_py_mod_namec                 C   s   |j | jddS ru  )r<  qualnamer>  rP   rP   rQ   get_py_qualified_namea&  s     z%ModuleNameMixin.get_py_qualified_nameN)rU   rV   rW   rx  rz  rP   rP   rP   rQ   rt  \&  s   rt  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 )r  docTc                 C   s   d S rI   rP   r   rP   rP   rQ   r   t&  s    zClassNode.analyse_annotationsc                 C   s   t S rI   rH  r   rP   rP   rQ   r   w&  s    zClassNode.infer_typec                 C   s8   | j r"| j || _ | j || _ |tdd | S )NZCreateClassr  )r{  r   r  r   r   r   r   rP   rP   rQ   r   {&  s
    zClassNode.analyse_typesc                 C   s   dS r  rP   rR   rP   rP   rQ   r  &  s    zClassNode.may_be_noneConstructing Python classc                 C   s   | j }|| j}| jrH|| jd|j |t	d| j f  | 
|}| |}|d|  |j |j |||||  | jf  | | d S )Nr  r  z.%s = __Pyx_CreateClass(%s, %s, %s, %s, %s); %s)class_def_noderQ  rj   r{  rO  rz   r  r   r   r  rx  rz  r   r   basesr   rg  )rS   r   r}  r   py_mod_namery  rP   rP   rQ   rG  &  s4    

	zClassNode.generate_result_codeN)rU   rV   rW   r   r   r   r   r   r   r   r  rZ  rG  rP   rP   rP   rQ   r  f&  s   
r  c                   @   sH   e Zd Zg ZeZdZdZdd Zdd Z	dd Z
d	Zd
d Zdd ZdS )r  FTc                 C   s   t S rI   rH  r   rP   rP   rQ   r   &  s    zPy3ClassNode.infer_typec                 C   s   | S rI   rP   r   rP   rP   rQ   r   &  s    zPy3ClassNode.analyse_typesc                 C   s   dS r  rP   rR   rP   rP   rQ   r  &  s    zPy3ClassNode.may_be_noner|  c                 C   s   ddl m} | jj}dd |j D }|rt||d}t|t	dd}|
|jpd||jt||_t|||d}|| | jjjd	| d S )
Nr)   AnnotationWriterc                 S   s2   g | ]*}|j rt|jt|j|jd |j jdqS r  rZ  )r  r_  rz   rS  rj   stringr[   r   rP   rP   rQ   r   &  s    z4Py3ClassNode.analyse_annotations.<locals>.<listcomp>r\  __annotations__rh  r  r   r   )AutoDocTransformsr  r}  rz   r  rb  r`  r~  r   r  rs  rj   rz  r   r   r-   r  bodyr)  insert)rS   rl   r  position
dict_itemsannotations_dictr  r|   rP   rP   rQ   r   &  s    	
z Py3ClassNode.analyse_annotationsc                 C   s   |j tdd || j}| j}|jr6|j nd}|j	rL|j	 }n| j
rXd}nd}|d|  |||j |j || j| j||  | jf	  | | d S )NZPy3ClassCreater  r  z((PyObject*)&PyType_Type)z$((PyObject*)&__Pyx_DefaultClassType)z9%s = __Pyx_Py3ClassCreate(%s, %s, %s, %s, %s, %d, %d); %s)r   r   r   r   rQ  rj   r}  mkwr   	metaclass
force_typer   r   r~  r  Zcalculate_metaclassZallow_py2_metaclassr   rz   rg  )rS   r   r   r}  r  r  rP   rP   rQ   rG  &  s.    z!Py3ClassNode.generate_result_codeN)rU   rV   rW   r   r   r   r  r   r   r   r  rZ  r   rG  rP   rP   rP   rQ   r  &  s   r  c                   @   s(   e Zd Zg Zdd Zdd Zdd ZdS )PyClassMetaclassNodec                 C   s   t | _d| _| S r  )r   r   r   r   rP   rP   rQ   r   &  s    z"PyClassMetaclassNode.analyse_typesc                 C   s   dS r  rP   rR   rP   rP   rQ   r  &  s    z PyClassMetaclassNode.may_be_nonec              	   C   s   | j j}| j j}|r>|jtdd d| | f }n |jtdd d|  }|d|  ||	|  | j
f  | | d S )NZPy3MetaclassGetr  z__Pyx_Py3MetaclassGet(%s, %s)ZCalculateMetaclassz"__Pyx_CalculateMetaclass(NULL, %s)r  )r}  r~  r  r   r   r   r   r   r   r   rz   rg  )rS   r   r~  r  r7  rP   rP   rQ   rG  &  s0    

 z)PyClassMetaclassNode.generate_result_codeNrU   rV   rW   r   r   r  rG  rP   rP   rP   rQ   r  &  s   r  c                   @   s*   e Zd ZdgZdd Zdd Zdd ZdS )	PyClassNamespaceNoder{  c                 C   s*   | j r| j ||| _ t| _d| _| S r  )r{  r   r  r   r   r   r   rP   rP   rQ   r   '  s
    z"PyClassNamespaceNode.analyse_typesc                 C   s   dS r  rP   rR   rP   rP   rQ   r  '  s    z PyClassNamespaceNode.may_be_nonec           
      C   s   | | j}| |}| |}| j}d}| jr:| j n|}|jrN|j n|}|j	rb|j	 n|}	|
d|  |	|j |||||||  | jf	  | | d S )Nz(PyObject *) NULLz>%s = __Pyx_Py3MetaclassPrepare(%s, %s, %s, %s, %s, %s, %s); %s)rQ  rj   rx  rz  r}  r{  r   r  r   r  r   r~  r   rz   rg  )
rS   r   r   r  ry  r}  nullZdoc_coder  r  rP   rP   rQ   rG  !'  s,    

z)PyClassNamespaceNode.generate_result_codeNr  rP   rP   rP   rQ   r  '  s   r  c                   @   s4   e Zd ZdZeZg ZdZdd Zdd Z	dd Z
d	S )
ClassCellInjectorNodeTFc                 C   s   | S rI   rP   r   rP   rP   rQ   r  ?'  s    z)ClassCellInjectorNode.analyse_expressionsc                 C   s<   | j s
t|d|  ||  | jf  | | d S )Nz%s = PyList_New(0); %s)	is_activer   r   r   r   rz   rg  r>  rP   rP   rQ   rG  B'  s    
z*ClassCellInjectorNode.generate_result_codec                 C   s<   | j s
t|jtdd || jd|  |f  d S )NZCyFunctionClassCellCythonFunction.cz&__Pyx_CyFunction_InitClassCell(%s, %s))	r  r   r   r   r   r   rO  rz   r   )rS   r   Zclassobj_cnamerP   rP   rQ   generate_injection_codeJ'  s    


 z-ClassCellInjectorNode.generate_injection_codeN)rU   rV   rW   r   r   r   r   r  r  rG  r  rP   rP   rP   rQ   r  8'  s   r  c                   @   s,   e Zd Zg ZdZdZeZdd Zdd Z	dS )ClassCellNodeTFc                 C   s   | S rI   rP   r   rP   rP   rQ   r   Y'  s    zClassCellNode.analyse_typesc                 C   sj   | j s |d|  tjf  n|d|  tjf  |d|  || jf  ||  t	 d S )Nz&%s = __Pyx_CyFunction_GetClassObj(%s);z%s =  %s->classobj;zUif (!%s) { PyErr_SetString(PyExc_RuntimeError, "super(): empty __class__ cell"); %s })
is_generatorr   r   r   
self_cnamegenerator_cnamer   rz   r=  r   r>  rP   rP   rQ   rG  \'  s"    
 
z"ClassCellNode.generate_result_codeN)
rU   rV   rW   r   r   r  r   r   r   rG  rP   rP   rP   rQ   r  R'  s   r  c                   @   s   e Zd Zdddg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 )r  defaults_tupledefaults_kwdictr  FNr)   c                 C   s    | |j ||jj|p|j|jdS )N)r  pymethdef_cnamebindingspecialized_cpdefs)rz   r   r  r  )rM   r|   r  rP   rP   rQ   from_defnode'  s    zPyCFunctionNode.from_defnodec                 C   s   | j jS rI   )r  code_objectrR   rP   rP   rQ   r  '  s    zPyCFunctionNode.code_objectc                 C   s   | j r| | | S rI   )r  analyse_default_argsr   rP   rP   rQ   r   '  s    
zPyCFunctionNode.analyse_typesc                 C   s  g }g }g }g }g }|j p&| jjo&|j}| jjD ]}|jr|s|jjrrt|j|j|_|jj	r|j
|j	||_n$d|_|j	jr|| n
|| |jj	r|jj	|r|jr|| n
|| |jr0|j||_||j|j|jjf q0| jj| jjfD ]:}|r|jr|j||_||j|j|jjf q| jj}	|	rx|	|| j_||	jtd|	jf |s|rv| }
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 |_+qN|j| j_,|s|r| jdkr|rt-| jdd |D d	}||.|| _/|rt0| jd
d |D d}||| _1n| j2s|rt3| j|| jj	j}n
t4| j}|r4t5| 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 )zB
        Handle non-literal function's default arguments.
        Tr  c                 S   s   g | ]
}|j qS rP   rs  rN  rP   rP   rQ   r   '  s     z8PyCFunctionNode.analyse_default_args.<locals>.<listcomp>c                 S   s   g | ]\}}| d r|qS r  )r  )r[   rj   r   rP   rP   rQ   r   '  s     
 r  Nc                 S   s   g | ]
}|j qS rP   )rk   rN  rP   rP   rQ   r   '  s    r  c                 S   s*   g | ]"}t |jt|j|jd |jdqS r  )r_  rz   rS  rj   rk   rN  rP   rP   rQ   r   '  s   r\  )r	  r   __defaults__)r   r  r  r  Z
decoratorsrj   Fc                 S   s(   g | ] \}}}t |t||d |dqS r  )r_  rS  )r[   rz   rj   r   rP   rP   rQ   r   (  s    
)Dry  r  Z
is_wrapperrt  r   rk   r   DefaultLiteralArgNoderz   r   r  Z
is_dynamicri   r   rx  Zkw_onlyr  r   rj   r  r  r  Zreturn_type_annotationr   r  r%  r  r  Zdeclare_defaults_c_classdefaults_entryr  r  r   r  r  defaultsr  r   defaults_class_keyr   Zdefaults_pyobjectsr   Zdynamic_args_cnamer(  defaults_structr  r  r  r`  r  r  DefaultsTupleNoder  DefaultsKwDictNoder   ZDefNodeZReturnStatNoder   ZCompilerDirectivesNodeZfor_internalr  r  r  local_scopepy_wrapper_requiredpymethdef_requireddefaults_getterr  )rS   rl   Znonliteral_objectsZnonliteral_otherZdefault_argsZdefault_kwargsannotationsZmust_use_constantsr  r  r  r  r   Zdefaults_class_scopeZarg_entriesr   r  r  r  Zdirectives_noder  rP   rP   rQ   r  '  s    



 


  
  
     	


z$PyCFunctionNode.analyse_default_argsc                 C   s   dS r&  rP   rR   rP   rP   rQ   r  (  s    zPyCFunctionNode.may_be_nonezConstructing Python functionc                 C   s   dS )Nr  rP   rR   rP   rP   rQ   closure_result_code!(  s    z#PyCFunctionNode.closure_result_codec                 C   s    | j r| | n
| | d S rI   )r  generate_cyfunction_codegenerate_pycfunction_coder>  rP   rP   rQ   rG  $(  s    z$PyCFunctionNode.generate_result_codec                 C   sH   |  |}|d|  | j|  |||  | jf  | | d S )Nz'%s = PyCFunction_NewEx(&%s, %s, %s); %s)rx  r   r   r  r  r   rz   rg  )rS   r   r  rP   rP   rQ   r  *(  s    
z)PyCFunctionNode.generate_pycfunction_codec           
      C   sx  | j r| j d }n| j}| j s$| jr>|jtdd d}n|jtdd d}g }|jrl|d n|j	r||d |j
jjr|jjs|d	 |jr|d
 |rd|}nd}|tj}| j| |d|  || j|| ||  | ||| j ||  | jf
  | | |j rh|j!sBt"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 st| j-r,|d|  | j- f  |j.rP|d|  |j.jj/f  | j0rt|d|  | j0 f  d S )Nr   ZFusedFunctionr  Z__pyx_FusedFunction_NewZCythonFunctionZ__Pyx_CyFunction_NewZ__Pyx_CYFUNCTION_STATICMETHODZ__Pyx_CYFUNCTION_CLASSMETHODZ__Pyx_CYFUNCTION_CCLASSZ__Pyx_CYFUNCTION_COROUTINEri  r  z(%s = %s(&%s, %s, %s, %s, %s, %s, %s); %szpyclass_stack is emptyr  zPyList_Append(%s, %s);z.if (!__Pyx_CyFunction_InitDefaults(%s, %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);)1r  r  is_specializationr   r   r   r   Zis_staticmethodr   Zis_classmethodr  r  ry  r   Zis_anonymousis_coroutinerp  r  r   r  r  rG  r   r   r  rz  r  rx  r   r   rz   rg  Zrequires_classobjZpyclass_stackr   Z
class_cellr  r  r   r  r   Zobjstruct_cnamerU  r   r  r  r  r  r  )
rS   r   r  r^  flagsr  Z
class_noder  r  r   rP   rP   rQ   r  6(  s    







      z(PyCFunctionNode.generate_cyfunction_code)rU   rV   rW   r   r  r  r  r  r  r  r  r   r   r   r  r  r  r  r  r  r   r  r  rZ  r  rG  r  r  rP   rP   rP   rQ   r  l'  s2   


	
 r  c                   @   s   e Zd ZdZdZdd ZdS )InnerFunctionNodeTc                 C   s   | j rdtj S dS )Nz((PyObject*)%s)r  )needs_closure_coder   cur_scope_cnamerR   rP   rP   rQ   r  (  s    
z%InnerFunctionNode.closure_result_codeN)rU   rV   rW   r  r  r  rP   rP   rP   rQ   r  (  s   r  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 rI   )r   rj   r  r  r   rz   _cfuncdef_node)rS   cfuncdef_noderP   rP   rQ   r  (  s
    

zDefFuncLikeNode.__init__c                 C   s   | j jS rI   )r  node_positionsrR   rP   rP   rQ   r  (  s    zDefFuncLikeNode.node_positionsc                 C   s   | j jS rI   )r  node_positions_to_offsetrR   rP   rP   rQ   r  (  s    z(DefFuncLikeNode.node_positions_to_offset)rU   rV   rW   r  r  r  is_asyncgenis_generator_expressionnum_posonly_argsr  r  r  r  r  r  r  rP   rP   rP   rQ   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 rP   rh  rN  rP   rP   rQ   r   (  s      z+CodeObjectNode.__init__.<locals>.<listcomp>c                 S   s   g | ]}t |j|jd qS r  )rS  rz   rj   rN  rP   rP   rQ   r   (  s   )r   r  rz   r   r   r  r  r  )rS   r  r   
local_varsrP   rP   rQ   r  (  s    
zCodeObjectNode.__init__c                 C   s   | t |S rI   )r  )rM   r  rP   rP   rQ   	for_cfunc(  s    zCodeObjectNode.for_cfuncc                 C   s   dS r&  rP   rR   rP   rP   rQ   r  (  s    zCodeObjectNode.may_be_nonec                 C   s   | j d kr|| | _ | j S rI   r  Zget_py_codeobj_constr>  rP   rP   rQ   r   (  s    
z$CodeObjectNode.calculate_result_codec                 C   s   | j d kr|| | _ d S rI   r  r>  rP   rP   rQ   rG  (  s    
z#CodeObjectNode.generate_result_codec                 C   s*  | j }| jd }|j|jdd}|jd  }tj|rH|jd  }t	
t| }||}|jrt	t|j|dd}||}	t|}
nd}	d}
ddg}|jr|d	 |jr|d
 |jr|d n"|jr|d n|jr|d |jrd}n
t|j}|j}|j}t| j}dd| p>d}| 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)   Trv  r   z	iso8859-1r  ZCO_OPTIMIZEDZCO_NEWLOCALS
CO_VARARGSCO_VARKEYWORDSCO_ASYNC_GENERATORCO_COROUTINECO_GENERATORz(unsigned int)(%s)|r  r   z5const __Pyx_PyCode_New_function_description descr = {r"  r  c                 S   s   g | ]}|  qS rP   r  r[   rV  rP   rP   rQ   r   )  s     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  rz   r<  rj   Zget_filenametable_entryr$   r7  isabsr9  r   r  r%   Pathas_posixr  r/  r!   rC  r=  r   r  r   r  r  r  r  r  r   r  r  r  rp  r   rL  rQ  rY  r  )rS   r   r  r  Zfirst_linenoZfunc_name_result	file_pathZfile_path_resultZ
line_tableZline_table_resultZline_table_lengthr  Zargcountr  Zkwonly_argcountZnlocalsrV  r  rP   rP   rQ   generate_codeobj(  s^    









2


*zCodeObjectNode.generate_codeobj)N)rU   rV   rW   r   r   r  r  r  r  r  r   rG  r  rP   rP   rP   rQ   r  (  s   


r  c                       sH   e Zd Zg ZdZdZ fddZdd Zdd Zd	d
 Z	dd Z
  ZS )r  TFc                    s.   t  | || _|j| _| jj| _d| _d S r&  )rK   r  r  rw   r   	evaluatedr  rN   rP   rQ   r  :)  s
    
zDefaultLiteralArgNode.__init__c                 C   s   | S rI   rP   r   rP   rP   rQ   r   A)  s    z#DefaultLiteralArgNode.analyse_typesc                 C   s   d S rI   rP   r>  rP   rP   rQ   rG  D)  s    z*DefaultLiteralArgNode.generate_result_codec                 C   s   | j s| j| d| _ d S r  )r  r  rL  r>  rP   rP   rQ   rL  G)  s    z.DefaultLiteralArgNode.generate_evaluation_codec                 C   s   | j | j S rI   )r   r  r  r   rR   rP   rP   rQ   r   L)  s    zDefaultLiteralArgNode.result)rU   rV   rW   r   r   r   r  r   rG  rL  r   rX   rP   rP   rN   rQ   r  1)  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 rI   )rK   r  r  r  )rS   rz   r  r  rN   rP   rQ   r  U)  s    z!DefaultNonLiteralArgNode.__init__c                 C   s   | j j| _d| _| S r&  )r  r   r   r   rP   rP   rQ   r   Z)  s    
z&DefaultNonLiteralArgNode.analyse_typesc                 C   s   d S rI   rP   r>  rP   rP   rQ   rG  _)  s    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  rj   r   r  r  r  r  r   rR   rP   rP   rQ   r   b)  s
     zDefaultNonLiteralArgNode.result)	rU   rV   rW   r   r  r   rG  r   rX   rP   rP   rN   rQ   r  P)  s
   r  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  )rk   r   r  r   rK   r  )rS   rz   r  r  r   r  rN   rP   rQ   r  k)  s    zDefaultsTupleNode.__init__Fc                    s   t  |||S rI   )rK   r   r  )rS   rl   r  rN   rP   rQ   r   u)  s    zDefaultsTupleNode.analyse_types)FrU   rV   rW   r  r   rX   rP   rP   rN   rQ   r  h)  s   
r  c                       s   e Zd Z fddZ  ZS )r  c                    sd   g }|D ]F}t |j|jd}|jjs2t|||}n|j}|t|j||d qt j	||d d S )Nr  rZ  r\  )
rS  rz   rj   rk   r   r  r   r_  rK   r  )rS   rz   r  r  r  r  rj   rN   rP   rQ   r  |)  s    zDefaultsKwDictNode.__init__)rU   rV   rW   r  rX   rP   rP   rN   rQ   r  y)  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_idr  r  Zno_assignment_synthesisr  r  r  r   r  Zadd_lambda_defr   rP   rP   rQ   r  )  s    
zLambdaNode.analyse_declarationsc                    s   | j || _ t |S rI   )r  r  rK   r   r   rN   rP   rQ   r   )  s    zLambdaNode.analyse_typesc                    s   | j | t | d S rI   )r  rV  rK   rG  r>  rN   rP   rQ   rG  )  s    zLambdaNode.generate_result_code)rU   rV   rW   r   r   r  rj   r  r   rG  rX   rP   rP   rN   rQ   r  )  s
   

r  c                       sV   e Zd ZedZdZejdg Zej	dg Z	 fddZ
 fddZdd	 Z  ZS )
GeneratorExpressionNodegenexprFcall_parametersc                    s   t  j|f|| g | _d S rI   )rK   r  r  )rS   rz   r   r  rN   rP   rQ   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sjt| jjd | nt| jtjstd S )Ngenexpr_namer  F)r  r  r  rK   r  r  r  r  r  r2   Zpyfunction_noargsr   r  rv   rR  r   rS  rA  r  r   r  rT  r   rN   rP   rQ   r  )  s    
z,GeneratorExpressionNode.analyse_declarationsc              
   C   s`   |   gdd | jD  }d|}|d|  | jjj|||  | j	f  | 
| d S )Nc                 S   s   g | ]}|  qS rP   r<  )r[   cprP   rP   rQ   r   )  s     z@GeneratorExpressionNode.generate_result_code.<locals>.<listcomp>r"  r  )r  r  rp  r   r   r  r   r  r   rz   rg  )rS   r   Zargs_to_callrP   rP   rQ   rG  )  s    
z,GeneratorExpressionNode.generate_result_code)rU   rV   rW   r   r  rj   r  r  r   r   r  r  rG  rX   rP   rP   rN   rQ   r  )  s   	
r  c                   @   sR   e Zd ZdgZeZdZdZdZdZ	dZ
dd Zdd Zd	d
 Zdd Zdd ZdS )YieldExprNoder  r   Fyieldc                 C   sZ   | j r| jr$| jr$t| jd| j  d| _| jd k	rV| j|| _| jj	j
sV| | | S )Nz'%s' not supported herer)   )	label_numis_yield_fromin_async_genr   rz   expr_keywordr   r  r   r   ri   coerce_yield_argumentr   rP   rP   rQ   r   )  s    


zYieldExprNode.analyse_typesc                 C   s   | j || _ d S rI   r  r  r   rP   rP   rQ   r  )  s    z#YieldExprNode.coerce_yield_argumentc                 C   sp   | j rT| j | | j | |dtj| j tf  | j | | j 	| n|
tjt | | d S Nr  )r  rL  r?  r   r   rb  r   r   rS  rY  Zput_init_to_py_nonegenerate_yield_coder>  rP   rP   rQ   rL  )  s    
z&YieldExprNode.generate_evaluation_codec                 C   s  | | jdd\}}|| g }|jj  |j D ]n\}}}|jj|}|	|||f |j
r|jtdd d| }n||| |dtj||f  q<|jjd }	|jjd }
|	s|
r|jtj| jd	 |tjt |  |jjd
k	r|dtj  n|dtj  |d| jr6dnd| jrDdndf  |dtj|f  | jr| js|dtj  n|dtj  || |	s|
r|| j |D ]z\}}}dtj|f }|j
rd| }|d||f  |jr|d|  | || n|j!r|d||f  q| "|tj# | j$r~| %| |&d| ' tj#f  |(| ' t d
S )z
        Generate the code to return the argument in 'Naming.retval_cname'
        and to continue at the yield label.
         r  rN  rO  z__PYX_STD_MOVE_IF_SUPPORTED(%s)z%s->%s = %s;profile	linetracerh  Nz"__Pyx_Coroutine_SwapException(%s);z+__Pyx_Coroutine_ResetAndClearException(%s);z*/* return from %sgenerator, %sing value */zasync rn  awaitr  z%s->resume_label = %d;z,return __Pyx__PyAsyncGenValueWrapperNew(%s);z
return %s;r  r  rR  z"%s.memview = NULL; %s.data = NULL;r  ))Znew_yield_labelr  replaceZ	use_labelr3  Zclosure_tempsresetZtemps_in_user4  r   r   r   r   r   r   rk  r   r   r  rd   Zput_trace_yieldrb  rz   r   Zput_finish_refcount_contextZcurrent_exceptr  r  is_awaitr  Zput_trace_resumeri   rh  r   !generate_sent_value_handling_codeZsent_value_cnamer2  r6  r  r   r=  )rS   r   r  Zresume_labelZsavedr   r   r/  Z
save_cnamer  r  rP   rP   rQ   r  *  sl    


 

z!YieldExprNode.generate_yield_codec                 C   s   | ||| j d S rI   )r   r   rz   rS   r   rm  rP   rP   rQ   r  M*  s    z/YieldExprNode.generate_sent_value_handling_codeN)rU   rV   rW   r   r   r   r  r  r  r  r  r   r  rL  r  r  rP   rP   rP   rQ   r  )  s   
Er  c                   @   s.   e Zd Zdd ZdddZdd Zd	d
 ZdS )_YieldDelegationExprNodec                 C   s
   t  d S rI   )NotImplementedErrorr>  rP   rP   rQ   yield_from_funcR*  s    z(_YieldDelegationExprNode.yield_from_funcNFc                 C   s  |d kr| j | |jjtjdd}|d|| |tj	|d krL| j 
 n|tjf  |d kr|| j | | j | n|r||t |d|  |tjt |j| | | |d|  |tjt | jr| | 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  rL  r3  r4  r   ZPySendResult_typer   r  r   r  r   rb  rQ  rY  rP  r   rd  r;  r  r2  fetch_iteration_resultpropagate_exception)rS   r   rP  rQ  Zresult_temprP   rP   rQ   rL  U*  s6    


z1_YieldDelegationExprNode.generate_evaluation_codec                 C   s$   | tjt ||| j d S rI   )rh  r   rb  r   r   r   rz   r>  rP   rP   rQ   r  t*  s    z,_YieldDelegationExprNode.propagate_exceptionc                 C   s    | d|  tjtjf  d S )NrA  )r   r   r   rb  r>  rP   rP   rQ   r  y*  s
    z/_YieldDelegationExprNode.fetch_iteration_result)NF)rU   rV   rW   r  rL  r  r  rP   rP   rP   rQ   r  Q*  s   
r  c                   @   s$   e Zd ZdZdZdd Zdd ZdS )YieldFromExprNodeTz
yield fromc                 C   s(   | j jjst| jd | j || _ d S )Nz-yielding from non-Python object not supported)r  r   rH  r   rz   r  r   rP   rP   rQ   r  *  s    
z'YieldFromExprNode.coerce_yield_argumentc                 C   s   |j tdd dS )NZGeneratorYieldFromrJ  Z__Pyx_Generator_Yield_Fromr   r   r   r   r>  rP   rP   rQ   r  *  s    z!YieldFromExprNode.yield_from_funcN)rU   rV   rW   r  r  r  r  rP   rP   rP   rQ   r  *  s   r  c                   @   s$   e Zd ZdZdZdd Zdd ZdS )AwaitExprNodeTr  c                 C   s   | j d k	r| j || _ d S rI   r  r   rP   rP   rQ   r  *  s    
z#AwaitExprNode.coerce_yield_argumentc                 C   s   |j tdd dS )NZCoroutineYieldFromrJ  Z__Pyx_Coroutine_Yield_Fromr  r>  rP   rP   rQ   r  *  s    zAwaitExprNode.yield_from_funcN)rU   rV   rW   r  r  r  r  rP   rP   rP   rQ   r  *  s   r  c                       s,   e Zd Zdd Z fddZdd Z  ZS )AwaitIterNextExprNodec                 C   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))))) {r  r.  r   )r   r>  rP   rP   rQ   _generate_break*  s
    



z%AwaitIterNextExprNode._generate_breakc                    s   |  | t | d S rI   )r  rK   r  r>  rN   rP   rQ   r  *  s    
z)AwaitIterNextExprNode.propagate_exceptionc                 C   sF   |j std|d|  | | ||| j |d d S )Nz1AwaitIterNextExprNode outside of 'async for' loopr  r   )Zbreak_labelr   r   r  r   rz   r  rP   rP   rQ   r  *  s
    
z7AwaitIterNextExprNode.generate_sent_value_handling_code)rU   rV   rW   r  r  r  rX   rP   rP   rN   rQ   r  *  s   	r  c                   @   s0   e Zd ZeZdZdd ZdZdd Zdd Z	d	S )
GlobalsExprNoder)   c                 C   s   | tj | S rI   )r   r   Zglobals_utility_coder   rP   rP   rQ   r   *  s    zGlobalsExprNode.analyse_typeszConstructing globals dictc                 C   s   dS r&  rP   rR   rP   rP   rQ   r  *  s    zGlobalsExprNode.may_be_nonec                 C   s2   | d|  ||  | jf  | | d S )Nz%s = __Pyx_Globals(); %s)r   r   r   rz   rg  r>  rP   rP   rQ   rG  *  s
    z$GlobalsExprNode.generate_result_codeN)
rU   rV   rW   r   r   r   r   rZ  r  rG  rP   rP   rP   rQ   r  *  s   r  c                   @   s   e Zd Zdd ZdS )LocalsDictItemNodec                 C   sR   | j || _ | j|| _| j || _ | jj|rH| j|| _nd | _| S rI   )r[  r   r   r  r   rx  r   rP   rP   rQ   r   *  s    z LocalsDictItemNode.analyse_typesN)rU   rV   rW   r   rP   rP   rP   rQ   r  *  s   r  c                       s$   e Zd Zdd Z fddZ  ZS )FuncLocalsExprNodec                    s@   t dd |j D } fdd|D }tj|  |dd d S )Nc                 S   s   g | ]}|j r|j qS rP   rh  r  rP   rP   rQ   r   *  s     z/FuncLocalsExprNode.__init__.<locals>.<listcomp>c              
      s,   g | ]$}t  t |d t |dddqS )r  T)rj   r  rZ  )r  rS  r~  r  rh  rP   rQ   r   *  s    
T)r]  rl  )r  r  rb  r`  r  )rS   rz   rl   r  r  rP   rh  rQ   r  *  s    

zFuncLocalsExprNode.__init__c                    s"   t  |}dd |jD |_|S )Nc                 S   s   g | ]}|j d k	r|qS rI   r  )r[   rq  rP   rP   rQ   r   *  s    
z4FuncLocalsExprNode.analyse_types.<locals>.<listcomp>)rK   r   r]  r   rN   rP   rQ   r   *  s    z FuncLocalsExprNode.analyse_typesr  rP   rP   rN   rQ   r  *  s   
r  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )PyClassLocalsExprNodec                 C   s   t | | || _d S rI   )r  r  pyclass_dict)rS   rz   r  rP   rP   rQ   r  *  s    zPyClassLocalsExprNode.__init__c                 C   s   | j j| _d| _| S r&  )r  r   r   r   rP   rP   rQ   r   *  s    
z#PyClassLocalsExprNode.analyse_typesc                 C   s   dS r&  rP   rR   rP   rP   rQ   r  *  s    z!PyClassLocalsExprNode.may_be_nonec                 C   s
   | j  S rI   )r  r   rR   rP   rP   rQ   r   *  s    zPyClassLocalsExprNode.resultc                 C   s   d S rI   rP   r>  rP   rP   rQ   rG  +  s    z*PyClassLocalsExprNode.generate_result_codeN)rU   rV   rW   r  r   r  r   rG  rP   rP   rP   rQ   r   *  s
   r   c                 C   s*   |j rt| S |jr t| |jS t| |S rI   )rt  r  ru  r   r  r  )rz   Z
scope_noderl   rP   rP   rQ   LocalsExprNode+  s
    r  )not~r  r   c                   @   s   e Zd ZdgZdZdZdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd%d"d#Zd$S )&UnopNoderr  TFc                 C   s   t | j }|| jj| _d S rI   )compile_time_unary_operatorsr	   rr  rw   rS   r  rP   rP   rQ   r   ++  s    
z"UnopNode.calculate_constant_resultc              
   C   sj   t | j}|s"t| jd| j  | j|}z
||W S  tk
rd } z| | W 5 d }~X Y nX d S )Nz3Unary '%s' not supported in compile-time expression)	r  rc   r	   r   rz   rr  r   r  r   )rS   r   r  rr  r   rP   rP   rQ   r   /+  s    
zUnopNode.compile_time_valuec                 C   s<   | j |}|js|jr0|| j}|d k	r0|S | ||S rI   )rr  r   r   rx  find_cpp_operation_typer	   infer_unop_type)rS   rl   operand_typecpp_typerP   rP   rQ   r   ;+  s    zUnopNode.infer_typec                 C   s   |j r|jstS |S d S rI   )ri   rf  r   rS   rl   r
  rP   rP   rQ   r	  C+  s    zUnopNode.infer_unop_typec                 C   s,   | j jr"| j jjr"| j jtk	r"dS t| S r&  )rr  r   rf  r   r   r  rR   rP   rP   rQ   r  I+  s    zUnopNode.may_be_nonec                 C   sx   | j || _ | |r6tt| j| j j| _d| _n>|  rV| 	| t
| _d| _n|  rj| | n
| | | S r  )rr  r   is_pythran_operationrG   r>   r	   r   r   is_py_operationcoerce_operand_to_pyobjectr   is_cpp_operationanalyse_cpp_operationanalyse_c_operationr   rP   rP   rQ   r   O+  s    


zUnopNode.analyse_typesc                 C   s
   | j  S rI   rr  r   rR   rP   rP   rQ   r   ^+  s    zUnopNode.check_constc                 C   s   | j jjp| j jjS rI   )rr  r   ri   r  rR   rP   rP   rQ   r  a+  s    zUnopNode.is_py_operationc                 C   s    t |}| jj}|o|jp|jS rI   )r?   rr  r   r  r;   )rS   rl   Z
np_pythranop_typerP   rP   rQ   r  d+  s    zUnopNode.is_pythran_operationc                 C   s   |   r|   d S rI   r  r#  r   rP   rP   rQ   r$  i+  s    zUnopNode.nogil_checkc                 C   s   | j j}|jS rI   )rr  r   r   r   rP   rP   rQ   r  m+  s    zUnopNode.is_cpp_operationc                 C   s   | j || _ d S rI   )rr  r  r   rP   rP   rQ   r  q+  s    z#UnopNode.coerce_operand_to_pyobjectc                 C   s   | j jrL|d |d|    |d|  |  | j| j f  n| jj jrb| | nx| j	r| 
 r| jdkrt|| jd|  | j| j f | j jr|  nd | j| j n |d|  | j| j f  d S )Nz// Pythran unaryopr  r  r   %s = %s %s;)r   r;   r   r   r	   rr  r   ri   generate_py_operation_coder   r  r   r   rz   r   rC  r>  rP   rP   rQ   rG  t+  s(    


 zUnopNode.generate_result_codec              
   C   sF   |  |}|d|  || j ||  | jf  | | d S )Nr  )py_operation_functionr   r   rr  r   r   rz   rg  r  rP   rP   rQ   r  +  s    
z#UnopNode.generate_py_operation_codec                 C   s0   | j jjs$t| jd| j| j jf  tj| _d S )Nz"Invalid operand type for '%s' (%s))rr  r   r  r   rz   r	   r   r0   rR   rP   rP   rQ   
type_error+  s
    
zUnopNode.type_errorc                 C   s  | j jg}| jr"| js"|tj || j| j	|}|rH|sH| 
  d S |r|jj| _|jj| _| jdkrd| _t| r|tdd nd| _d| _| jr| js| j jj| j	tjd}n| j j| j	}|r|d krt| jd| j	tf  | 
  d S || _d S )Nr   Tr  rO  rn  )r
  z '%s' operator not defined for %s)rr  r   is_inc_dec_op	is_prefixr   r   r  r8  rz   r	   r  r   r   r   r   r   r   r   r  r   )rS   rl   overload_checkZoperand_typesr   r  rP   rP   rQ   r  +  s<    



  zUnopNode.analyse_cpp_operationN)T)rU   rV   rW   r   infixr  r   r   r   r	  r  r   r   r  r  r$  r  r  rG  r  r  r  rP   rP   rP   rQ   r  +  s&   
r  c                   @   s>   e Zd ZdZejZdd Zdd Zdd Z	dd	 Z
d
d ZdS )NotNode!c                 C   s   | j j | _d S rI   )rr  rw   rR   rP   rP   rQ   r   +  s    z!NotNode.calculate_constant_resultc              
   C   sF   | j |}z| W S  tk
r@ } z| | W 5 d }~X Y nX d S rI   )rr  r   r  r   )rS   r   rr  r   rP   rP   rQ   r   +  s
    zNotNode.compile_time_valuec                 C   s   t jS rI   )r   r  r  rP   rP   rQ   r	  +  s    zNotNode.infer_unop_typec                 C   s:   | j || _ | j j}|jr(| | n| j || _ | S rI   )rr  r   r   r   r  r  r  rP   rP   rQ   r   +  s    zNotNode.analyse_typesc                 C   s   d| j   S )Nz(!%s)rr  r   rR   rP   rP   rQ   r   +  s    zNotNode.calculate_result_codeN)rU   rV   rW   r	   r   r  r   r   r   r	  r   r   rP   rP   rP   rQ   r  +  s   	r  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	UnaryPlusNoder   c                 C   s   t | jjt j| _d S rI   )r   r  rr  r   r  r   rP   rP   rQ   r  +  s     z!UnaryPlusNode.analyse_c_operationc                 C   s   dS )NZPyNumber_PositiverP   r>  rP   rP   rQ   r  +  s    z#UnaryPlusNode.py_operation_functionc                 C   s$   |   rd| j  S | j S d S )Nz(+%s))r  rr  r   rR   rP   rP   rQ   r   +  s    z#UnaryPlusNode.calculate_result_codeN)rU   rV   rW   r	   r  r  r   rP   rP   rP   rQ   r!  +  s   r!  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )UnaryMinusNoder  c                 C   sN   | j jjr t| j jtj| _n| j jjr4tj| _n|   | jjrJd| _	d S r&  )
rr  r   r  r   r  r  r  r  r  r  r   rP   rP   rQ   r  +  s    
 

z"UnaryMinusNode.analyse_c_operationc                 C   s   dS )NZPyNumber_NegativerP   r>  rP   rP   rQ   r  +  s    z$UnaryMinusNode.py_operation_functionc                 C   s4   | j rd| j  S d| jjd| j f S d S )N(-%s)ry  r  )r  rr  r   r   unary_oprR   rP   rP   rQ   r    ,  s    z$UnaryMinusNode.calculate_result_codec                 C   s   | j  }|rd| S d S )Nr#  )rr  r   )rS   r   rP   rP   rQ   r   ,  s    
z)UnaryMinusNode.get_constant_c_result_codeN)rU   rV   rW   r	   r  r  r   r   rP   rP   rP   rQ   r"  +  s
   r"  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )	TildeNodec                 C   s@   | j jjr t| j jtj| _n| j jjr4tj| _n|   d S rI   )rr  r   r  r   r  r  r  r  r   rP   rP   rQ   r  ,  s    
 

zTildeNode.analyse_c_operationc                 C   s   dS )NZPyNumber_InvertrP   r>  rP   rP   rQ   r  ,  s    zTildeNode.py_operation_functionc                 C   s   d| j   S )Nz(~%s)r   rR   rP   rP   rQ   r   ,  s    zTildeNode.calculate_result_codeN)rU   rV   rW   r  r  r   rP   rP   rP   rQ   r%  ,  s   	r%  c                   @   s   e Zd Zdd ZdS )	CUnopNodec                 C   s   dS r&  rP   rR   rP   rP   rQ   r   ,  s    zCUnopNode.is_py_operationN)rU   rV   rW   r  rP   rP   rP   rQ   r&  ,  s   r&  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	DereferenceNoder   c                 C   s   |j r|jS tjS d S rI   )rx  ry  r   r0   r  rP   rP   rQ   r	  (,  s    zDereferenceNode.infer_unop_typec                 C   s>   | j jjr2|jr$t| j jj| _q:| j jj| _n|   d S rI   )rr  r   rx  Zis_cppr   r  ry  r  r   rP   rP   rQ   r  .,  s
    
z#DereferenceNode.analyse_c_operationc                 C   s   d| j   S r  r   rR   rP   rP   rQ   r   7,  s    z%DereferenceNode.calculate_result_codeN)rU   rV   rW   r	   r	  r  r   rP   rP   rP   rQ   r'  #,  s   	r'  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	DecrementIncrementNodeTc                 C   sV   | j jjsJ| jr,t| jd| j| j jf  nt| jd| j| j| j jf  tj| _d S )Nz0No match for 'operator%s' (operand type is '%s')zENo 'operator%s(int)' declared for postfix '%s' (operand type is '%s'))	rr  r   r  r  r   rz   r	   r   r0   rR   rP   rP   rQ   r  ?,  s    
z!DecrementIncrementNode.type_errorc                 C   sB   | j jjr t| j jtj| _n| j jjr6| j j| _n|   d S rI   )rr  r   r  r   r  r  rx  r  r   rP   rP   rQ   r  I,  s    
 
z*DecrementIncrementNode.analyse_c_operationc                 C   s2   | j rd| j| j f S d| j | jf S d S )Nz(%s%s))r  r	   rr  r   rR   rP   rP   rQ   r   R,  s    z,DecrementIncrementNode.calculate_result_codeN)rU   rV   rW   r  r  r  r   rP   rP   rP   rQ   r(  ;,  s   
	r(  c                    s    fddS )Nc                    s   t | f d|S )Nr  r	   )r(  )rz   r  r)  rP   rQ   <lambda>Y,      z%inc_dec_constructor.<locals>.<lambda>rP   r)  rP   r)  rQ   inc_dec_constructorX,  s    r,  c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )AmpersandNoder<  c                 C   s
   t |S rI   )r   
c_ptr_typer  rP   rP   rQ   r	  b,  s    zAmpersandNode.infer_unop_typec                 C   s   | j || _ | j j}|jr*| j|dd |jsd|jsd| j  sd|jrR| 	d n| 	d|  | S |j
r| 	d| j jrd| j j n| j jrd| j j nd  | S |jr| jst|| _| S )	NF)r  z'Cannot take address of memoryview slicez&Taking address of non-lvalue (type %s)z Cannot take address of Python %szvariable '%s'zobject attribute '%s'r  )rr  r   r   r   r  r  r   r   r   r   ri   r   rj   r  r  r   r.  )rS   rl   ZargtyperP   rP   rQ   r   e,  s&    zAmpersandNode.analyse_typesc                 C   s
   | j  S rI   )rr  r)  rR   rP   rP   rQ   r   z,  s    zAmpersandNode.check_constc                 C   s   t | j| tj| _d| _d S Nr  r   rz   r   r0   r   r  rS   ZmessrP   rP   rQ   r   },  s    zAmpersandNode.errorc                 C   s   d| j   S )Nz(&%s)r   rR   rP   rP   rQ   r   ,  s    z#AmpersandNode.calculate_result_codec                 C   sV   | j jjrR| jdkrRt|| jd|  | j| j  f | jjrD|  nd | j	| j
 d S )Nr   r  )rr  r   r   r   r   rz   r   r	   ri   r   rC  r>  rP   rP   rQ   rG  ,  s     z"AmpersandNode.generate_result_codeN)
rU   rV   rW   r	   r	  r   r   r   r   rG  rP   rP   rP   rQ   r-  \,  s   r-  )r   r  r  c                 C   s   t |tr6|dkr6t|jtt|j |j|jdS t |t	rp|j
|  krVdkrpn nt| d|fd  d t| | ||dS )Nr  )rz   r   r  r  z+-zAPython has no increment/decrement operator: %s%sx == %s(%sx) == x      )r	   rr  )rv   r  rz   rp   r   r  r   r  r  r  r	   r   unop_node_classes)rz   r	   rr  rP   rP   rQ   	unop_node,  s     $r5  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 )rL  rr  Nc                 C   s   dS ra  rP   r   rP   rP   rQ   r  ,  s    zTypecastNode.type_dependenciesc                 C   s0   | j d kr*| j|}| j||\}| _ | j S rI   )r   ry  r  
declarator)rS   rl   ry  r  rP   rP   rQ   r   ,  s    
zTypecastNode.infer_typec                 C   s  | j d kr*| j|}| j||\}| _ | j r<|   | j jrXt| j	d t
j| _ | j|| _| j t
jkr~| j|S | j j}| jj j}|r|s| j r| j js| j jst| j	d |rv|sv| j tkr| jj jrt| j|S | jj |rt| _| j| j || _n^| jj jrJ| jj jjsd| jj jjsdt| j	d nt| j	d| jj | j f  | j|| _n|r|s| j |r| j| j || _nJ| j jr| j jjs| j jjst| j	d nt| j	d| j | jj f  n|r>|r>| j rt!| j| j |dd| _n t"| jt#r| j| j || _nD| j j$rd| jj j$rd| j|| _n| jj j%r| j| j || _| j jr| j jjr| j jj&r| jj }|jr|j}|jr|j&st| j	dd	 | S )
NzCannot cast to a function typez>Casting temporary Python object to non-numeric non-Python typez>Python objects cannot be cast from pointers of primitive typesz8No conversion from %s to %s, python object pointer used.z<Python objects cannot be cast to pointers of primitive typesT)notnonezQCasting a GIL-requiring function into a nogil function circumvents GIL validationr)   )'r   ry  r  r6  rr  r   r   r  r   rz   r   r0   r   r  r  ri   r   r  r   r   r  r  rx  r   r   r  rx  r1  r  r   r	  create_from_py_utility_codeZ	typecheckr  rv   r  r  r  r   )rS   rl   ry  r  Zto_pyZfrom_pyr  rP   rP   rQ   r   ,  sz    


 
 
" zTypecastNode.analyse_typesc                 C   s
   | j  S rI   )rr  r  rR   rP   rP   rQ   r  ,  s    zTypecastNode.is_simplec                 C   s
   | j  S rI   )rr  r   rR   rP   rP   rQ   r   ,  s    zTypecastNode.is_ephemeralc                 C   s   | j p| j S rI   )r   rr  r  rR   rP   rP   rQ   r  ,  s    z!TypecastNode.nonlocally_immutablec                 C   s    | j r| j jr| jr|   d S rI   )r   ri   r   r#  r   rP   rP   rQ   r$  -  s    zTypecastNode.nogil_checkc                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r   -  s    zTypecastNode.check_constc                 C   s   |  | jj| _d S rI   )r   rr  rw   rR   rP   rP   rQ   r   	-  s    z&TypecastNode.calculate_constant_resultc                 C   s   |d kr| j  }| jjr| j  }| j jjr`| jj| j j|}| jj| j j|}n| jj|}d}d| jj||f S | j|S d S Nr  r  )	rr  r   r   r  	real_typer  	real_code	imag_coderY  )rS   operand_result	real_part	imag_partrP   rP   rQ   r   -  s&    


z"TypecastNode.calculate_result_codec                 C   s   | j  }|r| j|S d S rI   )rr  r   r   r  )rS   r=  rP   rP   rQ   r    -  s    
z'TypecastNode.get_constant_c_result_codec                 C   s*   | j jr| js| j|S t| |S d S rI   )r   ri   r   rr  r   r   r   rP   rP   rQ   r   %-  s    zTypecastNode.result_asc                 C   s:   | j r6|d|  | j f  ||  |   d S )Nz%s = (PyObject *)%s;)r   r   r   rr  r=  r   r>  rP   rP   rQ   rG  ,-  s    z!TypecastNode.generate_result_code)N)rU   rV   rW   r   ry  r6  r   r  r   r   r  r   r  r$  r   r   r   r   r   rG  rP   rP   rP   rQ   rL  ,  s   @
rL  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
    rr  shapesNTcc                 C   s0  ddl m} | j|| _| jr(| j}n| jj|}| jj}t| _	g | _
t|}| jj	}| jj	js| jj	jst| jjt | S g }|jr|jr||j |j}qn"|jr|j}nt| jd|  | S ||s|jst| jjt | S | jj	jr"t||kr"t| jjd|t|f  | S t|D ]t\}}	|	jjsTt|	jjt |   S |	jjr|r|| }
t| jt|
|
tjd|	_nt|	jt  |   S |	j||	_|	j!| j"|}|j#s|$| | j
| |d|d fk}|	j%jsx|rx|	j%||	_%|	j%j	j&s>|	j%j#r>|	j%j	j's>t|	j%jd |   S |	j%(|dkrft|	j%jt) |   S |dkrd| _*n&|	j%js*|s*t|	j%jt) |   S q*| jj+s| j$|| _d	gt| }| j*dkrd
|d< nd
|d< t,||| _-| j-.| j | /|| _	|0| |1|2|j3j4 | S )Nr)   ro  zunexpected base type %s foundz/Expected %d dimensions, array has %d dimensionsr  r   zExpected an integer literalZfortran)r  follow)r  Zcontigr  )5rn  rp  rr  r   array_dtypebase_type_noder  r  r0   r   r@  r   rx  r  r   rz   ERR_NOT_POINTERr   r  ry  r{  r1  ERR_BASE_TYPEro  r   r  	ERR_STARTr   r  rp   r   r  ERR_NOT_STOPr  
shape_typer   r  r   r  r  r   	ERR_STEPSmoder   r  r}  Zvalidate_memslice_dtypeget_cython_array_typeZuse_cython_array_utility_coder   Zget_typeinfo_to_format_coder  r  )rS   rl   rp  rC  r  r  ry  Zarray_dimension_sizesZaxis_noZaxisZdimsizeshapeZfirst_or_lastrP   rP   rQ   r   [-  s    









zCythonArrayNode.analyse_typesc                 C   s$   | j rtd|j| jd| _ d S )Nztemp allocated multiple timesT)r   r0  r3  r4  r   r>  rP   rP   rQ   r6  -  s    z$CythonArrayNode.allocate_temp_resultc                 C   s
   |  |S rI   )rL  r   rP   rP   rQ   r   -  s    zCythonArrayNode.infer_typec                 C   s   |j j}|  |jdjS )Narray)r  cython_scopeZload_cythonscopeZ	viewscoper  r   )rS   rl   rO  rP   rP   rQ   rL  -  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r 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 rP   )rI  r  r   )r[   rM  rR   rP   rQ   r   -  s   z8CythonArrayNode.generate_result_code.<locals>.<listcomp>Tr"  z
if (!%s) {zQPyErr_SetString(PyExc_ValueError,"Cannot create cython.array from NULL pointer");r   z(%s = __pyx_format_from_typeinfo(&%s); %sz __PYX_BUILD_PY_SSIZE_T z&%s = Py_BuildValue("(" %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 rI   )rP  r   r3  r;  )r  )r   rP   rQ   dispose.  s    z5CythonArrayNode.generate_result_code.<locals>.dispose)rn  r  r@  r}  r  r3  r4  r   r.   r_  Zget_type_information_cnamerr  r   rx  r   r   r   rz   r   rd  r   rp  rK  rg  r;  )rS   r   r  r@  r  Zshapes_tempZformat_tempZformat_ptr_tempitemsize	type_infoZbuildvalue_fmtrP  rP   r  rQ   rG  -  sn    




 
 
    
z$CythonArrayNode.generate_result_codec           	      C   s~   |j }|j}t|}g }|jr<|t||||d |j}qt|ddd|d _t	j
|||d}t||||d}||}|S )z@
        Given a C array type, return a CythonArrayNode
        r  r  T)r   r  r  )r  rD  )rD  rr  rC  )rz   r   r  r  r   r  ry  r  r   r   ZMemoryViewSliceTypeNoder  r   )	rM   Zsrc_noderl   rz   ry  r-  r  Zmemslicenoder   rP   rP   rQ   r  .  s&     
zCythonArrayNode.from_carray)rU   rV   rW   r  r   r@  r   rK  rC  r   r  rI  r   r6  r   rL  rG  r  r  rP   rP   rP   rQ   r  =-  s   j@r  c                   @   s"   e Zd ZejZdd Zdd ZdS )
SizeofNodec                 C   s   dS r  rP   rR   rP   rP   rQ   r   0.  s    zSizeofNode.check_constc                 C   s   d S rI   rP   r>  rP   rP   rQ   rG  3.  s    zSizeofNode.generate_result_codeN)rU   rV   rW   r   r  r   r   rG  rP   rP   rP   rQ   rS  +.  s   rS  c                   @   s,   e Zd Zg ZdZdd Zdd Zdd ZdS )r+  Nc           
      C   s   dr| j jr| j j}||d }|jd krt| j|d d}|dd  D ]}t| j||d}qJt| j|| j jd}t| j|d	|}|S | j
d kr| j |}| j||\}}	|	| _
|   | S )Nr   )rz   rj   r)   )rz   r  r  rr  )ry  module_pathr  r  r~  rz   r  rj   SizeofVarNoder   r,  r  r6  
check_type)
rS   rl   r7  r  rr  r  r|   ry  r  r,  rP   rP   rQ   r   @.  s     

zSizeofTypeNode.analyse_typesc                 C   sX   | j }|sd S |jr(|js(t| jd n,|jr<t| jd n| sTt| jd|  d S )Nz Cannot take sizeof Python objectzCannot take sizeof voidz'Cannot take sizeof incomplete type '%s')r,  ri   re  r   rz   r1  is_complete)rS   r,  rP   rP   rQ   rW  T.  s    zSizeofTypeNode.check_typec                 C   s,   | j jr| j jddd}n
| j  }d| S )Nrn  r)   )Zderef(sizeof(%s)))r,  re  r   r_  )rS   r  rP   rP   rQ   r   _.  s    
z$SizeofTypeNode.calculate_result_code)rU   rV   rW   r   r,  r   rW  r   rP   rP   rP   rQ   r+  7.  s
   r+  c                   @   s*   e Zd ZdgZdd Zdd Zdd ZdS )	rV  rr  c                 C   sx   | j |}|rf|| _| jjrVz| j|j| _W n" tk
rT   t| j jd Y nX t	| _
|   n| j || _ | S )NzLType cannot be specialized since it is not a fused argument to this function)rr  r  r,  r  r  r  r*   r   rz   r+  rO   rW  r   )rS   rl   Zoperand_as_typerP   rP   rQ   r   p.  s    

zSizeofVarNode.analyse_typesc                 C   s   d| j   S )NrY  r   rR   rP   rP   rQ   r   .  s    z#SizeofVarNode.calculate_result_codec                 C   s   d S rI   rP   r>  rP   rP   rQ   rG  .  s    z"SizeofVarNode.generate_result_codeN)rU   rV   rW   r   r   r   rG  rP   rP   rP   rQ   rV  i.  s   rV  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 )
TypeidNoderr  Nr)   c                 C   s@   |}|j s|j}q|d| j}|d}ttj|jddS )Nzlibcpp.typeinforR  T)r;  )	rt  r  find_modulerz   r  r   r  r  r   )rS   rl   Z
env_moduleZtypeinfo_moduleZtypeinfo_entryrP   rP   rQ   get_type_info_type.  s    
zTypeidNode.get_type_info_typeztypeid operatorc                 C   s   | j stj| _ | | | |}|s4| d | S | jd krB| S || _ | j|}|rl|| _d| _	d | _nl| j
|| _d| _	d | _| jj jr| d | S | jj jr| d | S | jj  s| d| jj   | S |tdd | S )	NzKThe 'libcpp.typeinfo' module must be cimported to use the typeid() operatorTFz$Cannot use typeid on a Python objectzCannot use typeid on voidz)Cannot use typeid on incomplete type '%s'r  rO  )r   r   r0   r\  r\  r   rr  r   r,  r&  r   ri   r1  rX  r   r   r   )rS   rl   rR  Zas_typerP   rP   rQ   r   .  s:    







zTypeidNode.analyse_typesc                 C   s   t | j| tj| _d| _d S r/  r0  r1  rP   rP   rQ   r   .  s    zTypeidNode.errorc                 C   s   dS r  rP   rR   rP   rP   rQ   r   .  s    zTypeidNode.check_constc                 C   s   | j S rI   r  rR   rP   rP   rQ   r   .  s    z TypeidNode.calculate_result_codec                 C   s@   | j r| j }n
| j }t|| jd| j|f d d | j d S )Nz%s = typeid(%s);)r&  r,  r_  r   r   rz   r   rC  )rS   r   r  rP   rP   rQ   rG  .  s    
  zTypeidNode.generate_result_code)rU   rV   rW   r   r,  r  r   r\  Zcpp_messager   r   r   r   rG  rP   rP   rP   rQ   rZ  .  s    rZ  c                   @   sB   e Zd ZdZeZdgZdd Zdd Zdd Z	d	d
 Z
dd ZdS )
TypeofNodeNr  c                 C   sH   | j || _ tt| j j}t| j|d}||}||| _	| S )Nr  )
rr  r   r   r  rp   r   r  rz   r  r  )rS   rl   r   r  rP   rP   rQ   r   .  s    
zTypeofNode.analyse_typesc                 C   s   | j || _ | j jS rI   )rr  r   r   r   rP   rP   rQ   r  .  s    zTypeofNode.analyse_as_typec                 C   s   dS r&  rP   rR   rP   rP   rQ   r  .  s    zTypeofNode.may_be_nonec                 C   s   | j | d S rI   )r  rL  r>  rP   rP   rQ   rL  .  s    z#TypeofNode.generate_evaluation_codec                 C   s
   | j  S rI   )r  r   rR   rP   rP   rQ   r   .  s    z TypeofNode.calculate_result_code)rU   rV   rW   r  r   r   r   r   r  r  rL  r   rP   rP   rP   rQ   r]  .  s   r]  c                 C   s0   z
| j }W n tk
r$   |j}Y nX || |S rI   )
__matmul__r   __rmatmul__)ru  br  rP   rP   rQ   matmul_operator.  s
    
ra  c                 C   s   | |kS rI   rP   xseqrP   rP   rQ   r*  /  r+  r  c                 C   s   | |kS rI   rP   rb  rP   rP   rQ   r*  /  r+  )<<===r6  >=>r  is_notr   r<  ///<<%r   r  **>>r  ^@innot_inc                 C   s&   t | j}|s"t| jd| j  |S )Nz4Binary '%s' not supported in compile-time expression)compile_time_binary_operatorsrc   r	   r   rz   )r|   r  rP   rP   rQ   get_compile_time_binop/  s    rv  c                       s   e Zd ZddgZdZdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Z fd$d%Zd&d' Zd(d) Z  ZS )*	BinopNoder  r   Fc                 C   s"   t | j }|| jj| jj| _d S rI   )ru  r	   r  rw   r   r  rP   rP   rQ   r   7/  s
    
z#BinopNode.calculate_constant_resultc              
   C   s^   t | }| j|}| j|}z|||W S  tk
rX } z| | W 5 d }~X Y nX d S rI   )rv  r  r   r   r  r   )rS   r   r  r  r   r   rP   rP   rQ   r   =/  s    zBinopNode.compile_time_valuec                 C   s   |  | j|| j||S rI   )rT  r  r   r   r   rP   rP   rQ   r   F/  s    
 zBinopNode.infer_typec                 C   s&   | j || _ | j|| _| |S rI   )r  r   r   r  r   rP   rP   rQ   r   J/  s    zBinopNode.analyse_typesc                 C   s   |  |r6| | jj| jj|| _| jjs.td| _nr|  r| 	| | | jj| jj|| _d| _| jj
s| jt }| _| ||S n|  r| | n
| | | S r  )r  rT  r  r   r   r;   r   r   r  coerce_operands_to_pyobjectsri   r   r  r  r  r  )rS   rl   original_typerP   rP   rQ   r  O/  s*    

 

 
zBinopNode.analyse_operationc                 C   s   |  | jj| jjS rI   )is_py_operation_typesr  r   r   rR   rP   rP   rQ   r  g/  s    zBinopNode.is_py_operationc                 C   s   |j p|j p|jp|jS rI   )ri   r  rS   type1type2rP   rP   rQ   rz  j/  s    zBinopNode.is_py_operation_typesc                 C   s   |  | jj| jj|S rI   )is_pythran_operation_typesr  r   r   r   rP   rP   rQ   r  m/  s    zBinopNode.is_pythran_operationc                 C   s(   t |o&t|o&t|o&t|p&t|S rI   )r?   r:   r;   )rS   r|  r}  rl   rP   rP   rQ   r~  p/  s
    z$BinopNode.is_pythran_operation_typesc                 C   s   | j jjp| jjjS rI   r  r   r   r   rR   rP   rP   rQ   r  v/  s    
zBinopNode.is_cpp_operationc                 C   s   | | j| j| jg}|s&|   d S |j}|j| _|j| _| jdkrfd| _t	| rf|
tdd |jrr|j}t|jdkr| j|jd j|| _n0| j|jd j|| _| j|jd j|| _|j| _d S )Nr   r)   r  rO  r   )r  r	   r  r   r  r   r   r   r   r   r   r   r   rx  ry  r   r   r  r	  )rS   rl   r   r  rP   rP   rQ   r  z/  s$    
zBinopNode.analyse_cpp_operationc                 C   s   |  |||r tt| j||S | ||r|jr:tj}n|jrFtj	}|jrTtj}n|jr`tj	}|j
sl|j
r||kr|tk	r| jdkr|S | ||}|d k	r|S tS |js|jrtjS | ||S d S )Nz**%+|&^)r~  rG   r=   r	   rz  rH  r   r   rI  r   rf  r   infer_builtin_types_operationr   r  r   r0   compute_c_result_type)rS   r|  r}  rl   rT  rP   rP   rQ   rT  /  s*    zBinopNode.result_typec                 C   s   d S rI   rP   r{  rP   rP   rQ   r  /  s    z'BinopNode.infer_builtin_types_operationc                 C   s   |   r|   d S rI   r  r   rP   rP   rQ   r$  /  s    zBinopNode.nogil_checkc                 C   s    | j || _ | j|| _d S rI   )r  r  r   r   rP   rP   rQ   rx  /  s    z&BinopNode.coerce_operands_to_pyobjectsc                 C   s   | j  o| j S rI   r  r   r   rR   rP   rP   rQ   r   /  s    zBinopNode.check_constc                    s   t   p| j p| j S rI   )rK   r   r  r   rR   rN   rP   rQ   r   /  s
    
zBinopNode.is_ephemeralc                 C   s  | j j}| jj}| jjr|d |d|    | jdkrj|d|  |  | j  | j f  n.|d|  |  | j  | j| j f  n
|js|jr2| 	|}| jdkrdnd}|jr| j 
 n| j  }|jr| j
 n| j }|d|  ||||||  | jf  | | nt| jr|  r| jd	krt|| jd
|  |  f | jjr||  nd | j| j n|d
|  |  f  d S )Nz// Pythran binopr  ro  zBnew (&%s) decltype(%s){pythonic::numpy::functor::power{}(%s, %s)};z!new (&%s) decltype(%s){%s %s %s};z	, Py_Nonern  r  r   r  )r  r   r   r;   r   r   r	   r   ri   r  r   r   rz   rg  r   r  r   r   r   r   rC  )rS   r   r|  r}  r  
extra_argsZ
op1_resultZ
op2_resultrP   rP   rQ   rG  /  sX    



 zBinopNode.generate_result_codec                 C   s@   | j jjs4| jjjs4t| jd| j| j j| jjf  tj| _d S )Nz'Invalid operand types for '%s' (%s; %s))	r  r   r  r   r   rz   r	   r   r0   rR   rP   rP   rQ   r  /  s    

zBinopNode.type_error)rU   rV   rW   r   r!  r   r   r   r   r  r  rz  r  r~  r  r  rT  r  r$  rx  r   r   rG  r  rX   rP   rP   rN   rQ   rw  '/  s*   	,rw  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )

CBinopNodec                 C   s    t | |}| rtj|_|S rI   )rw  r   r  r   r0   r   r   rP   rP   rQ   r   /  s    zCBinopNode.analyse_typesc                 C   s   dS r  rP   r>  rP   rP   rQ   r  /  s    z CBinopNode.py_operation_functionc                 C   s   d| j  | j| j f S N
(%s %s %s))r  r   r	   r   rR   rP   rP   rQ   r   /  s
    z CBinopNode.calculate_result_codec                 C   sD   d }|j s|jr|| j|}|d kr@|j s2|jr@|| j|}|S rI   )r   rx  r  r	   )rS   r|  r}  r  rP   rP   rQ   r  0  s    z CBinopNode.compute_c_result_typeN)rU   rV   rW   r   r  r   r  rP   rP   rP   rQ   r  /  s   r  c                    s    fdd}|S )Nc                    s   t | fd i|S )Nr	   )r  )rz   r  r	   rP   rQ   make_binop_node0  s    z,c_binop_constructor.<locals>.make_binop_noderP   )r	   r  rP   r  rQ   c_binop_constructor0  s    r  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s0|   d S | jjr>d| _| jjr|jd r| j	| j
kr| j	dkr| j  r| j s| j| j  | _ | _d| _|jd | _| jj| j
| j	 || j d| _d| _| jr|jr|jr| j | j|| _ | j| j|| _d S )NFr~  )r   r   Tzoverflowcheck.fold)Z	const_rhs)r  r   r   r  r  r  r  r  rd   r	   overflow_op_namesr   overflow_checkZoverflow_foldZoverflow_check_binopr  r   r  r  rS   rl   r|  r}  rP   rP   rQ   r  0  s<    


z NumBinopNode.analyse_c_operationc                 C   sN   |  ||rFt||}|tjkr4| jdkrBtj}nt|tj}|S d S d S )Nz|^&)c_types_okayr   r  r  r	   r  rS   r|  r}  Zwidest_typerP   rP   rQ   r  30  s    

 z"NumBinopNode.compute_c_result_typec                 C   s"   |j rt||S t||S d S rI   )rf  r   Z result_type_of_builtin_operationr{  rP   rP   rQ   r  A0  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 r&  )r   rf  r  r   rK   r  r{  rN   rP   rQ   r  G0  s    zNumBinopNode.may_be_nonec                 C   s4   | j  }| j }|r,|r,d|| j|f S d S d S r  )r  r   r   r	   )rS   Zvalue1Zvalue2rP   rP   rQ   r   T0  s
    

z'NumBinopNode.get_constant_c_result_codec                 C   s   |j s|jo|j p|jS rI   )r  r  r{  rP   rP   rQ   r  \0  s    
zNumBinopNode.c_types_okayc                    s   | j r0| | _|jjtjdd| _|d| j  t 	| | j r|d| j  |d ||
| j |d |j| j d S )NFr.  rR  r  z8PyErr_SetString(PyExc_OverflowError, "value too large");r   )r  overflow_bit_noder3  r4  r   r  overflow_bitr   rK   rL  r   rz   r;  r>  rN   rP   rQ   rL  a0  s    

z%NumBinopNode.generate_evaluation_codec                 C   s   | j d k	r,d| j| j | j | j jf S | jjs:| jrt	| jr\| j
 | j
  }}n| j | j  }}d|| j|f S | j| j}|d krt| jd| j| jf  d|| j | j f S d S )Nz%s(%s, %s, &%s)r  z'binary operator %s not supported for %sr  )r  r  r  r   r   r  r   r   r  r;   r   r	   	binary_opr   rz   )rS   result1result2r  rP   rP   rQ   r   n0  s(    

z"NumBinopNode.calculate_result_codec                 C   s   |j p|j pt| ||S rI   )r8  rw  rz  r{  rP   rP   rQ   rz  0  s
    z"NumBinopNode.is_py_operation_typesc                 C   s"   | j | j }| jr|dd}|S )NZ	PyNumber_ZPyNumber_InPlace)py_functionsr	   r!  r  )rS   r   r  rP   rP   rQ   r  0  s    z"NumBinopNode.py_operation_functionZPyNumber_OrZPyNumber_XorZPyNumber_AndZPyNumber_LshiftZPyNumber_RshiftZPyNumber_AddZPyNumber_SubtractZPyNumber_MultiplyZ__Pyx_PyNumber_MatrixMultiplyZ__Pyx_PyNumber_DivideZPyNumber_FloorDivideZPyNumber_RemainderZPyNumber_Power)r  rq  r<  rm  rp  r   r  r   rr  rk  rl  rn  ro  rm  rZ  mullshift)r   r  r   rm  )rU   rV   rW   r  r  r  r  r  r  r  r   r  rL  r   rz  r  r  r  rX   rP   rP   rN   rQ   r  0  s@   r  c                   @   s   e Zd Zdd ZdS )IntBinopNodec                 C   s   |j s|jo|j p|jS rI   )r  r  r{  rP   rP   rQ   r  0  s    
zIntBinopNode.c_types_okayN)rU   rV   rW   r  rP   rP   rP   rQ   r  0  s   r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )BitwiseOrNodec                 C   s   | j js| jjrdgS d S r  )r  r  r   r   rP   rP   rQ   r  0  s    z(BitwiseOrNode.analyse_pytyping_modifiersc              	   C   sZ   | d ||}W 5 Q R X |s(dS | sV|jrD| sD|jS t|jd|  |S )z=Analyse annotations in form `[...] | None` and `None | [...]`FNz)'[...] | None' cannot be applied to type )new_c_type_contextr  Zcan_be_optionalr  r  r   rz   )rS   rl   Zoperand_nodettyperP   rP   rQ   _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 rI   )r  r  r  r   r   rP   rP   rQ   r  0  s
    zBitwiseOrNode.analyse_as_typeN)rU   rV   rW   r  r  r  rP   rP   rP   rQ   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 d S r  )rH  rI  r  rz  r{  rP   rP   rQ   rz  0  s    zAddNode.is_py_operation_typesc                    sB   t ttf}||kr4||kr4|t|||| S t ||S rI   )r   r   r   rJ  r  rK   r  )rS   r|  r}  string_typesrN   rP   rQ   r  0  s    
z%AddNode.infer_builtin_types_operationc                 C   sJ   |j s|jr|js|jr|S |j s(|jr8|js4|jr8|S t| ||S d S rI   )rx  r  r  r  r  r  r{  rP   rP   rQ   r  0  s      zAddNode.compute_c_result_typec                    s   | j j| jj }}d }|tks&|tkr|tkr<|tkr<d}n"t| j tsTt| jtrZd}nd}|r| jsr| j  r|j	t
dd d}|r| js| j  r|d7 }| j  s| j r|d7 }|S t |S )NTFZUnicodeConcatInPlacer  Z__Pyx_PyUnicode_ConcatZInPlaceZSafe)r  r   r   r   rv   rk  r!  r+  r   r   r   r   r  rK   r  )rS   r   r|  r}  r  Zis_unicode_concatrN   rP   rQ   r  0  s*    
zAddNode.py_operation_function)rU   rV   rW   rz  r  r  r  rX   rP   rP   rN   rQ   r  0  s   	
r  c                   @   s   e Zd Zdd ZdS )SubNodec                 C   sL   |j s|jr|js|jr|S |j s(|jr:|j s4|jr:tjS t| ||S d S rI   )rx  r  r  r  r   Zc_ptrdiff_t_typer  r  r{  rP   rP   rQ   r  1  s      zSubNode.compute_c_result_typeN)rU   rV   rW   r  rP   rP   rP   rQ   r  1  s   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r| j }| j}|jrV|jd krV| |||S |jrt|jd krt| |||S |jt	kr|
|| _n|jt	kr|
|| _ | |S rI   )r  r   r   calculate_is_sequence_mulis_sequence_mulr   r   analyse_sequence_mulr   r    r  r  rS   rl   r  r   rP   rP   rQ   r   1  s    


zMulNode.analyse_typesc                 C   s   | j o| tko| tk	S rI   )rf  r    r   rs  rP   rP   rQ   is_builtin_seqmul_type-1  s    zMulNode.is_builtin_seqmul_typec                 C   s\   | j j}| jj}|tjks |jr*|| }}|tjks:|jrX|jsF|jrJdS | |rXdS dS r  )	r  r   r   r   r	  r  rH  r  r  r{  rP   rP   rQ   r  11  s    

z!MulNode.calculate_is_sequence_mulc                 C   s.   |j d kst||}|||_ ||S rI   )r   r   r  r  r   )rS   rl   rd  ZmultrP   rP   rQ   r  >1  s    
zMulNode.analyse_sequence_mulc                    sL   | j r<| jjjr | j|| _n| jjjr8| j|| _d S t | d S rI   )r  r  r   r  r  r   rK   rx  r   rN   rP   rQ   rx  D1  s    

z$MulNode.coerce_operands_to_pyobjectsc                    s   | j pt ||S rI   )r  rK   rz  r{  rN   rP   rQ   rz  N1  s    zMulNode.is_py_operation_typesc                    s8   | j r,|jtdd | jjjr(dS dS t 	|S )NrH  r  Z__Pyx_PySequence_MultiplyZ__Pyx_PySequence_Multiply_Left)
r  r   r   r   r   r  r   ri   rK   r  r>  rN   rP   rQ   r  Q1  s    
zMulNode.py_operation_functionc                    sJ   |j r(|j r(| |r|S | |r(|S |jr2|S |jr<|S t ||S rI   )rf  r  r  rK   r  r{  rN   rP   rQ   r  X1  s    

z%MulNode.infer_builtin_types_operation)rU   rV   rW   r  r   r  r  r  r  rx  rz  r  r  rX   rP   rP   rN   rQ   r  1  s   

r  c                       s,   e Zd Zdd Zdd Z fddZ  ZS )MatMultNodec                 C   s   dS r  rP   r{  rP   rP   rQ   rz  l1  s    z!MatMultNode.is_py_operation_typesc                 C   s   d S rI   rP   r{  rP   rP   rQ   r  o1  s    z)MatMultNode.infer_builtin_types_operationc                    s$   |j tdd t | d S )NZMatrixMultiplyr  )r   r   r   r   rK   rL  r>  rN   rP   rQ   rL  s1  s    z$MatMultNode.generate_evaluation_code)rU   rV   rW   rz  r  rL  rX   rP   rP   rN   rQ   r  i1  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 kr:t|tr:t|tr:t d }|S )Nrk  rl  )ru  r	   truedivisionrv   rx   rS   op1op2r  rP   rP   rQ   !find_compile_time_binary_operator1  s
    
z)DivNode.find_compile_time_binary_operatorc                 C   s,   | j j}| jj}| ||}|||| _d S rI   )r  rw   r   r  r  rP   rP   rQ   r   1  s    z!DivNode.calculate_constant_resultc              
   C   sb   | j |}| j|}| ||}z|||W S  tk
r\ } z| | W 5 d }~X Y nX d S rI   )r  r   r   r  r  r   )rS   r   r  r   r  r   rP   rP   rQ   r   1  s    zDivNode.compile_time_valuec                 C   s$   | j s|jd rd| _n| j| _d S )N	cdivisionF)r  rd   ctruedivisionr  r   rP   rP   rQ   _check_truedivision1  s    zDivNode._check_truedivisionc                 C   s(   |  | | | j|| j||S rI   )r  rT  r  r   r   r   rP   rP   rQ   r   1  s    


 zDivNode.infer_typec                    sj   t  ||}|d k	rf| jdkrf| js,| jrR|tjkr<tjS |j	rft
tj|S n|tjksb|j	rfd }|S Nrk  )rK   r  r	   r  r  r   r	  r   r  r  r  )rS   r|  r}  rT  rN   rP   rQ   r  1  s    
z%DivNode.infer_builtin_types_operationc                 C   s   |  | t| |}|  r$d| _| jjs| jd koX|jd  oX| j	  pX| jj
dk| _| jsl|jd r| j|| _| j|| _|S )NTr  r   cdivision_warnings)r  r  r  r  r  r   ri   rd   r   r   rw   zerodivision_checkr  r	  r   rP   rP   rQ   r  1  s    

zDivNode.analyse_operationc                 C   sT   | j dkrF| jrF|jsF|jsF|jsF|jsFt|tj}t||}|S t| ||S r  )	r	   r  r   r  r   r  r  r  r  r  rP   rP   rQ   r  1  s    zDivNode.compute_c_result_typec                 C   s   | j jrdS dS d S )N"integer division or modulo by zerozfloat divisionr  rR   rP   rP   rQ   zero_division_message1  s    zDivNode.zero_division_messagec                 C   s   | j jsl| j jsl| jd krJ|jjd pF| j jpF| j js>| j joF| j j	 | _| jsl|j
tdd| j  t| | | | d S )Nr  ZDivIntCMath.c)r   ri   r  r  r   rd   r  r  r  r  r   r   r   r  r  rL  generate_div_warning_coder>  rP   rP   rQ   rL  1  s    
z DivNode.generate_evaluation_codec                 C   sb  | j }| jjs^| jrp| js:d| jd| j f }nd| j  }|d|  |rb|	  |d| 
   |r|  ||| j |d | jjrp| jjrp| jdkrp|jtdd	 | jjjd
krd| j  }n | jj }d|| j |f }|d| j || j f  |r<|	  |d |rT|  ||| j |d |jjd r^| jdkr^|jtdd |d| j | j f  dtjtjd }|r d}|d|  |	  ||j| jdd |d||f  |  n|}||j| jdd |d|  ||j |d d S )Nry  Zzeroz%s == 0r  z/PyErr_SetString(PyExc_ZeroDivisionError, "%s");r   rn  ZUnaryNegOverflowsr  r4   zunlikely(%s == -1)z+(!(((%s)-1) > 0)) && unlikely(%s == (%s)-1)z]else if (sizeof(%s) == sizeof(long) && %s  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(%s))) {zLPyErr_SetString(PyExc_OverflowError, "value too large to perform division");r  rk  ZCDivisionWarningr  z$if (unlikely((%s < 0) ^ (%s < 0))) {z1__Pyx_cdivision_warning(%(FILENAME)s, %(LINENO)s))ZFILENAMEZLINENOr   zint %s;T)r|  r  zif (unlikely(%s)) )rC  r   ri   r  r  r$  r   r   r   r   r  r   r   rz   r  r  r	   r   r   r   r   r_  r  rd   r   Zfilename_cnameZlineno_cnameZset_error_infor  r  r  )rS   r   Zin_nogilZ	zero_testZminus1_checkZtype_of_op2Zwarning_coder  rP   rP   rQ   r  1  sz    

   



z!DivNode.generate_div_warning_codec              	   C   s   | j js|  rt| S | j }| j }| j jrR| j	dkrRd| d| dS | j
s^| jr| j
r| j | jj kr~| j |}| j | jj kr| j |}d| d| dS | j }d| j   d| d| dt|dd	S d S )	Nrl  zfloor(z / r  r-  Z
__Pyx_div_r"  rv  )r   r  r  r  r   r  r   r   r  r	   r  r  r  r   specialization_namer  rS   r  r  Zb_is_constantrP   rP   rQ   r   "2  s    



zDivNode.calculate_result_code)rU   rV   rW   r  r  r  r  r  r  r   r   r  r   r  r  r  r  rL  r  r   rX   rP   rP   rN   rQ   r  x1  s"   	?r  s'   %(?:%|(?:\([^)]+\))?[-+#,0-9 ]*([a-z]))   d   i   o   u   x   X   e   E   f   F   g   G   c   b   ac                       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   s   |j p|j pt| ||S rI   )rH  r  rz  r{  rP   rP   rQ   rz  H2  s
    zModNode.is_py_operation_typesc                    s6   |t ttfkr(|js$|jr$| j s(|S t ||S rI   )	r   r   r   rf  ri   r  r  rK   r  r{  rN   rP   rQ   r  M2  s    z%ModNode.infer_builtin_types_operationc                 C   s   | j jrdS dS d S )Nr  zfloat divmod()r  rR   rP   rP   rQ   r  T2  s    zModNode.zero_division_messagec                 C   s`   t | |}| jjs\| jd kr4|jd p0| jj | _| js\| jjs\| jjs\t	| j
d| j  |S )Nr  z(mod operator not supported for type '%s')r  r  r   ri   r  rd   r  r  r  r   rz   r   rP   rP   rQ   r  Z2  s    
zModNode.analyse_operationc                 C   sr   | j jsX| jsX| j jr4|jtdd| j  n$|jtddj| j | j j	d t
| | | | d S )NZModIntr  ZModFloat)math_h_modifier)r   ri   r  r  r   r   r   r   r  r  r  rL  r  r>  rP   rP   rQ   rL  f2  s     z ModNode.generate_evaluation_codec              	   C   s   | j  }| j }| jrR| jjr>d| jj d| d| dS d| d| dS n4| j }d| j  d| d| dt	|dd	S d S )Nfmodr-  r"  r  z % Z
__Pyx_mod_rv  )
r  r   r   r  r   r  r  r   r  r  r  rP   rP   rQ   r   s2  s    


zModNode.calculate_result_codec                    s\   | j j| jj }}|tkrP| j  sH|jr4||sH|tkrLt| jt	sLdS dS t
 |S )NZ__Pyx_PyUnicode_FormatSafeZPyUnicode_Format)r  r   r   r   r  re  r  r   rv   r  rK   r  )rS   r   r|  r}  rN   rP   rQ   r  2  s    

zModNode.py_operation_function)rU   rV   rW   rz  r  r  r  rL  r   r  rX   rP   rP   rN   rQ   r  E2  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 k	rd S |jd | _ d S )NZcpow)is_cpowrd   r   rP   rP   rQ   _check_cpow2  s    
zPowNode._check_cpowc                    s   |  | t |S rI   )r  rK   r   r   rN   rP   rQ   r   2  s    
zPowNode.infer_typec                    s   |  | t |S rI   )r  rK   r   r   rN   rP   rQ   r   2  s    
zPowNode.analyse_typesc                 C   s   d S rI   rP   r{  rP   rP   rQ   r  2  s    z%PowNode.infer_builtin_types_operationc                 C   s   t | | | jjrf| jjjrR| j| j|| _| j| j|| _| j	d| _
qt| jd d| _
n| jjr~d| jj | _
nx| jjrd| j dd | _
|tdd	j| j
| j | jjrd
pdd n$| jjst| jd| jj| jjf  d S )Nro  z complex int powers not supportedr  powz__Pyx_pow_%sr  r  ZIntPowr  r)   r   )rW  r   r  z1got unexpected types for C power operator: %s, %s)r  r  r   r  r:  r  r  r  r   r  pow_funcr   rz   r  r  r_  r  r   r   r   r  r  r  r   rP   rP   rQ   r  2  s.    
zPowNode.analyse_c_operationc                    s,  ddl m} d }| j r&| jjdkp4|jo4|jdk}|jpf| j oft| jj|oft	| jj| jjk}d}| j
rt ||}| j st| jjt	o| jjdk }nn|s|rt ||}| j s|jo|j}|rd| _nt| jjt	o| jjdk }n| ||rtj}d| _|r(t|tj}|S )Nr   )RealFT)Znumbersr  r  r   rw   r  r  r   rv   rx   r  rK   r  type_was_inferredr  r   r  r  r  )rS   r|  r}  r  Zc_result_typeZop1_is_definitely_positiveZtype2_is_intZneeds_wideningrN   rP   rQ   r  2  sB    




zPowNode.compute_c_result_typec                    s(    fdd}d j | j| jf S )Nc                    s(    j | j kr|  S  j |  S d S rI   )r   r   r  rT  rR   rP   rQ   r/   2  s    z/PowNode.calculate_result_code.<locals>.typecastr  )r  r  r   )rS   r/   rP   rR   rQ   r   2  s    zPowNode.calculate_result_codec                    s\   | j jrP| jjdkrPt| jjtrP| jj tkrP|j	t
dd | jrLdS dS t |S )Nr4   ZPyNumberPow2rY  Z__Pyx_PyNumber_InPlacePowerOf2Z__Pyx_PyNumber_PowerOf2)r   ri   r  rw   rv   rx   r   r   r   r   r   r   r!  rK   r  r>  rN   rP   rQ   r  2  s    

zPowNode.py_operation_functionc           	         s   || j kr| S | jd kr| jr|js*|jr| j tjkrJd	 fdd	 d}n|jr^dd  d}ndd   | j\}} | j\}}|r|rt	| j
d|  d| _|| _|| _| |}|j |kr|||}|S t ||S )
NTc                    s>   | j js| j jrd| fS |r:t| tr: | jdd| jfS dS )NTF)recurseFN)r   r  r  rv   r  r  )rr  r  check_typesrP   rQ   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 d S )NTr  r  rT  rP   rP   rQ   r  3  s    zan integer C numeric typec                 S   s   dS )Nr  rP   rT  rP   rP   rQ   r  3  s    zTreating '**' as if 'cython.cpow(True)' since it is directly assigned to a %s. This is likely to be fragile and we recommend setting 'cython.cpow' explicitly.)T)r   r  r  r  r  r   r  r  r   r   rz   r   r  rK   )	rS   r  rl   Z
msg_detailZ	check_op1r  Z	check_op2r  r   rN   r  rQ   r  2  s8    


zPowNode.coerce_to)rU   rV   rW   r  r  r  r   r   r  r  r  r   r  r  rX   rP   rP   rN   rQ   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 rI   )r  r   r   r   independent_spanning_typer  rP   rP   rQ   r   <3  s    zBoolBinopNode.infer_typec                 C   s,   | j dkr| j S | j p&| j S d S )Nor)r	   r   r  r  rR   rP   rP   rQ   r  A3  s    

zBoolBinopNode.may_be_nonec                 C   s4   | j j}| jj}| jdkr&|o || _n
|p,|| _d S Nand)r  rw   r   r	   )rS   r  r   rP   rP   rQ   r   G3  s
    
z'BoolBinopNode.calculate_constant_resultc                 C   s6   | j |}| j|}| jdkr*|o(|S |p0|S d S r  )r  r   r   r	   )rS   r   r  r   rP   rP   rQ   r   O3  s
    
z BoolBinopNode.compile_time_valuec                 C   s   | j  p| j S rI   )r  r   r   rR   rP   rP   rQ   r   W3  s    zBoolBinopNode.is_ephemeralc                 C   sJ   | j |}| j|}t|j|j| _| ||| _ | ||| _| S rI   )r  r   r   r   r  r   _wrap_operandr  rP   rP   rQ   r   Z3  s     zBoolBinopNode.analyse_typesc                 C   s    t |ttfst|| j|}|S rI   )rv   r  BoolBinopResultNoder   )rS   rr  rl   rP   rP   rQ   r  f3  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   rP   rP   rQ   wrap_operandsk3  s    zBoolBinopNode.wrap_operandsc                 C   s   |  tj|S rI   r  r   r  r   rP   rP   rQ   r  s3  s    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	   )rS   r  rl   r  r   rP   rP   rQ   r  v3  s      zBoolBinopNode.coerce_toc           
   	   C   s   | | j ||f}| jdkr.|d }	}n|d }	}| j|||||||	 |\}}||	 | j||||||| d S )Nr  Znext_andZnext_or)rF  rz   r	   r  r  generate_bool_evaluation_coder  r   )
rS   r   final_result_tempfinal_result_type	and_labelor_label	end_labelfall_throughZouter_labelsZmy_labelrP   rP   rQ   r  ~3  s2    
      
      z+BoolBinopNode.generate_bool_evaluation_codec              	   C   sX   |  | | jjrtjn| j}d  }}|d}| ||  ||||| || d S )NZbool_binop_done)	r6  r   ri   r   r   r  r  r   r  )rS   r   rT  r  r  r  rP   rP   rQ   rL  3  s    

z&BoolBinopNode.generate_evaluation_codeTruth-testing Python objectc                 C   s   | j  o| j S rI   r  rR   rP   rP   rQ   r   3  s    zBoolBinopNode.check_constc                 C   s   d S rI   rP   r>  rP   rP   rQ   rJ  3  s    z,BoolBinopNode.generate_subexpr_disposal_codec                 C   s   d S rI   rP   r>  rP   rP   rQ   rK  3  s    z BoolBinopNode.free_subexpr_tempsc              	   C   sV   | j jr@|jjtjdd}|d|| j |	|| j
f  n
| j }|| j jfS NFr.  "%s = __Pyx_PyObject_IsTrue(%s); %s)r   ri   r3  r4  r   r  r   r  r   r  rz   r   rS   r   test_resultrP   rP   rQ   generate_operand1_test3  s     
z$BoolBinopNode.generate_operand1_test)rU   rV   rW   r  r   r   r	   r  r   r   r  r   r   r   r   r  r  r  r  r  rL  rZ  r   rJ  rK  r  rP   rP   rP   rQ   r  +3  s.   
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	  	ProxyNoderK   r  rz   rl  r  )rS   r  rT  rl   rN   rP   rQ   r  3  s    
  zBoolBinopResultNode.__init__c                 C   s   |  tj|S rI   r  r   rP   rP   rQ   r  3  s    z%BoolBinopResultNode.coerce_to_booleanc                 C   s(   | j j }|tjkr||}t|||S rI   )r  r   r  r  r  )rS   r  rl   r  rP   rP   rQ   r  3  s    

zBoolBinopResultNode.coerce_toc                 C   s   d S rI   rP   r   rP   rP   rQ   r$  3  s    zBoolBinopResultNode.nogil_checkc              	   C   sZ   | j jjrB|jjtjdd}|d|| j  |	|| j
f  n
| j  }|| j jjfS r  )r  r   ri   r3  r4  r   r  r   r   r  rz   r   r  rP   rP   rQ   generate_operand_test3  s    
 
z)BoolBinopResultNode.generate_operand_testc                 C   s  | | j | j| |s |r| |\}}	|	rF|rF|rF| j| |rNdnd}
|d|
|f  |	rt|j| |	r|r|s| j| |r||kr|	| |r|r|d |	s| j| ||kr|	| |r|s\|s|r|d | j
| | j
| |d|| j
|f  | j
| | j| | j
| ||kr\|	| |sh|rr|d | j| d S )Nr  rn  zif (%s%s) {r  r  r   )rF  rz   r  rL  r  rQ  r   r3  r;  r  r   r?  r   rS  rY  )rS   r   r  r  r  r  r  r  r  Z	uses_tempZsenserP   rP   rQ   r  3  sF    







z1BoolBinopResultNode.generate_bool_evaluation_codec                 C   s   | S rI   rP   r   rP   rP   rQ   r    4  s    z!BoolBinopResultNode.analyse_types)rU   rV   rW   r  r   r   r  r   r  r  r  r$  r  r  r   rX   rP   rP   rN   rQ   r  3  s   	7r  c                       s   e Zd ZdZdZdZdddgZdd Zdd	 Zd
d Z	dd Z
dd Zdd Z fddZ fddZdd Zdd Zdd Zdd Zdd Zd d! Z  ZS )"r%  NTr#  r!  r"  c                 C   s   | j || j| S rI   )r!  r  r"  r   rP   rP   rQ   r  14  s    zCondExprNode.type_dependenciesc                 C   s   t | j|| j|S rI   )r   r  r!  r   r"  r   rP   rP   rQ   r   44  s    

zCondExprNode.infer_typec                 C   s"   | j jr| jj| _n
| jj| _d S rI   )r#  rw   r!  r"  rR   rP   rP   rQ   r   94  s    z&CondExprNode.calculate_constant_resultc                 C   s   | j  p| j S rI   )r!  r   r"  rR   rP   rP   rQ   r   ?4  s    zCondExprNode.is_ephemeralc                 C   s4   | j || _ | j|| _| j|| _| |S rI   )r#  r
  r!  r   r"  r'  r   rP   rP   rQ   r   B4  s    zCondExprNode.analyse_typesc                 C   s   | j j}| jj}t||| _| jjr6t| jj| _| jjrFt	| _
n8| jjr~| j  rft| j jd | j r~t| jjd |js|js| jjr|| jkr| j | j|| _ || jkr| j| j|| _| jjr|   | S )NzPUnsafe C derivative of temporary Python reference used in conditional expression)r!  r   r"  r   r  r   r  ru  ri   r   r   rx  r   r   rz   r  r  r  )rS   rl   Ztrue_val_typeZfalse_val_typerP   rP   rQ   r'  H4  s(    



z CondExprNode.analyse_result_typec                    sp   | j jjs| j || _ | jjjs0| j|| _d | _| |}|jjsl|| krbtt||}n
||}|S rI   )	r!  r   r  r  r"  r   r'  rK   r%  )rS   rl   outrN   rP   rQ   r  a4  s    



zCondExprNode.coerce_to_indexc                    s~   | j j|kr| j ||| _ | jj|kr8| j||| _d | _| |}|j|krz|| krntt|||}n|||}|S rI   )r!  r   r  r"  r   r'  rK   r%  )rS   r  rl   r  rN   rP   rQ   r  r4  s    

zCondExprNode.coerce_toc                 C   s<   | j jjs0| jjjs0t| jd| j j| jjf  tj| _d S )Nz5Incompatible types in conditional expression (%s; %s))r!  r   r  r"  r   rz   r   r0   rR   rP   rP   rQ   r  4  s
    zCondExprNode.type_errorc                 C   s   | j  o| j o| j S rI   )r#  r   r!  r"  rR   rP   rP   rQ   r   4  s
    
zCondExprNode.check_constc                 C   s   | | j | | | j| |d| j   | || j |d | || j	 |d | j
| | j| d S )NrN  r  r   )rF  rz   r6  r#  rL  r   r   eval_and_getr!  r"  rQ  rY  r>  rP   rP   rQ   rL  4  s    


z%CondExprNode.generate_evaluation_codec                 C   s`   | | | jjr|| n
|| |d|  ||  f  |	| |
| d S r  )rL  r   r   rD  r?  r   r   r   r   rS  rY  )rS   r   r*  rP   rP   rQ   r  4  s    

 
zCondExprNode.eval_and_getc                 C   s   d S rI   rP   r>  rP   rP   rQ   rJ  4  s    z+CondExprNode.generate_subexpr_disposal_codec                 C   s   d S rI   rP   r>  rP   rP   rQ   rK  4  s    zCondExprNode.free_subexpr_temps)rU   rV   rW   r!  r"  r   r   r  r   r   r   r   r'  r  r  r  r   rL  r  rJ  rK  rX   rP   rP   rN   rQ   r%  $4  s$   

r%  ZPy_LTZPy_LEZPy_EQZPy_NEZPy_GTZPy_GE)	re  rf  rg  r6  z<>ri  rh  rs  rt  c                   @   s   e Zd ZdZdZg Zdd Zdd Zdd Zdd	 Z	d
d Z
d!ddZdd Zdd Zdd Zdd Zdd Zdd Zd"ddZdd Zdd  ZdS )#CmpNodeNc                 C   s   t S rI   rH  r   rP   rP   rQ   r   4  s    zCmpNode.infer_typec                 C   s   t | j }| jj}t|tr:t|tr:t|t|kr:d S | jdkrt| jttt	fr| jj
sn| jdk| _d S t| jtr| js| j | _n$t| jtr| jjs| jdk| _d S |||| _d S )Nrs  rt  rt  )ru  r	   r   rw   rv   any_string_typer   r  r  re  r   cascaderM  r`  r]  )rS   Zoperand1_resultr  Zoperand2_resultrP   rP   rQ   "calculate_cascaded_constant_result4  s(    


z*CmpNode.calculate_cascaded_constant_resultc              
   C   sv   t | }| j|}z|||}W n0 tk
rR } z| | d }W 5 d }~X Y nX |rr| j}|rr|op|||}|S rI   )rv  r   r   r  r   r  cascaded_compile_time_value)rS   r  r   r  r   r   r   r  rP   rP   rQ   r  4  s    
z#CmpNode.cascaded_compile_time_valuec                 C   s   | j jjp| jjjS rI   r  rR   rP   rP   rQ   is_cpp_comparison4  s    zCmpNode.is_cpp_comparisonc           	      C   s~   |j }|j }d}d}|jr&| r&d}|jr8| r8d}|jrH|rz|S n2|jrX|rz|S n"|rz|rztj||fkrttjS tjS d S r  )	r   r  r4  r  r   r   r   r  r  )	rS   rl   r  r  r   r|  r}  Ztype1_can_be_intZtype2_can_be_intrP   rP   rQ   find_common_int_type4  s(    zCmpNode.find_common_int_typec           	      C   s6  | j }|j}|j}d }|js"|jr|dkrT|js6|jrT|jsB|jrTt| jd t}q|jrr|t	j
rlt	j
nt}q|jr|t	j
rt	j
nt}qt||}n8|jr|jrt||}n|d ks|js| ||||}|d kr|js|jrt}n||kr|}n|js|jr|js"|jr<|||r6t}nt}nZ|jsL|jrf|||r`t}nt}n0t|rt|rt}n| ||| t}n6||r|}n$||r|}n| ||| t}|jrt|tst|trt}|d ks|jr
|}nt||}| jr2| j|| j||}|S )Nrg  r6  zcomplex types are unordered)r   r   r  r  r   rz   r0   ri   r  r   rX  r   r   r  r  r  rH  rt  r  invalid_types_errorrv   r  r   r  Zspanning_typer  find_common_typer	   )	rS   rl   r  r  common_typer   r|  r}  Znew_common_typerP   rP   rQ   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   rz   r   )rS   r  r  r   rP   rP   rQ   r  X5  s    zCmpNode.invalid_types_errorc                 C   s6   |    o4|   o4|  p4| jr,| j p4| jdkS Nr  )is_ptr_containsis_c_string_containshas_python_operandsr  is_python_comparisonr	   rR   rP   rP   rQ   r  \5  s    
zCmpNode.is_python_comparisonc                 C   s6   | j }|j|kr|||| _ | jr2| j|| d S rI   )r   r   r  r  coerce_operands_to)rS   r  rl   r   rP   rP   rQ   r  c5  s
    
zCmpNode.coerce_operands_toc                 C   s@   |   r0| jd kr0| jdkr0|   r0|   p>| jo>| j S )N)r  rj  rs  rt  )r   special_bool_cmp_functionr	   r  r  r  is_python_resultrR   rP   rP   rQ   r  j5  s    zCmpNode.is_python_resultc                 C   s@   | j dko>| jjjr*| jjjp>| jjtkp>| jjjo>| jjtkS r  )	r	   r  r   r  r   rH  r   r8  r   rR   rP   rP   rQ   r  r5  s    



zCmpNode.is_c_string_containsc                 C   s*   | j dkr&| jj}|js|jo$|j S d S r  )r	   r   r   rx  r  rH  )rS   Zcontainer_typerP   rP   rQ   r  y5  s
    
zCmpNode.is_ptr_containsFc           	      C   s  | j dkr|j| jj }}|s*|jr|jr|tjks>|tjkrVtdd| _d| _	dS |tj
ksj|tj
krtdd| _d| _	dS |rdd	lm} || j d
krdnd| tj|| j}|r|\| _	| _| _}dS n| j dkr| jjtjkr| jd| _tdd| _d| _	dS | jjtjkrH| jd| _tdd| _d| _	dS | jjtjkr~| jd| _tdd| _d| _	dS | jjjs| j|| _tdd| _d| _	dS dS )Nr  ZUnicodeEqualsrg  Z__Pyx_PyUnicode_EqualsTZBytesEqualsZ__Pyx_PyBytes_Equalsr)   )optimise_numeric_binoprg  ZEqZNer  r  ZPyDictContainsr  Z__Pyx_PyDict_ContainsTFZPySetContainsZ__Pyx_PySet_ContainsTFZPyUnicodeContainsZ__Pyx_PyUnicode_ContainsTFZPySequenceContainsZ__Pyx_PySequence_ContainsTFF)r	   r   r   rf  r   r   r   r   special_bool_cmp_utility_coder  r   ZOptimizer  r   r  special_bool_extra_argsr   r  r   ri   r  )	rS   rl   r  result_is_boolr|  r}  r  r   r  rP   rP   rQ   "find_special_bool_compare_function5  sb    
z*CmpNode.find_special_bool_compare_functionc                 C   sr  | j jr<|j}d| }| jr6|jtdd d}qJd}n|j}d}d}| jr|j jrb|	 }	n|
 }	|j jr||	 }
n|
 }
ddd	 | jD }| jr|j| j |d
||| j|	|
| jr|nt| |||| jf  n|j jrl|dkrl|dkst|| j js*| j tjks*t|d|| j jr@dnd|	 |	 t| |||| jf  n|j jr|d|||dkrdpd|j d|
 |
 f  n|j }|j }|js|jr||st}n|jrt||}n|}||}||}d|||| ||f }|  rd| jdkrdt|| j|| j jrT|nd | j | j! n
|| d S )Nz__Pyx_XGOTREF(%s); ZPyBoolOrNullFromLongr  Z__Pyx_PyBoolOrNull_FromLongZ__Pyx_PyBool_FromLongrn  r"  c                 S   s   g | ]}|  qS rP   r<  )r[   	extra_argrP   rP   rQ   r   5  s    z3CmpNode.generate_operation_code.<locals>.<listcomp>z%s = %s(%s(%s, %s, %s)); %s%s)r  rj  r  z-%s = PyObject_RichCompare%s(%s, %s, %s); %s%sZBoolz%s = %s(%s%s(%s, %s));r6  r  eqz%s = %s(%s %s %s);r   )"r   ri   r   r  r   r   r   r   r  r   r   rp  r  r  r   richcmp_constantsrz   r   r   r  r  r$  re  r{  r   r  r  r   
c_operatorr  r   r   r   rC  )rS   r   r  r  r  r   Zerror_clauseZgot_refZcoerce_resultr  r  Zspecial_bool_extra_args_resultr|  r}  r  code1code2Z	statementrP   rP   rQ   r)  5  s    



 


	


	

zCmpNode.generate_operation_codec                 C   s    |dkrdS |dkrdS |S d S )Nr  rg  rj  r6  rP   )rS   r  rP   rP   rQ   r  6  s
    zCmpNode.c_operator)N)F)rU   rV   rW   r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r	  r)  r  rP   rP   rP   rQ   r  4  s$   
M
4Zr  c                   @   s   e Zd ZdddddgZdZdZdZdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' ZdS )(r&  r  r   coerced_operand2r  r  NFc                 C   sN   | j |}| j|}t|s(t|rJt|rJt|rJtt| j||S tS rI   )	r  r   r   r;   r9   rG   r=   r	   r   r  rP   rP   rQ   r   *6  s    zPrimaryCmpNode.infer_typec                 C   s   dS ra  rP   r   rP   rP   rQ   r  56  s    z PrimaryCmpNode.type_dependenciesc                 C   s   | j r
t| | jj d S rI   )r  r   r  r  rw   rR   rP   rP   rQ   r   86  s    
z(PrimaryCmpNode.calculate_constant_resultc                 C   s   | j |}| ||S rI   )r  r   r  )rS   r   r  rP   rP   rQ   r   <6  s    z!PrimaryCmpNode.compile_time_valuec                 C   s   | j }|r| j|_|j }qd S rI   )r  r   )rS   ZcdrrP   rP   rQ   unify_cascade_type@6  s    z!PrimaryCmpNode.unify_cascade_typec                 C   s  | j || _ | j|| _|  rD| | | jr@t| jd | S | j j}| jj}t	|sdt	|rt
|rt
|rtt| j||| _d| _| S | |r| S | jr| j|| _| jdkr|  rnd| _d }| jrt| jd | S | jjtkr|tdd nR| j jtjkr.| j tj|| _ | jjtk	rL| jt|| _|tdd | jd| _nj|  r| jrt| jd	 tj| _| S | || j r| j jjs| j || _ d }d| _n
t }d
| _nP| || j r| j jjs| j || _ d }d| _n| !|| j| j }|j| _|d k	rf|j"sf| j j|krZ| j ||| _ | #|| | jr| j$|| _| j%| | j&| j|}|| jk	r|| _'| ( rtj | _ntj| _| )  | js| js| j*rd| _+| S )Nz5Cascading comparison not yet supported for cpp types.Fr  z?Cascading comparison not yet supported for 'int_val in string'.ZPyUCS4InUnicoderg  ZBytesContainsz+argument of type 'NoneType' is not iterablez?Cascading comparison not supported for 'val in sliced pointer'.Tr)   ),r  r   r   r  analyse_cpp_comparisonr  r   rz   r   r;   r9   rG   r=   r	   is_pycmp"analyse_memoryviewslice_comparisonr  r   r   r   r   r   r  r  r   r   r  r  r  r	  ri   r  r   r  r  r  r	   coerce_cascaded_operands_to_tempoptimise_comparisonr  r  r  r  r   )rS   rl   r|  r}  r  r   rP   rP   rQ   r   F6  s    





zPrimaryCmpNode.analyse_typesc                 C   s  | j j}| jj}d| _|| j| j | jg}|d kr^t| jd| j||f  tj	| _d| _
d S |j}|jrp|j}|j| _|j| _| jdkrd| _t| r|tdd t|jdkr| j|jd	 j|| _n0| j |jd	 j|| _ | j|jd j|| _|j| _d S )
NFr  r  r   Tr  rO  r)   r   )r  r   r   r  r  r	   r   rz   r   r0   r  rx  ry  r   r   r   r   r   r   r   r   r   r  r	  )rS   rl   r|  r}  r   r  rP   rP   rQ   r  6  s2    

z%PrimaryCmpNode.analyse_cpp_comparisonc                 C   sV   | j jp| jj}| j jjp"| jjj}d}|rR|rR| j|krRd| _tj| _d| _	dS dS )N)rg  r6  r  rj  FT)
r  r  r   r   r   r	   r  r   r  is_memslice_nonecheck)rS   rl   Z	have_noneZ
have_sliceopsrP   rP   rQ   r  6  s    
z1PrimaryCmpNode.analyse_memoryviewslice_comparisonc                 C   sn   | j rb| j|| jddrbd| _ tj| _d| _| jrV| jj| j	|dd}|| j	k	rV|| _
|   | S t| |S )NT)r  Fr)   )r  r	  r  r   r  r   r   r  r  r   r  r  r   r  )rS   rl   r   rP   rP   rQ   r  6  s(        
z PrimaryCmpNode.coerce_to_booleanc                 C   s   | j jjp| jjjS rI   )r  r   ri   r   rR   rP   rP   rQ   r   6  s    
z"PrimaryCmpNode.has_python_operandsc                 C   s*   | j r|   dS | j o$| j S d S r&  )r  r'  r  r   r   rR   rP   rP   rQ   r   6  s    zPrimaryCmpNode.check_constc                 C   s   | j | j }}|jjrJ| jdkr&d}nd}d||jd| | f S |  r|jtkrbd}nd}| jdkrvd}nd}d||| | f S t	| jr|
 |
  }}n2| |  }}| jr|jjrd	| }nd	| }d
|| | j|f S d S )Nr6  r  rn  z(%s%s(%s, %s))rg  Z__Pyx_UnicodeContainsUCS4Z__Pyx_BytesContainsrt  ((PyObject *) %s.memview)r  )r  r   r   r  r	   r  r   r  r   r;   r   r  r   r  )rS   r  r   Znegationrn  r  r  rP   rP   rQ   r   6  sH    






z$PrimaryCmpNode.calculate_result_codec                 C   s   | j | | j| | jD ]}|| q| jr| | | ||  | j | j| j | j	r| j	j||  | j
px| j| j
d k	d | j | | j | | j| | j| d S )Nneeds_evaluation)r  rL  r   r  r   r6  r)  r   r	   r  r  rQ  rY  )rS   r   r
  rP   rP   rQ   rL  	7  s,    

    
z'PrimaryCmpNode.generate_evaluation_codec                 C   s   | j | | j| d S rI   )r  rQ  r   r>  rP   rP   rQ   rJ  7  s    z-PrimaryCmpNode.generate_subexpr_disposal_codec                 C   s   | j | | j| d S rI   )r  rY  r   r>  rP   rP   rQ   rK  !7  s    z!PrimaryCmpNode.free_subexpr_tempsc                 C   s.   | j | | j| | jr*| j| d S rI   )r  rm  r   r  r>  rP   rP   rQ   rm  '7  s    zPrimaryCmpNode.annotate)rU   rV   rW   r   r  r  r  r   r  r   r   r  r   r  r  r  r   r   r   rL  rJ  rK  rm  rP   rP   rP   rQ   r&  6  s,   T*r&  c                   @   s   e Zd ZddddgZdZdZeZdd Zdd	 Z	d
d Z
dd Zdd Zdd ZdddZdd Zdd ZdddZdd ZdS )CascadedCmpNoder   r  r  r  Nc                 C   s   t S rI   rH  r   rP   rP   rQ   r   ?7  s    zCascadedCmpNode.infer_typec                 C   s   dS ra  rP   r   rP   rP   rQ   r  C7  s    z!CascadedCmpNode.type_dependenciesc                 C   s   | j tk	o| j tk	S rI   r   rR   rP   rP   rQ   r   F7  s    
z#CascadedCmpNode.has_constant_resultc                 C   s&   | j || _ | jr"| j|| _| S rI   )r   r   r  r   rP   rP   rQ   r   J7  s    zCascadedCmpNode.analyse_typesc                 C   s
   | j jjS rI   )r   r   ri   rR   rP   rP   rQ   r   P7  s    z#CascadedCmpNode.has_python_operandsc                 C   s   dS r&  rP   rR   rP   rP   rQ   r  S7  s    z!CascadedCmpNode.is_cpp_comparisonFc                 C   sZ   |  |||r.d| _tj| _|jjs.||}| jrV| j| j	||}|| j	k	rV|| _
|S r&  )r	  r  r   r  r   ri   r  r  r  r   r  )rS   r  rl   r  r   rP   rP   rQ   r  W7  s    

z#CascadedCmpNode.optimise_comparisonc                 C   sH   | j || _ | j jtkr2| jdkr2| j d| _ | jrD| j| d S )Nr  r  )r   r  r   r   r	   r  r  rx  r   rP   rP   rQ   rx  c7  s
    z,CascadedCmpNode.coerce_operands_to_pyobjectsc                 C   s$   | j r | j|| _| j | d S rI   )r  r   r	  r  r   rP   rP   rQ   r  j7  s    z0CascadedCmpNode.coerce_cascaded_operands_to_tempc                 C   s   | j jr&|d|  ||| j  n|d|  |rB|| | j| | jD ]}|| qT| |||| j| j | j	r| j	j||| j
p| j| j
d k	d |r|| || | j| | j| |d d S )Nz if (__Pyx_PyObject_IsTrue(%s)) {rN  r  r   )r   ri   r   r  rL  r   r  r)  r	   r  r  rQ  rY  )rS   r   r   r  r  r
  rP   rP   rQ   rL  p7  s6    

    


z(CascadedCmpNode.generate_evaluation_codec                 C   s"   | j | | jr| j| d S rI   )r   rm  r  r>  rP   rP   rQ   rm  7  s    zCascadedCmpNode.annotate)F)F)rU   rV   rW   r   r  r  r   rw   r   r  r   r   r   r  r  rx  r  rL  rm  rP   rP   rP   rQ   r  .7  s"   


r  )r  r  r  rq  r<  rm  rp  r   r  r   rr  rk  rl  rn  ro  Fc                 K   s   t | | f||||d|S )N)r	   r  r   r!  )binop_node_classes)rz   r	   r  r   r!  r  rP   rP   rQ   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                    s.   t  |j || _tr*td| | jf  d S )Nz%s Coercing %s)rK   r  rz   r  r   r  rq  rN   rP   rQ   r  7  s    zCoercionNode.__init__c                 C   s   d S rI   rP   rR   rP   rP   rQ   r   7  s    z&CoercionNode.calculate_constant_resultc              	   C   sX   | j | | j j| jkrT| j\}}}||||d ftddd| j j| jf d d S )Nr)   Zcoercez[%s] to [%s])r  tagr  )r  rm  r   rz   r5   )rS   r   filelinecolrP   rP   rQ   rm  7  s      zCoercionNode.annotatec                 C   s   | S rI   rP   r   rP   rP   rQ   r   7  s    zCoercionNode.analyse_types)rU   rV   rW   r   r   rw   r  r   rm  r   rX   rP   rP   rN   rQ   r  7  s   r  c                   @   s    e Zd ZdZdd Zdd ZdS )r  zc
    Coerce an object to a memoryview slice. This holds a new reference in
    a managed temp.
    c                 C   sJ   |j s
t|jj rtt| | || _d| _d| _|| _| j| d S r  )	r   r   r   r  r  r   r5  r  r8  rS   r  r  rl   rP   rP   rQ   r  7  s    
z!CoerceToMemViewSliceNode.__init__c                 C   s(   | | j| j |  | j| d S rI   )r   r   from_py_call_coder  r   r   rz   r>  rP   rP   rQ   rG  7  s    
z-CoerceToMemViewSliceNode.generate_result_codeN)rU   rV   rW   r  r  rG  rP   rP   rP   rQ   r  7  s   
r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r:  c                 C   s   t | | || _d S rI   )r  r  r   )rS   r  new_typerP   rP   rQ   r  7  s    zCastNode.__init__c                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r  7  s    zCastNode.may_be_nonec                 C   s   | j | jS rI   )r  r   r   rR   rP   rP   rQ   r   7  s    zCastNode.calculate_result_codec                 C   s   d S rI   rP   r>  rP   rP   rQ   rG  7  s    zCastNode.generate_result_codeN)rU   rV   rW   r  r  r   rG  rP   rP   rP   rQ   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td|j|f t| | || _| | _|| _d S )Nz/PyTypeTest for %s against non extension type %s)	re  rf  r   r   r  r  r   r   r7  )rS   r  r  rl   r7  rP   rP   rQ   r  8  s    
zPyTypeTestNode.__init__zPython type testc                 C   s   | S rI   rP   r   rP   rP   rQ   r   8  s    zPyTypeTestNode.analyse_typesc                 C   s   | j r
dS | j S r&  )r7  r  r  rR   rP   rP   rQ   r  8  s    zPyTypeTestNode.may_be_nonec                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r  8  s    zPyTypeTestNode.is_simplec                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r+  8  s    zPyTypeTestNode.result_in_tempc                 C   s
   | j  S rI   )r  r   rR   rP   rP   rQ   r   "8  s    zPyTypeTestNode.is_ephemeralc                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r  %8  s    z#PyTypeTestNode.nonlocally_immutablec                 C   s   | j || _ | S rI   )r  r  r   rP   rP   rQ   r  (8  s    zPyTypeTestNode.coerce_to_tempc                 C   sT   | j | jj ks| j s| S | j  s*| S | j rN| jrN| jd| j j S | jS )Nz!Cannot convert NoneType to %.200s)r   r  r+  typeobj_is_availabler  r7  r  rj   rR   rP   rP   rQ   	reanalyse,8  s    
zPyTypeTestNode.reanalysec                 C   s   d S rI   rP   rR   rP   rP   rQ   r   58  s    z(PyTypeTestNode.calculate_constant_resultc                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r   98  s    z$PyTypeTestNode.calculate_result_codec                 C   s   | j  r| j }| j jrP| j j|jj| j || j	d}|j
tdd n.| j |jj| j |}|j
tdd |d||| jf  nt| jd d S )N)exactZRaiseUnexpectedTypeErrorr  ZExtTypeTestzif (!(%s)) %szICannot test type of extern C class without type object name specification)r   r%  r7  rf  Ztype_test_coder3  r  r  r   r  r   r   r   r   r   r   rz   r   )rS   r   r+  Z	type_testrP   rP   rQ   rG  <8  s4    

 
 

z#PyTypeTestNode.generate_result_codec                 C   s   | j | d S rI   r  r>  rP   rP   rQ   rS  V8  s    z,PyTypeTestNode.generate_post_assignment_codec                 C   s   d S rI   rP   r>  rP   rP   rQ   r6  Y8  s    z#PyTypeTestNode.allocate_temp_resultc                 C   s   d S rI   rP   r>  rP   rP   rQ   r<  \8  s    z"PyTypeTestNode.release_temp_resultc                 C   s   | j | d S rI   r  r>  rP   rP   rQ   rY  _8  s    zPyTypeTestNode.free_tempsc                 C   s   | j | d S rI   )r  rK  r>  rP   rP   rQ   rK  b8  s    z!PyTypeTestNode.free_subexpr_tempsN)F)rU   rV   rW   r  r  r,   r#  r$  rZ  r   r  r  r+  r   r  r  r&  r   r   rG  rS  r6  r<  rY  rK  rP   rP   rP   rQ   r   8  s(   

	r  c                       sn   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  TNrP   c                    s@   t  |j| |j| _| | _|| _|| _t|p6d| _	d S ra  )
rK   r  rz   r   r   r   exception_type_cnameexception_messager   exception_format_args)rS   r  r(  r)  r*  rN   rP   rQ   r  n8  s    
zNoneCheckNode.__init__c                 C   s   | S rI   rP   r   rP   rP   rQ   r   y8  s    zNoneCheckNode.analyse_typesc                 C   s   dS r&  rP   rR   rP   rP   rQ   r  ~8  s    zNoneCheckNode.may_be_nonec                 C   s4   | j jr| j S | j jr(d| j  S tdd S )Nr  zunsupported type)r   ri   r  r   r   r   r  rR   rP   rP   rQ   	condition8  s
    
zNoneCheckNode.conditionr  Fc                 C   s"   | ||||}||_ || d S rI   )rC  put_nonecheck)rM   r  r   r)  r(  r*  rC  r|   rP   rP   rQ   generate8  s    zNoneCheckNode.generatec                 C   s    |  r| |||||| d S rI   )r  r-  )rM   r  r   r)  r(  r*  rC  rP   rP   rQ   generate_if_needed8  s    z NoneCheckNode.generate_if_neededc              
      s   | d|    | jr |  tj | jrh| d| jt| j	dd
 fdd| jD f  n | d| j | j	df  | jr|  | || j | d d S )	Nzif (unlikely(%s == Py_None)) {zPyErr_Format(%s, "%s", %s);UTF-8r"  c                    s"   g | ]}d  t |d qS )z"%s"r/  )rp   rC  rN  escaperP   rQ   r   8  s   z/NoneCheckNode.put_nonecheck.<locals>.<listcomp>zPyErr_SetString(%s, "%s");r   )r   r+  rC  r   r   Zescape_byte_stringr*  r(  r)  rC  rp  r   r   rz   r>  rP   r0  rQ   r,  8  s0    


zNoneCheckNode.put_nonecheckc                 C   s   |  | d S rI   )r,  r>  rP   rP   rQ   rG  8  s    z"NoneCheckNode.generate_result_code)rP   )r  rP   F)r  rP   F)rU   rV   rW   r  r   r  r$  r   r  r+  r  r-  r.  r,  rG  rX   rP   rP   rN   rQ   r  f8  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r2||}t| | |tkr|j j	sV|j j
rbt|| _ n(|j jsr|j jrzt| _ n|j jrtj| _ | j | _nP|j j	s|j j
r|ttfkr|jd st|jd|j |f  | | _ | _n|| _d S )Nz$Cannot convert '%s' to Python objectrY   r/  )r   r  r   rz   r  r	  r  r  r   rH  rB  rs   rI  r8  r   r   rX  target_typer   r   rd   )rS   r  rl   r   rP   rP   rQ   r  8  s0    

zCoerceToPyTypeNode.__init__zConverting to Python objectc                 C   s   dS r&  rP   rR   rP   rP   rQ   r  8  s    zCoerceToPyTypeNode.may_be_nonec                 C   s<   | j j}|tjks"|jr.|jdkr.| j |S t| |S d S )Nr  )r  r   r   r  ri   rj   r  r  )rS   rl   r,  rP   rP   rQ   r  8  s    
z$CoerceToPyTypeNode.coerce_to_booleanc                 C   s   | j |S rI   )r  r  r   rP   rP   rQ   r  8  s    z"CoerceToPyTypeNode.coerce_to_indexc                 C   s   | S rI   rP   r   rP   rP   rQ   r   8  s    z CoerceToPyTypeNode.analyse_typesc                 C   sH   | d| jj| j |  | j||  | jf  | | d S )Nz%s; %s)	r   r  r   Zto_py_call_coder   r2  r   rz   rg  r>  rP   rP   rQ   rG  8  s    z'CoerceToPyTypeNode.generate_result_codeN)rU   rV   rW   r   r   r2  r   r  rZ  r  r  r  r   rG  rP   rP   rP   rQ   r  8  s   r  c                   @   s    e Zd ZdZdd Zdd ZdS )r  r)   c                 C   s"   | |}t| | tj| _d S rI   )r	  r  r  r   r   r   rS   r  rl   rP   rP   rQ   r  8  s    
zCoerceIntToBytesNode.__init__c              	   C   s   | j }| }|jtjtjtjfkrn|jjr@|d||f  n|d|  |d|	| j
  |d d }|jtjk	r|jjtjdd}|d||f  |}|d|  |||  | j
f  |d k	r|j| | | d S )	Nzif ((%s < 0) || (%s > 255)) {zif (%s > 255) {zOPyErr_SetString(PyExc_OverflowError, "value too large to pack into a byte"); %sr   Fr.  z%s = (char)%s;z*%s = PyBytes_FromStringAndSize(&%s, 1); %s)r  r   r   r   r   r  r  r  r   r   rz   r3  r4  r   r;  rg  )rS   r   r  Z
arg_resultr  rP   rP   rQ   rG  9  s:     


z)CoerceIntToBytesNode.generate_result_codeN)rU   rV   rW   r   r  rG  rP   rP   rP   rQ   r  8  s   r  c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )r  Nc                 C   s   t | | || _d| _||s2t|jd|  | jjsB| jjr| j	j
rp| j	jrp| j	jjrpt|jd| dd | jjrt|jddd d S )Nr)   z$Cannot convert Python object to '%s'z=Obtaining '%s' from externally modifiable global Python valuert   a  Py_UNICODE* has been removed in Python 3.12. This conversion to a Py_UNICODE* will no longer compile in the latest Python versions. Use Python C API functions like PyUnicode_AsWideCharString if you need to obtain a wchar_t* on Windows (and free the string manually after use).)r  r  r   r   r8  r   rz   rH  rI  r  r   r   r  r   )rS   rT  r  rl   rP   rP   rQ   r  (9  s$    
zCoerceFromPyTypeNode.__init__c                 C   s   | S rI   rP   r   rP   rP   rQ   r   <9  s    z"CoerceFromPyTypeNode.analyse_typesc                 C   s   | j jo| j j o| j S rI   )r   rx  r  r  r   rR   rP   rP   rQ   r   @9  s    z!CoerceFromPyTypeNode.is_ephemeralc              
   C   s   d }| j jrN| jj tkrN| j jdrNd| j jtdd   }t| j|d |	| j j
| j |  | j||| jd | j jr| | d S )NZ__Pyx_PyObject_AsZ__Pyx_PyBytesZ__Pyx_PyObjectzexpected bytes, NoneType found)from_py_functionspecial_none_cvalue)r   rH  r  r   r4  r  r   r  r.  r   r#  r   r   rz   r5  ri   rg  )rS   r   r4  rP   rP   rQ   rG  C9  s    
   z)CoerceFromPyTypeNode.generate_result_codec                 C   s   t | jd d S )Nz0Coercion from Python not allowed without the GILr   r   rP   rP   rQ   r$  S9  s    z CoerceFromPyTypeNode.nogil_check)	rU   rV   rW   r5  r  r   r   rG  r$  rP   rP   rP   rQ   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  Z__Pyx_PySet_GET_SIZEZ__Pyx_PyBytes_GET_SIZEZ__Pyx_PyByteArray_GET_SIZEZ__Pyx_PyUnicode_IS_TRUEc                 C   s   t | | |jjrd| _d S r  )r  r  r   ri   r   r3  rP   rP   rQ   r  j9  s    zCoerceToBooleanNode.__init__c                 C   s*   | j jjr&| j| j jd kr&|   d S rI   )r  r   ri   _special_builtinsrc   r#  r   rP   rP   rQ   r$  o9  s    zCoerceToBooleanNode.nogil_checkr  c                 C   s   | j r|   dS | j S r&  )r   r'  r  r   rR   rP   rP   rQ   r   u9  s    zCoerceToBooleanNode.check_constc                 C   s   d| j   S )Nz	(%s != 0)r  rR   rP   rP   rQ   r   {9  s    z)CoerceToBooleanNode.calculate_result_codec              	   C   s  | j s
d S | j| jj}|d k	r| j rX|d| j  d|   d |d |d |dt	j
 d| d| j  d	 ||d
t	j
 d| j ||   dt	j
 d |d |  n,|d|  | j ||  | jf  d S )Nr+  z == Py_None) r  elser   zPy_ssize_t r,  r-  r#  z((!CYTHON_ASSUME_SAFE_SIZE) && z < 0)z = (z != 0);r   r  )r   r6  rc   r  r   r  r   r   r   r   r(  r   rz   r  )rS   r   Z	test_funcrP   rP   rQ   rG  ~9  s.    
"

& 

z(CoerceToBooleanNode.generate_result_codec                 C   s   | S rI   rP   r   rP   rP   rQ   r   9  s    z!CoerceToBooleanNode.analyse_typesN)rU   rV   rW   r   r  r   r   r   r   r   Zfrozenset_typer   r   r   r6  r  r$  rZ  r   r   rG  r   rP   rP   rP   rQ   r  W9  s.          
r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r  c                 C   s2   |j jr||}|| _ t| | || d S rI   )r   r  r	  r  r  rW  r"  rP   rP   rQ   r  9  s
    
zCoerceToComplexNode.__init__c                 C   sT   | j jjr4| j j| j  }| j j| j  }n| j  }d}d| jj||f S r9  )r  r   r  r;  r   r<  rY  )rS   r>  r?  rP   rP   rQ   r   9  s    

z)CoerceToComplexNode.calculate_result_codec                 C   s   d S rI   rP   r>  rP   rP   rQ   rG  9  s    z(CoerceToComplexNode.generate_result_codec                 C   s   | S rI   rP   r   rP   rP   rQ   r   9  s    z!CoerceToComplexNode.analyse_typesN)rU   rV   rW   r  r   rG  r   rP   rP   rP   rQ   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r|||}|S )Nr)   )HasNoGilNoder   rA  r  T)r   r   r   Z__Pyx_SoftComplexToDoubleZSoftComplexToDoublez	Complex.c)r  r   )r$  r8  r   r1  r  r2  r  r  r  rz   r   r   r   r   r  )r  r  rl   r8  Z
cfunc_typer7  rP   rP   rQ   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r8t| _	d S r  )
r  r  r  r   Zas_argument_typerw   r   ri   r   r   r3  rP   rP   rQ   r  9  s    
zCoerceToTempNode.__init__z#Creating temporary Python referencec                 C   s   | S rI   rP   r   rP   rP   rQ   r   9  s    zCoerceToTempNode.analyse_typesc                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r  9  s    zCoerceToTempNode.may_be_nonec                 C   s4   | j || _ | j  r| j S | j j| _| j| _| S rI   )r  r  r  r   r   r   rP   rP   rQ   r  9  s    

z"CoerceToTempNode.coerce_to_booleanc                 C   sd   | d|  | j|  f  | jr`| jjsF||  |   n|j	|  | j| j
 d d S )Nr  r@  )r   r   r  r   r   r5  r   r   r=  rB  rC  r>  rP   rP   rQ   rG  9  s     z%CoerceToTempNode.generate_result_codeN)	rU   rV   rW   r  rZ  r   r  r  rG  rP   rP   rP   rQ   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 rI   )rK   r  rw   update_type_and_entryrq  rN   rP   rQ   r  :  s    zProxyNode.__init__c                 C   s   | j || _ |   | S rI   )r  r  r9  r   rP   rP   rQ   r   :  s    zProxyNode.analyse_typesc                 C   s   | j |S rI   r  r   rP   rP   rQ   r   :  s    zProxyNode.infer_typec                 C   s>   t | jdd }|r"|| _| jj| _t | jdd }|r:|| _d S Nr   r   )r   r  r   r   r   )rS   r   	arg_entryrP   rP   rQ   r9  :  s    
zProxyNode.update_type_and_entryc                 C   s   | j | d S rI   )r  rG  r>  rP   rP   rQ   rG  :  s    zProxyNode.generate_result_codec                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r   :  s    zProxyNode.resultc                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r  :  s    zProxyNode.is_simplec                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r  ":  s    zProxyNode.may_be_nonec                 C   s   | j | d S rI   )r  rL  r>  rP   rP   rQ   rL  %:  s    z"ProxyNode.generate_evaluation_codec                 C   s   | j | d S rI   )r  rQ  r>  rP   rP   rQ   rQ  (:  s    z ProxyNode.generate_disposal_codec                 C   s   | j | d S rI   r  r>  rP   rP   rQ   rY  +:  s    zProxyNode.free_temps)rU   rV   rW   r  r$  r  r   r   r9  rG  r   r  r  rL  rQ  rY  rX   rP   rP   rN   rQ   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 )rl  Nc                 C   sL   t | | |j| _t|dd }|r2|| _|j| _t|dd }|rH|| _d S r:  )r  r  rw   r   r   r   r   )rS   r  r   r;  rP   rP   rQ   r  9:  s    zCloneNode.__init__c                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r   D:  s    zCloneNode.resultc                 C   s
   | j  S rI   r  rR   rP   rP   rQ   r  G:  s    zCloneNode.may_be_nonec                 C   s   | j |S rI   )r  r  r   rP   rP   rQ   r  J:  s    zCloneNode.type_dependenciesc                 C   s   | j |S rI   r  r   rP   rP   rQ   r   M:  s    zCloneNode.infer_typec                 C   s6   | j j| _| j j| _d| _t| j dd }|r2|| _| S )Nr)   r   )r  r   r   r   r   r   )rS   rl   r;  rP   rP   rQ   r   P:  s    

zCloneNode.analyse_typesc                    s$   | j jr| j ||S t ||S rI   )r  r   r  rK   )rS   Z	dest_typerl   rN   rP   rQ   r  Y:  s    zCloneNode.coerce_toc                 C   s   dS r  rP   rR   rP   rP   rQ   r  ^:  s    zCloneNode.is_simplec                 C   s   d S rI   rP   r>  rP   rP   rQ   rL  a:  s    z"CloneNode.generate_evaluation_codec                 C   s   d S rI   rP   r>  rP   rP   rQ   rG  d:  s    zCloneNode.generate_result_codec                 C   s   d S rI   rP   r>  rP   rP   rQ   rQ  g:  s    z CloneNode.generate_disposal_codec                 C   s   | j r||  |   d S rI   )r   r=  r   r   r>  rP   rP   rQ   rS  j:  s    z'CloneNode.generate_post_assignment_codec                 C   s   d S rI   rP   r>  rP   rP   rQ   rY  p:  s    zCloneNode.free_temps)rU   rV   rW   r   r$  r  r   r  r  r   r   r  r  rL  rG  rQ  rS  rY  rX   rP   rP   rN   rQ   rl  .:  s   	rl  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   s   | j jS rI   r  rR   rP   rP   rQ   r   z:  s    zCppOptionalTempCoercion.typec                 C   s   d| j   S r  r  rR   rP   rP   rQ   r   ~:  s    z-CppOptionalTempCoercion.calculate_result_codec                 C   s   d S rI   rP   r>  rP   rP   rQ   rG  :  s    z,CppOptionalTempCoercion.generate_result_codec                 O   s   t | jd d S )NziUsing C++ classes in boolean binary operators with the 'cpp_locals' directive is not currently supported.r   )rS   r   r  rP   rP   rQ   r  :  s    z5CppOptionalTempCoercion.generate_bool_evaluation_codec                    s   t  j|ddS )NFr   )rK   r   r   rN   rP   rQ   r   :  s    z-CppOptionalTempCoercion._make_move_result_rhs)F)rU   rV   rW   r  r   r  r   r   rG  r  r   rX   rP   rP   rN   rQ   r<  t:  s   
r<  c                   @   s   e Zd Zdd ZdS )r  c                 C   s$   |j r| j|r| S t| ||S rI   )rf  r   r  rl  r  r  rP   rP   rQ   r  :  s    zCMethodSelfCloneNode.coerce_toN)rU   rV   rW   r  rP   rP   rP   rQ   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   s   | S rI   rP   r   rP   rP   rQ   r   :  s    zModuleRefNode.analyse_typesc                 C   s   dS r&  rP   rR   rP   rP   rQ   r  :  s    zModuleRefNode.may_be_nonec                 C   s   t jS rI   )r   r  rR   rP   rP   rQ   r   :  s    z#ModuleRefNode.calculate_result_codec                 C   s   d S rI   rP   r>  rP   rP   rQ   rG  :  s    z"ModuleRefNode.generate_result_codeN)rU   rV   rW   r   r   r   r   r   r  r   rG  rP   rP   rP   rQ   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t|| _d S rI   )r   r  r   ri   r   r  )rS   rz   r  rP   rP   rQ   r  :  s    zDocstringRefNode.__init__c                 C   s   | S rI   rP   r   rP   rP   rQ   r   :  s    zDocstringRefNode.analyse_typesc              
   C   sH   | d|  | j |td||  | jf  | | d S )Nz%s = __Pyx_GetAttr(%s, %s); %sr  )	r   r   r  rQ  r   r  r   rz   rg  r>  rP   rP   rQ   rG  :  s     z%DocstringRefNode.generate_result_codeN)
rU   rV   rW   r   r   r   r   r  r   rG  rP   rP   rP   rQ   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krBd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  writer  r  r*  )rS   rz   r*  r  r  Zstring_valuerP   rP   rQ   r  :  s    zAnnotationNode.__init__c                 C   s   | S rI   rP   r   rP   rP   rQ   r   :  s    zAnnotationNode.analyse_typesc                 C   s   |  |d S r  )rv  r   rP   rP   rQ   r  :  s    zAnnotationNode.analyse_as_typec                 C   s   t |tr|j}|jr<||jst|jd| jj	 dd n|j
r|jjr||jjsrt|jd| jj	 dd q|jjr|j|}|r||jst|jd| jj	  q|j|}|r|jrt|jd| jj	 dd nt|jd dS )zZMethod checks for cases when user should be warned that annotation contains unknown types.z5Unknown type declaration '%s' in annotation, ignoringr)   rt   z+Unknown type declaration '%s' in annotationz0Unknown type declaration in annotation, ignoringN)rv   r  r  r   r  rj   r   rz   r  r   r  r  r  r  r  r  r   Zpxd_file_loaded)rS   rl   r  r  rP   rP   rQ   _warn_on_unknown_annotation:  s6    

 
 


 z*AnnotationNode._warn_on_unknown_annotationc           
   
   C   sv  | j rg d fS | j}d }}|jrt|jddd |jD ]:\}}|jsHq8|jdkr`d}|sr|}q8|jdkr8d}|}q8|r|rt|jddd n"t|t	rt|jd	dd g d fS |j
|d
 ||}|d kr| || g |fW  5 Q R  S |jrt|jddd |r0|s0|js0|js0t|jd |jrB|| |jsVt|tr`||ng }	W 5 Q R X |	|fS )NFzSDicts should no longer be used as type annotations. Use 'cython.int' etc. directly.r)   rt   )r   s   typeT)r   s   ctypez9Duplicate type declarations found in signature annotationzTTuples cannot be declared as simple tuples of types. Use 'tuple[type1, type2, ...]'.)r$  zWStrings should no longer be used for type declarations. Use 'cython.int' etc. directly.zOPython type declaration in signature annotation does not refer to a Python type)untypedr*  r  r   rz   r]  r  r   rv   r  r  r  rB  ri   r  r  rW  r  r  r  )
rS   rl   Zassigned_valuer  Zexplicit_pytypeZexplicit_ctyperj   r   r,  r|  rP   rP   rQ   rv  ;  sZ     


 

,z&AnnotationNode.analyse_type_annotation)N)N)
rU   rV   rW   r   rC  r  r   r  rB  rv  rP   rP   rP   rQ   r?  :  s   

r?  c                       s   e Zd ZU dZdgZddgZdZeed< dZ	e
e ed< eed< dZeed< eed 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  Fr   Nassignment_is_independentr  c                    s&   t  j|f| t|||dd| _d S )NT)r  r   r  )rK   r  r-   r  )rS   rz   r  r   r  rN   rP   rQ   r  N;  s       z!AssignmentExpressionNode.__init__c                 C   s   | j d k	r| j jS | jj jS rI   )r   r   r  rR   rP   rP   rQ   r   S;  s    
zAssignmentExpressionNode.typec                 C   s
   | j jjS rI   )r  r  rj   rR   rP   rP   rQ   target_nameY;  s    z$AssignmentExpressionNode.target_namec                 C   s   | j p| jj }||S rI   )r   r  r   r  rP   rP   rQ   r   ];  s    z#AssignmentExpressionNode.infer_typec                 C   s   | j | d S rI   )r  r  r   rP   rP   rQ   r  a;  s    z-AssignmentExpressionNode.analyse_declarationsc                 C   s   | j || _ | j j}| sF|jr<t| j j| _d| _n
||}| jsvt|| _t	| j| j _| jj
|| j_
| jjr| jrd| j j_| S r  )r  r   r   r+  r   r#   rE  r  r  rl  r  r   r   r   r  rP   rP   rQ   r   d;  s    	


z&AssignmentExpressionNode.analyse_typesc                    s   | j r| j||| _| S || jjjkr| jd k	s6t| jj}t|trN|j}|||}||k	r|| j_| j	  t| jjt
rt| jjts| jjj| j_| jjjj| jj_| S t ||S rI   )rE  r   r  r  r   r   r  rv   r  r9  r  rl  rK   )rS   r  rl   Zold_rhs_argZrhs_argrN   rP   rQ   r  ;  s&    

z"AssignmentExpressionNode.coerce_toc                 C   s
   | j  S rI   )r   r   rR   rP   rP   rQ   r   ;  s    z.AssignmentExpressionNode.calculate_result_codec                 C   s   | j | d S rI   )r  rV  r>  rP   rP   rQ   rG  ;  s    z-AssignmentExpressionNode.generate_result_code)rU   rV   rW   r  r   r   r   r  r  r   r(   r   r-   rE  r~  r  r  r   rF  r   r  r   r  r   rG  rX   rP   rP   rN   rQ   rD  9;  s$   


*rD  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   rh  )
r   Z	func_noder   r   rz   r~  Zdeclared_namerH  r  r   r   rP   rP   rQ   r  ;  s    z8FirstArgumentForCriticalSectionNode.analyse_declarationsc                 C   s   | j r| j |S | S rI   )rH  r  r   rP   rP   rQ   r  ;  s    z7FirstArgumentForCriticalSectionNode.analyse_expressions)
rU   rV   rW   r   rH  r   r   r   r  r  rP   rP   rP   rQ   rG  ;  s
   rG  )NN)F(2  ZcythonZdeclarer  r#   r"   r	   os.pathr$   r%   r&   r'   typingr(   ZErrorsr   r   r   r   r   r
   r*   r+   ZCoder   r   Z	LineTabler!   rn  r   r   r   r,   r-   r   r.   r   r/   r0   r1   r2   r   r   r   r   r   r   r   r   r   r   r3   r    r   r   r   ZAnnotater5   r6   Z	Debuggingr7   Z
DebugFlagsr   r   ZPythranr8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rn   rp   r  rH   r   r   rg   rf   rh   Zc_py_unicode_ptr_typer3  Zcy_pymutex_typeZcy_pythread_type_lock_typerb   r   rs   r}   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r   r  r  r-  r  r  rS  rT  r[  r~  r  r  r  r  r  r?  rG  rK  rL  rS  rX  r\  r^  ra  rk  r}  r  r  r  r  r  r  r  r  r  r  r  r  rL  r  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  rQ  rW  r\  r_  r#  re  r`  r_  rp  rs  rt  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  not_invnegrz   r  r  r  r!  r"  r%  r&  r'  r(  r,  r-  r4  r5  rL  rG  rH  rJ  rE  rF  r  rS  r+  rV  rZ  r]  matmulra  r   ltler  negegtis_rj  rm  and_truedivfloordivr  modr  or_r  rshiftrZ  xorru  rv  rw  r  r  r  r  r  r  r  r  r  r  compilefindallZ_find_formatting_types	frozensetZ_safe_bytes_formatsr  r  r  r  r%  r  r  r&  r  r  r$  r  r  r:  r  r  r  r  r  r  r  r  r  r  rl  r<  r  r=  r>  r?  rD  rG  rP   rP   rP   rQ   <module>   sJ                            (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C+6Fsv