
    Aee                       d dl mZ d dlZ ej                  di dedededededed	ed
edededededededededededededededededededededed ed!ed"ed#ed$ej
                   d dlZd dlZd dlZd dl	Z
d dlZd%d&lmZmZmZmZmZmZ d%d'lmZmZ d%d(lmZ d%d)lmZ d%d*lmZ d%d+lmZmZmZ d%d,lmZ d%d-lmZmZm Z m!Z!m"Z" d%d.lm#Z# d%d/l$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ d%d0lm$Z$ d%d1lm0Z0 d2d3lm1Z1 d%d4l2m3Z3 d%d5lm4Z4 d2d6l5m6Z6 d%d7l7m8Z8m9Z9m:Z: d%d8l;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJ d%d9lmKZK 	 d d:lLmMZM eNeOfZPej                  d    d;k\  rd<ZTeUZVnd=ZTeUeWfZV G d> d?e      ZX eX       ZY e       ZZi e*e+fd@e*e,fdAe*ej                  fdBe*ej                  fdBe*ej                  fdBe*ej                  fdBe,e*fdCe,e+fdDe,e.fdEe,ej                  fdFe,ej                  fdFe.e,fdGe+e*fdHe+e,fdIe+ej                  fdJe+ej                  fdJe+ej                  fdJe+ej                  fdJe+ej                  fdKe+ej                  fdKej                  e*fdLej                  e*fdLej                  e*fdLej                  e*fdLiZadM ZbdN ZcdO ZdddPZedQ ZfdR ZgdS ZhdT ZidU Zj G dV dWe      Zk G dX dYek      Zl G dZ d[el      Zm G d\ d]em      Zn G d^ d_em      Zo G d` dael      Zp G db dcep      Zq G dd deep      Zr G df dgep      Zs G dh diep      Zt G dj dkep      Zudl Zv G dm dnep      Zw G do dpep      Zx G dq drem      Zy G ds dtey      Zz G du dvel      Z{ G dw dxel      Z| G dy dzel      Z} G d{ d|ek      Z~ G d} d~ek      Z G d dek      Z G d del      Z G d dek      Z G d del      Z G d dek      Z G d del      Z G d dek      Z G d de      Z G d dek      Z G d dek      Z G d dek      Z G d del      Z G d del      Z G d dek      Z G d de      Z G d de      Z G d de      Z G d de      Z G d dek      Z G d de      Z G d de      Z G d dek      Z G d dek      Z G d de      Z G d dek      Z G d de      Z G d dek      Z G d de      Z G d de      Z G d dek      Z G d de      Z G d de      Z G d de      Z G d dek      Z G dÄ dek      Z G dń dek      Z G dǄ dek      Z G dɄ dek      Z G d˄ de      Z G d̈́ de      Z G dτ dek      Z G dф de      Z G dӄ de      Z G dՄ de      Z G dׄ dek      Z G dل dek      Z G dۄ dek      Z G d݄ dek      Z G d߄ dek      Z G d dek      Z G d de      Z G d deke      Z G d dek      Z G d dek      Z G d deke      Z G d dek      Z G d dek      Z G d deke      Z G d de      Z G d dek      Z G d dek      Z G d dek      Z G d de      Z G d de      Z G d d e      Z G d de      Z G d dek      Z G d de«      Z G d deë      Z G d	 d
eë      Z G d deū      Z G d del      Z G d de      Z G d de      Z G d del      Zʐd Zej                  ej                  ej                  ej                  dZ G d dek      Z G d deѫ      Z G d deѫ      Z G d deѫ      Z G d d eѫ      Z G d! d"eѫ      Z G d# d$e֫      Z G d% d&e֫      Zؐd' Z G d( d)e֫      ZeeeՐd*Zېd+ Z G d, d-ek      Zݐd.Zސd/Zߐd0Zd1Zd2Z G d3 d4ek      Z G d5 d6ek      Z G d7 d8e      Z G d9 d:e      Z G d; d<ek      Z G d= d>ek      Z	 ej                  Zi d@ej                  dAej                  dBej                  dCej                  dDej                  dEej                  dFej                  dGej                  dHej                  dIej                  dJej                  dKej                  dLej                  dMej                  dNej                  dOej                  dPej                  ej                  ej                  ej                  edQ dR dSZ dT Z G dU dVek      Z G dW dXe      ZdY Z G dZ d[e      Z G d\ d]e      Z G d^ d_e      Z G d` dae      Z G db dce      Z	 G dd dee      Z
 G df dge      Z ej                  dh      j                  Z eg di      Z G dj dke      Z G dl dme      Z G dn doek      Z G dp dqek      Z G dr dsek      Zdtdudvdwdwdxdydvdwdz	Z G d{ d|e      Z G d} d~eke      Z G d dee      Zeeeeeeeeee	e
eeeedZddZ G d dek      Z G d de      Z G d de      Z G d de      Z G d de      Z  G d de      Z! G d de!      Z" G d de      Z# G d de      Z$ G d de      Z% G d de      Z& G d de      Z' G d de      Z( G d de(      Z) G d dek      Z* G d dek      Z+ edd      Z, edd      Z- edd      Z. edde-g      Z/ ej`                  dd      Z1 ej`                  dd      Z2 ej`                  dd      Z3y# eQ$ r
 eRZMeNeRfZPY 
w xY w# e$ r d? ZY 1w xY w(      )absolute_importNerrorwarning	warn_onceInternalErrorCompileErrorUtilityCodeTempitaUtilityCodeStringEncodingoperatorlocal_errorsreport_errorNamingNodes
PyrexTypespy_object_type	list_type
tuple_typeset_type	dict_typeunicode_typestr_type
bytes_type	type_typeBuiltinSymtabUtilsfind_coercion_errordebug_disposal_codedebug_temp_allocdebug_coercionbytearray_type
slice_type_py_int_types
IS_PYTHON3   )r   r   r   r   r   r   )r	   r
   )r   )r   )r   )Nodeutility_code_for_importsanalyse_type_annotation)r   )r   c_long_typetypecast
error_typeunspecified_type)	TypeSlots)r   r   r   r   r   r   r   r   r"   basestring_typer#   )r   )r      )r   )AnnotationItem)Future)print_call_chain)r   r    r!   )
to_pythranis_pythran_supported_type#is_pythran_supported_operation_typeis_pythran_exprpythran_func_typepythran_binop_typepythran_unaryop_typehas_np_pythranpythran_indexing_codepythran_indexing_type!is_pythran_supported_node_or_nonepythran_typepythran_is_numpy_func_supportedpythran_get_func_include_filepythran_functor)PythranExpr)
basestring   TFc                   (     e Zd ZdZ fdZd Z xZS )NotConstantNc                 |    t         j                  t        t         |   |       t         _        t         j                  S N)rG   _objsuper__new__)cls	__class__s    9lib/python3.12/site-packages/Cython/Compiler/ExprNodes.pyrL   zNotConstant.__new__J   s/    #$[#>sCK    c                      y)Nz<NOT CONSTANT> selfs    rO   __repr__zNotConstant.__repr__P   s    rP   )__name__
__module____qualname__rJ   rL   rU   __classcell__rN   s   @rO   rG   rG   G   s    D  rP   rG   zgCannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding.zGCannot convert Unicode string to 'bytes' implicitly, encoding required.z5Unicode objects only support coercion to Py_UNICODE*.zFCannot convert 'bytes' object to unicode implicitly, decoding requiredzMCannot convert 'bytes' object to str implicitly. This is not portable to Py3.zTCannot convert 'bytes' object to basestring implicitly. This is not portable to Py3.z<Cannot convert 'bytes' object to Py_UNICODE*, use 'unicode'.zMCannot convert 'basestring' object to bytes implicitly. This is not portable.zZstr objects do not support coercion to unicode, use a unicode string literal instead (u'')zACannot convert 'str' to 'bytes' implicitly. This is not portable.z@'str' objects do not support coercion to C types (use 'bytes'?).zB'str' objects do not support coercion to C types (use 'unicode'?).z?Cannot convert 'char*' to unicode implicitly, decoding requiredc                 d    t         j                         }||S |j                  d   rt         fdt        j
                  t        j                  t        j                  t        j                  fD              r6 d   j                  r|S |j                  d   dv r|S d d   j                  z  S |S )Nc_string_encodingc              3   &   K   | ]  }|v  
 y wrI   rR   ).0t
type_tuples     rO   	<genexpr>z&find_coercion_error.<locals>.<genexpr>   s      ra!z/ rs   r&   )asciidefaultz_'%s' objects do not support coercion to C types with non-ascii or non-default c_string_encodingr   )coercion_error_dictget
directivesanyr   c_char_ptr_typec_uchar_ptr_typec_const_char_ptr_typec_const_uchar_ptr_typeis_pyobjectname)r`   rc   enverrs   `   rO   r   r   z   s    

!
!*
-C
{
..,
- rJ,F,F
HcHc,6,L,LjNoNo,q r ra=$$N^^/04HHNt  xB  CD  xE  xJ  xJ  J  J
rP   c                 h    t         t        t        t        dj	                  | j
                  d         S )N)bytes	bytearraystrunicodec_string_type)r   r"   r   r   re   rf   )rn   s    rO   default_str_typerv      s-    #	
 
c#..
)*+rP   c                      | D ]a  }|4t        |j                  t              st        |j                  t              s:|j                  dk  sJt	        |j
                  dd       c y)z
    Raise a warning on nodes that are known to have negative numeric values.
    Used to find (potential) bugs inside of "wraparound=False" sections.
    Nr   zfthe result of using negative indices inside of code sections marked as 'wraparound=False' is undefinedr&   level)
isinstanceconstant_resultr$   floatr   pos)nodesnodes     rO   check_negative_indicesr      s_    
  	*<t33]Ct33U;!#DHH '(*	*rP   c                 `   |j                   sY||j                  |       }|t        u r>|j                  r2t	        |j                        dk(  r	 |j                  d   j
                  }||j                   r|;|j                         r+	 |j                  |j                     }|j                  |       S t        |j                  D cg c]  }|j                  |        c}      }t	        |      dk(  r|j                         S y # t        $ r Y w xY w# t        t        t        f$ r Y vw xY wc c}w )Nr&   r   )is_sequence_constructor
infer_typer   cf_statelenrhsAttributeErrorhas_constant_resultargsr{   
ValueError	TypeError
IndexErrorsetpop)rn   seq_node
index_nodeseq_typeitem
item_typess         rO   infer_sequence_item_typer      s   ++**3/Hz!  S):):%;q%@'00377H  @ @!j&D&D&F,}}Z%?%?@ s++8==I4$//#.IJ
z?a>>## &  	:6 
 Js*   D D D+	DDD('D(c           	      ,   |D cg c]  }|t         dt        d      fn|j                  r<t        |j                  |j                  r|j
                  ndg|j                  z         n|j                  r7t        |j                  |j                  |j                  |j                  f      nQ|j                         r@|j                  |j                  |j                  t         u rt        |j                        ndfnd }}d|v ry| t        |      fS c c}w )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.
    N)r   typer   make_dedup_key
is_literalmult_factorr   is_slicestartstopstepr   r{   tuple)
outer_type
item_nodesr   	item_keyss       rO   r   r      s   $ 
  /3ltDz*gk  hD  hD^DIIDOO(8(8QU'VY]YbYb'bcNRmm^DII

DIItyy'IJ W[VnVnVp ii--,0II,Gd4''(TS	
I 
 yuY'''
s   C8Dc                 *   | y| j                   t        j                  k(  r| j                  dk(  ry| j                   j                  r3d| j
                  j                  d| j
                  j                  ddfS d| j
                  j                  z  dfS )	N)__Pyx_CppExn2PyErr();F*)r   TzAtry { throw; } catch(const std::exception& exn) {PyErr_SetString(z+, exn.what());} catch(...) { PyErr_SetNone(z); }Fzc%s(); if (!PyErr_Occurred())PyErr_SetString(PyExc_RuntimeError, "Error converting c++ exception.");)r   r   c_char_typevaluerl   entrycname)exception_values    rO   get_exception_handlerr      s    -


*"8"8
8##s*,				)	)
  %%++%%++	-
  	2  %%++-  	rP   c                     |rF|r"| j                  | j                  d|             y | j                  | j                  d|             y y )N__Pyx_ErrOccurredWithGIL()PyErr_Occurred())putlnerror_goto_if)codecheck_py_exceptionr}   nogils       rO   maybe_check_py_errorr      sA    JJt))*FLMJJt))*<cBC	 rP   c                    t        |      \  }}| j                  d       | j                  d|z         |r!| j                  | j                  ||             t        | |||       | j                  d       |r| j	                  d       | j                  |       |r| j                          | j                  | j                  |             | j                  d       y )Ntry {z%s} catch(...) {Tdeclare_gilstate})r   r   error_goto_if_nullr   put_ensure_gilput_release_ensured_gil
error_goto)r   r}   inside	py_resultr   r   raise_py_exceptionr   s           rO   translate_cpp_exceptionr      s    -B?-S**JJwJJtf}
jj((C8913>JJ T2JJ!"$$&JJts#$JJsOrP   c                 
   t        |      \  }}	t        |      \  }
}| j                  d       | j                  |j                  d|z               t        | |	||       | j                  d       | j                  d|z         t        | |||       | j                  d       |r| j	                  d       | j                  |
       |r| j                          | j                  | j                  |             | j                  d       | j                  d       |r| j	                  d       | j                  |       |r| j                          | j                  | j                  |             | j                  d       y )Nr   z__pyx_local_lvalue = %s;r   Tr   r   )r   r   declaration_coder   r   r   r   )r   r}   lhs_typelhs_coderhs_codelhs_exc_valassign_exc_valr   handle_lhs_exclhc_check_py_exchandle_assignment_excassignment_check_py_excs               rO   translate_double_cpp_exceptionr   	  sA   '<['I$N$5J>5Z22JJwJJx(()Ch)NOP/e<JJwJJ)H456UCJJ T2JJ$%$$&JJts#$JJsOJJ T2JJ~$$&JJts#$JJsOrP   c                   \   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eZ e ej>                  d            Z d Z!d Z"d Z#d	 Z$d
 Z%d Z&dKdZ'd Z(dKdZ)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1d Z2d Z3d Z4d Z5d Z6d Z7d Z8d Z9dLdZ:d  Z;d! Z<d" Z=d# Z>d$ Z?d% Z@d& ZAd' ZBd( ZCd) ZDd* ZEd+ ZFd, ZGd- ZHd. ZId/ ZJd0 ZKd1 ZLd2 ZMd3 ZNd4 ZOd5 ZPd6 ZQd7 ZR	 	 dMd8ZSdNd9ZTd: ZUd; ZVd< ZWd= ZXd> ZYd? ZZdOd@Z[dA Z\dB Z]dC Z^dD Z_dE Z`dF ZadG ZbdH ZcdPdIZdeedJ        Zfy)QExprNodeNTFsubexprs)fgetc                 d    t        |d       t        | j                  j                  d|d      )Nznot implemented.z not implemented)r3   r   rN   rV   )rT   method_names     rO   not_implementedzExprNode.not_implemented  s.    &78((+78 	8rP   c                      yNr   rR   rS   s    rO   	is_lvaluezExprNode.is_lvalue      rP   c                 T    | j                         xr | j                  j                   S rI   )r   r   is_memoryviewslicerS   s    rO   is_addressablezExprNode.is_addressable  s!    ~~D		(D(D$DDrP   c                 J    | j                   j                  xr | j                  S rI   )r   rl   is_temprS   s    rO   is_ephemeralzExprNode.is_ephemeral  s     yy$$55rP   c                     g }| j                   D ]E  }t        | |      }|t        |      t        u r|j	                  |       5|j                  |       G |S rI   )r   getattrr   listextendappend)rT   r~   rm   r   s       rO   subexpr_nodeszExprNode.subexpr_nodes  sY     MM 	'D4&D:%LL&LL&	' rP   c                 R    | j                   r| j                  S | j                         S rI   )r   	temp_codecalculate_result_coderS   s    rO   resultzExprNode.result  s$    <<
 >>!--//rP   c                 N    t        |       rt        |       S |J t        | |      S rI   )r>   r4   )rT   type_s     rO   pythran_resultzExprNode.pythran_result  s+    ,T2d## !$&&rP   c                      y)zZ
        Subtypes may return False here if result temp allocation can be skipped.
        TrR   rS   s    rO   is_c_result_requiredzExprNode.is_c_result_required  s     rP   c                     | j                   r>| j                  j                  r(|t        k7  rt	        |t        | j                               S t	        || j                         | j                               S rI   )r   r   rl   r   r+   r   ctyperT   r   s     rO   	result_aszExprNode.result_as  sO    LLTYY22& D.$++-@@djjlDKKM::rP   c                 ,    | j                  t              S rI   )r   r   rS   s    rO   r   zExprNode.py_result  s    ~~n--rP   c                 6    | j                   xs | j                  S rI   )result_ctyper   rS   s    rO   r   zExprNode.ctype  s       -DII-rP   c                      y rI   rR   rS   s    rO   get_constant_c_result_codez#ExprNode.get_constant_c_result_code  s     rP   c                      y rI   rR   rS   s    rO   calculate_constant_resultz"ExprNode.calculate_constant_result  s     	rP   c                 N    | j                   t        uxr | j                   t        uS rI   r{   constant_value_not_setnot_a_constantrS   s    rO   r   zExprNode.has_constant_result+  )    ##+AA :##>9	:rP   c                 0    t        | j                  d       y )NzInvalid compile-time expressionr   r}   rT   denvs     rO   compile_time_valuezExprNode.compile_time_value/  s    dhh9:rP   c                 d    t        | j                  d|j                  j                  d|       y )Nz"Error in compile-time expression: : )r   r}   rN   rV   )rT   es     rO   compile_time_value_errorz!ExprNode.compile_time_value_error3  s$    dhhKK  !% 	&rP   c                 0    t        | j                  d       y )NzCannot assign to or delete thisr   rT   rn   s     rO   analyse_target_declarationz#ExprNode.analyse_target_declaration9  s    dhh9:rP   c                 H    | j                  |      }|j                          |S rI   )analyse_typescheck_constrT   rn   r   s      rO   analyse_const_expressionz!ExprNode.analyse_const_expression>  s%    
 !!#&rP   c                 $    | j                  |      S rI   r  r	  s     rO   analyse_expressionszExprNode.analyse_expressionsG  s     !!#&&rP   c                 $    | j                  |      S rI   )analyse_target_types)rT   rn   r   s      rO   analyse_target_expressionz"ExprNode.analyse_target_expressionM  s     ((--rP   c                 J    | j                  |      }|j                  |      }|S rI   )r  coerce_to_boolean)rT   rn   r   bools       rO   analyse_boolean_expressionz#ExprNode.analyse_boolean_expressionS  s'    !!#&%%c*rP   c                 d    | j                  |      }|j                  |      j                  |      S rI   )r  r  coerce_to_simpler  s      rO   analyse_temp_boolean_expressionz(ExprNode.analyse_temp_boolean_expressionY  s0     !!#&%%c*;;C@@rP   c                     t        | d      r| j                  yt        | j                         D cg c]  }|j	                  |       c}d      S c c}w )Nr   rR   )hasattrr   sumr   type_dependenciesr  s      rO   r   zExprNode.type_dependenciesf  sJ     4 TYY%:D<N<N<PQDD**3/QSUVVQs   Ac                     t        | d      r| j                  | j                  S t        | d      r"| j                  | j                  j                  S | j                  d       y )Nr   r   r   )r  r   r   r   r	  s     rO   r   zExprNode.infer_typem  sP    
 4 TYY%:99T7#

(>::??"  .rP   c                     | j                   xs< | j                  xs. | j                  j                  xs | j                  j                  S rI   )r   r   r   is_arrayis_cfunctionrS   s    rO   nonlocally_immutablezExprNode.nonlocally_immutabley  s5     ^$,,^$))2D2D^		H^H^^rP   c           
          t        | j                  | t        | j                  t        |      |t        j
                              S )z
        Return a node that represents the (type) result of an indexing operation,
        e.g. for tuple unpacking or iteration.
        r   r{   r   baseindex)	IndexNoder}   IntNoders   r   c_py_ssize_t_typerT   r*  s     rO   inferable_item_nodezExprNode.inferable_item_node~  s:    
 GHHCJJD`D`5b c 	crP   c                      y rI   rR   r	  s     rO   analyse_as_modulezExprNode.analyse_as_module       rP   c                      y rI   rR   r	  s     rO   analyse_as_typezExprNode.analyse_as_type  r2  rP   c                      y rI   rR   r	  s     rO   analyse_as_extension_typez"ExprNode.analyse_as_extension_type  r2  rP   c                 &    | j                  d       y )Nr  r   r	  s     rO   r  zExprNode.analyse_types  s    _-rP   c                 $    | j                  |      S rI   r  r	  s     rO   r  zExprNode.analyse_target_types  s    !!#&&rP   c                 l    | j                   r(| j                   j                  r| j                          y y y rI   )r   rl   	gil_errorr	  s     rO   nogil_checkzExprNode.nogil_check  s(     99..NN /9rP   c                 x    |j                   r.| j                  j                  rt        | j                  d       y y y )Nz3Assignment of Python object not allowed without gil)r   r   rl   r   r}   r	  s     rO   gil_assignment_checkzExprNode.gil_assignment_check  s+    99..$((QR /9rP   c                 $    | j                          yNF)	not_constrS   s    rO   r  zExprNode.check_const  s    rP   c                 0    t        | j                  d       y )Nz$Not allowed in a constant expressionr   rS   s    rO   rA  zExprNode.not_const  s    dhh>?rP   c                 $    | j                          yr@  )addr_not_constrS   s    rO   check_const_addrzExprNode.check_const_addr  s    rP   c                 0    t        | j                  d       y )NzAddress is not constantr   rS   s    rO   rD  zExprNode.addr_not_const  s    dhh12rP   c                     | j                   S rI   r   rS   s    rO   result_in_tempzExprNode.result_in_temp  s    
 ||rP   c                 "    | j                         S rI   r   rS   s    rO   target_codezExprNode.target_code  s    ))++rP   c                 &    | j                  d       y )Nr   r8  rS   s    rO   r   zExprNode.calculate_result_code  s    45rP   c                    | j                   r/t        d| j                  j                  d| j                        | j
                  }|j                  sz|j                  rt        j                  }n0| j                  s$|j                  s| j                         sd | _         y |j                  j                  || j                        | _         y d | _         y )Nz!Temp allocated multiple times in r  
manage_ref)r   RuntimeErrorrN   rV   r}   r   is_voidrl   r   r   result_is_usedr   r   	funcstateallocate_tempuse_managed_ref)rT   r   r   s      rO   allocate_temp_resultzExprNode.allocate_temp_result  s    >>DNNLcLceiememnooyy||!00))T-D-DHaHaHc!%!^^99!5!5 : 7DN "DNrP   c                 (   | j                   s| j                  sy | j                  rKt        j                  j                  | j                  d   j                               f| j                  dd  z   nd}| j                  r2t        d| j                  d| j                  j                  d|      t        d| j                  j                  d|      |j                  j                  | j                          | j                   | _        d | _         y )Nr   r&   z(?)ztemp z released multiple times in z at z"no temp, but release requested in )r   rS  r}   ospathbasenameget_descriptionold_temprQ  rN   rV   rT  release_temp)rT   r   r}   s      rO   release_temp_resultzExprNode.release_temp_result  s    ~~&&W[W_W_277##DHHQK$?$?$ABDtxxPQPR|SejC}}"MM4>>#:#:C$A B B #NN++S$2 3 3##DNN3rP   c                     | j                   j                  r@| j                         s/|j                  | j	                         | j                                yyy)z
        If result is a pyobject, make sure we own a reference to it.
        If the result is in a temp, it is already a new reference.
        N)r   rl   rI  
put_increfr   r   rT   r   s     rO   make_owned_referencezExprNode.make_owned_reference  s>    
 99  )<)<)>OODKKM4::<8 *? rP   c                 |    | j                         s,|j                  | j                         | j                         yy)zJ
        Make sure we own the reference to this memoryview slice.
        have_gilN)rI  put_incref_memoryviewslicer   in_nogil_contextrb  s     rO   make_owned_memoryviewslicez#ExprNode.make_owned_memoryviewslice  s:     ""$++DKKM595J5J , L %rP   c                 r   | j                  |       |j                  | j                         | j                  r| j	                  |       | j                  |       | j                  rQ| j                  j                  s:| j                  j                  s#| j                  |       | j                  |       y y y y rI   ) generate_subexpr_evaluation_codemark_posr}   r   rW  generate_result_coder   	is_stringis_pyunicode_ptrgenerate_subexpr_disposal_codefree_subexpr_tempsrb  s     rO   generate_evaluation_codez!ExprNode.generate_evaluation_code  s     	--d3dhh<<%%d+!!$'<<!4!4		8R8R //5##D)	 9S!4<rP   c                 P    | j                         D ]  }|j                  |        y rI   )r   rr  rT   r   r   s      rO   rk  z)ExprNode.generate_subexpr_evaluation_code  s(    &&( 	0D))$/	0rP   c                 &    | j                  d       y )Nrm  r8  rb  s     rO   rm  zExprNode.generate_result_code  s    34rP   c                    | j                   r,| j                  j                  s| j                  j                  r"| j	                  |       | j                  |       | j                         r| j                  j                  r/|j                  | j                         | j                                y | j                  j                  rq|j                  | j                         | j                          |j                  d| j                         z         |j                  d| j                         z         y y y | j	                  |       y )Nre  %s.memview = NULL;%s.data = NULL;)r   r   rn  ro  rp  rq  r   rl   put_decref_clearr   r   put_xdecref_memoryviewslicerh  r   rb  s     rO   generate_disposal_codezExprNode.generate_disposal_code  s    <<yy""dii&@&@33D9''-{{}99(())$++-FYY1144 KKM8M8M4M 5 OJJ3dkkmCDJJ04;;=@A	 2  //5rP   c                 P    | j                         D ]  }|j                  |        y rI   )r   r{  rt  s      rO   rp  z'ExprNode.generate_subexpr_disposal_code%  s*     &&( 	.D''-	.rP   c                    | j                   r| j                  j                  s| j                  j                  r#| j	                  |       | j                  |       y | j                  j                  r#|j                  d| j                         z         y | j                  j                  rE|j                  d| j                         z         |j                  d| j                         z         y y | j	                  |       y )N%s = 0;rw  rx  )
r   r   rn  ro  rp  rq  rl   r   r   r   rb  s     rO   generate_post_assignment_codez&ExprNode.generate_post_assignment_code+  s    <<yy""dii&@&@33D9''-&&

9t{{}45--

/$++-?@

,t{{}<= . //5rP   c                      y rI   rR   )rT   r   r   overloaded_assignmentexception_checkr   s         rO   generate_assignment_codez!ExprNode.generate_assignment_code9  s    
 	rP   c                      y rI   rR   rT   r   ignore_nonexistings      rO   generate_deletion_codezExprNode.generate_deletion_code@  s     	rP   c                     | j                   r)| j                  j                  s| j                  |       y y | j	                  |       y rI   )r   r   rR  r_  rq  rb  s     rO   
free_tempszExprNode.free_tempsF  s9    <<99$$((. % ##D)rP   c                 P    | j                         D ]  }|j                  |        y rI   )r   r  )rT   r   subs      rO   rq  zExprNode.free_subexpr_tempsM  s&    %%' 	!CNN4 	!rP   c                      y rI   rR   rT   rn   r   s      rO   generate_function_definitionsz&ExprNode.generate_function_definitionsQ      rP   c                 P    | j                         D ]  }|j                  |        y rI   )r   annotatert  s      rO   r  zExprNode.annotateV  s&    &&( 	 DMM$	 rP   c                 	   | }| j                   }| j                  ||      r| S |j                  }|r|j                  s|j                  }|j                  r|j
                  }|j                  s|j                  r|j                  r|j                  s|j                  r|j                  j                  ri|j                  }|j                         D ]J  }|j                  |      s||_         |j                   j                  |_        d|j                  _        | c S  |j                  rt        | j                  d       n0|j                   r|j                  r| S t        | j                  d       t"        | _         | S | j$                  4t'        | j                  d| j$                        }|j)                  ||       |j*                  ruddlm} |j                   j*                  s|j                   j0                  rt3        |||      }|S |j                   j4                  r(t6        j9                  ||      j)                  ||      }|S |j:                  st        | j                  d|d	       |S |j                   j<                  rd|_        |j                   j?                  || j@                  | jB                  
      s}|j                   jD                  j                  |jD                        rd}	|j                   |f}
n$d}	|j                   jD                  |jD                  f}
t        | j                  |	|
z         |S |j0                  r|j                   j0                  s9|tF        u r#|j                   jH                  rtK        ||      }ntM        |||      }|j                   jO                  |      s|jP                  tS        |||      }|S tU        |      rtW        |j                         r|S tU        |j                         rtW        |      r|S tM        |||      }|S |j                   j0                  r6|r%|jX                  rt[        | j                  d|z         t]        |||      }|S |j^                  r%||k7  r |ja                  |      rtc        |||      }|S |j                   |k(  sCte        |j                         te        |      k(  s"|ja                  |      s| jg                  |       |S )NTzType is not specializedz/Cannot coerce to a type that is not specialized )rm   r   r&   
MemoryViewzCannot convert 'z' 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.)4r   check_for_coercion_erroris_referenceref_base_typeis_constconst_base_typeis_fusedr$  is_ptr	base_type"get_all_specialized_function_typessame_asr   usedr   r}   is_null_ptrr,   coercion_typeNameNode	coerce_tor   r  r  rl   CoerceToMemViewSliceNoder#  CythonArrayNodefrom_carrayis_errorwritable_neededconforms_tois_memview_broadcastis_memview_copy_assignmentdtyper   is_intCoerceIntToBytesNodeCoerceToPyTypeNode
subtype_ofr{   PyTypeTestNoder7   r5   is_cpp_classr   CoerceFromPyTypeNode
is_complexassignable_fromCoerceToComplexNoders   fail_assignment)rT   dst_typern   srcsrc_typeused_as_reference	signaturer   r  msgtups              rO   r  zExprNode.coerce_to\  s/     99((37K$11X%:%:--H//H 1 1 %%h.?.?OO(:(:(G(G#--!)!L!L!N $I ((2#,$'HHNN	)-		#$   dhh 9:%%(//dhh QR"DIK)DHH2D4F4FGDNN8S)&&$88..88''23#FCp 
o XX&&)55c3?II(TWXCl 
k "**$((FNPRh 
c 88++/3H,xx++H@Y@Y484S4S , Uxx~~--hnn=S!hh0M!hhnnhnn<$((C#I.L 
I !!88''z)chhoo.sC8C,S#HEC88&&x0&&2(h<C8 
7 X&+DSXX+NJSXX&(2 
$S#H=C$ 
# XX!! X%:%:HHjmuuw 'xc:C 
 !!h&**84%c8S9C 
 HH(CMS],JhNfNfgoNp$$X.
rP   c                 R    t        | j                  d| j                  d|d       y )NzCannot assign type '' to ''r   r}   r   )rT   r  s     rO   r  zExprNode.fail_assignment  s    dhhTYYQRrP   c                     |r|sd}t        | j                  |f||      }|'t        | j                  || j                  |dz         y|r| j	                  |       yy)Nz)Cannot assign type '%(FROM)s' to '%(TO)s')FROMTOTF)r   r   r   r}   r  )rT   r  rn   failrc   messages         rO   r  z!ExprNode.check_for_coercion_error  s_    AG%tyy(&;WcJ$((Gtyy&IIJ  *rP   c                 B    | j                  t        j                  |      S rI   )r  r   r   r	  s     rO   coerce_to_pyobjectzExprNode.coerce_to_pyobject  s    ~~j77==rP   c           
         | j                         r-t        | j                        }t        | j                  ||      S | j
                  }|j                  s|j                  r| S |j                  s$|j                  s|j                  s|j                  rt        | |      S |j                  rw|j                  rk|j                  j                  d      rPt!        | j                  t#        | j                  | t%        j&                  d            g       j)                  |      S |j*                  r0t-        |j.                        dk(  }t        | j                  ||      S t1        | j                  d|z         | S )Nr   r{   zoperator bool)obj	attributefunctionr   r   z%Type '%s' not acceptable as a boolean)r   r  r{   BoolNoder}   r   is_enumr  rl   r  r  is_floatCoerceToBooleanNoder  scopelookupSimpleCallNodeAttributeNoder   EncodedStringr  	is_ctupler   
componentsr   )rT   rn   
bool_valuer   s       rO   r  zExprNode.coerce_to_boolean  s.   
 ##%d223JDHHJ,68 8 yy<<4==Kt}}&tS114::$**2C2CO2T!&HH$.2N2N2_a	 's+	,
 ^^T__-2JDHHJ,68 8 $((CdJKKrP   c                 r    | j                   j                  r| S | j                  t        j                  |      S rI   )r   r  r  r   r*   r	  s     rO   coerce_to_integerzExprNode.coerce_to_integer  s+    99K>>*"8"8#>>rP   c                 >    | j                         r| S t        | |      S rI   )rI  CoerceToTempNoder	  s     rO   coerce_to_tempzExprNode.coerce_to_temp  s      K#D#..rP   c                 H    | j                         r| S | j                  |      S rI   )	is_simpler  r	  s     rO   r  zExprNode.coerce_to_simple  s"    >>K&&s++rP   c                 "    | j                         S rI   )rI  rS   s    rO   r  zExprNode.is_simple  s    
 ""$$rP   c                     | j                   r-| j                   j                  s| j                   j                  sy| j                         r| j                  d uS yNFT)r   rl   r   r   r{   rS   s    rO   may_be_nonezExprNode.may_be_none!  sE    99dii33"ii::##%''t33rP   c                      y rI   rR   rS   s    rO   as_cython_attributezExprNode.as_cython_attribute)      rP   c                 B    | j                         rt        | |||      S | S rI   )r  NoneCheckNode)rT   r  r   format_argss       rO   as_none_safe_nodezExprNode.as_none_safe_node,  s&      ug{CCKrP   c                     dj                         }|D ]  }||v r	 t        ||      }|||<     | |j                  fi |S # t        $ r Y :w xY w)zInstantiate this node class from another node, properly
        copying over all attributes that one would forget otherwise.
        z1cf_state cf_maybe_null cf_is_null constant_result)splitr   r   r}   )rM   r   kwargs
attributes	attr_namer   s         rO   	from_nodezExprNode.from_node4  st    
 INNP
# 	*IF"*i0 %*y!	* 488&v&&	 " s   A	AArI   r   FNNF)FN)PyExc_TypeErrorrR   )grV   rW   rX   r   r   
annotationr   r]  rV  rS  is_numpy_attributer   is_dict_literalis_set_literalis_string_literalis_attributeis_subscriptr   is_buffer_accessis_memview_indexis_memview_slicer  r  saved_subexpr_nodesr   	is_target
is_starredr   r{   propertyr   
attrgetterchild_attrsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r
  r  r  r  r  r  r   r   r%  r/  r1  r4  r6  r  r  r<  r>  r  rA  rE  rD  rI  rL  r   rW  r_  rc  ri  rr  rk  rm  r{  rp  r  r  r  r  rq  r  r  r  r  r  r  r  r  r  r  r  r  r  r  classmethodr  rR   rP   rO   r   r   '  s"   $ LDJIHONf $ONLLH !&GIJ,O 3 3 3J ?@K8E60';..
	
:;&;
'.	AW
/_
c


.'S@3
,6"$9L*"056$.6 IN.2*!
 xtS
>:?/,% ' 'rP   r   c                       e Zd Zg Zd Zd Zy)AtomicExprNodec                      y rI   rR   rb  s     rO   rk  z/AtomicExprNode.generate_subexpr_evaluation_codeM  r  rP   c                      y rI   rR   rb  s     rO   rp  z-AtomicExprNode.generate_subexpr_disposal_codeO  r  rP   N)rV   rW   rX   r   rk  rp  rR   rP   rO   r  r  F  s     HrP   r  c                   2    e Zd ZdZeZd Zd Zd Zd Z	d Z
y)PyConstNoder&   c                      yNr&   rR   rS   s    rO   r  zPyConstNode.is_simpleX  r   rP   c                      yr@  rR   rS   s    rO   r  zPyConstNode.may_be_none[      rP   c                     | S rI   rR   r	  s     rO   r  zPyConstNode.analyse_types^      rP   c                     | j                   S rI   r   rS   s    rO   r   z!PyConstNode.calculate_result_codea      zzrP   c                      y rI   rR   rb  s     rO   rm  z PyConstNode.generate_result_coded  r  rP   N)rV   rW   rX   r   r   r   r  r  r  r   rm  rR   rP   rO   r  r  R  s'     JDrP   r  c                   :     e Zd ZdZdZdZdZd Zd Z fdZ	 xZ
S )NoneNoder&   Py_NoneNc                      y rI   rR   r  s     rO   r  zNoneNode.compile_time_valuer  r  rP   c                      yNTrR   rS   s    rO   r  zNoneNode.may_be_noneu  r  rP   c                     |j                   s1|j                  s%|j                  st        | j                  d|z         t
        t        |   ||      S )NzCannot assign None to %s)rl   r   r  r   r}   rK   r  r  rT   r  rn   rN   s      rO   r  zNoneNode.coerce_tox  sD    $$(C(CxGXGX$((6ABXt.x==rP   )rV   rW   rX   is_noner   r{   r<  r  r  r  rY   rZ   s   @rO   r  r  h  s-     GEOK> >rP   r  c                       e Zd ZdZeZd Zy)EllipsisNodePy_Ellipsisc                     t         S rI   )Ellipsisr  s     rO   r  zEllipsisNode.compile_time_value  s    rP   N)rV   rW   rX   r   r*  r{   r  rR   rP   rO   r'  r'    s     EOrP   r'  c                   D    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)	ConstNoder&   Nc                      yr  rR   rS   s    rO   r  zConstNode.is_simple  r   rP   c                      yr  rR   rS   s    rO   r%  zConstNode.nonlocally_immutable  r   rP   c                      yr@  rR   rS   s    rO   r  zConstNode.may_be_none  r  rP   c                     | S rI   rR   r	  s     rO   r  zConstNode.analyse_types  r  rP   c                      yr"  rR   rS   s    rO   r  zConstNode.check_const  r  rP   c                 "    | j                         S rI   rK  rS   s    rO   r   z$ConstNode.get_constant_c_result_code  s    ))++rP   c                 ,    t        | j                        S rI   )rs   r   rS   s    rO   r   zConstNode.calculate_result_code      4::rP   c                      y rI   rR   rb  s     rO   rm  zConstNode.generate_result_code  r  rP   )rV   rW   rX   r   r<  r  r%  r  r  r  r   r   rm  rR   rP   rO   r,  r,    s6    
 JK,rP   r,  c                   <    e Zd Zej                  Zd Zd Zd Zd Z	y)r  c                 &    | j                   | _        y rI   r  rS   s    rO   r   z"BoolNode.calculate_constant_result      #zzrP   c                     | j                   S rI   r  r  s     rO   r  zBoolNode.compile_time_value  r  rP   c                     | j                   j                  r| j                  xr dxs dS t        t	        | j                              S )NPy_TruePy_False)r   rl   r   rs   intrS   s    rO   r   zBoolNode.calculate_result_code  s6    99  ::+)9z9s4::''rP   c                    || j                   k(  r| S |t        u r| j                   t        j                  u r| S |j                  rQ| j                   j
                  r;t        | j                  | j                  | j                  t        j                        S |j
                  rQ| j                   j                  r;t        | j                  | j                  | j                  t        j                        S t        j                  | ||      S Nr'  )r   r   r   	bool_typerl   r  r  r}   r   r{   r   c_bint_typer,  r  rT   r  rn   s      rO   r  zBoolNode.coerce_to  s    tyy K~%$))w7H7H*HKDII$4$4

 $ 4 4&&( ( ??tyy44

 $ 4 4++- - ""4377rP   N)
rV   rW   rX   r   rA  r   r   r  r   r  rR   rP   rO   r  r    s!    !!D*(8rP   r  c                   2    e Zd Zej                  ZdZdZd Zy)NullNodeNULLr   c                     | j                   S rI   r  rS   s    rO   r   z#NullNode.get_constant_c_result_code  r  rP   N)	rV   rW   rX   r   c_null_ptr_typer   r   r{   r   rR   rP   rO   rD  rD    s    %%DEOrP   rD  c                   6    e Zd Zej                  Zd Zd Zd Zy)CharNodec                 8    t        | j                        | _        y rI   )ordr   r{   rS   s    rO   r   z"CharNode.calculate_constant_result  s    "4::rP   c                 ,    t        | j                        S rI   )rK  r   r  s     rO   r  zCharNode.compile_time_value  r4  rP   c                 F    dt        j                  | j                        z  S )Nz'%s')r   escape_charr   rS   s    rO   r   zCharNode.calculate_result_code  s    224::>>>rP   N)	rV   rW   rX   r   r   r   r   r  r   rR   rP   rO   rI  rI    s    !!D/?rP   rI  c                   T    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y)r,  r  Nc                 f    t        j                  | |fi | d|vr| j                         | _        y y )Nr   )r   __init__find_suitable_type_for_valuer   )rT   r}   kwdss      rO   rQ  zIntNode.__init__  s4    $,t,99;DI rP   c                 z   | j                   t        u r	 | j                          | j                  s+| j                         r| j                  s| j                  dk(  rf| j                  dk(  xr dxs d}t        j                  | j                   |df   }| j                  r t        j                  || j                        }|S d| j                   cxk  rdk  rEn nB| j                  r$| j                  j                  r| j                  }|S t        j                  }|S t        j                  }|S # t        $ r Y w xY w)NLLr0   r&   r=  i   l        )r{   r   r   r   is_c_literalr   unsignedlongnessr   modifiers_and_name_to_typer   widest_numeric_typer  r*   r   )rT   ranksuitable_types      rO   rR  z$IntNode.find_suitable_type_for_value  s   #99..0
 ++-}} 5MMT)0q5AD&AAdmmBSUY[`B`aMyy * > >}dii X  --5599!1!1$(IIM
  %/$:$:M  !+ 9 9+  s   D- -	D:9D:c           	      X   | j                   |u r| S |j                  ry| j                         rBt        | j                  dt        | j                        z  |t        | j                              S t        | j                  | j                  |t              S |j                  rR|j                  sFt        | j                  | j                  | j                  |d| j                  | j                        }|S |j                  rSt        | j                  | j                  | j                  t         j"                  d| j                  | j                        }nBt        | j                  | j                  | j                  | j                  | j                        }t$        j'                  |||      S )Nz%d.0)r   r   r{   T)r   r{   r   rV  rW  rX  F)r   r{   rW  rX  )r   r  r   	FloatNoder}   r=  r{   r|   r   r   
is_numericr  r,  rW  rX  rl   r   r   r,  r  rT   r  rn   r   s       rO   r  zIntNode.coerce_to  sP   99 K'') #d>R>R:S1SZb16t7K7K1LN N !(1?A Ax':':4884::tG[G[ (t$(MMDMMKD K!!4884::tG[G[ * 9 9$(MMDMMKD 4884::tG[G[$(MMDMMKD
 ""4377rP   c                     t        | j                  | j                  | j                  t        j
                  | j                  | j                        S )N)r   r{   r   rW  rX  )r,  r}   r   r{   r   rA  rW  rX  r	  s     rO   r  zIntNode.coerce_to_boolean*  s;    HHDJJ 00'']]T]]	< 	<rP   c                     | j                   j                  rJt        t        j                  | j
                              }|j                  || j                        | _        y | j                         | _        y rI   )
r   rl   rs   r   str_to_numberr   
get_py_intrX  result_coder   )rT   r   plain_integer_strings      rO   rr  z IntNode.generate_evaluation_code1  sR    99  #&u':':4::'F#G #/CT]]SD#>>@DrP   c                    | j                   | j                  }}| j                         }|s|s| j                  j                  rw|d   dk(  ro|d   dk7  rg| j                  j
                  t        j                  j
                  k\  rd}n3| j                  j
                  t        j                  j
                  k\  rd}||z   |z   S )Nr   -r&   0rU  L)	rW  rX  value_as_c_integer_stringr   r  r[  r   c_longlong_typer*   )rT   rW  rX  literals       rO   r   z"IntNode.get_constant_c_result_code9  s    !]]DMM(002H$))*:*:wqzS?PU\]^U_cfUfyy~~!;!;!@!@@:#9#9#>#>>!H,,rP   c                    | j                   }t        |      dk  r|S d}|d   dk(  rd}|dd  }|d   dk(  rs|d   }|r:|dv r6|dd  j                         r#t        t	        j
                  |            }||z   S |dv rd|dd  z   }||z   S |d	v rt        t        |dd  d            }||z   S |j                         r(| j                  s| j                  s|sd
t        |      z  }||z   S )Nr0   r  r   rh  r&   ri  oOxX0123456789oObBz0x%X)	r   r   isdigitrs   r   rc  r=  rW  rX  )rT   r   neg_signliteral_types       rO   rk  z!IntNode.value_as_c_integer_stringD  s   

u:?L8s?H!"IE8s? 8L L,<<qrARARAT E//67 % %eABi % %Cab	1-. % ]]_T]]4== U+%rP   c                     | j                   S rI   re  rS   s    rO   r   zIntNode.calculate_result_code`      rP   c                 L    t        j                  | j                        | _        y rI   )r   rc  r   r{   rS   s    rO   r   z!IntNode.calculate_constant_resultc  s    $224::>rP   c                 @    t        j                  | j                        S rI   )r   rc  r   r  s     rO   r  zIntNode.compile_time_valuef  s    ""4::..rP   )rV   rW   rX   rW  rX  rV  rQ  rR  r  r  rr  r   rk  r   r   r  rR   rP   rO   r,  r,    sF     HHL<
68:<A	- 8 ?/rP   r,  c                   H    e Zd Zej                  Zd Zd Zd Zd Z	d Z
d Zy)r^  c                 8    t        | j                        | _        y rI   )r|   r   r{   rS   s    rO   r   z#FloatNode.calculate_constant_resultl  s    $TZZ0rP   c                 ,    t        | j                        S rI   )r|   r   r  s     rO   r  zFloatNode.compile_time_valueo  s    TZZ  rP   c                    |j                   rQ| j                  j                  r;t        | j                  | j
                  | j                  t        j                        S |j                  rC| j                  j                   r-t        | j                  | j
                  | j                  |      S t        j                  | ||      S r?  )rl   r   r  r^  r}   r   r{   r   
float_typer,  r  rB  s      rO   r  zFloatNode.coerce_tor  s    DII$6$6

 $ 4 4'') ) !6!6

 $ 4 4  ""4377rP   c                     | j                   S rI   rv  rS   s    rO   r   zFloatNode.calculate_result_code  rw  rP   c                     | j                   }t        |t              sJ t        t	        |            }|dk(  ry|dk(  ry|dk(  ry|S )Nnanz(Py_HUGE_VAL * 0)infPy_HUGE_VALz-infz(-Py_HUGE_VAL))r   rz   rD   reprr|   )rT   strvalcmpvals      rO   r   z$FloatNode.get_constant_c_result_code  sJ    &*--eFm$U?&u_ v#MrP   c                     | j                         }| j                  j                  r"|j                  | j                  |      | _        y || _        y rI   )r   r   rl   get_py_floatr   re  )rT   r   c_values      rO   rr  z"FloatNode.generate_evaluation_code  s>    11399  #00WED&DrP   N)rV   rW   rX   r   c_double_typer   r   r  r  r   r   rr  rR   rP   rO   r^  r^  i  s+    ##D1!8 'rP   r^  c                    t        j                  |       }||S |j                         j                  |       }|rp|j                  rd|j                  j
                  sB|j                  j                  s,|j                  j                  s|j                  j                  r|j                  S ddl	m	} t        d      5  |d   |d   |d   dz
  f}	  |d| z  |d   j                  |	      }|j                  j                  d   j                  }t        |t               r6|j#                  |      }t        |t               r|j$                  cd d d        S d d d        y # t&        $ r Y w xY w# 1 sw Y   y xY w)
Nr&   )TreeFragmentTignorer   r0      
sizeof(%s))rm   initial_pos)r   parse_basic_typeglobal_scoper  r   is_extension_typeis_struct_or_unionis_builtin_typer  r  r   filenamerootstatsexprrz   SizeofTypeNoder  arg_typer   )rm   r}   rn   r   global_entryr  declarationsizeof_nodes           rO   _analyse_name_as_typer    sT   &&t,D##%,,T2L))//  33  00  --   *	T	" 01vs1vs1vax(		0&}t';#a&//_bcK &**00388K+~6)77<k>:&//0 0 0   			0 s1   =E,E+AE,	E)&E,(E))E,,E5c                   R    e Zd ZdZeZd ZddZd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zy)	BytesNodeTc                 &    | j                   | _        y rI   r  rS   s    rO   r   z#BytesNode.calculate_constant_result  r8  rP   Nc                     t        j                  | j                  |||   | j                  j                        }t	        | j
                  ||      S Nr  )r   bytes_literalr   encodingr  r}   )rT   r   r   r   r   s        rO   as_sliced_nodezBytesNode.as_sliced_node  s@    ,,TZZd4-H$**J]J]^FFrP   c                 6    | j                   j                         S rI   )r   
byteencoder  s     rO   r  zBytesNode.compile_time_value  s    zz$$&&rP   c                 b    t        | j                  j                  d      | j                  |      S Nz	ISO8859-1)r  r   decoder}   r	  s     rO   r4  zBytesNode.analyse_as_type  s$    $TZZ%6%6{%CTXXsSSrP   c                 2    t        | j                        dk(  S r  r   r   rS   s    rO   can_coerce_to_char_literalz$BytesNode.can_coerce_to_char_literal      4::!##rP   c                 \    t        | j                        }t        | j                  ||      S r  r  r   r  r}   rT   rn   r  s      rO   r  zBytesNode.coerce_to_boolean  s%     $**%

JOOrP   c                 &   | j                   |k(  r| S |j                  r| j                         st        | j                  d       | S |j
                  rt        | j                  d       | S t        | j                  | j                  t        | j                              S t        | j                  | j                  | j                        }|j                  rE|t        t        j                  fv rt        j                  |_         |S | j                  ||d       |S |t         j"                  t         j$                  fv r	||_         |S |t         j&                  t         j(                  t         j*                  fv rD|t         j(                  k(  rt         j$                  nt         j"                  |_         t-        ||      S |j/                  t         j"                        r!|j0                  r|j2                  r	||_         |S t4        j7                  |||      S )Nz?Only single-character string literals can be coerced into ints.zRBytes literals cannot coerce to Py_UNICODE/Py_UCS4, use a unicode literal instead.r  Tr  )r   r  r  r   r}   is_unicode_charrI  r   rK  r  r{   rl   r   r   r   r  r   rh   rj   ri   rk   c_void_ptr_typeCastNoder  r  r  r,  r  r`  s       rO   r  zBytesNode.coerce_to  s   99 K??224dhh ab''dhh tuDHHDJJ,/

O= = TEYEYZNG,>,>??#..	 K --h$-GK*44j6V6VWW DIK*55z7X7XZdZtZtuu=EIjIj=j99(88 ID(++%%j&@&@A((H,=,=$	
 ""4377rP   c                 t   | j                   j                  r#|j                  | j                        }|| _
        y | j                   j                  r#|j                  | j                        }|| _
        y | j                  j                         }t        | j                   t        j                  |      }|| _
        y rI   )r   rl   get_py_string_constr   r  get_string_constas_c_string_literalr+   r   r  re  )rT   r   r   rm  s       rO   rr  z"BytesNode.generate_evaluation_code  s    99  --djj9F " YY**4::6F " jj446Gdii)C)CWMF!rP   c                      y rI   rR   rS   s    rO   r   z$BytesNode.get_constant_c_result_code  r  rP   c                     | j                   S rI   rv  rS   s    rO   r   zBytesNode.calculate_result_code  rw  rP   rI   )rV   rW   rX   r   r   r   r   r  r  r4  r  r  r  rr  r   r   rR   rP   rO   r  r    sE    
 D*G'T$P$8L
" rP   r  c                   V    e Zd ZdZdZeZd Zd ZddZ	d Z
d Zd Zd	 Zd
 Zd Zd Zy)UnicodeNodeTNc                 &    | j                   | _        y rI   r  rS   s    rO   r   z%UnicodeNode.calculate_constant_result  r8  rP   c                 D    t        | j                  | j                  |      S rI   )r  r   r}   r	  s     rO   r4  zUnicodeNode.analyse_as_type  s    $TZZ3??rP   c                    t        j                  | j                  d |       ry t        j                  | j                  |||         }| j                  j                  |_        | j
                  ;t        j                  | j
                  |||   | j
                  j                        }nd }t        | j                  |||      S )N)r   bytes_valuer{   )	r   string_contains_surrogatesr   r  r  r  r  r  r}   )rT   r   r   r   r   r  s         rO   r  zUnicodeNode.as_sliced_node  s    44TZZ5FG ,,TZZd4-HI,,'(66  tD143C3C3L3LNK KHHE{!# 	#rP   c                    || j                   u r	 | S |j                  r_| j                         st        | j                  d       | S t        | j                        }t        | j                  |t        |      |      S |j                  s|j                  r=| j                  1t        | j                  | j                        j                  ||      S |j                  r*t        | j                  | j                        }||_         |S t        | j                  d       | S |t         t"        j$                  fvr| j'                  ||d       | S )NzhOnly single-character Unicode string literals or surrogate pairs can be coerced into Py_UCS4/Py_UNICODE.r   r   r{   r  zUnicode literals do not support coercion to C types other than Py_UNICODE/Py_UCS4 (for characters) or Py_UNICODE* (for strings).Tr  )r   r  r  r   r}   rK  r   r,  rs   rl   rn  r  r  r  ro  r  r   r   r/   r  )rT   r  rn   	int_valuer   s        rO   r  zUnicodeNode.coerce_to-  s.   tyy 4 3 %%224dhhPQ DJJI488(#i.+46 6%%!!d&6&6&B !1A1A i#./(("4884::>$	$((#$  ng.E.EFF))(Cd)CrP   c                 2    t        | j                        dk(  S r  r  rS   s    rO   r  z&UnicodeNode.can_coerce_to_char_literalK  r  rP   c                 \    t        | j                        }t        | j                  ||      S r  r  r  s      rO   r  zUnicodeNode.coerce_to_booleanQ  s#    $**%

JOOrP   c                 @    t        j                  | j                        S rI   )r   r  r   rS   s    rO   contains_surrogateszUnicodeNode.contains_surrogatesU  s    88DDrP   c                    | j                   j                  rFt        j                  | j                        r|j                  t        d      | _        |j                  t        j                  | j                  j                  d                  }|j                  | j                        }|y |j                  | j                         |j                  | j                  d|d|d|j                  | j                  | j                               |j!                  | j                  d| j                  z         y |j#                  | j                        | _        y |j%                  | j                        | _        y )Nustringunicode_escapez! = PyUnicode_DecodeUnicodeEscape(	, sizeof(z) - 1, NULL); z__Pyx_PyUnicode_READY(%s))r   rl   r   string_contains_lone_surrogatesr   get_py_constr   re  r  BytesLiteralencodeget_cached_constants_writerrl  r}   r   r   put_error_if_negr  get_pyunicode_ptr_const)rT   r   
data_cname
const_codes       rO   rr  z$UnicodeNode.generate_evaluation_codeX  s.   99   ==djjI $(#4#4^Y#O !22"//

0A0ABR0STV
!==d>N>NO
%##DHH-  (("""55d6F6FQ	ST ++HH9D<L<LLN $(#;#;DJJ#G #;;DJJGDrP   c                     | j                   S rI   rv  rS   s    rO   r   z!UnicodeNode.calculate_result_codev  rw  rP   c                     | j                   S rI   r  r	  s     rO   r  zUnicodeNode.compile_time_valuey  r  rP   rI   )rV   rW   rX   r   r  r   r   r   r4  r  r  r  r  r  rr  r   r  rR   rP   rO   r  r    sJ     KD*@# <$PEH< rP   r  c                   T    e Zd ZeZdZdZdZd Zd Z	ddZ
d Zd Zd Zd	 Zd
 Zd Zy)
StringNodeTNc                 @    | j                   | j                   | _        y y rI   )unicode_valuer{   rS   s    rO   r   z$StringNode.calculate_constant_result  s!    )#'#5#5D  *rP   c                 ~    t        | j                  xs | j                  j                  d      | j                  |      S r  )r  r  r   r  r}   r	  s     rO   r4  zStringNode.analyse_as_type  s3    $T%7%7%Y4::;L;L[;Y[_[c[cehiirP   c                     t        | j                        | j                  |||         }| j                  j                  |_        | j                  It	        j
                  | j                  d |       ry t	        j                  | j                  |||         }nd }t        | j                  |||| j                        S )N)r   r  r{   is_identifier)
r   r   r  r  r   r  r  r  r}   r  )rT   r   r   r   r   r  s         rO   r  zStringNode.as_sliced_node  s     TZZ E$tO!<=,,)889K9KET9RS*88""5d?35M !MHHE!1C1CE 	ErP   c                    |t         urxt        j                  |      sc|j                  s1t	        | j
                  | j                        j                  ||      S |t        j                  ur| j                  ||d       | S )Nr  Tr  )r   r   r  rl   r  r}   r   r  r   r/   r  rB  s      rO   r  zStringNode.coerce_to  sm    >)(2E2Eh2O '' <FFxQTUUw666--h$-GrP   c                 P    | j                    xr t        | j                        dk(  S r  )r  r   r   rS   s    rO   r  z%StringNode.can_coerce_to_char_literal  s#    %%%>#djj/Q*>>rP   c                 t    |j                  | j                  | j                  d| j                        | _        y )NT
identifieris_strr  )r  r   r  r  re  rb  s     rO   rr  z#StringNode.generate_evaluation_code  s4    33JJ4#5#5d,, 4 .rP   c                      y rI   rR   rS   s    rO   r   z%StringNode.get_constant_c_result_code  r  rP   c                     | j                   S rI   rv  rS   s    rO   r   z StringNode.calculate_result_code  rw  rP   c                     | j                   j                  r| j                   S t        s| j                   j                         S | j                  | j                  S | j                   j                  d      S )N	iso8859-1)r   
is_unicoder%   r  r  r  r	  s     rO   r  zStringNode.compile_time_value  s\    ::  ::::((**)%%%zz  --rP   rI   )rV   rW   rX   r   r   r   r  r  r   r4  r  r  r  rr  r   r   r  rR   rP   rO   r  r  }  sH     DMM6
jE	?.
 	.rP   r  c                       e Zd ZdZy)IdentifierStringNodeTN)rV   rW   rX   r  rR   rP   rO   r  r    s	     MrP   r  c                   R    e Zd Zej                  Zd Zd Zd Zd Z	d Z
dZd Zd Zy	)
ImagNodec                 L    t        dt        | j                              | _        y Ng        )complexr|   r   r{   rS   s    rO   r   z"ImagNode.calculate_constant_result  s    &sE$**,=>rP   c                 @    t        dt        | j                              S r  )r  r|   r   r  s     rO   r  zImagNode.compile_time_value  s    sE$**-..rP   c                 <    | j                   j                  |       | S rI   )r   create_declaration_utility_coder	  s     rO   r  zImagNode.analyse_types  s    		11#6rP   c                      yr@  rR   rS   s    rO   r  zImagNode.may_be_none  r  rP   c                     | j                   |u r| S t        | j                  | j                        }|j                  rd|_        t        j                  |_         t        j                  |||      S )Nr  r&   )
r   r  r}   r   rl   r   r   complex_typer  r  r`  s       rO   r  zImagNode.coerce_to  s[    99 K

3DL,,DI ''h<<rP   zConstructing complex numberc                     | j                   j                  r| j                         S | j                   j                  dt	        | j
                        dS )Nz(0, ))r   rl   r   
from_partsr|   r   rS   s    rO   r   zImagNode.calculate_result_code  s9    99  ;;= "&))"6"6djj8IJJrP   c           
      4   | j                   j                  r|j                  | j                         dt	        | j
                        d|j                  | j                         | j                               |j                  | j                                y y )Nz = PyComplex_FromDoubles(0.0, ); )
r   rl   r   r   r|   r   r   r}   
put_gotrefr   rb  s     rO   rm  zImagNode.generate_result_code  sk    99  JJKKM$**%++DKKM488DFG
 OODNN,- !rP   N)rV   rW   rX   r   c_double_complex_typer   r   r  r  r  r  gil_messager   rm  rR   rP   rO   r  r    s:    
 ++D?/
= 0KK.rP   r  c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)NewExprNodeNc                 F   | j                   j                  |      }||j                  s"t        | j                  d       t
        | _        y | j                  |       |j                  | j                        }|| _	        || _
        |j                  | _        | j                  S )Nz/new operator can only be applied to a C++ class)cppclassr4  r  r   r}   r,   r   	cpp_checkget_constructor
class_typer   )rT   rn   r   constructors       rO   r   zNewExprNode.infer_type  s    }},,S1<t00$((MN"DIs**4884 
$$	yyrP   c                 @    | j                   | j                  |       | S rI   )r   r   r	  s     rO   r  zNewExprNode.analyse_types  s    99OOC rP   c                      yr@  rR   rS   s    rO   r  zNewExprNode.may_be_none  r  rP   c                      y rI   rR   rb  s     rO   rm  z NewExprNode.generate_result_code  r  rP   c                 <    d| j                   j                         z   S )Nznew )r
  empty_declaration_coderS   s    rO   r   z!NewExprNode.calculate_result_code  s    >>@@@rP   )	rV   rW   rX   r   r   r  r  rm  r   rR   rP   rO   r  r    s#     D
ArP   r  c                   (    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 fd
Zd(dZd Zd Zd Zd Zd Zd Zd Zd ZdZd(dZd Z d Z!d Z" fdZ#d Z$d Z%d Z&d Z'd Z(d Z)d  Z*d! Z+d" Z,	 	 d)d#Z-d$ Z.d% Z/d(d&Z0d' Z1 xZ2S )*r  TFNr   c                     | j                   S rI   )cython_attributerS   s    rO   r  zNameNode.as_cython_attribute:  s    $$$rP   c                     | j                    |j                  | j                        | _         | j                   #| j                   j                  j                  r| fS yNrR   )r   r  rm   r   is_unspecifiedr	  s     rO   r   zNameNode.type_dependencies=  sD    ::DII.DJ::!djjoo&D&D7NrP   c                    | j                    |j                  | j                        | _         | j                   | j                   j                  t        u r| j
                  | j
                  S t        S | j                   j                  j                  s | j                   j                  j                  r3| j                  | j                   j                  j                  k(  rt        S | j                   j                  j                  rO| j                   j                  j                  rt        S t        j                  | j                   j                        S | j                   j                  j                  rD| j
                  r8| j
                  j                   r| j                   j"                  s| j
                  S | j                   j                  S rI   )r   r  rm   r   r-   inferred_typer   r  r  r   r$  r  is_builtin_scoper   CPtrTyperl   r  might_overflowr	  s     rO   r   zNameNode.infer_typeE  s0   ::DII.DJ::4D!D!!-)))!!jjoo//4::??3R3R		TZZ__111 ZZ__))zz00%% "**4::??;; zz**t/A/A**11djj6O6O---::??"rP   c                     	 |j                  | j                        S # t        $ r& t        | j                  d| j                  z         Y y w xY w)Nz"Compile-time name '%s' not defined)r  rm   KeyErrorr   r}   r  s     rO   r  zNameNode.compile_time_valuea  sD    	N;;tyy)) 	N$((@499LM	Ns    ,AAc                     | j                   r | j                   j                  j                  ry | j                   j                  S rI   )r   r   rl   r   rS   s    rO   r   z#NameNode.get_constant_c_result_codeg  s,    zzTZZ__88zzrP   c                 ~   |t         u r| j                  }|r|j                  r|j                  }|ry|j                  r2|j
                  r&|j                  |j                  | j                        }t        | j                  | j                        }||_        |j                  |       |S t        t        | 3  ||      S )N)rm   )r   r   r$  as_variable
is_builtinr  declare_builtinrm   r}   r  analyse_rvalue_entryrK   r  )rT   r  rn   r   	var_entryr   rN   s         rO   r  zNameNode.coerce_tol  s    
 ~%JJE++!--	 ++	0B0B$'$7$7	$Q	#DHHTYY?D!*DJ--c2KXt.x==rP   c                    |j                   d   sy|j                  s|j                  ry| j                  }| j                  s|j                  |      y| j                  }|j                  rd}nt        ||      \  }}| |r|j                   d   dk7  rt        nt        }|j                  ||| j                  |       | _        || j                  _        y)aV  Implements PEP 526 annotation typing in a fairly relaxed way.

        Annotations are ignored for global variables, Python class attributes and already declared variables.
        String literals are allowed and ignored.
        The ambiguous Python types 'int' and 'long' are ignored and the 'cython.int' form must be used instead.
        annotation_typingNinfer_typesF)is_cdef)rf   is_module_scopeis_py_class_scoperm   r   lookup_herer  r   r)   r-   r   declare_varr}   )rT   rn   	as_targetrm   r  atype_s          rO   declare_from_annotationz NameNode.declare_from_annotation  s     ~~12#"7"7yy::.:__
''E.z3?HAu=(1cnn]6SW\6\$bpE__T5$((	M_R
 *

rP   c                     | j                   }|s|j                  | j                        }|r|j                  r|j                  S y rI   )r   r  rm   	as_modulerT   rn   r   s      rO   r1  zNameNode.analyse_as_module  s8     

JJtyy)EU__??"rP   c                 (   | j                   r t        j                  | j                         }nt        j                  | j                        }|r|S | j                  }|s|j                  | j                        }|r|j                  r|j                  S y rI   )r  r   r  rm   r   r  is_typer   )rT   rn   r   r   s       rO   r4  zNameNode.analyse_as_type  sq      ..t/D/DED..tyy9DK

JJtyy)EU]]::rP   c                     | j                   }|s|j                  | j                        }|rD|j                  r8|j                  j
                  s|j                  j                  r|j                  S y rI   )r   r  rm   r5  r   r  r  r3  s      rO   r6  z"NameNode.analyse_as_extension_type  sQ     

JJtyy)EU]]zz++uzz/I/Izz!rP   c                 X   | j                   s |j                  | j                        | _         | j                   s| j                  | j	                  |d       | j                   s~|j
                  d   r$t        | j                  d| j                  z  d       |j
                  d   dk7  rt        }nt        }|j                  | j                  || j                        | _         | j                   j                  rt        | _        | j                   j                  rd| j                   _        y y )NT)r-  zwarn.undeclaredzimplicit declaration of '%s'r&   r'  F)r   r+  rm   r  r0  rf   r   r}   r-   r   r,  is_declared_genericr   r2  is_variable)rT   rn   r   s      rO   r
  z#NameNode.analyse_target_declaration  s    zz3DJzzdoo9(((=zz~~/0"@499"LaP~~m,5'%D$((CDJ::)) .D::%&DJJ"  rP   c                    |j                   d   | _        | j                  }||j                  | j                        }|sG|j                  | j                  | j                        }|r|j                  r|j                  rd| _	        |st        j                  | _        | S || _        d|_        |j                  j                  rddlm} |j#                  |       | j%                  |       | S )NinitializedcheckTr&   Buffer)rf   initialized_checkr   r  rm   r"  r}   r!  r  r   r   r,   r   r  	is_bufferr  r=  used_buffer_aux_varsr#  rT   rn   r   r=  s       rO   r  zNameNode.analyse_types  s    !$0B!C

=JJtyy)E++DIItxx@U--%..&*DO&11	DJ
:: ''.!!#&rP   c                    | j                  |d       | j                  }|j                  rn|j                  rb|j                  s2|j
                  j                  s| j                         s0|j                  r$|j                  x}| _        |j
                  | _        | j
                  j                  r#t        | j                  d| j                  z         | j
                  j                  r#t        | j                  d| j                  z         | j                         s8t        | j                  d| j                  z         t        j                  | _        d|_        |j
                  j                   rddlm} |j'                  |       | S )NT)r  zAssignment to const '%s'zAssignment to reference '%s'zAssignment to non-lvalue '%s'r&   r<  )analyse_entryr   r$  r   is_overridabler   r   fused_cfunctionr  r   r}   rm   r  r   r,   r  r?  r  r=  r@  rA  s       rO   r  zNameNode.analyse_target_types  s   3$/

%"3"3$$

(A(A$..JZ_d_t_t%*%6%66
!JJ	99$((6BC99!!$((:TYYFG~~$((;diiGH"--DI
:: ''.rP   c                 T   | j                  |       | j                  }|j                  rt        | _        |j
                  s|j                  r0|j                  r|j                  rd| _        nd| _        d| _	        | S |j                  j                  rd| _        d| _	        d| _        | S )Nr   r&   FT)rC  r   r8  r   r   is_pyglobalr!  r  r   is_used_as_rvaluer   r   rV  r3  s      rO   r#  zNameNode.analyse_rvalue_entry  s     	3

$$ .D 0 0ENN  %&D"
 	 ZZ** DL%)D"#'D rP   c                     d| _         | j                  rT| j                  }|j                  r|j                  s| j                          y y |j                  r| j                          y y y r"  )r   rH  r   r!  r  r;  rG  r3  s      rO   r<  zNameNode.nogil_check  sW    
!!JJE~~NN$ &""  # "rP   z"Accessing Python global or builtinc                     | j                          | j                  }|j                  }|s:|j                  r.| j                  r"| j                  j
                  r| j                  }|| _        y rI   )check_identifier_kindr   r   rl   r  r  )rT   rn   r  r   r   s        rO   rC  zNameNode.analyse_entry!  sT    ""$

zzd..43E3E""22%%D	rP   c                    | j                   }|j                  r|j                  j                  r|| _        |j                  re|j                  j
                  rOt        j                  | j                  d t              }d|_
        | j                   j                  |_        || _         y |j                  s|j                  s|j                  s}|j                  sp|j                   sc| j                   j"                  r| j                   j"                  | _         y | j$                  s$t'        | j(                  d| j                  z         y y y y y y y )NTz7'%s' is not a constant, variable or function identifier)r   r5  r   r  
type_entryr  r   Entryrm   r   rG  r  r  r9  r!  r$  r  r   is_cython_moduler   r}   )rT   r   py_entrys      rO   rK  zNameNode.check_identifier_kind,  s     

==UZZ99#DO==UZZ//||DIIt^DH#'H !ZZ--HN!DJ..E$5$5""e&8&8$$zz%%!ZZ33
**dhh Y\`\e\e ef + % '9" %6.rP   c                     | j                   s| j                  ry| j                  xs |j                  | j                        }|j
                  xr |j                   S r@  )rO  r  r   r  rm   r2  r9  r3  s      rO   "is_cimported_module_without_shadowz+NameNode.is_cimported_module_without_shadow@  sI      D$9$9

3cjj38u'8'8#88rP   c                      yr  rR   rS   s    rO   r  zNameNode.is_simpleF  s    rP   c                 J   | j                   r| j                  ry| j                  j                  s| j                  j                  rMt	        | dd      ryd| _        d}| j                   D ]#  }|j                  j                         sd} | `|S  | `|S t        t        |          S )N_none_checkingFT)
r   r   rl   r   r   rU  r   r  rK   r  )rT   r  
assignmentrN   s      rO   r  zNameNode.may_be_noneJ  s    ==TYYDII,A,A,0II,H,Ht-u5 "&D  K"mm 
>>--/"&K# #Xt022rP   c                     t         j                  |       ry| j                  }|r|j                  ry|j                  xs( |j
                  xs |j                  xs |j                  S NTF)r   r%  r   
in_closureis_localis_argr!  is_readonlyrT   r   s     rO   r%  zNameNode.nonlocally_immutable_  sS    ((.

((~~VV1A1AVUEVEVVrP   c                      y rI   rR   r	  s     rO   calculate_target_resultsz!NameNode.calculate_target_resultsg  r  rP   c                     | j                   }|K|j                  s?|j                  s3|j                  s'|j                  j                  s| j                          yyr  )r   r  r$  r!  r   rA  r]  s     rO   r  zNameNode.check_constj  sG    

""  

##NNrP   c                     | j                   }|j                  s)|j                  s|j                  s| j	                          yyr  )r   
is_cglobalr$  r!  rD  r]  s     rO   rE  zNameNode.check_const_addru  s6    

  E$6$6%:J:J!rP   c                     | j                   j                  xr | j                   j                   xs. | j                   j                  xr | j                   j                  S rI   )r   r9  r\  r$  rD  rS   s    rO   r   zNameNode.is_lvalue|  sO    JJ"" '

&&&
 JJ## &JJ%%	
rP   c                 `    | j                   j                  xr | j                  j                   S rI   )r   r9  r   r   rS   s    rO   r   zNameNode.is_addressable  s$    zz%%Jdii.J.J*JJrP   c                      yr   rR   rS   s    rO   r   zNameNode.is_ephemeral  s     rP   c                 8    | j                   }|sy|j                  S N<error>)r   r   r]  s     rO   r   zNameNode.calculate_result_code  s    

{{rP   c                    t        | d      sJ | j                  }|y |j                  r%|j                  j	                  |j                         |j
                  r|j                  ry |j                  r|j                  j                  sJ d       |j                  | j                  j                        }|j
                  rt        j                  }n|j                  j                  }| j                   s[|j#                  | j%                         d|d|d       |j#                  d| j%                         z         |j#                  d       |j                  j	                  t'        j(                  dd	             |j#                  d
| j%                         d|d       | j                   s|j#                  d       |j#                  |j+                  | j%                         | j,                               |j/                  | j1                                y |j
                  r|j                  j2                  s|j                  j                  sJ d       |j                  | j                  j                        }|j                  j	                  t'        j(                  dd	             |j#                  | j%                         d|d|j+                  | j%                         | j,                               |j/                  | j1                                y |j4                  s$|j
                  r|j                  j2                  r|j                  j                  sJ d       |j                  | j                  j                        }|j                  j2                  r|j                  j	                  t'        j(                  dd	             |j#                  d
| j%                         d|d|j+                  | j%                         | j,                               n|j                  j	                  t'        j(                  dd	             |j#                  d| j%                         d|j                  j                  d|d|j+                  | j%                         | j,                               |j/                  | j1                                y |j6                  s.|j8                  s"|j:                  s|j                  j<                  r| j>                  xs | j                   xr | j@                   }|j                  jC                  |jD                        }|j                  j<                  xr | jF                  }|rD|rA|j                  j                  s|r(|jI                  | j,                  || jJ                         y y y y y )Nr   ,Python global or builtin not a Python objectz = PyObject_GetItem(, );if (unlikely(!%s)) {PyErr_Clear();GetModuleGlobalNameObjectHandling.cz__Pyx_GetModuleGlobalName(r   GetBuiltinNamez = __Pyx_GetBuiltinName(r   GetNameInClassz__Pyx_GetNameInClass()&r  r   utility_codeglobalstateuse_utility_coder!  r  is_pyclass_attrr   rl   intern_identifierrm   r   builtins_cnamer  namespace_cname
cf_is_nullr   r   r	   load_cachedr   r}   r  r   r)  rG  rZ  rY  from_closurer   cf_maybe_null
allow_nullcheck_for_null_coder   r>  put_error_if_unboundrh  )rT   r   r   interned_cname	namespaceraise_unbound	null_codememslice_checks           rO   rm  zNameNode.generate_result_code  s:   tW%%

=--e.@.@A""::))Y+YY!33DJJOODN"11	!KK77	??

!&()
 

1DKKMAB

+,--''(=?QRTJJKKM"$% ??

3JJt..t{{}dhhGHOODNN,-ekk&A&A::))Y+YY!33DJJOODN--''(8:LMOJJ''txx@BC
 OODNN,-5#3#38S8S::))Y+YY!33DJJOODN{{**  11++,ACUVX

&//txxHJK   11++,<>PQS

33&//txxH	JK OODNN,-^^u//53E3EIfIf ##6tO<O 

66u{{CI"ZZ::Ut?U?UN]

0F0F.))$((E4;P;PQ KY]y JgrP   c                    | j                   }|y | j                   j                  j                  r>t        |t              r.| j
                  s"|j                  st        | j                  d       |j                  r|j                  j                  sJ d       |j                  | j                   j                        }| j                   j                  j                  }|j                  rd}	d|z  }nw|j                  j                   rd}	t"        j$                  }nN|j&                  r2|j(                  j+                  t-        j.                  dd             d}	nJ t1        |             |j3                  | j                  |	d	|d
|d
|j5                         d       t6        rt9        d       t9        d|z         |j;                  |       |j=                  |       |j                  r3|j?                  d|j                  j@                  jB                  z         y y | j                  jD                  r| jG                  ||       n(| j                  jH                  r| jK                  ||       d}
| j                  j                  r| jL                  r|jO                  |       |jP                  xs. | j                   jR                  xs | j                   jT                  }|rW| jV                  sK| jX                  r |j[                  | j5                                n|j]                  | j5                                d}
|jP                  r>|j_                  | ja                         |jc                  | je                                      n| jV                  s| jX                  r>|jg                  | ja                         |jc                  | je                                      n@|j_                  | ja                         |jc                  | je                                      nd}
|r|ji                  |j5                                | j                  jD                  st|
s@|r|ja                         }|dk(  r_tk        || j                  | ja                         d|d| j                  j                  r| ja                         nd || jl                         n|j?                  | ja                         d|d       n|jc                  | je                               }to        | j                        r8|j?                  d| ja                         d| ja                         d|d       n8|| ja                         k7  r%|j?                  | ja                         d|d       t6        rt9        d       t9        d|z         |jq                  |       n!|js                         r|jq                  |       |j=                  |       y )Nz?Literal list must be assigned to pointer at time of declarationrj  PyDict_SetItemz%s->tp_dictSetNameInClassrp  __Pyx_SetNameInClassF(rk  r  z"NameNode.generate_assignment_code:z"...generating disposal code for %szPyType_Modified(%s);T+ = ;new (&) decltype(){};z)...generating post-assignment code for %s):r   r   r  rz   ListNodelhs_of_first_assignmentin_module_scoper   r}   rG  rl   rw  rm   r  ry  	is_memberr)  r   moddict_cnamerv  rt  ru  r	   r{  r  r  r   r   printr{  r  r   parent_typetypeptr_cnamer    generate_acquire_memoryviewslicer?  generate_acquire_bufferrV  rc  rb  rY  r|  rz  r}  put_xgotrefr  put_decref_setr   r   r   put_xdecref_setput_giverefr   rh  r7   r  rI  )rT   r   r   r  r  r   r   r  r  setterassignedis_external_refr   s                rO   r  z!NameNode.generate_assignment_code  si    

=JJOO""z#x'@44S=P=P$((]^ ::))Y+YY!33DJJOODN

((88I *)I5	,,)"00	&&  11+2I2IJZ\n2op/)d5k)!!"MMO	%& #:;:S@A&&t,NN4 

1 ;;22@@A B 
 yy++55c4@$$ ,,S$7Hyy$$
 '',,T2&+&6&6&j$**:O:O&jSWS]S]SjSjO&##11 $ 0 01A B $0@ A#H''++ KKM3==+FH  $#11 $ 4 4$(KKM3==3N!P !% 3 3$(KKM3==3N!P (-H&((999//,!$*c13 $dhh.2kkmV D151F1FD /1F1F	H !JJT[[]F'KL!$tzz|!<*4995 JJW[WbWbWdfl'mn#t{{}4 JJT[[]F'KL&>?EKL11$7##%11$7NN4 rP   c           	          ddl m} |j                  | j                         | j                  | j
                  ||| j                   | j                         y)z
        Slices, coercions from objects, return values etc are new references.
        We have a borrowed reference in case of dst = src
        r&   r  )	lhs_cnamer   lhs_posr   r   rf  first_assignmentN)r  r  put_acquire_memoryviewslicer   r   r}   rh  rz  )rT   r   r   r  s       rO   r  z)NameNode.generate_acquire_memoryviewslice\	  sJ    
 	!..kkmYYHH...!__ 	/ 	.rP   c                 F   t        |t              xs |j                  }|r |j                  | j	                               }ne|j
                  j                  | j                  j                  d      }|j                  |d|j                  | j	                               d       ddl
m} |j                  | j                         || j                  | j                   | j                  |       |s0|j                  d|z         |j
                  j!                  |       y y )	NFrO  r  r  r&   r<  )is_initializedr}   r   r~  )rz   r  r   r   r   rT  rU  r   r   r   r  r=  put_assign_to_bufferr   r  r}   r^  )rT   r   r   
pretty_rhsrhstmpr=  s         rO   r  z NameNode.generate_acquire_bufferl	  s      X.=#++
]]4::<0F^^11$**//e1TFJJVS]]4::<-HIJ##DKKM64::7;7S7S3S(,t 	$ 	= JJy6)*NN''/ rP   c                    | j                   y | j                   j                  r| j                   j                  j                  }|j	                  | j                   j
                        }|rd}nd| j                   j
                  z  }|j                  d|d|d|d|j                  | j                        d	       y | j                   j                  r|j                  j                  t        j                  dd	             |j	                  | j                   j
                        }d
t        j                  d|d}|r2|j                  d|d|j                  | j                        d       y |j!                  | j                  |       y | j                   j"                  j$                  s!| j                   j"                  j&                  r| j(                  sx| j*                  r(|s&|j-                  | j                  | j                          | j                   j"                  j$                  r| j                   j.                  rM|r,| j*                  r |j1                  | j3                                n|j5                  | j3                                |r;| j*                  r/|j7                  | j3                         | j9                                n.|j;                  | j3                         | j9                                |j                  d| j3                         z         y |j=                  | j                   j>                  | j@                          y y tC        | j                  d       y )NzPyErr_Clear(); elsezT{ PyErr_Clear(); PyErr_Format(PyExc_NameError, "name '%%s' is not defined", "%s"); }zif (unlikely(PyObject_DelItem(rk  z>) < 0)) { if (likely(PyErr_ExceptionMatches(PyExc_KeyError)))   }PyObjectSetAttrStrrp  __Pyx_PyObject_DelAttrStr(r  if (unlikely(zW < 0)) { if (likely(PyErr_ExceptionMatches(PyExc_AttributeError))) PyErr_Clear(); else 
%s = NULL;re  z!Deletion of C names not supported)"r   rv  r  ry  rw  rm   r   r   r}   rG  rt  ru  r	   r{  r   module_cnamer  r   rl   r   rz  r}  r  rY  r  r   r  put_xdecrefr   
put_decrefrz  r   r   r   )rT   r   r  r  r  key_error_codedel_codes          rO   r  zNameNode.generate_deletion_code	  sk   ::ZZ''

((88I!33DJJOODN!!6 mJJOO$  JJ !.%txx023 ZZ##--''(<>PQS!33DJJOODN##^5H!

 $T__TXX%>@A
 %%dhh9ZZ__((DJJOO,N,N??%%.@--dhh

C::??..zz,,-$2D2D ,,T[[]; OODKKM:)d.@.@((

Etzz|DJJ|dkkm;<44TZZ5E5EBF**n 5 N# #( $((?@rP   c           
         t        | d      r| j                  r| j                  d   | j                  d   | j                  d   t        | j                        z
  dz
  f}| j
                  j                  rd\  }}nd\  }}|j                  |t        ||| j
                  z  t        | j                                     y y y )N	is_calledr   r&   r0   )py_callzpython function (%s))c_callzc function (%s)size)	r  r  r}   r   rm   r   rl   r  r1   )rT   r   r}   styletexts        rO   r  zNameNode.annotate	  s    4%$..88A;TXXa[3tyy>-IA-MNCyy$$?t9tMM#~eTDII5ECPTPYPYN[\ +9%rP   r  r  )3rV   rW   rX   is_namerO  r  r  rH  r   rM  r}  rz  r~  r   r  r  r   r   r  r   r  r0  r1  r4  r6  r
  r  r  r#  r<  r  rC  rK  rR  r  r  r%  r_  r  rE  r   r   r   r   rm  r  r  r  r  r  rY   rZ   s   @rO   r  r  "  s    G#EJMJJEM%#8N 
>&+8	'((0,! 7K	g(93*W	
K
QRf IN.2t!l. 0(6Ap]rP   r  c                   ,    e Zd ZeZdgZd ZdZd Zd Z	y)BackquoteNodeargc                     | j                   j                  |      | _         | j                   j                  |      | _         d| _        | S r  )r  r  r  r   r	  s     rO   r  zBackquoteNode.analyse_types	  s:    88))#.88..s3rP   zBackquote expressionc                 L    t        | j                  j                        | _        y rI   )r  r  r{   rS   s    rO   r   z'BackquoteNode.calculate_constant_result	  s    #DHH$<$<=rP   c           
         |j                  | j                         d| j                  j                         d|j	                  | j                         | j
                               |j                  | j                                y )Nz = PyObject_Repr(r   )r   r   r  r   r   r}   r  rb  s     rO   rm  z"BackquoteNode.generate_result_code	  s]    

""$''txx@B	C
 	()rP   N)
rV   rW   rX   r   r   r   r  r  r   rm  rR   rP   rO   r  r  	  s&    
 DwH )K>*rP   r  c                   (    e Zd ZeZddgZd ZdZd Zy)
ImportNodemodule_name	name_listc                    | j                   R|j                  d   s4t        j                  |j	                         j
                  j                  vrd| _         nd| _         | j                  j                  |      }|j                  |      | _        | j                  r1| j                  j                  |      }|j                  |      | _
        d| _        | S )N
py2_importr   r&   )ry   rf   r2   r   r  contextfuture_directivesr  r  r  r  r   )rT   rn   r  r  s       rO   r  zImportNode.analyse_types	  s    ::|,&&c.>.>.@.H.H.Z.ZZ

&&44S9&99#>>>44S9I&99#>DNrP   zPython importc           
         | j                   r| j                   j                         }nd}|j                  j                  t	        j
                  dd             d| j                  j                         || j                  fz  }| j                  dk  r| j                  j                  rt| j                  j                  t        v rXt        | j                  j                     \  }}}|j                  j                  t	        j
                  ||             |d|d}|j                  | j                         d|d	|j                  | j                         | j                               |j                  | j                                y )
Nri  ImportzImportExport.cz__Pyx_Import(%s, %s, %d)r   r  r  r  ; )r  r   rt  ru  r	   r{  r  ry   r   r   r(   r   r   r   r}   r  )rT   r   name_list_codeimport_codehelper_func	code_name	code_files          rO   rm  zImportNode.generate_result_code
  s3   >>!^^557N N))+*A*A(L\*]^0&&(JJ4 
 JJ!O  22  &&*BB0HIYIYI_I_0`-KI--k.E.EiQZ.[\&1;?K

KKM##DKKM488<> 	? 	()rP   N)	rV   rW   rX   r   r   r   r  r  rm  rR   rP   rO   r  r  	  s$    " D{+H "K*rP   r  c            
           e Zd ZeZdZdZdZdZdZ	dgZ
d ZdZ ej                   ej                  ej                   ej                   dej                  d      g            Zd Zd Zd	 Zd
 Zd Zd Zd Zy)IteratorNodeNFsequencec                 t   | j                   j                  |      | _         | j                   j                  j                  s | j                   j                  j                  r<| j                   j                  j
                  s| j                   j                  | _        n| j                   j                  j                  r| j                  |       nb| j                   j                  |      | _         | j                   j                  t        t        fv r | j                   j                  d      | _         d| _        | S )N!'NoneType' object is not iterabler&   )r  r  r   r#  r  rn  r  analyse_cpp_typesr  r   r   r  r   r	  s     rO   r  zIteratorNode.analyse_types.
  s    33C8MM''4==+=+=+D+DMM&&00**DI]],,""3' MM<<SADM}}!!i%<< $ ? ?@c drP   zIterating over Python objectitc                 8    | j                   j                  |      S rI   )r  r   r	  s     rO   r   zIteratorNode.type_dependenciesD
      }}..s33rP   c                    | j                   j                  |      }|j                  s|j                  r|S |j                  r9|j
                  j                  d      }||j                  j                  S t        S |j                  r|S t        S )Nbegin)r  r   r#  r  r  r  r  r   return_typerl   r   )rT   rn   sequence_typer  s       rO   r   zIteratorNode.infer_typeG
  s    005!!]%9%9  ''!''..w7E zz---  &&  rP   c                    | j                   j                  }|j                  r|j                  }|j                  j                  d      }|j                  j                  d      }|,|j                  j                  r|j                  j                  r9t        | j                  d| j                   j                  z         t        | _        y |,|j                  j                  r|j                  j                  r9t        | j                  d| j                   j                  z         t        | _        y |j                  j                  }|j                  r#|j                  | j                  d||j                  j                  g      	 9t        | j                  d| j                   j                  z         t        | _        y |j                  | j                  d|g      9t        | j                  d| j                   j                  z         t        | _        y |j                  | j                  d	|g      9t        | j                  d
| j                   j                  z         t        | _        y || _        y |j                  r7||j                  j                  k(  st        | j                  d       || _        y t        | j                  d| j                   j                  z         t        | _        y )Nr  endzmissing begin() on %szmissing end() on %s!=z-missing operator!= on result of begin() on %s++z-missing operator++ on result of begin() on %sr   z,missing operator* on result of begin() on %sz(incompatible types for begin() and end()z;result type of begin() on %s must be a C++ class or pointer)r  r   r  r  r  r  r$  r   r   r}   r,   r  r  lookup_operator_for_types)rT   rn   r  r  r  	iter_types         rO   r  zIteratorNode.analyse_cpp_typesS
  sC   **)33M##**73!!((/M::**zz$((3dmm6H6HHI"DIK88((xx}}$((1DMM4F4FFG"DIJJ**	!!,,HH 4 457 ;?? dhh ORVR_R_RdRd de&	,,TXXti[IQdhh ORVR_R_RdRd de&	,,TXXsYKHPdhh NQUQ^Q^QcQc cd&	!DI!5!55dhh JK!DI$((Y\`\i\i\n\nno"DIrP   c                    | j                   j                  }|j                  r| j                   j                  rd| j                   j	                         z  }nt        j                  |      }|j                  j                  |d      | _	        |j                  | j                  d| j                   j	                         d       d| j                  z  }|j                  | j	                         d|d       y |j                  s|j                  rt        d	      |t        t        fv }|s| j                   rJ d
       |j"                   | _        | j$                  rH|j                  d| j                   j'                         d| j                   j'                         d       |s| j$                  r|j                  j                  t
        j(                  d      | _        | j                   r0|t        u rd| j	                         z  }nd| j	                         z  }nd}|j                  | j	                         d| j                   j'                         d| j	                         d| j*                  d|d
       |s`|j                  j                  | j,                  d      | _        | j$                  rM|j                  d| j.                  z         |j                  d       |j1                  d| j*                  z         |j                  | j	                         d| j                   j'                         d|j3                  | j	                         | j4                               |j7                  | j'                                |j                  | j.                  d| j'                         d|j3                  | j.                  | j4                               | j$                  r|j                  d       y y )Nz%s.beginFrO  z = &r  z	%s->beginr  z();z#for in carray slice not transformedzBinternal error: reversed() only implemented for list/tuple objectszif (likely(PyList_CheckExact(z)) || PyTuple_CheckExact()) {zPyList_GET_SIZE(%s) - 1zPyTuple_GET_SIZE(%s) - 1ri  z; __Pyx_INCREF(r   r  } else {z	%s = -1;  = PyObject_GetIter( = Py_TYPE(z)->tp_iternext; r   )r  r   r  r  r   r   
c_ptr_typerT  rU  cpp_iterator_cnamer   r#  r  r   r   r   reversedr  may_be_a_sequencer   r-  counter_cname_func_iternext_typeiter_func_ptrputr   r}   r  )rT   r   r  
begin_funcis_builtin_sequence
init_values         rO   rm  z!IteratorNode.generate_result_code
  s   **%%}}$$'$--*>*>*@@
 * 5 5m D*...*F*F}af*F*g'

$*A*A4==CWCWCYZ[(4+B+BB
JJt{{}jAB!!]%9%9 EFF+	:/FF"}}j&jj%2%B%B!B!!JJMM++-MM++-/0
 $"8"8!%!=!=,, "> "@D}} I-!:T[[]!JJ!;dkkm!KJ 
JJ'')""  #!%!=!=d>V>Vch!=!iD%%

<$*<*<<=

:&t'9'99:JJ'')''txx@B C OODNN,-
 JJ""DNN$4''(:(:DHHEG H !!JJsO "rP   c                    | j                   sJ d       d|d| j                         d}| j                  j                  rt	        | j                  j
                        }| j                  j                  |}nQt        | j                  j                  j                  t              r#|| j                  j                  j                  z  }|j                  d| j                   d|d       | j                  rd}nd	}|j                  d
       |j                  |d|d| j                         d| j                   d|d| j                   |d|j                  d| j                               |j                  d       |j                  |d| j                         d| j                   d| j                   |d|j                  || j                        
       |j                  |       |j                  d       y )Nz/internal error: counter_cname temp not preparedPyz
_GET_SIZE(r  if (z >= z) break;z--r  <#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFSz = Pyz
_GET_ITEM(rk  z); __Pyx_INCREF(r   r  ri  #elsez = PySequence_ITEM(#endif)r  r   r  r   r   r   r   rz   r{   r$   r   r  error_goto_if_negr}   r   r  )rT   	test_nameresult_namer   
final_size
item_countinc_decs          rO   generate_next_sequence_itemz(IteratorNode.generate_next_sequence_item
  s   !!T#TT!,5t~~7GH
==00T]]//0J}}((0'
DMM55EE}U'$--*C*C*S*SS


T-?-?LM==GG

QR

 """"&&sDHH5
	 	

7

 """"''TXX>@	A 	$

8rP   c                    | j                   j                  }| j                  r|j                  d| j                  z         |j
                  r| j                  rd| j                  z  }nd| j                   j                         z  }|j                  d| j                         d|d       |j                  |d| j                         d       |j                  d	| j                         z         y |t        u r| j                  d
||       y |t        u r| j                  d||       y | j                  r|j                  d| j                  z         |j                  d| j                         z         | j                  d
||       |j                  d       | j                  d||       |j                  d       |j                  d       |j                  d       |j                  |d| j                  d| j                         d       |j                  d|z         |j                  d       |j                  d       |j                  d       |j                  d|j                  | j                         z         |j                  d       |j                  d       |j                  d       |j#                  |       |j                  d       y )Nzif (%s < 0) break;z%s->endz%s.endif (!(z != z())) break;z = *r  z++%s;ListTuplezif (likely(!%s)) {z$if (likely(PyList_CheckExact(%s))) {r  r   z} else {r  r  rl  rm  z&PyObject* exc_type = PyErr_Occurred();if (exc_type) {z\if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();else %sbreak;)r  r   r  r   r  r  r  r   r   r  r   r  r  r   r  r   r}   r  )rT   r  r   r  end_funcs        rO   generate_iter_next_result_codez+IteratorNode.generate_iter_next_result_code
  s@   **==JJ+d.@.@@A%%&&$t'>'>>#dmm&:&:&<<JJ KKM$& ' JJ' KKM+ , JJw./i',,V[$Gj(,,Wk4H!!JJ+d.@.@@AJJ=@PPQ,,V[$GJJz",,Wk4HJJsOHHY

3

"" "	#
 	

)K78

;<

$%

qr

9ttxx889

3

8

3$

3rP   c                 d   | j                   r%|j                  j                  | j                          | j                  r,|j                  j                  | j                         d | _        | j                  r%|j                  j                  | j                         t
        j                  | |       y rI   )r  rT  r^  r  r  r   r  rb  s     rO   r  zIteratorNode.free_temps  s}    NN''(:(:;NN''(:(:;!%D""NN''(?(?@D$'rP   )rV   rW   rX   r   r   r  r  r  r  is_asyncr   r  r  r   r  	CFuncTypeCFuncTypeArgr  r   r   r  rm  r  r  r  rR   rP   rO   r  r  
  s     DMMHH|H 1K-*--.Bj.B.B!!#J##D**C*CTJ$/ 
4
+Z@D%N1f(rP   r  c                   2    e Zd Zd Zd Zd ZddZd Zd Zy)	NextNodec                 R    t         j                  | |j                         || _        y rI   r  rQ  r}   iteratorrT   r  s     rO   rQ  zNextNode.__init__/      hll3 rP   c                      y rI   rR   r	  s     rO   r<  zNextNode.nogil_check3      rP   c                 8    | j                   j                  |      S rI   )r  r   r	  s     rO   r   zNextNode.type_dependencies7  r  rP   Nc           	      ~   || j                   j                  |      }|j                  s|j                  r|j                  S | j                   j
                  j                  t        u rt        S |j                  rd|j                  | j                  d|g      j                  j                  }|j                  r|j                  }|j                  r|j                   }|S t#        | j                  | j                   j
                  t%        | j                  dt&        j(                              }|j                  |      S )Nr   PY_SSIZE_T_MAX)r   r   r(  )r  r   r  r#  r  r  r   r"   r   r  r  r}   r  r  r  r  r  r+  r,  r   r-  )rT   rn   iterator_type	item_typefake_index_nodes        rO   r   zNextNode.infer_type:  s     MM44S9M=#9#9 ***]]##((N: "!''55dhhm_UZZffI%%%33	!!%55	 (]]++dhh.>#-#?#?ABO
 #--c22rP   c                 j    | j                  || j                  j                        | _        d| _        | S r  )r   r  r   r   r	  s     rO   r  zNextNode.analyse_typesS  s*    OOC););<	rP   c                 X    | j                   j                  | j                         |       y rI   )r  r  r   rb  s     rO   rm  zNextNode.generate_result_codeX  s    44T[[]DIrP   rI   )	rV   rW   rX   rQ  r<  r   r   r  rm  rR   rP   rO   r  r  '  s!    !432
JrP   r  c                   0    e Zd ZdgZdZeZdZd Zd Z	d Z
y)AsyncIteratorNoder  Tr&   c                     t         S rI   r   r	  s     rO   r   zAsyncIteratorNode.infer_typei      rP   c                     | j                   j                  |      | _         | j                   j                  j                  s6t	        | j
                  d       | j                   j                  |      | _         | S )Nz*async for loops not allowed on C/C++ types)r  r  r   rl   r   r}   r  r	  s     rO   r  zAsyncIteratorNode.analyse_typesl  sU    33C8}}!!--$((HI MM<<SADMrP   c           
      n   |j                   j                  t        j                  dd             |j	                  | j                         d| j                  j                         d|j                  | j                         | j                               |j                  | j                                y )N	AsyncIterCoroutine.cz  = __Pyx_Coroutine_GetAsyncIter(r   )rt  ru  r	   r{  r   r   r  r   r   r}   r  rb  s     rO   rm  z&AsyncIteratorNode.generate_result_codes  {    ))+*A*A+}*]^

KKMMM##%##DKKM488<> 	? 	&rP   N)rV   rW   rX   r   r  r   r   r   r   r  rm  rR   rP   rO   r)  r)  \  s)     |HHDG'rP   r)  c                   ,    e Zd ZeZdZd Zd Zd Zd Z	y)AsyncNextNoder&   c                 R    t         j                  | |j                         || _        y rI   r  r  s     rO   rQ  zAsyncNextNode.__init__  r  rP   c                     t         S rI   r+  r	  s     rO   r   zAsyncNextNode.infer_type  r,  rP   c                     | S rI   rR   r	  s     rO   r  zAsyncNextNode.analyse_types  r  rP   c           
      n   |j                   j                  t        j                  dd             |j	                  | j                         d| j                  j                         d|j                  | j                         | j                               |j                  | j                                y )Nr/  r0  z! = __Pyx_Coroutine_AsyncIterNext(r   )rt  ru  r	   r{  r   r   r  r   r   r}   r  rb  s     rO   rm  z"AsyncNextNode.generate_result_code  r1  rP   N)
rV   rW   rX   r   r   r   rQ  r   r  rm  rR   rP   rO   r3  r3  |  s"     DG!'rP   r3  c                   (    e Zd ZddgZdZdZd Zd Zy)WithExitCallNoder   
await_exprTNc                     | j                   j                  |      | _         | j                  r | j                  j                  |      | _        t        j                  | _        d| _        | S r"  )r   r  r:  r   rA  r   r   r	  s     rO   r  zWithExitCallNode.analyse_types  sN    II++C0	??"oo;;C@DO**	rP   c                    | j                   r(|j                  d| j                  j                  z         | j                  j                  |       |j                  j                  t        d      }|j                  | j                         |j                  j                  t        j                  dd             |j                  |d| j                  j                  d| j                  j                         d       |j!                  | j                  j                  t        	       | j                  j#                  |       | j                  j%                  |       |j                  |j'                  || j                               |j)                  |       | j*                  r| j*                  j                  ||d
       |j                  |d| j*                  j-                         d       | j*                  j/                  |       | j*                  j%                  |       | j0                  r6| j3                  |       |j                  | j                         d|d       |j!                  |t        	       | j0                  r*|j5                  | j                  | j                                |j                  j7                  |       | j                   r|j                  d       y y )N	if (%s) {FrO  PyObjectCallrp   = __Pyx_PyObject_Call(rk  z, NULL);r  T)source_cnamedecref_sourcer  r   = __Pyx_PyObject_IsTrue(rl  r   )test_if_runr   	with_statexit_varr   rr  rT  rU  r   rl  r}   rt  ru  r	   r{  r   ry  r{  r  r   r  r:  r   r  rS  rW  r  r^  )rT   r   
result_vars      rO   rr  z)WithExitCallNode.generate_evaluation_code  s   JJ{T^^%<%<<=		**40^^11.U1S
dhh))+*A*A.+0 	1

NN##II  	! 	dnn55NK		((.		T"

4**:txx@A
#??OO44T
bf4gJJZ1J1J1LMNOO99$?OO&&t,%%d+JJDKKM:VWj~>!!$((DKKM:##J/JJsO rP   )rV   rW   rX   r   rC  r:  r  rr  rR   rP   rO   r9  r9    s"     %HKJ%rP   r9  c                   .    e Zd ZeZd Zd Zd Zd Zd Z	y)ExcValueNodec                 0    t         j                  | |       y rI   r   rQ  )rT   r}   s     rO   rQ  zExcValueNode.__init__  s    $$rP   c                     || _         y rI   var)rT   rM  s     rO   set_varzExcValueNode.set_var  s	    rP   c                     | j                   S rI   rL  rS   s    rO   r   z"ExcValueNode.calculate_result_code  s    xxrP   c                      y rI   rR   rb  s     rO   rm  z!ExcValueNode.generate_result_code  r  rP   c                     | S rI   rR   r	  s     rO   r  zExcValueNode.analyse_types  r  rP   N)
rV   rW   rX   r   r   rQ  rN  r   rm  r  rR   rP   rO   rH  rH    s"    
 D%rP   rH  c                   H    e Zd Zg ZddZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)TempNodeNc                 z    t         j                  | |       || _        |j                  rt        | _        d| _        y r  )r   rQ  r   rl   r   r   r   )rT   r}   r   rn   s       rO   rQ  zTempNode.__init__  s1    $$	 .DrP   c                     | S rI   rR   r	  s     rO   r  zTempNode.analyse_types  r  rP   c                      y rI   rR   r	  s     rO   r
  z#TempNode.analyse_target_declaration  r  rP   c                      y rI   rR   rb  s     rO   rm  zTempNode.generate_result_code  r  rP   c                 \    |j                   j                  | j                  d      | _        y )NTrO  )rT  rU  r   
temp_cnamerb  s     rO   allocatezTempNode.allocate  s!    ..66tyyT6RrP   c                 \    |j                   j                  | j                         d | _        y rI   )rT  r^  rY  rb  s     rO   releasezTempNode.release  s    ##DOO4rP   c                 4    	 | j                   S #  J d       xY w)Nz-Remember to call allocate/release on TempNode)rY  rS   s    rO   r   zTempNode.result  s!    	??"	IIIs    	c                      y rI   rR   rb  s     rO   rW  zTempNode.allocate_temp_result  r  rP   c                      y rI   rR   rb  s     rO   r_  zTempNode.release_temp_result  r  rP   rI   )rV   rW   rX   r   rQ  r  r
  rm  rZ  r\  r   rW  r_  rR   rP   rO   rS  rS    s7     HSrP   rS  c                       e Zd Zd Zy)
PyTempNodec                 P    t         j                  | |t        j                  |       y rI   )rS  rQ  r   r   )rT   r}   rn   s      rO   rQ  zPyTempNode.__init__   s    $Z%>%>DrP   NrV   rW   rX   rQ  rR   rP   rO   ra  ra    s    ErP   ra  c                   0    e Zd Zg ZddZd Zd Zd Zd Zy)RawCNameExprNodeNc                 H    t         j                  | ||       ||| _        y y )Nr  )r   rQ  r   )rT   r}   r   r   s       rO   rQ  zRawCNameExprNode.__init__&  s)    $$/DJ rP   c                     | S rI   rR   r	  s     rO   r  zRawCNameExprNode.analyse_types+  r  rP   c                     || _         y rI   r   )rT   r   s     rO   	set_cnamezRawCNameExprNode.set_cname.  s	    
rP   c                     | j                   S rI   ri  rS   s    rO   r   zRawCNameExprNode.result1  r  rP   c                      y rI   rR   rb  s     rO   rm  z%RawCNameExprNode.generate_result_code4  r  rP   NN)	rV   rW   rX   r   rQ  r  rj  r   rm  rR   rP   rO   re  re  #  s     H
rP   re  c                   ,    e Zd ZeZdZdgZd Zd Zd Z	y)JoinedStrNodeTvaluesc                     | j                   D cg c]"  }|j                  |      j                  |      $ c}| _         | S c c}w rI   )rp  r  r  )rT   rn   vs      rO   r  zJoinedStrNode.analyse_typesI  s7    MQ[[Yqs+>>sCY Zs   'A c                      yr@  rR   rS   s    rO   r  zJoinedStrNode.may_be_noneM      rP   c                    |j                  | j                         t        | j                        }|j                  j                  t        d      }|j                  j                  t        j                  d      }|j                  j                  t        j                  d      }|j                  |d|d|j                  || j                               |j                  |       |j                  d|z         |j                  d|z         t        | j                        D ]  \  }}|j                  |       |j                  |       d|j!                         z  }d	|j!                         z  }	d}
t#        |t$              rZ	 |j&                  j)                  d
       d}	|j&                  j)                  d       d}
t+        t        |j&                              }n2t#        |t4              r"|j&                  j6                  j8                  rd}
|
s |j                  |d|	d|d|	d|d
       |j                  |d|d       |j;                  |j!                                |j                  d|d|d|j!                         d       |j=                  |       |j?                  |        |j                  | j                         | jA                  |       |jB                  jE                  tG        jH                  dd             |j                  d| jK                         |||||j                  | j!                         | j                        fz         |j                  | j!                                |jM                  |t               |j                  jO                  |       |j                  jO                  |       |j                  jO                  |       y # t,        $ ry |	dk7  rpt/        t1        t2        |j&                              }|dk  r!d}	t+        t        |j&                              }n'|dk\  r!d}	t+        t        |j&                              }n	 Y Yw xY w)NTrO  Fz = PyTuple_New(r   r~  z	%s = 127;z__Pyx_PyUnicode_GET_LENGTH(%s)z"__Pyx_PyUnicode_MAX_CHAR_VALUE(%s)r  255zus-asciii   65535i   1114111 = (z > z) ? z : r  z += zPyTuple_SET_ITEM(rk  rl  JoinPyUnicodeStringTools.cz-%s = __Pyx_PyUnicode_Join(%s, %d, %s, %s); %s)(rl  r}   r   rp  rT  rU  r   r   r-  c_py_ucs4_typer   r   r  	enumeraterr  rc  r   rz   r  r   r  rs   UnicodeEncodeErrormaxmaprK  FormattedValueNoder   r_  r  r  r  rW  rt  ru  r	   r{  r   ry  r^  )rT   r   	num_itemslist_varulength_varmax_char_varir   ulengthmax_char_valueis_asciimax_chars               rO   rr  z&JoinedStrNode.generate_evaluation_codeQ  s   dhh$	>>//4/Pnn22:3O3O\a2b~~33J4M4MZ_3`

##Hdhh79 	: 	!

9{*+

;-. - +	"GAt))$/%%d+69IIGADNNDTTNH$,3JJ%%k2%*NJJ%%j1#H$ "#djj/2GD"45$**//:T:T

 .,P\^ _JJk7;<T^^-.JJ(At~~GWXY..t4OOD!W+	"Z 	dhh!!$'))+*A*A/Sb*cd

BKKM##DNN$4dhh?FA A 	B 	()h7##H-##K0##L1] * !%.#&s3

';#<#f,-4N&)#djj/&:G%.-6N&)#djj/&:G !!s   :O..A>Q0/Q0N)
rV   rW   rX   r   r   r   r   r  r  rr  rR   rP   rO   ro  ro  ?  s%    
 DGzHK2rP   ro  c                   T    e Zd ZddgZeZdZdZddddd	j                  Z	d
 Z
d Zd Zy)r  r   format_specTNPyObject_UnicodePyObject_ReprPyObject_ASCII__Pyx_PyNumber_IntOrLong)sradc                      yr@  rR   rS   s    rO   r  zFormattedValueNode.may_be_none  rt  rP   c                 
   | j                   j                  |      | _         | j                  r| j                  j                  rp| j                  r| j                  j                   n| j                   j                  j
                  }| j                   j                  j                  ||      r|| _        | j                  r/| j                  j                  |      j                  |      | _        | j                  | j                   j                  |      | _         | j                  s]| j                  r| j                  dk(  rB| j                   j                  t        u r&| j                   j                         s| j                   S | S )N)r  r  )r   r  r  r   r   default_format_speccan_coerce_to_pystringc_format_specr  conversion_charr   r  )rT   rn   r  s      rO   r  z FormattedValueNode.analyse_types  s   ZZ--c2
4#3#3#E#E6:6F6FD,,22DJJOOLoLoMzz55c}5U%2"#//==cBUUVYZD%66s;DJ##T-A-ATEYEY]`E`::??l24::;Q;Q;S::%rP   c                    | j                   | j                  j                  j                  s| j                  j                  j	                  | j                  j                         || j                         }|j                  | j                         d|d|j                  | j                         | j                               |j                  | j                                y | j                  j                         }| j                  j                  t        u xr | j                  j                          }| j                  rd}| j                  j                         }nd}t        j                  }| j                   }|dk(  r|rd }|rZ| j#                  |      }|
J d|z         |d|d}|j$                  j'                  t)        j*                  d	d
             |dz  }nk| j                  r0|j$                  j'                  t)        j*                  dd
             n/|j$                  j'                  t)        j*                  dd
             |j                  | j                         d|d|d|d|j                  | j                         | j                        	       |j                  | j                                y )Nr  r  __Pyx_PyObject_Format__Pyx_PyObject_FormatSimpler  z(invalid conversion character found: '%s'r  r  PyObjectFormatAndDecrefr{  	AndDecrefPyObjectFormatPyObjectFormatSimplerk  r   )r  r   r   rl   convert_to_pystringr   r   r   r}   r  r   r   r  r  r   empty_unicoder  find_conversion_funcrt  ru  r	   r{  )	rT   r   convert_func_callvalue_resultvalue_is_unicodeformat_funcr  r  fns	            rO   rm  z'FormattedValueNode.generate_result_code  s7   )$**//2M2M $

 C C

!!#T4+=+=!?JJ!''txx@B C OODNN,-zz++-::??l:[4::CYCYC[?[1K**446K 8K ..K..c!&6"O**?;B>_#MP_#__')<8L--''(A?SU;&K--''(8/JL --''(>PR 	

KKM##DKKM488<> 	? 	()rP   )rV   rW   rX   r   r   r   r   r  re   r  r  r  rm  rR   rP   rO   r  r    sK     'HDGM  '	
 
c "/*rP   r  c                   :    e Zd ZdZej
                  Zd Zd Zd Z	y)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                     d| _         | S r"  rH  r	  s     rO   r  z*ParallelThreadsAvailableNode.analyse_types      rP   c                    |j                  d       |j                  d| j                  z         |j                  d| j                  z         |j                  d       |j                  d| j                  z         |j                  d       y )N#ifdef _OPENMPz2if (omp_in_parallel()) %s = omp_get_max_threads();z else %s = omp_get_num_threads();r   %s = 1;r  r   r   rb  s     rO   rm  z1ParallelThreadsAvailableNode.generate_result_code  so    

#$

G<@NNK 	L

5FG

7

9t~~-.

8rP   c                     | j                   S rI   r   rS   s    rO   r   z#ParallelThreadsAvailableNode.result      ~~rP   N
rV   rW   rX   __doc__r   
c_int_typer   r  rm  r   rR   rP   rO   r  r    s#       D
rP   r  c                   :    e Zd ZdZej
                  Zd Zd Zd Z	y)ParallelThreadIdNodez/
    Implements cython.parallel.threadid()
    c                     d| _         | S r"  rH  r	  s     rO   r  z"ParallelThreadIdNode.analyse_types%  r  rP   c                     |j                  d       |j                  d| j                  z         |j                  d       |j                  d| j                  z         |j                  d       y )Nr  z%s = omp_get_thread_num();r   r~  r  r  rb  s     rO   rm  z)ParallelThreadIdNode.generate_result_code*  sR    

#$

/$..@A

7

9t~~-.

8rP   c                     | j                   S rI   r  rS   s    rO   r   zParallelThreadIdNode.result1  r  rP   Nr  rR   rP   rO   r  r    s#       D
rP   r  c                       e Zd Zd Zd Zd Zy)_IndexingBaseNodec                     | j                   j                         xs1 | j                   j                  t        t        t
        t        t        fv S rI   )r)  r   r   r/   r   r   r"   r   rS   s    rO   r   z_IndexingBaseNode.is_ephemeralA  sA     yy%%' Q499>>Xz><>Q ,Q 	QrP   c                 n    | j                   j                         xr | j                  j                         S rI   )r)  rE  r*  r  rS   s    rO   rE  z"_IndexingBaseNode.check_const_addrG  s'    yy))+H

0F0F0HHrP   c                     | j                   j                  r"| j                   j                  j                  ryy| j                   j                  ryyr  )r   r  r  r#  r  rS   s    rO   r   z_IndexingBaseNode.is_lvalueJ  sC     99!!yy&&//  YY rP   N)rV   rW   rX   r   rE  r   rR   rP   rO   r  r  <  s    
QIrP   r  c                       e Zd ZddgZdZdZdZd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Z	 	 d"dZd Zd Zd Zd Zd Zd Zd Zd#dZd ZdZd Zd Zd Zd Z	 	 d$dZ d  Z!d%d!Z"y)&r+  r)  r*  NTFc                 h    | j                   j                  | j                  j                     | _        y rI   )r)  r{   r*  rS   s    rO   r   z#IndexNode.calculate_constant_resultj  s#    #yy889S9STrP   c                     | j                   j                  |      }| j                  j                  |      }	 ||   S # t        $ r}| j	                  |       Y d }~y d }~ww xY wrI   )r)  r  r*  	Exceptionr  )rT   r  r)  r*  r  s        rO   r  zIndexNode.compile_time_valuem  sZ    yy++D1

--d3	-; 	-))!,,	-s   = 	A!AA!c                     | j                   }|j                         xrX | j                  j                         xr< |j                  xr. |j                  j                  xs |j                  j
                  S rI   )r)  r  r*  r   r  r#  rT   r)  s     rO   r  zIndexNode.is_simpleu  s_    yy  KTZZ%9%9%; KIIK#'99#3#3#Ityy7I7I	LrP   c                     | j                   j                  }|rO|j                  ryt        | j                  t
              r(|t        t        t        t        t        t        t        fv ryt        j                  |       S r@  )r)  r   rn  rz   r*  	SliceNoder   r"   r   r   r/   r   r   r   r  rT   r  s     rO   r  zIndexNode.may_be_nonez  s^    IINN	""$**i0^X|!0)Z!I I ##D))rP   c                      y rI   rR   r	  s     rO   r
  z$IndexNode.analyse_target_declaration  r  rP   c                    | j                   j                  |      }|r|j                  s|j                  rst	        | j
                  t              r| j
                  j                  }n| j
                  g}t        j                  | j                  |d       }|j                  ||      S | j
                  j                  s| j
                  j                  rddlm} |j!                  |j"                         | j
                  j                  r| j
                  gnt%        | j
                  j                        }t'        j(                  ||j+                  ||            S | j
                  j-                  |      }|"	 t/        |      }t'        j0                  ||      S t7        | j                  d       y # t2        t4        f$ r Y (w xY w)N)r}   positional_argskeyword_args)r  r&   r  z*Array size must be a compile time constant)r)  r4  rl   r  rz   r*  	TupleNoder   r   TemplatedTypeNoder}   analyser   r   r  r  ru  view_utility_coder   r   MemoryViewSliceTypeget_axes_specsr  r=  
CArrayTyper   r   r   )rT   rn   r  template_values	type_noder  axesr*  s           rO   r4  zIndexNode.analyse_as_type  sh   II--c2	Y22%%djj)4&*jjooO'+zzlO!33$3!%'	 !((	(BB$$

(J(J($$Z%A%AB'+zz':':

|TZZ__@U!55iAZAZ[^`dAeff 

55c:$G #E
  *44YFFdhh LM '	2 s   >F6 6GGc                 p    | j                   j                  |      | j                  j                  |      z   S rI   )r)  r   r*  r	  s     rO   r   zIndexNode.type_dependencies  s+    yy**3/$**2N2Ns2SSSrP   c                    | j                   j                  |      }| j                  j                  rN|j                  rt
        S |j                  rt        S |t        t
        t        t        t        t        fv r|S t        S | j                  j                  |      }|r|j                  st        | j                  t              rD|t        u rt         j"                  S |t        u r|S |t        u rt         j$                  S t        | j                   t&              rt        S |t        t        fv r't)        || j                   | j                  |      }||S |j*                  s|j,                  r|j.                  S |j0                  rt        | j                  t              rk| j                  j3                         rQ| j                  j4                  }|dk  r||j6                  z  }d|cxk  r|j6                  k  rn n|j8                  |   S |j:                  r\ G d d      } || j<                  |       || j<                  |      g}|j?                  d|      }||j@                  jB                  S tE        |      r/tE        |      r$| j                  |f}	tG        tI        ||	g            S |t        t        fv r|S t        S )Nr   r   c                       e Zd Zd Zy))IndexNode.infer_type.<locals>.FakeOperandc                 :    | j                   j                  |       y rI   )__dict__update)rT   rS  s     rO   rQ  z2IndexNode.infer_type.<locals>.FakeOperand.__init__  s    MM((.rP   Nrc  rR   rP   rO   FakeOperandr    s    /rP   r  )r}   r   [])%r)  r   r*  r   rn  r   ro  r   r   r"   r   r   r   r  rz   r,  r   r|  c_uchar_typer  r   r  r#  r  r  r   r{   r  r  r  r}   lookup_operatorr   r  r7   rC   r=   )
rT   rn   r  
index_typer$  r*  r  operands
index_funcindex_with_types
             rO   r   zIndexNode.infer_type  sW   II((-	::""!!++##|Z-y*F F !  &%ZZ**3/
*++z$**g/NL( "000h&  n,!...DIIy1
 &%z9554DJJD	($$!!Y%7%7 ***$$DJJ)H::113 JJ66Eqy/E2INN2(33E::!!/ / y9z:H ,,T8<J%!2229%/**E#zz:6O4Y@QRSS x00 "!rP   c                 (    | j                  |d      S )NTgetting)analyse_base_and_index_typesr	  s     rO   r  zIndexNode.analyse_types  s    00d0CCrP   c                     | j                  |d      }|j                  j                  rt        | j                  d       || u r3|j                         s#t        | j                  d|j                  z         |S )NT)settingzAssignment to const dereference%Assignment to non-lvalue of type '%s')r  r   r  r   r}   r   r  s      rO   r  zIndexNode.analyse_target_types   s`    00d0C99$((=>4< 0$((CdiiOPrP   c                    |r | j                   j                  |      | _         | j                   j                  j                  rt        j
                  | _        | S | j                  j                  }|j                  d   sL|r5t        | j                  j                  | j                  j                         nt        | j                         |sct        | j                  t              rIt        j                  | j                  j                         r | j                  j#                  |      | _        | j                   j                  j$                  }|st        | j                   t&              s|r| j                   j                  j(                  s@| j                   j                  j*                  s@| j                   j                  j,                  s | j                   j#                  |      | _         | j/                  ||      }||S |j0                  | _        | j                   j                  }|j2                  s| j                  j                  |      | _        | j                  j                  | _        |j6                  ru|rt9        | j:                  dd       n$| j                  j<                  dv r| j                   S | j                   j#                  |      | _         | j                   j                  }|j>                  r| jA                  ||||      S |j*                  s|j,                  r| jC                  ||      S |jD                  r| jG                  ||      S |j2                  r| jI                  |      S |jJ                  r| jM                  |||      S tO        | j:                  d|z         t        j
                  | _        | S )N
wraparoundz%cannot assign to Unicode string indexr&   rx   )r   r  z'Attempting to index non-array type '%s')(r)  r  r   r  r   r,   r*  r   rf   r   r   r   rz   r,  r   long_literalr   r  r   r  rn  r  r#  analyse_as_buffer_operationr   r$  original_index_typer  r   r}   r{   rl   analyse_as_pyobjectanalyse_as_c_arrayr  analyse_as_cppanalyse_as_c_functionr  analyse_as_c_tupler   )	rT   rn   r  r  analyse_baser   is_memslicereplacement_noder  s	            rO   r  z&IndexNode.analyse_base_and_index_types  s   
 		//4DI99>>"" #--DIK::&&~~l+&tzz'7'7I&tzz2 Jtzz7;@R@RSWS]S]ScSc@d66s;DJiinn77
499i @Hyy~~''		0E0EI`I` II88=	;;CI'##YY
IINN	%%11#6DJ'+zzD$(( DHH&MUVWZZ//7:99$ II88=	 IINN	  ++C7GLL!3!3**399##&&sG44##--c22  **3AA$((; #--DIKrP   c                    | j                   j                  }| j                  j                  j                  rI|t        urAt        | j                  dd       | j                  j                  |      | _        d| _        nZ| j                  j                  j                  r|t        ur	|r|t        t        t        fv r| j                  j                  j                  r\|j                  d   rMt        | j                  t               rJ| j                  j#                         r0| j                  j$                  dk\  r|j                  d   sd| _        nd| _        | j                  j'                  t(        j*                  |      j-                  |      | _        | j.                  j1                  |       n'| j                  j                  |      | _        d| _        | j                  j                  j                  r|t2        u rt(        j4                  | _        n| j                  j                  j                  r6|t        u r.|rt(        j6                  | _        nt(        j8                  | _        n|r*|t:        t        t<        t2        t        t        fv r|| _        nd }|t        t        fv rC| j                  j                  j                  r#t?        || j                   | j                  |      }|t@        }|| _        |t        t        t        fv r | j                   jC                  d      | _         | jE                  ||       | 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&   rx   r  r   boundscheckr  &'NoneType' object is not subscriptable)#r)  r   r*  r  r   r   r}   r  r   r  r   r   r"   signedrf   rz   r,  r   r{   r  r   r-  r  r  create_to_py_utility_coder   r|  r  r  r   r   r   r   r  wrap_in_nonecheck_node)rT   rn   r   r  r  r  r$  s          rO   r  zIndexNode.analyse_as_pyobjectN  sS   IINN	::??**y	/IDHHhopr 66s;DJDLZZ__##	(B"y*n&MM!ZZ__33 #| <'

G<!ZZ;;=$**B\B\`aBaNN=9  --j.J.JCPaabefDJ$$>>sC66s;DJDL::??!!i<&? #11DIZZ__##	^(C&33	 '11	)
NHl\egq'rr!DIIY
33

8N8N4DJJD	 *	!DIY
I>> II778`a	##C1rP   c                    | j                   j                  }|j                  | _        |r	|| _        | S | j                  j                  j                  r1| j                  j                  t        j                  |      | _        | S | j                  j                  j                  s-t        | j                  d| j                  j                  z         | S )NzInvalid index type '%s')r)  r   r  r*  rl   r  r   r-  r  r   r}   )rT   rn   r   r  s       rO   r  zIndexNode.analyse_as_c_array  s    IINN	''	!DI
 	 ZZ__((--j.J.JCPDJ  ''$((5

GHrP   c                 D   | j                   j                  }|j                  d| j                   | j                  g      }|Ot	        | j
                  d|d| j                  j                  d       t        j                  | _        d| _        | S |j                  }|j                  r|j                  }|j                  | _        |j                  | _        | j                  r:|sd| _        | j                  %|j                  t        j                   dd             | j                  j#                  |j$                  d	   j                  |      | _        |j&                  | _        |r9|j&                  j(                  s#t	        | j
                  d
| j                  z         | S )Nr  z
Indexing 'z ' not supported for index type 'r  rh  TCppExceptionConversionCppSupport.cppr   z#Can't set non-reference result '%s')r)  r   r  r*  r   r}   r   r,   re  r  r  r  r   r   ru  r	   r{  r  r   r  r  )rT   rn   r  r  r  	func_types         rO   r  zIndexNode.analyse_as_cpp  sF   IINN	&&tdii-DE$((QZ\`\f\f\k\klm"--DI(DKMM	!++I(88(88###+$$[%<%<=UWg%hiZZ)))..*;*@*@#F
))	900==$((ADIIMNrP   c           	         | j                   j                  }|j                  r| j                  |       | S | j	                  |      | _        d | _        |j                  #t        | j                  d       t        | _        | S | j
                  t        | _        | S t        |j                        t        | j
                        k7  rOt        | j                  dt        |j                        dt        | j
                               t        | _        | S |j                  t        t        |j                  | j
                                    | _        | S )Nz)Can only parameterize template functions.z-Wrong number of template arguments: expected , got )r)  r   r  parse_indexed_fused_cdefparse_index_as_typestype_indicesr*  	templatesr   r}   r,   r   
specializedictziprT   rn   r  s      rO   r  zIndexNode.analyse_as_c_function  s   IINN	))#."  !% 9 9# >DDJ""*dhh KL&	  ""*&	  Y(()S1B1B-CCdhhY0013t7H7H3I!L M&	  &00c):M:MtO`O`6a1bc	rP   c                 .   | j                   j                  }t        | j                  t              r| j                  j                         r| j                  j                  }|j                   |cxk  r|j                  k  r-n n*|dk  r||j                  z  }|j                  |   | _        | S t        | j                  d|d|d       t        j                  | _        | S | j                   j                  |      | _         | j                  |||d      S )Nr   zIndex z out of bounds for 'r  Fr  r  r  )r)  r   rz   r*  r,  r   r{   r  r  r   r}   r   r,   r  r  )rT   rn   r  r  r  r*  s         rO   r  zIndexNode.analyse_as_c_tuple  s    IINN	djj'*tzz/M/M/OJJ..E%8)..819Y^^+E%007	 K	 dhhi)* '11	K		44S9DI44S'SZin4oorP   c                    t        | j                  t              r| j                  j                  }n| j                  g}| j                  }|j
                  }d}|j                  rddlm} |j                  r-|j                  |      }||j                  }|j
                  }|}|j                  ||j                        \  }	}}
|	rt        | j                  ||      }nMt        | j                  ||      }n3|j                   s|j"                  r|j"                  st%        |      |j                  k(  rd}|D cg c]  }|j'                  |       }}|j"                  rt)        d |D              }|rt+        |      D ]_  \  }}|j,                  st/        |j                  |j0                  |j2                  |j4                        }|j'                  |      }|||<   a nt)        d |D              }|r4t7        | j                  ||      }t        | j                  t8              rJ ||j'                  ||      }|S c c}w )	zI
        Analyse buffer indexing and memoryview indexing/slicing
        Nr&   r  )indicesr)  Tc              3      K   | ]@  }|j                   j                  xs$ |j                  xs |j                   j                   B y wrI   )r   r  r   r7   r^   r*  s     rO   ra   z8IndexNode.analyse_as_buffer_operation.<locals>.<genexpr>  s=      ).! 

))YU^^Yuzz?Y?YY).s   AAr   r   r   c              3   H   K   | ]  }|j                   j                    y wrI   r   r  r  s     rO   ra   z8IndexNode.analyse_as_buffer_operation.<locals>.<genexpr>  s     (Pu):):(Ps    ")rz   r*  r  r   r)  r   r   r  r  r  merged_indicesunellipsifyndimMemoryViewSliceNoder}   MemoryViewIndexNoder?  r7   r   r  allr}  r   SliceIntNoder   r   r   BufferIndexNode	CloneNode)rT   rn   r  r  r)  r  r  r  r  have_slicesnewaxesr  r*  do_replacementr  s                  rO   r  z%IndexNode.analyse_as_buffer_operation  s    djj),jjooGzzlGyyII	''$$$!%!4!4W!=!-99D $		I,G,6,B,B7INN,[)K'#6txxW[#\ #6txxW[#\   I$=$=((CLINN,J#' AHI5..s3II,,%( ).%,). &.N &'0'9 3GAe$~~(4UYYekkX]XbXbinisis(t(-(;(;C(@-2
	3 &)(P(P%PN!'6txxW['\$)$**i@@'/==c7K) Js   =Ic                     |j                   d   r| j                  j                         sy | j                  j                  d      | _        y )N	nonecheckr  )rf   r)  r  r  rT   rn   r  s      rO   r  z IndexNode.wrap_in_nonecheck_node  s7    ~~k*$))2G2G2III//0XY	rP   c                    t        | j                  t              r| j                  j                  }n| j                  g}g }|D ]A  }|j	                  |j                  |             |d   )|rt        |j                  d        y  |S )Nr  znot parsable as a type)rz   r*  r  r   r   r4  r   r}   )rT   rn   requiredr  r  r*  s         rO   r  zIndexNode.parse_index_as_types  s}    djj),jjooGzzlG 	E 5 5c :;B'%))%=>	 rP   c           	      "   t         j                  | _        d| _        | j                  j                  }g }| j
                  j                  s| j
                  j                  r&|j                  | j
                  j                         nPt        | j
                  t              r6| j
                  j                  D ]  }|j                  |j                          | j                  |d      }|| j
                  j                  |      | _        | j                  j                  j                   st#        | j                  d       d| _        y| j                  j                  j                   x| j                  _        | _        | j                  j                  x| j                  _        | _        d| j                  _        d| _        d| j                  _        d| _        yt)        |      D ]  \  }}|j+                  |      ||<    |j-                         }t/        |      t/        |      kD  rt#        | j                  d      S t/        |      t/        |      k  r'|t/        |         }	t#        | j                  d|	z        S t1        |||      D ]V  \  }
}}t3        |j4                  D 	cg c]  }	|j7                  |	       c}	      st#        |
d      c S ||j8                  sV y t;        t1        ||            }|j=                  |      }|j>                  rt#        | j                  d	       y| j                  j                  jA                         D ]  }|j7                  |      s|| _        | j                  j                  r3|j                  | _        d| _        | j                  jB                  | _!        d| j                  j                  _        || j                  _        |j                  | j                  _         y tE        d
      c c}	w )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 fusedzType not in fused typez6Index operation makes function only partially specificz!Couldn't find the right signature)#r   r,   r   is_fused_indexr)  r*  r  r  r   r}   rz   r  r   r  r  r   r   r   r   r  r}  specialize_fusedget_fused_typesr   r  rg   typesr  r  r  r  r  r  r  r   )rT   rn   r  	positionsr  specific_typesr  r   fused_typesr_   r}   specific_type
fused_typefused_to_specificr  s                  rO   r
  z"IndexNode.parse_indexed_fused_cdef  sL    ))	"IINN		::!8!8TZZ^^,

I.zz *  )*2232G!11#6DJ99??..dhh KL #(D 04yy/J/JJ		$*-1ZZ__<		$(		!#"&

"'D 0 	;GAt $ 5 5c :N1	;  //1~[!11#=>> 3{#33C/0A $EGH$I J J /2)2@2=/? 	*C
 *:J:JKQ--a0KLS":;;$(>(>	 ![.!AB##$56==$((JL "YY^^NNP I	<<	* )DIyy-- &/__
,0)#'99==+/DIIOO(%.DIIN&/ooDIIOI$ $$GHHC Ls   &P
zIndexing Python objectc           	      x   | j                   j                  t        t        t        fv r~| j                   j                  t        u rd}n| j                   j                  t        u rd}n| j                   j                  t        u rd}nxJ d| j                   j                  z         | j                   j                  j
                  rU| j                   j                         ddj                  | j                  D cg c]  }|j                          c}      dS | j                   j                  j                  r]| j                  j                  }|dk  r#|| j                   j                  j                  z  }| j                   j                         d	|S | j                  j                  s| j                  j                  r:| j                  | j                   j                  k(  rt!        | j"                  d
       y d}|| j                   j                         | j                  j                         fz  S c c}w )NzPyList_GET_ITEM(%s, %s)zPyTuple_GET_ITEM(%s, %s)z0((unsigned char)(PyByteArray_AS_STRING(%s)[%s]))z$unexpected base type in indexing: %s<,>r   .fzInvalid use of pointer slicez(%s[%s]))r)  r   r   r   r"   r$  r   joinr  r  r  r*  r{   r  r  r#  r   r}   )rT   
index_codeparamr*  s       rO   r   zIndexNode.calculate_result_codes  s   99>>i^DDyy~~*6
:-7
>1O
UDtyy~~UUYY^^((		  "dFWFWXU%668XY[ [ YY^^%%JJ..Eqy,,,#yy//1599		  DII$6$6DII<Wdhh >?#JTYY--/1B1B1DEEE Ys   :H7c                 `   | j                   j                  j                  r| j                  j                  t        u }t        |j                  j                  d         xrX | j                  j                  xr@ t        | j                   j                  t              xr | j                   j                  dk\   }t        |j                  j                  d         }d| j                  j                         | j                  j                  xr dxs d| j                  j                  |||fz  S y)Nr  r   r  z, %s, %d, %s, %d, %d, %dr&   r  )r*  r   r  r)  r   r  rt  rf   r  r   rz   r{   r$   r  to_py_function)rT   r   is_listr  r  s        rO   extra_index_paramszIndexNode.extra_index_params  s   ::??!!iinn	1GT%%00>? :((//:

 : :MJ 933q8: 
 t//::=IJK-((??A((//5A:((77[	12 2 2 rP   c                 \	   | j                   sy d }| j                  j                  rQd}| j                  j                  j                  rX| j
                  j                  t        u rd}n!| j
                  j                  t        u rd}nd}t        j                  dd      }n| j
                  j                  t        u rd}t        j                  dd      }n| j
                  j                  t        u r<| j                  j                  t        t        fv rd	}t        j                  dd      }nd
}|j                  j!                  t        j                  dd             t        j                  dd      }n8| j                  j"                  rY| j
                  j                  t        u r=| j                  j                  j                  sJ d}d}t        j                  dd      }n| j
                  j                  t$        u rU| j                  j                  j                  sJ | j                  j                  sJ d}d}t        j                  dd      }nX| j
                  j                  j&                  r| j(                  s,J d| j                  d| j
                  j                  d       ||j                  j!                  |       | j                  j                  j                  r| j                  j+                         }n| j                  j-                         }| j
                  j                  j&                  r| j(                  rt/        || j0                  | j+                         d| j
                  j+                         d| j                  j+                         d| j                  j                  r| j+                         nd | j2                  | j4                         ndk(  rdnd|z  }|j7                  | j+                         dd| j
                  j-                         d|| j9                  |      d|j;                  || j+                         z  | j0                        
       | j                  j                  r |j=                  | j-                                y y )NrE  __Pyx_GetItemInt_List__Pyx_GetItemInt_Tuple__Pyx_GetItemInt
GetItemIntrp  __Pyx_PyDict_GetItemDictGetItem__Pyx_PyObject_Dict_GetItem__Pyx_PyObject_GetItemObjectGetItem__Pyx_GetItemInt_Unicodez(Py_UCS4)-1GetItemIntUnicoder{  __Pyx_GetItemInt_ByteArrayz-1GetItemIntByteArrayzunexpected type z and base type z for indexingr  [z];!%sz	%%s == %sr  rk  r   )r   r   rl   r*  r  r)  r   r   r
   r{  r   r	   r   r   r   rt  ru  r  r"   r  r  r   r   r   r}   r   rh  r   rB  r   r  )rT   r   rs  error_valuer  r=  error_checks          rO   rm  zIndexNode.generate_result_code  sZ   ||99   Kzz%%99>>Y.6HYY^^z17H1H1==lL^_99>>Y.5H#.#:#:=J\#]LYY^^~5$**//hXdMe:e<H#.#:#:=J\#]L7H$$55*66|EWXZ#.#:#:?L^#_LYY&&499>>\+I::??)))1H'K&223FXLYY^^~-::??)))99###3HK&223H/ZL))..--$2F2F+		499>>+ + #--l;::??!!**,J--/J99>>&&4+?+?#D$(("&++-1A1A1C"&**"3"3"57!%!6!6D$$d&;&;	= $/&#8%kK>WKJJKKMII'')++D1&&{T[[]'BDHHMOP 99  OODNN,- !rP   c                    | j                   j                  j                  r| j                  j                  t        u r2|j
                  j                  t        j                  dd             d}n1|j
                  j                  t        j                  dd             d}| j                   j                         }n;| j                   j                         }| j                  j                  t        u rd}nd}|j                  |j                  |d	| j                  j                         d
|d
|| j                  |      d	| j                               y )NSetItemIntByteArrayr{  __Pyx_SetItemInt_ByteArray
SetItemIntrp  __Pyx_SetItemIntr  PyObject_SetItemr  rk  r  )r*  r   r  r)  r"   rt  ru  r	   r{  r   r   r   r   r  rB  r}   )rT   
value_coder   r  r=  s        rO   generate_setitem_codezIndexNode.generate_setitem_code  s   ::??!!yy~~/  11++,A?SU7  11++L:LMO-**,J--/Jyy~~*+ .

4))		##%''-/ HH 	rP   c           
      @   | j                  |       | j                  j                  r"| j                  |j	                         |       n| j
                  j                  t        u r&| j                  ||      }| j                  ||       nO| j
                  j                  j                  r| j                  r| j                  dk(  r|rh|rf| j                  |k7  rWt        || j                  | j                  | j                         |j                         | j                  || j                         nt        || j                  | j                         d|j                         d| j                  j                  r| j                         nd | j                  | j                         n3|j!                  | j                         d|j                         d       | j#                  |       | j%                  |       |j'                  |       |j)                  |       y )Nr  r  r  )rk  r   rl   r\  r   r)  r"   _check_byte_valuer  r  r   r   r}   r   rh  r   r   rp  rq  r{  r  )rT   r   r   r  r  r   r[  s          rO   r  z"IndexNode.generate_assignment_code  s   --d399  &&s}}=YY^^~-//c:J&&z48YY^^((T-A-AdFZFZ^aFa$$$7 /tTXXtyyKKM3::<1E1E#T%:%:< (dhh"&++->%)YY%:%:DKKM(($*?*?A
 JJ"kkmSZZ\:< 	++D1%""4(trP   c                    |j                   j                  sJ t        |j                                |j                         }|j	                         r@d|j
                  cxk  rdk  r|S  d}t        |j                  d|j
                  z  d       n|j                   t        j                  k7  }| j                  sg }|j                  s|j                   j                  r|j                  d|z         |j                  sG|j                  r;|j                   t        j                  t        j                  t        j                   fv s|j                  d|z         |ra|j#                  d	d
j%                  |      z         |j#                  d|j'                  | j                        z         |j#                  d       |rd|z  }|S )Nr      Tz9value outside of range(0, 256) when assigning to byte: %sr&   rx   z%s < 0z%s > 255if (unlikely(%s)) {z || zFPyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)"); %sr   z((unsigned char)%s))r   r  r  r   r   r{   r   r}   r   r  r   r   r   r   r   r   c_schar_typer   r<  r   )rT   r   r   r[  
needs_cast
conditionss         rO   r^  zIndexNode._check_byte_value(  ss   xx.SXX.ZZ\
""$C''-#-!! .JCGG2474G4GH
 Z%<%<<JzzJ~~!!(Z"78[[SXX"//1G1G"//21 &1 !!*z"9:

06;;z3JJK

<OODHH-./ 

3.;JrP   c                 r   | j                  |       | j                  j                  j                  rLd}| j                  j	                         }|j
                  j                  t        j                  dd             n;| j                  j                         }| j                  j                  t        u rd}nd}|j                  |j                  |d| j                  j                         d|| j                  |      d| j                               | j!                  |       | j#                  |       y )	N__Pyx_DelItemInt
DelItemIntrp  PyDict_DelItemPyObject_DelItemr  rk  r  )rk  r*  r   r  r   rt  ru  r	   r{  r   r)  r   r   r  rB  r}   rp  rq  )rT   r   r  r  r=  s        rO   r  z IndexNode.generate_deletion_codeL  s    --d3::??!!)H**,J--''6HIK --/Jyy~~*+-

4))		##%''-	/
 HH 	 	++D1%rP   )FFTTr  r  )#rV   rW   rX   r   r  r  r-  r   r  r  r  r
  r4  r   r   r  r  r  r  r  r  r  r  r  r  r  r
  r  r   rB  rm  r\  r  r^  r  rR   rP   rO   r+  r+  Z  s      HLLNU-L

*@TO"bD HM26DL3j	0,p$3 jZ
YIv +KF4"E.NB IN.2 D"H&rP   r+  c                        e Zd ZdZddgZdZdZdZd Zd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 Z fdZ x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  TFrR   c                 *    | j                  |d       y NFr  r  r	  s     rO   r  z$BufferIndexNode.analyse_target_typesy  s    3.rP   c                 (   | j                   j                  sBt        | j                   j                        s#t	        | j
                  d       t        | _        | S |s| j                   j                  j                  j                  st	        | j
                  d       nLd| _	        | j                   j                  j                  r%d| j                   j                  j                  _	        d| _        | j                  ||       | j                  |       | 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  r7   r   r   r}   r,   r   writabler  r?  
buffer_auxnone_error_messageanalyse_buffer_indexr  r)  s      rO   r  zBufferIndexNode.analyse_types|  s     yy  )H$((=>"DIK99??''00dhh <='+$99>>++AEDIIOO..>"J!!#w/##C(rP   c                 "   t        | j                  j                        rT| j                  D cg c]  }||j                  f }}t	        t        | j                  j                  |            | _        nE| j                  j                  |      | _        | j                  j                  j                  | _        | j                  j                  | _        |r5| j                  j                  s| j                  j                   rd| _
        y y y c c}w r"  )r7   r)  r   r  rC   r=   r  r  buffer_typerl   r   )rT   rn   r  idxindex_with_type_lists        rO   rr  z$BufferIndexNode.analyse_buffer_index  s    499>>*?C||#LS#((O#L #L#$9$))..J^$_`DI		2237DI		,,DI99>>		--1J1JDL 2K7 $Ms   Dc                      y)zk
        Called by IndexNode when this node is assigned to,
        with the rhs of the assignment
        NrR   rT   r   s     rO   analyse_assignmentz"BufferIndexNode.analyse_assignment  s    rP   c                     |j                   d   r| j                  j                         sy | j                  j                  | j                        | _        y )Nr(  )rf   r)  r  r  rq  r	  s     rO   r  z&BufferIndexNode.wrap_in_nonecheck_node  s<    ~~k*$))2G2G2III//0G0GH	rP   c                     | j                   s| j                  r9| j                  j                  r"t	        | j
                  d       t        | _        y y y )Nz2Cannot access buffer with object dtype without gil)r  r  r   rl   r   r}   r,   r	  s     rO   r<  zBufferIndexNode.nogil_check  s@      D$9$9yy$$dhh TU&	 % %:rP   c                      d| j                   z  S Nz(*%s))buffer_ptr_coderS   s    rO   r   z%BufferIndexNode.calculate_result_code  s    ----rP   c                     | j                   }| j                   j                  r|j                  }|j                  j	                  |      S rI   )r)  is_nonecheckr  r   	get_entryr  s     rO   buffer_entryzBufferIndexNode.buffer_entry  s6    yy99!!88Dyy""4((rP   c                 .   |j                   j                  t        j                  |j                  |j                  j
                  rt        j                  nt        j                        d      }|j                  |d|j                         d       |S )NFrO  r  r  )
rT  rU  r   rZ  r   r   c_ssize_t_typec_size_t_typer   r   )rT   r   ivarrets       rO   get_index_in_tempz!BufferIndexNode.get_index_in_temp  sq    nn****		-1YY-=-=
)):C[C[] 	 + 
 	

dkkm45
rP   c                    | j                   rI| j                  s| j                  r1|j                  j                  d   rt        | j                  dd       | j                  D cg c]  }| j                  ||       c}x| _	        }ddl
m} | j                         }|j                  j                  r|j                  j                  }n|j                   d   }||j#                  || j                  D cg c]  }|j                  j$                   c}||j                  j                  | j                  ||| j                         fS c c}w c c}w )z8
        ndarray[1, 2, 3] and memslice[1, 2, 3]
        r  z(Use boundscheck(False) for faster accessr&   rx   r<  negative_indices)r   index_signedsindex_cnamesrf   r}   r   r  rh  )rh  r  r  rt  rf   r   r}   r  r  index_tempsr  r=  r  r   r?  r  buffer_defaultsput_buffer_lookup_coder   )rT   r   r  r  r=  r  r  s          rO   buffer_lookup_codez"BufferIndexNode.buffer_lookup_code  s+      $$(=(=##..}=DHH&PXYZ Y]XdXd)ePT$*@*@d*K)ee; 	((*&&+00AA%556HIV::8<E499++E$''22t-!22 ; 4 4 	4 *f Fs   $E4Ec                     | j                  |       | j                  ||       | j                  |       | j                  |       |j	                  |       |j                  |       y rI   )rk  generate_buffer_setitem_coderp  rq  r{  r  rT   r   r   r  s       rO   r  z(BufferIndexNode.generate_assignment_code  sV    --d3))#t4++D1%""4(trP   c           	      z   | j                   j                  }t        |      rt        |j                        r|j                  j                  t        t        | j                   j                              d      }|j                  d|z         |j                  d|d|d| j                   j                         d       |j                  |t        | j                        d|d	|j                         d
       |j                  j                  |       y | j                  |      \  }}| j                  j                  j                   r|j                  j                  |j"                  d      }|j%                         }	|j                  |d|d
       |j'                  d|z         |j                  d|	d|d       |j                  d|d|d	|	d
       |j)                  d|z         |j                  j                  |       y |j                  d|d|d	|j%                         d
       y )NFrO  __Pyx_call_destructor(%s);r  r  r  r  r  z= r  r  z*%sz__Pyx_INCREF(z); __Pyx_XDECREF(*rl  r   )r)  r   r7   r5   rT  rU  rC   r?   r   r   r<   r  r^  r  rt  r  rl   buf_ptr_typer   r  put_xgiveref)
rT   r   r   opr  r  r  ptrexprptrr   s
             rO   r  z,BufferIndexNode.generate_buffer_setitem_code  s   IINN	9%*CCHH*M....{<		;W/Xej.kC JJ3c9:JJS$))BZBZB\]^JJ%dll3""$	& '
 NN'', !% 7 7 =g!!-- ....|/H/H:? / ACzz|HJJS'23US[)JJ#  JJR:;eck*NN'', JJSZZ\BCrP   c                 6   t        | j                  j                        rm| j                         }|j	                  d|z         |j	                  d|d|d| j                  j                         t        | j                        d       y | j                  |      \  }| _	        | j                  j                  r^| j                         }|j	                  |d| j                  d       |j	                  d|d	|d
       |j	                  d|z         y y )Nr  r  r  r  r  z = (PyObject *) *r  r  z == NULL)) z = Py_None;z__Pyx_INCREF((PyObject*)%s);)r7   r)  r   r   r   r   r<   r  r  r~  rl   )rT   r   resr  s       rO   rm  z$BufferIndexNode.generate_result_code  s    499>>*++-CJJ3c9:JJ		((*%dll3	5 6
 -1-D-DT-J*d*99   ++-CJJ38L8LMNJJCMNJJ5;< !rP   c                     | j                   D ]  }|j                  j                  |        d| _         t        t        |   |       y r  )r  rT  r^  rK   r"  rq  )rT   r   temprN   s      rO   rq  z"BufferIndexNode.free_subexpr_temps'  sA    $$ 	.DNN''-	.ot7=rP   rj  r  )r  )rV   rW   rX   r  r   r  r  r  r  r  rr  ry  r  r<  r   r  r  r  r  r  rm  rq  rY   rZ   s   @rO   r"  r"  e  sv     	"H O K/0
 I
'.)4:(DT=*> >rP   r"  c                   2    e Zd ZdZdZdZddZd Zd Zd Z	y)	r  TFc                    ddl m} t        |      | _        | j                  }|j                  || j                  j                  j                        \  }}}|sXd| _	        | j                  j                  s| j                  j                  r%d| j                  j                  j                  _	        | xr, t        |      | j                  j                  j                  k(  | _        g }t        j                   }g }	t        |      t        |      z
  | j                  j                  j                  kD  r[t"        | _        t%        || j                  j                  j                     j&                  d| j                  j                  z         | S d}
t)        |d d        D ]  \  }}|j+                  |      }|j,                  r*d| _        |	j1                  |       |j1                  d       N| j                  j                  j2                  |
   \  }}|
dz  }
|j4                  rd| _        |j6                  j,                  r|j1                  ||f       n|j1                  |df       dD ]K  }t9        ||      }|j,                  r|j;                  ||      }t=        |||       |	j1                  |       M |j                  j>                  s|j                  j@                  rv|j                  j@                  r/| jB                  s#tE        |j&                  d	d
       dtF        _!        d| _$        |j;                  ||      }|||<   |	j1                  |       t"        | _        t%        |j&                  d|j                  z         | c S  | jH                  xr | j.                   | _$        |	| _        || _%        |jL                  | _&        | jO                  |||       | jQ                  |       | S )Nr&   r  Tz&Too many indices specified for type %sr   )directstridedr  r  z/Index should be typed for more efficient accessr0   rx   z/Invalid index for memoryview specified, type %s))r  r  r;   is_pythran_moder  r  r)  r   r  r  r  r  r   r   memslice_indexr   r-  r,   r   r}   r}  r  r%  r  r   r  r   r   r   r  setattrr  rl   warned_untyped_idxr   r  r  original_indicesr   analyse_operationr  )rT   rn   r  r  r  r$  r%  r  r  new_indicesaxis_idxr  r*  accesspackingattrr   s                    rO   r  z!MemoryViewIndexNode.analyse_types4  s-    -c2,,(2(>(>w		H[H[(\%Wg#'D yy  DII$:$:7;		$$4#*{Rs7|tyy~~?R?R/R11
w<#g,&)<)<<"DI'$))..--.22:TYY^^KMK!'!*- (	HAu'',E}}(,%""5)12"iinn11(;OFGMH~~(,%::%%KK 12KK 34 6 2D#E40E == %
C @tU3#**512 ""ejj&<&<::))$2I2IEII'X`ab=A':(,%
C8"
""5) '	eii!RUZU_U_!_`Q(	V !% 5 5 Sd>S>S:S" !(YY
sGT2##C(rP   c                 6    d| _         | j                  ||       y )Nz"Cannot index None memoryview slice)rq  rr  )rT   rn   r  r  s       rO   r  z%MemoryViewIndexNode.analyse_operation  s    "F!!#w/rP   c                     | j                   j                  r*| }|j                  s|j                  rd|_        d|_        yyy)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  rT   r   lhss      rO   analyse_broadcast_operationz/MemoryViewIndexNode.analyse_broadcast_operation  sB     99''C''3+C+C+/(+/( ,D (rP   c                 R    | j                  |      }|r|j                  |_        |S | S rI   )ry  r  r  s      rO   $analyse_as_memview_scalar_assignmentz8MemoryViewIndexNode.analyse_as_memview_scalar_assignment  s-    %%c*-0-K-KC*JrP   Nrj  )
rV   rW   rX   r  r  r  r  r  r  r  rR   rP   rO   r  r  .  s*    N`00rP   r  c                   R    e Zd ZdZdZdZdZdZd Zd Z	d Z
d Zd Zd Zd	 Zdd
Zy)r  TFc                     t        d | j                  D              | _        | j                  r| j                  j                  | _        yy)z@Slicing operations needing no evaluation, i.e. m[...] or m[:, :]c              3      K   | ]X  }|j                   xrF |j                  j                  xr. |j                  j                  xr |j                  j                   Z y wrI   )r   r   r%  r   r   r  s     rO   ra   z<MemoryViewSliceNode.analyse_ellipsis_noop.<locals>.<genexpr>  sL      $' NN`u{{22`uzz7I7I`ejjN`N``$'   AA N)r   r  is_ellipsis_noopr)  r   r)  s      rO   analyse_ellipsis_noopz)MemoryViewSliceNode.analyse_ellipsis_noop  sA     !$ $'$' !'   		DI !rP   c                    ddl m} |sd| _        d| _        nd| _        | j	                  ||       | j
                  ry d | _        d| _        d| _        |j                  | j                  |      st        | _        y t        j                  | j                  j                  j                   |      | _        | j                  j#                         s<| j                  j%                         s!| j                  j'                  |      | _        y y y )Nr&   r  Tz&Cannot assign to None memoryview slicez"Cannot slice None memoryview slice)r  r  r  rq  r  r  r*  r   rV  validate_axesr}   r,   r   r   r  r)  r  r  rI  r  )rT   rn   r  r  r  s        rO   r  z%MemoryViewSliceNode.analyse_operation  s     (,D%&ND#&JD#""30  
#''$7"DI22499>>3G3GN			##%)A)A)C		005DI *D%rP   c                    |j                   j                  s[| j                   j                  j                  |j                         s|j                   j                  rt        | j                  |       S t        | j                  |       S rI   )r   r   r  r  rl   MemoryCopyScalarr}   MemoryCopySlicerx  s     rO   ry  z&MemoryViewSliceNode.analyse_assignment  sX    xx**		//9$$#DHHd33"488T22rP   c                    |sy| j                   dd }|dd }t        | j                         D ]  \  }}|j                  rd|j                  j                  rL|j
                  j                  r6|j                  j                  r |d   ||<   |j                  d       |rp|c S  y|j                  j                  r y |r>t        |      t        |      z   | j                  j                  j                  kD  ry||z  }|S )a  Return a new list of indices/slices with 'indices' merged into the current ones
        according to slicing rules.
        Is used to implement "view[i][j]" => "view[i, j]".
        Return None if the indices cannot (easily) be merged at compile time.
        Nr   )r  r}  r   r   r%  r   r   r   r   r  r   r)  r  )rT   r  r  r  r  s        rO   r  z"MemoryViewSliceNode.merged_indices  s     ++A.!*d334 	DAqzz77??qvv~~!&&..%,QZKNKKN"**  VV]]	 ;#g,.1D1DD7"KrP   c                     | j                   r6| j                  j                         xs | j                  j                         S | j                         S rI   )r  r)  r  rI  rS   s    rO   r  zMemoryViewSliceNode.is_simple  s?      99&&(FDII,D,D,FF""$$rP   c                 6    | j                   j                         S )z3This is called in case this is a no-op slicing node)r)  r   rS   s    rO   r   z)MemoryViewSliceNode.calculate_result_code  s    yy!!rP   c                 b   | j                   ry | j                         }| j                   }d}t        | j                        }| j
                  D ]  }|j                  rvd}|j                  j                  st        |      |_        |j                  j                  st        |      |_
        |j                  j                  rtt        |      |_        t        |        t        |      rJ |j                  || j
                  | j                         |||j                  j                          y )NFT)rf  r$  rf   )r  r  rh  iterr  r  r   r   r%  nextr   r   r   generate_buffer_slice_coder   rt  rf   )rT   r   r  rf  r$  r  r*  s          rO   rm  z(MemoryViewSliceNode.generate_result_code  s      ((*,,, $,,** 
	E~~"{{**"&r(EKzz))!%bEJzz))!%bEJR
	 8//$'';''22 	0 	4rP   c                 f   | j                   r| j                  |       n| j                  |       | j                  r| j	                  ||       n| j                  ||       | j                   r| j                  |       n| j                  |       |j                  |       |j                  |       y rI   )	r  rk  rr  is_memview_scalar_assignment+generate_memoryviewslice_assign_scalar_code&generate_memoryviewslice_setslice_coderp  r{  r  r  s       rO   r  z,MemoryViewSliceNode.generate_assignment_code  s      11$7))$/,,<<S$G77TB  //5''-""4(trP   Nr  )rV   rW   rX   r  r  r  r  r  r  r  ry  r  r  r   rm  r  rR   rP   rO   r  r    sJ     #(  '643>%"48rP   r  c                   0     e Zd ZdZdgZ fdZddZ xZS )MemoryCopyNodeze
    Wraps a memoryview slice for slice assignment.

        dst: destination mememoryview slice
    dstc                 \    t         t        |   |       || _        |j                  | _        y rI   )rK   r  rQ  r  r   rT   r}   r  rN   s      rO   rQ  zMemoryCopyNode.__init__7  s$    nd,S1HH	rP   c                    | j                   j                  |       | j                  ||       | j                   j                  |       | j                   j	                  |       |j                  |       |j	                  |       y rI   )r  rr  _generate_assignment_coder{  r  r  s       rO   r  z'MemoryCopyNode.generate_assignment_code<  sb    ))$/&&sD1''-D!""4(trP   r  )rV   rW   rX   r  r   rQ  r  rY   rZ   s   @rO   r  r  .  s     wH
rP   r  c                       e Zd ZdZdZdZd Zy)r  z
    Copy the contents of slice src to slice dst. Does not support indirect
    slices.

        memslice1[...] = memslice2
        memslice1[:] = memslice2
    T__pyx_memoryview_copy_contentsc                    | j                   }|j                  j                  |j                         |j                  j                  |j                         |j	                  |j                  d| j                  |j                         |j                         |j                  j                  |j                  j                  |j                  j                  j                  fz  |j                               y )Nz%s(%s, %s, %d, %d, %d))r  r   assert_direct_dimsr}   r   r  copy_slice_cnamer   r  r  rl   )rT   r  r   r  s       rO   r  z)MemoryCopySlice._generate_assignment_codeQ  s    hh##CGG,##CGG,

4))$(=(=(+

cjjl(+sxx}}(+(B(B(D D GG 	rP   N)rV   rW   rX   r  r  r  r  rR   rP   rO   r  r  E  s     "&7rP   r  c                   (     e Zd ZdZ fdZd Z x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                 d    t         t        |   ||       |j                  j                  | _        y rI   )rK   r  rQ  r   r  r  s      rO   rQ  zMemoryCopyScalar.__init__h  s$    .sC8HHNN	rP   c                 .   ddl m} | j                  j                  j	                  | j                  j
                         | j                  j                  j                  }|j                  d      }| j                  j                  j                  d      }|j                          |j                  |d|j                         d       | j                  j                         s| j                  j                         r| j                  j                         }n1|j                  |d| j                  j                         d       d}|j                  | j                  j                  || j                  j                  j                  |      }|j                         }	|j                   r|j                  d|	z         |j                  d	|d
|	d       |j                   r|j                  d       |j#                          |j%                          y )Nr&   r  r  z __pyx_temp_scalar = r  z __pyx_temp_slice = __pyx_temp_slicezPy_DECREF(*(PyObject **) %s);z*((z *) z) = __pyx_temp_scalar;zPy_INCREF(__pyx_temp_scalar);)r  r  r  r   r  r}   r  r   begin_blockr   r   rI  r  
slice_iterr  start_loopsrl   	end_loops	end_block)
rT   scalarr   r  r  	type_decl
slice_decldst_tempslice_iter_objps
             rO   r  z*MemoryCopyScalar._generate_assignment_codel  sg    ((6##**2.	XX]]33B7


9fmmoNO88""$(:(:(<xx(HJJj$((//BSTU)H#..txx}}h/3xx}}/A/A4I&&(JJ6:;

)QGHJJ67  "rP   )rV   rW   rX   r  rQ  r  rY   rZ   s   @rO   r  r  _  s    #rP   r  c                       e Zd Zg dZdZd ZddZd Zd Zd Z	d Z
d	 Zdd
Zd Zej                  ZdZ ej&                  ddddi      Z ej&                  ddddi      Z fdZd Z	 	 ddZddZd Zd Zd Zd Zd Z xZS ) SliceIndexNode)r)  r   r   sliceNc                 f   | j                   j                  |      }|j                  s|j                  rt        S |j
                  rt        S |t        t        t        t        t        t        t        fv r|S |j                  s|j                  r t        j                  |j                   d       S t"        S rI   )r)  r   rn  r  r   ro  r   r"   r   r/   r   r   r  r#  r   c_array_typer  r   r  s      rO   r   zSliceIndexNode.infer_type  s    II((-	)"8"8'':~x*IzC C!3!3**9+>+>EErP   c                     |t         urF| j                  r:| j                  j                         r|| j                  j                  z  }nt         }| j                  j                  |      S rI   )r   r   r   r{   r)  r/  r.  s     rO   r/  z"SliceIndexNode.inferable_item_node  sN    &4::zz--/333&yy,,U33rP   c                     | j                   j                  }|r0|j                  ry|t        t        t
        t        t        t        fv ryt        j                  |       S r@  )r)  r   rn  r   r   r   r/   r   r   r   r  r  s     rO   r  zSliceIndexNode.may_be_none  sN    IINN	""Z<,iE E##D))rP   c                     | j                   d }n| j                   j                  }| j                  d }n| j                  j                  }| j                  j                  || | _        y rI   )r   r{   r   r)  )rT   r   r   s      rO   r   z(SliceIndexNode.calculate_constant_result  sW    ::EJJ..E99D99,,D#yy88tDrP   c                 :   | j                   j                  |      }| j                  d}n| j                  j                  |      }| j                  d }n| j                  j                  |      }	 ||| S # t        $ r}| j                  |       Y d }~y d }~ww xY wr   )r)  r  r   r   r  r  )rT   r  r)  r   r   r  s         rO   r  z!SliceIndexNode.compile_time_value  s    yy++D1::EJJ11$7E99D99//5D	-d## 	-))!,,	-s   1A6 6	B?BBc                      y rI   rR   r	  s     rO   r
  z)SliceIndexNode.analyse_target_declaration  r  rP   c                 n    | j                  |d      }|j                  j                  rt        |_        |S rm  )r  r   rl   r   r  s      rO   r  z#SliceIndexNode.analyse_target_types  s0    !!#u!599  &DIrP   c                 >	   | j                   j                  |      | _         | j                   j                  j                  s@| j                   j                  j                  s | j                   j                  j
                  rt        | j                        }t        | j                  | j                  xs || j                  xs ||      }t        | j                  || j                         }|j                  ||| d      S | j                  r | j                  j                  |      | _	        | j                  r | j                  j                  |      | _
        |j                  d   s t        | j                  | j                         | j                   j                  }|j                  rG|sE| j                  s| j                  s|| _        nt!        j"                  |j$                        | _        n|j&                  s|j(                  rt+        |      | _        n|j,                  rt.        | _        np|j0                  r|| _        n\|j                  r%t!        j"                  |j$                        | _        n+| j                   j3                  |      | _         t4        | _        |j6                  r'|| _        | j                   j9                  d      | _         | j                  t4        u r| j                  r| j                  j:                  r| j                  r| j                  j:                  rft        | j                        }t        | j                  t=        j>                  | j                  xs |      t=        j>                  | j                  xs |      |      j                  |      | _         nt         jB                  fd}| j                  rZ| j                  j                  jD                  r || j                  d|      | _	        | j                  jG                  |      | _	        | j                  rZ| j                  j                  jD                  r || j                  d	|      | _
        | j                  jG                  |      | _
        d
| _$        | S )Nr  )r*  r)  Fr  r  r  c                    ddl m}m}  ||       }t        | j                  t        | j                  ||j                         rt        |      nt              |j                  |      t        | j                  |dt        | j                              j                  |            j                  |      } |||      S )Nr&   )EvalWithTempExprNodeResultRefNoder  is)operand1r   operand2)true_val	false_valtest)	UtilNodesr  r  CondExprNoder}   r,  rr  r=  r   r  PrimaryCmpNoder  r  analyse_result_type)r   default_valuern   r  r  node_refnew_exprc_ints          rO   
allow_nonez0SliceIndexNode.analyse_types.<locals>.allow_none  s    J(.'HH$"+>K>S>S>UM(:[i	 '00<'!)!%!)$((!3	
 $mC( &%c*   ,Hh??rP   ri  r"  r&   )%r)  r  r   r?  r7   r   r  r}   r  r   r   r+  r  rf   r   r#  r   r  r  rn  is_cpp_stringrv   ro  r   r  r  r   r  r  r   copydeepcopyr  r-  rl   r  r   )	rT   rn   r  	none_noder*  r   r  r  r  s	           @rO   r  zSliceIndexNode.analyse_types  s:   II++C0	99>>##tyy~~'E'EIjIj *Idhh$(JJ$;)#'99#9	#,.E #4885tyyIJ::W'k" ; $ $ ::11#6DJ99		//4DI~~l+"4::tyy9IINN	g::dii%	&//	0C0CD	  I$;$;(-DI''$DI!DI #++I,?,?@DI		44S9DI&DI$$!DI		334\]DI99&JJ$**"7"7dii&:&:$TXX.	&HH--

(?i@tyy'=I>"	
  -$ 
 00E@. zz::??..!+DJJS!ADJ!ZZ11%=
yy99>>-- *4996F LDI II//s;	rP   c                 r   | j                   j                  |      }|r|j                  s| j                  s| j                  svddlm} |j                  |j                         t        | j                        }t        | j                  |||      }t        j                  ||j                  ||g            S y )Nr&   r  r  )r)  r4  rl   r   r   r  r  ru  r  r  r}   r  r   r  r  )rT   rn   r  r  r  
slice_nodes         rO   r4  zSliceIndexNode.analyse_as_type=  s    II--c2	Y22::dii($$Z%A%AB$TXX.	&HH#""	
 "55z88zlKM MrP   zSlicing Python objectSliceObjectrp  r  Get)r  Setc                 F   | j                   j                  j                  s | j                   j                  j                  rm|t        t
        t        t        fv rU|t        t
        fvr@|j                  d   s1t        | j                  d| j                   j                  d|d       || _        |j                  rT| j                   j                  j                  r4| j                  s(| j                  s| j                   j                  ||      S t        t         | ;  ||      S )Nr\   /default encoding required for conversion from 'r  r  )r)  r   rn  r  r   r"   r   r   rf   r   r}   r#  r   r   r  rK   r  r$  s      rO   r  zSliceIndexNode.coerce_toX  s    YY^^%%)E)E^X| TT^ <<NN+>?dhhYY^^X/0 !DI!8!8::diiyy**8S99^T4XsCCrP   c                 	   | j                   j                  s$t        | j                  d| j                   z         y | j                  j                         }| j                         }| j                         }| j                         }| j                  j                   j                  r| j                  j                         }| j                  j                   t        j                  t        j                  fvrd|z  }| j                   t        u rd}n$| j                   j                  j                         }| j                  ;|j!                  |d|d|d|d|j#                  || j                        	       nb|j!                  |d|d|d|d	|d
|d|j#                  || j                               n!| j                  j                   j$                  r| j                  j                         }| j                  j                   t        j&                  k7  rd|z  }| j                  8|j!                  |d|d|d|j#                  || j                               nw|j!                  |d|d|d	|d
|d|j#                  || j                               n9| j                  j                   t(        u rj|j*                  j-                  t/        j0                  dd             |j!                  |d|d	|d	|d|j#                  || j                        	       n| j                   t2        u r|j*                  j-                  | j4                         | j7                         \  }}}	}
}}}|j!                  d|| j                  j9                         |	|
|||||t;        |j*                  j<                  d         |j#                  || j                        fz         n| j                  j                   t>        u r2|j*                  j-                  tA        j0                  dd             d}nP| j                  j                   tB        u r2|j*                  j-                  tA        j0                  dd             d}nd}|j!                  |d|d| j                  j9                         d	|d	|d|j#                  || j                               |jE                  | j9                                y )Nz,Slicing is not currently supported for '%s'.z((const char*)%s)	ByteArrayz = __Pyx_Pyz_FromString( + r   z_FromStringAndSize(rk   - z((const Py_UNICODE*)%s)z = __Pyx_PyUnicode_FromUnicode(z( = __Pyx_PyUnicode_FromUnicodeAndLength(PyUnicode_Substringr{  z = __Pyx_PyUnicode_Substring(zD%s = __Pyx_PyObject_GetSlice(%s, %s, %s, %s, %s, %s, %d, %d, %d); %sr  SliceTupleAndListrp  __Pyx_PyList_GetSlice__Pyx_PyTuple_GetSlicePySequence_GetSlicer  r  )#r   rl   r   r}   r)  r   
start_code	stop_codern  r   rh   rj   r"   rm   titler   r   r   ro  c_py_unicode_ptr_typer   rt  ru  r	   r{  r   get_slice_utility_codeget_slice_configr   r  rf   r   r
   r   r  )rT   r   base_resultr   r  r  	type_namehas_c_start
has_c_stopc_startc_stoppy_startpy_stoppy_slicecfuncs                  rO   rm  z#SliceIndexNode.generate_result_codeh  s   yy$$$((@499LNii&&(__&
NN$	99>>##))**,Kyy~~j&@&@*BbBb%cc1K?yyN*'	 IINN002	yy 

!#"//ACD 

!#"!"//ACD YY^^,,))**,Kyy~~!A!AA7+Eyy 

#"//A	CD 

#"!"//ACD YY^^|+--%112GY[JJ++FDHH=?@ YY.(--d.I.IJ,0,A,A,C*[*gvwJJVII'')Vgx))44\BC++FDHH=Z? ?@ yy~~*  11&223FHZ[]/:-  11&223FHZ[]0-JJII'')++FDHH=?@ 	()rP   c                 6   | j                  |       | j                  j                  r|j                  j	                  | j
                         | j                         \  }}}}	}
}}|j                  | j                  d| j                  j                         |j                         ||	|
||||t        |j                  j                  d         f
z         n | j                  r| j                         nd}|j                  j                  r)|j                  j                   }| j#                  ||       n| j%                         d|}|j                  j	                  t'        j(                  dd             |j+                  d| j                  j-                         d|d	|j-                         d
| j                  j-                         d|d       | j/                  |       | j1                  |       |j3                  |       |j5                  |       y )Nz?__Pyx_PyObject_SetSlice(%s, %s, %s, %s, %s, %s, %s, %d, %d, %d)r  ri  r  IncludeStringHr{  	memcpy(&(rQ  ]), r  z[0]) * ());)rk  r   rl   rt  ru  set_slice_utility_coder  r  r}   r)  r   r  rf   r   r  r#  r  generate_slice_guard_coder  r	   r{  r   r   rp  rq  r{  r  )rT   r   r   r  r  r   r   r!  r"  r#  r$  r%  r&  start_offsetarray_lengths                  rO   r  z'SliceIndexNode.generate_assignment_code  s   --d399  --d.I.IJ,0,A,A,C*[*gvw!!$((QII'')MMOVgx))44\BCUE EF 15

4??,Lxx  "xx}}..t\B,0NN,<lK--k.E.EFVXg.hiJJ		  "L

		  "L  	++D1%""4(trP   c                 ,   | j                   j                  j                  s$t        | j                  d| j                  z         y | j                  |       |j                  j                  | j                         | j                         \  }}}}}}}	|j                  | j                  d| j                   j                         |||||	||t        |j                  j                  d         f	z         | j                  |       | j                  |       y )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   rl   r   r}   rk  rt  ru  r-  r  r  r   r  rf   rp  rq  )
rT   r   r  r   r!  r"  r#  r$  r%  r&  s
             rO   r  z%SliceIndexNode.generate_deletion_code  s    yy~~))$((QTXT]T]]_--d3))$*E*EF(,(=(=(?	&j'6	7HdhhI		##%'8ZT%%00>?MA A	B 	++D1%rP   c                 &   d\  }}}| j                   r[| j                   j                  j                   }|r| j                   j                         }nd| j                   j	                         z  }d\  }}}| j
                  r[| j
                  j                  j                   }|r| j
                  j                         }nd| j
                  j	                         z  }| j                  xr d| j                  j	                         z  xs d}|||||||fS )N)Fri  rE  &%srE  )r   r   rl   r   r   r   r  )rT   r   r"  r$  r!  r#  r%  r&  s           rO   r  zSliceIndexNode.get_slice_config  s    );&Wh::"jjoo999K**++- 4::#7#7#99&8#
FG99!YY^^777J))+$))"5"5"77::@%$***>*>*@"@JFZ&'8- 	-rP   c                    | j                   j                  j                  sy | j                   j                  j                  }	 t	        |      x}}d x}}| j                  r?| j                  j                         }	 t	        |      }|dk  r|d||fz  }n||z  }n|}d }| j                  rx| j                  j                         }	 t	        |      }|dk  r-|&d| j                   j                  j                  |fz  }n||z  }t        |t              r||z  }n|d|d}d }d }d}	 t	        |      }	t        |t              }|r!|dk  r|	dkD  rVt        | j                  d       n?|r&|$|"|	|k7  r4t        | j                  d|d|       n|||}d	|d
|d}n||}n|}|rl|j                  d|d|d       |j                  d|d|d       |j                  |j                  | j                               |j                  d       y y # t
        $ r d }Y w xY w# t
        $ r Y w xY w# t
        $ r Y w xY w# t
        $ r d }	Y w xY w)Nr   z%s + %dz - (r  FzAssignment to empty slice.z.Assignment to slice of wrong length, expected r	  r  z)-(if (unlikely((z) != ())) {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)(z), (Py_ssize_t)(r,  r   )r)  r   r#  r  r=  r   r   r   r   rz   r$   r   r}   r   r   )
rT   r   target_size
slice_sizetotal_lengthr   r   runtime_checkcompile_time_checkint_target_sizes
             rO   r.  z(SliceIndexNode.generate_slice_guard_code  sj   yy~~&&YY^^((
	 (+J7L: 9999##%D4y!8#+%.*d1C%C
"d*
!%J ::JJ%%'EE
19#+ )TYY^^-@-@%,H H-j-8%'J0:E!BJ "	G!+.O ",J!F*q."dhh <=EMdl*,dhh +!/ 0|!+/7M M&MJJ-UVJJ  01
 JJttxx01JJsO }  	 L	    "    	#"O	#sI   H ;$H& AH6 (I H#"H#&	H32H36	IIIIc                 P    | j                   r| j                   j                         S y)Nri  )r   r   rS   s    rO   r  zSliceIndexNode.start_coded  s    ::::$$&&rP   c                     | j                   r| j                   j                         S | j                  j                  j                  r | j                  j                  j
                  S y)Nr"  )r   r   r)  r   r#  r  rS   s    rO   r  zSliceIndexNode.stop_codej  sD    9999##%%YY^^$$99>>&&&#rP   c                      y)Nz<unused>rR   rS   s    rO   r   z$SliceIndexNode.calculate_result_coder  s    rP   r  rj  r  r  ) rV   rW   rX   r   r  r   r/  r  r   r  r
  r  r  r4  r'   r;  r<  r  r
   loadr  r-  r  rm  r  r  r  r.  r  r  r   rY   rZ   s   @rO   r  r    s     2HE4*	E-^@$ ..K)K4/44)He3DF 5/44)He3DFD c*J IN.2!F&&-&L\$rP   r  c                   H    e Zd Zg dZdZeZdZd Zd Z	d Z
d ZdZd	 Zd
 Zy)r  r  Tr&   c                     t        | j                  j                  | j                  j                  | j                  j                        | _        y rI   r  r   r{   r   r   rS   s    rO   r   z#SliceNode.calculate_constant_result  6    $JJ&&II%%II%% 'rP   c                    | j                   j                  |      }| j                  j                  |      }| j                  j                  |      }	 t	        |||      S # t
        $ r}| j                  |       Y d }~y d }~ww xY wrI   r   r  r   r   r  r  r  rT   r  r   r   r   r  s         rO   r  zSliceNode.compile_time_value  s    

--d3yy++D1yy++D1	-d++ 	-))!,,	-   A   	B)A??Bc                      yr@  rR   rS   s    rO   r  zSliceNode.may_be_none  r  rP   c                    | j                   j                  |      }| j                  j                  |      }| j                  j                  |      }|j	                  |      | _         |j	                  |      | _        |j	                  |      | _        | j                   j
                  r:| j                  j
                  r$| j                  j
                  rd| _        d| _        | S rX  )r   r  r   r   r  r   r   )rT   rn   r   r   r   s        rO   r  zSliceNode.analyse_types  s    

((-yy&&s+yy&&s+--c2
++C0	++C0	::  TYY%9%9dii>R>R"DO DLrP   z Constructing Python slice objectc                     | j                   S rI   rv  rS   s    rO   r   zSliceNode.calculate_result_code  rw  rP   c                    | j                   rnt        | j                  | f      }|j                  t        dd|      | _        |j                  | j
                        }|y |j                  | j                         |j                  | j                         d| j                  j                         d| j                  j                         d| j                  j                         d|j                  | j                         | j                        	       |j!                  | j                                | j                   r |j#                  | j                                y y )Nr  r0   cleanup_level	dedup_keyz = PySlice_New(rk  r   )r   r   r   r  r   re  r  rl  r}   r   r   r   r   r   r   r   r  r  )rT   r   rP  s      rO   rm  zSliceNode.generate_result_code  s   ??&tyy4':I#00XYen0oD33D4D4DED|MM$((#



$$&		##%		##%''txx@B	C 	()??T^^-. rP   N)rV   rW   rX   r   r   r#   r   r   r   r  r  r  r  r   rm  rR   rP   rO   r  r  w  s=     )HHDG'-
 5K /rP   r  c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	r!  r   c                     t        | j                  j                  | j                  j                  | j                  j                        | _        y rI   rC  rS   s    rO   r   z&SliceIntNode.calculate_constant_result  rD  rP   c                    | j                   j                  |      }| j                  j                  |      }| j                  j                  |      }	 t	        |||      S # t
        $ r}| j                  |       Y d }~y d }~ww xY wrI   rF  rG  s         rO   r  zSliceIntNode.compile_time_value  rH  rI  c                      yr@  rR   rS   s    rO   r  zSliceIntNode.may_be_none  r  rP   c                    | j                   j                  |      | _         | j                  j                  |      | _        | j                  j                  |      | _        | j                   j                  s | j                   j                  |      | _         | j                  j                  s | j                  j                  |      | _        | j                  j                  s | j                  j                  |      | _        | j                   j                  r:| j                  j                  r$| j                  j                  rd| _        d| _        | S rX  )r   r  r   r   r%  r  r   r   r	  s     rO   r  zSliceIntNode.analyse_types  s    ZZ--c2
II++C0	II++C0	zz!!55c:DJyy  		33C8DIyy  		33C8DI::  TYY%9%9dii>R>R"DO DLrP   c                      y rI   rR   rS   s    rO   r   z"SliceIntNode.calculate_result_code  r  rP   c                     | j                   | j                  | j                  fD ]-  }t        |t              s|j
                  j                          / y rI   )r   r   r   rz   r#  r  r   )rT   r   r  s      rO   rm  z!SliceIntNode.generate_result_code  s;    DIIdii/ 	A!Y'	rP   N)
rV   rW   rX   r   r   r  r  r  r   rm  rR   rP   rO   r!  r!    s'     G'-"rP   r!  c                   F    e Zd ZdZd Zd Zd Zd ZddZd Z	d Z
d	 Zd
Zy)CallNodeNc                 :   | j                   }|j                  |      }t        |t              rt	        j
                  |j                        S |t        u rt        |dd       }||j                  xs |}|j                  r|j                  }|j                  rt        | j                   dd       rt        | d      r| j                   j                  j                         }| j                   D cg c]  }|j                  |       }}t	        j"                  ||      }|r0|j                  }|j                  r|j                  }|j$                  S |j$                  S |t&        u r|j(                  r|j                  r|j                  j                  r|j                  j                  }	|	j*                  r|	S |	j,                  rQ|j                  j.                  dk(  rt        j0                  S |j                  j.                  t2        j4                  v r|	S t        S c c}w )Nr   r   r|   )r  r   rz   r  r   r  r
  r   r   r   r  r  r$  r  r   all_alternativesr   
best_matchr  r   r  r  r  rm   r  r   #types_that_construct_their_instance)
rT   rn   r  r  r   alternativesr  	arg_types
func_entryresult_types
             rO   r   zCallNode.infer_type  s   =='',	h,&&x':':;;&Hgt4E !JJ3)	!++I!!t}}gt4v9N#}}22CCE<@IIFSS^^C0F	F'229lK
 *I ''$-$7$7	$000((()#HNNx~~7J7J&nn1100&& 00~~**g5)777!,,0[0[[**% Gs   -Hc                 8    | j                   j                  |      S rI   )r  r   r	  s     rO   r   zCallNode.type_dependencies  s     }}..s33rP   c                      yr@  rR   rS   s    rO   r  zCallNode.is_simple   s    
 rP   c                    | j                   | j                   S | j                  j                  }|t        u rv| j                  j                  r`| j                  j
                  }|j                  j                  ry|j                  j                  r|j                  t        j                  v ryt        j                  |       S r@  )may_return_noner  r   r   r  r   r  r  rm   r   r]  r   r  )rT   r  r   s      rO   r  zCallNode.may_be_none'  s    +'''MM&&		!dmm&;&;MM''Ezz++

**JJ'"M"MM##D))rP   c                    ||j                   }|t        j                  u r|j                  r|j                  r|j                  j
                  r|j                  j                  t        j                  v r|j                  j                  dk(  r2t        j                  | _         t        j                  | _
        d| _        y t        j                  |j                  j                     | _         t        | _
        d| _        y |j                  r:|j                  r.|j                  j                   | _         t        | _
        d| _        y t        | _         y )Nr|   F)r   r   r   r  r   r!  rm   r]  r   r  r   builtin_typesr   re  rM  )rT   r  r  s      rO   set_py_result_typezCallNode.set_py_result_type4  s     I)))  ))##w'R'RR~~""g-&44	$.$<$<! $)D  $11(..2E2EF	$2!#(D ("5"5 !++00DI .D#(D &DIrP   c           
      8   | j                   j                  |      }|r|j                  r| j                         \  }}g }t	        ||j
                  j                        D ]K  \  }}|j                  t        |j                  t        |j                  |j                        |             M |r||j                  z  }|| _        t        | _        | j                  |       | j!                  ||       y|r|j"                  r| j$                  D cg c]  }|j                  |       c}| _        |j
                  j'                  d      }|sDt)        | j                   j                  d| j                   j                  z         t*        | _        | S t/        | j                   j                  |j,                        | _         || j                   _        | j                   j3                  |j5                                | j7                  |       || _        yy y c c}w )N)r}   r   )r}   keyr   Tz<init>z'no constructor found for C++  type '%s')r  r4  r  explicit_args_kwdsr  r  var_entriesr   DictItemNoder}   r  rm   key_value_pairsDictNoderN   r  r  r  r   r  r   r,   r   re  r   rj  r  analyse_c_function_call)	rT   rn   r   r   rS  itemsr  memberr  s	            rO   analyse_as_type_constructorz$CallNode.analyse_as_type_constructorN  s   }},,S1D++002JD$E"4)?)?@ sV\cgg:#''Y_YdYd;empqrs---#(D %DNs#NN4%d''<@IIGS#++C0GDI**++H5Kdmm'')RUYUbUbUgUg)gh&	,T]]->->@P@PQDM"-DMMMM##D$?$?$AB((-DI (TGs   Hc                 .    | j                   j                  S rI   )r   r  rS   s    rO   r   zCallNode.is_lvaluej  s    yy%%%rP   c                     | j                         }|j                  r| j                          y |j                  st	        |dd      s| j                          y y y )Nr   F)function_typerl   r;  r  r   )rT   rn   r  s      rO   r<  zCallNode.nogil_checkm  sJ    &&(	  NN##GIw,NNN -O#rP   zCalling gil-requiring functionrI   )rV   rW   rX   re  r   r   r  r  rh  rs  r   r<  r  rR   rP   rO   rY  rY    s9     O#J4
*'48& 3KrP   rY  c                        e Zd Zg dZdZdZdZdZdZdZ	dZ
dZd Zd Zd Zd Zd Zd	 Zd
 Zd Zd Z fdZd Z xZS )r  )rT   coerced_selfr  r   	arg_tupleNFc                     | j                   j                  |      }| j                  D cg c]  }|j                  |       }}	  || S c c}w # t        $ r}| j	                  |       Y d }~y d }~ww xY wrI   )r  r  r   r  r  )rT   r  r  r  r   r  s         rO   r  z!SimpleCallNode.compile_time_value  sp    ==33D98<		B&&t,BB	-T?" C  	-))!,,	-s   A
A 	A3A..A3c                 4   | j                   j                         }|dk(  rt        | j                        dk7  r!t	        | j                  j
                  d       y | j                  d   j                  |      }|s$t	        | j                  d   j
                  d       y t        j                  |      S |dk(  rbt        | j                        dk7  r t	        | j                  j
                  d       | j                  d   j                  |      }|j                  S y )Npointerr&   zonly one type allowed.r   zUnknown typetypeof)r  r  r   r   r   r}   r4  r   r  r  r   )rT   rn   r  r   operands        rO   r4  zSimpleCallNode.analyse_as_type  s    }}0029499~"diimm%=>yy|33C8$))A,**N;%..t44X499~"diimm%=>iil005G<<	 rP   c                     | j                   d fS rI   r   rS   s    rO   rk  z!SimpleCallNode.explicit_args_kwds  s    yy$rP   c                    | j                  |      r| S | j                  r| S d| _        d| j                  _        | j                  j	                  |      | _        | j                  }|j
                  rM|j                  rA|j                  j                  r+|j                  | _	        t        | j                        |_        | j                         }d| _        t        |      r|j                  rt        |      rd}t!        | j"                  | j$                        | _        | j&                  j	                  |      | _        | j&                  j$                  D ]  }|t)        |      z  } t+        |      | _        | j                  rm|j-                  t/        |             t0        j3                  | t5        |      | j&                  t7        t9        || j&                  j$                                    S |j:                  rwt!        | j"                  | j$                        | _        | j&                  j	                  |      j=                  |      | _        d | _        | j?                  ||       d| _         | S | j$                  D cg c]  }|j	                  |       c}| _        | jC                  |       |jD                  dk(  rd| _         | S c c}w )NTr&   Fr  )function_cnamery  r   r  )#rs  analysedr  r  r  r  r   
is_cmethodr  rT   r#  rv  is_numpy_call_with_exprsr;   r  r@   r  r}   r   ry  r>   r  add_include_filerA   NumPyMethodCallNoder  rB   rC   r8   rl   r  rh  r   rp  r  )rT   rn   r  r  has_pythran_argsr  s         rO   r  zSimpleCallNode.analyse_types  s@   ++C0K==K"#33C8==  X^^8Q8Q !DI$TYY/HL&&(	(-%3H$?$?/9#&txx		BDN!^^99#>DN~~** K $Ec$JJ K,01A,BD)((  !>x!HI&00.x8.. !28T^^=P=P!QR	 1   ""&txx		BDN!^^99#>QQRUVDNDI##Hi8DL 	 =AIIGS#++C0GDI((-((C/#	 Hs   Kc                 b    | j                   j                  }|j                  r|j                  }|S rI   )r  r   r  r  rT   r  s     rO   rv  zSimpleCallNode.function_type  s-     MM&&	!++IrP   c                    | j                   j                  }|t        u rt        | _        y |j                  r[|j                  rO| j
                  r6| j
                  j                  j                  rt        | j                  d       | j                  }n3| j
                  r| j
                  g| j                  z   }n| j                  }|j                  rN| j                   j                  j                  j                  d      }|t        j                  | _        d| _        y t        | j                   d      r| j                   j                   }nO| j                   j"                  r7| j                   j$                  r!| j                   j                  j                   }nd }|r| j                   j                  j&                  r>| j                   j                  j)                         }|D cg c]  }|j                    }}n|j+                         }t        j,                  |D cg c]  }|j                   c}|| j                  ||      }	|	st        j                  | _        d| _        y d|	_        |j                  s|	| j                   _        |	j                  | j                   _        | j1                         }nTd }	| j1                         }|j                  s6t        | j                  d|z         t        j                  | _        d| _        y t3        |j                        }
|
|j4                  z
  }t3        |      }|j4                  r||k7  rd| _        d| _        |	r|	j:                  r|j                  r|j                  s|j                  d   }|d   }|j<                  r| j
                  rX| j
                  j?                  d	jA                  t3        |	jB                        d
k  rdnd      d|	jB                  g      | _        n3|j?                  d|	jB                  |j                  jB                  g      }| j
                  r[|jD                  rtG        | j
                        }ntI        | j
                        }|jK                  |j                  |      x}| _&        n_|j                  jN                  rI|jK                  |j                  |      }|j                  jN                  rtQ        |tR              rd|_*        ||d<   d}tW        tY        |
|            D ]  }|j                  |   }|j                  }||   jK                  ||      }|j<                  r|j?                  d      }|j8                  r|dkD  r`d}n]|j                  jZ                  rG|j\                  s;|dk(  r| j
                  n)|j_                         rn|dkD  rd}|ja                  |      }|||<    tW        |
|      D ]  }||   }|j                  jZ                  rz|j                  tb        u rt        jd                  }n|j                  jg                         }|$t        | j                  |   j                  d       n|jK                  ||      x||<   }|j8                  s|dkD  sd} |rtW        |dz
        D ]  }|dk(  r| j
                  ||   }|j_                         r+|j                  j                  rB|j\                  r|j                  jZ                  re|dkD  s|dk(  sp| j
                  }ti        |j                  dd        n || j                  d d  tQ        | j                   tj              r/t        jl                  | j                   jn                        | _        n|jp                  | _        | j                   jr                  s| j                   jt                  r7| j                   j                   }|r|jv                  s|jx                  rd| _        | j                  jZ                  rtz        | _>        d| _        n=|j~                  |j                  rd| _        n| j                  j                  rd| _        | j8                  rD| j                  j                  r.t        j                  | j                  j                        | _        |j\                  | _.        | j\                  r0|j                  r$|j                  dk7  r|j                  t               |j                  dk(  r1|j~                  %|j                  t        j                  dd             |j                  d   | _J        y c c}w c c}w )Nz4Cannot call a static method on an instance variable.z
operator()rh  r   TzCalling non-function type '%s'r&   r   *'NoneType' object has no attribute '%{0}s'   .30r  PyExc_AttributeError)r   r  z@descriptor '%s' requires a '%s' object but received a 'NoneType'r  FzGcannot pass None into a C function argument that is declared 'not None'z5Python object cannot be passed as a varargs parameterTArgument evaluation order in C function call is undefined and may not be as expectedr  r  r  overflowcheck)Kr  r   r,   r$  is_static_methodrT   r  r   r}   r   r  r  r  r   re  r  r   r  r-  r  r  r[  r\  r  rv  r   optional_arg_counthas_optional_argsr   r  not_noner  formatrm   accept_builtin_subtypesCMethodSelfCloneNoder#  r  rx  r  rz   r  exact_builtin_typerangeminrl   r   r%  r  r   rh   default_coerced_ctyper   r  r  r
  r  r  r  rs  utility_code_definitionr   r   r   r  r   r  CFakeReferenceTyper  ru  #pyerr_occurred_withgil_utility_coder	   r{  rf   r  )rT   rn   r  r   overloaded_entry	functypesfr^  r  r   	max_nargsexpected_nargsactual_nargs
formal_argsome_args_in_tempsr  formal_type	arg_ctyper`  s                      rO   rp  z&SimpleCallNode.analyse_c_function_call  s   MM&&	
""DI!!i&@&@yyTYY^^== dhh VW99DYYII;*D99D!!#}}1177>>|L'&11	#, T]]G,#}}22]]''DMM,H,H#}}1177#}}!!** MM..QQS	1:;A;;/@@B))%)*c*L$((COE &11	#, EJ))&+#!&DMM**,IE**,I))dhh @9 LM&11	#,  	'	"Y%A%AA4y''Nl,J%&D"DL U%%)..A[A["*Jq'C""99 $		 ; ;DKKUXY^YcYcUdhjUjEprs4%*ZZL !< !2DI //Z%*ZZ1E1E$F 0 HC yy55.tyy9C#DII.C*---
*MMd'00mmJOOS988++
30O-2C*DG #s9l34 	A"*J$//Kq'##K5C""++]_{{q5)-&%%cii6dii3--/ 1u-1*,,S1CDG7	< y,/ 	*Aq'Cxx##88x' * : :I # > > @I$$))A,**QS %(MM)S$AADGc{{q1u%)"	*  <>* 6dii31g++-XX**YY388#7#7  1uQ499+@)  BC  D), 		! dmm[1"++DMM,D,DEDI!--DI==  DMM$>$>,,Jz66*:\:\ 99   .DDL&&2i6O6ODLYY))DL <<DII22"55dii6M6MNDI YY
JJ%%%%,  !DE$$+((0$$[%<%<=UWg%hi ^^O<[  <
 +s   &e)e.c                 "    | j                         S rI   )c_call_coderS   s    rO   r   z$SimpleCallNode.calculate_result_code  s    !!rP   c                    | j                         }| j                  t        j                  u s|j                  sy|j
                  }g }t        t        || j
                              }t        |j
                        }||j                  z
  }t        | j
                        }|d | D ]1  \  }}	|	j                  |j                        }
|j                  |
       3 |j                  rO|j                  t        t        | j                  xs  | j                   j"                  j$                                     |j                  r(||k(  rd}nd| j&                  z  }|j                  |       | j
                  t        |      d  D ]!  }	|j                  |	j)                                # | j                   j)                         ddj+                  |      d}|S )Nrh  rE  r3  r  rk  r  )rv  r   r   r,   r$  r   r   r  r   r  r   r   rD  rs   r=  wrapper_callr  r   is_unbound_cmethodopt_arg_structr   r<  )rT   r  formal_argsarg_list_coder   r  r  r  r  
actual_argarg_codeoptional_argsr   s                rO   r  zSimpleCallNode.c_call_code  s   &&(	99
---Y5K5KnnCTYY/0	'	"Y%A%AA499~&*?N&; 	/"J
%//
@$$X.	/ ##  S):):)ddmm>Q>Q>d>d%e!fg''- & %(;(; ;  /))C$4$56 	6J  !2!2!45	6 "]]113TYY}5MNrP   c                 \    | j                         }|j                  r|j                  dk(  ryy)Nr  FT)rv  r   r  r  s     rO   r   z#SimpleCallNode.is_c_result_required  s,    &&(	((I,E,E,LrP   c                    | j                   }|j                  s|j                  r%|j                  j	                  |j
                         d}| j                  j                  xr | j                  j                  }| j                  r|r|j                         |v r|j                  j                  t        j                  dd             |j                  d| j                  d   j                         d| j                  d   j                  j!                         d|j#                  | j$                        d       |j                  j&                  rNt)        | j*                  j                        d	kD  s,| j*                  j                  r*| j*                  j,                  rt.        t0        | g  |       y | j*                  j                  r| j*                  j                  d   nd }| j4                  | j6                  ||f}|D ]  }||j3                  |        |j9                  | j$                         | j:                  sJ | j=                  |       ||j                  j                  t        j                  d
d             |j                  | j                         d|j?                         d|jA                  | j                         | j$                               n|j                  j                  t        j                  dd             |j                  | j                         d|j?                         d|j?                         d|jA                  | j                         | j$                               |jC                  | j?                                |D ]'  }||jE                  |       |jG                  |       ) y )N)abslabs__Pyx_abs_longlongCommon
Overflow.cr  r   z == __PYX_MIN(z))) {                PyErr_SetString(PyExc_OverflowError,                                "Trying to take the absolute value of the most negative integer is not defined."); z; }r&   PyObjectCallNoArgrp  z = __Pyx_PyObject_CallNoArg(r   PyObjectCallOneArgz = __Pyx_PyObject_CallOneArg(rk  )$r  r  r  rt  use_entry_utility_coder   r   r  r   r  r   ru  r	   r{  r   r   r  r   r}   rl   r   ry  r   rK   r  rr  rT   rx  rl  r   rW  r   r   r  r{  r  )	rT   r   r  abs_function_cnamesis_signed_intr  r   subexprrN   s	           rO   rr  z'SimpleCallNode.generate_evaluation_code  s   ==x4433HNNCC		((=TYY-=-=-HOO4EI\4\--k.E.EhP\.]^JJ !IIaL//1 IIaL--DDF OODHH57 8 }}((C0C0C,Dq,H##(A(A.$@F )-(;(;dnn!!!$IIt00(C@ 	7G"006	7 	dhh||!!$';--k.E.E#%7/9 :JJKKM&&(++DKKM488DFG --k.E.E$&8/: ;JJKKM&&(MMO++DKKM488D	FG 	() 	)G"..t4""4(	)rP   c                 j
   | j                         }|j                  r| j                  j                         }|j                  j                  t        j                  dd             |j                  | j                         d| j                  j                         d|d|j                  | j                         | j                               |j                  | j                                y |j                  r7| j                  rDt!        | j"                        }t!        |j"                        |j$                  z
  }|j&                  j)                  |j*                  j,                  d      | _        |j                  | j.                  dt0        j2                  d	z   d
t!        | j"                        |z
  d       t5        t7        |j"                  | j"                              }||| D ][  \  }}|j                  | j.                  d|j9                  |j:                        d
|j=                  |j>                        d       ] g }	| j>                  j                  r/| j@                  r#|	jC                  d| j                         z         n| j>                  jD                  rG| j@                  sJ |	jC                  | j>                  jG                  | j                                      n|jH                  dk7  r|jJ                  }
|jH                  }|
=|	jC                  | j                         d|jL                  jO                  |
             |r/| jP                  r|	jC                  d       n|	jC                  d       | j@                  s|	ri| jS                         }| j                         rQd| j                         z  }| j@                  r4| j>                  j                  rtU        tV        | j>                  |      }nd}|jH                  dk(  rZtY        || j                  ||d| j>                  j                  r| j                         nd |jJ                  | jP                         nH|	r,|j[                  dj]                  |	      | j                        }nd}|j                  ||d|       | j>                  j                  r/| j                         r|j                  | j                                | j                  r&|j&                  j_                  | j.                         y y y )Nr>  rp  r?  rk  	, NULL); TrO  r   nr  r  rR  r  z == r   r   z%s = r  z && r  )0rv  rl   ry  r   rt  ru  r	   r{  r   r   r  r   r}   r  r$  r  r   r   r  rT  rU  op_arg_structr  r  r   pyrex_prefixr   r  opt_arg_cnamerm   r   r   r   r   r   error_conditionr  r   r  	cast_coder   r  r+   r   r   r   r<  r^  )rT   r   r  r  r  r  r   r  r  
exc_checksexc_val	exc_checkr   r  
goto_errors                  rO   rm  z#SimpleCallNode.generate_result_code  s   &&(	  ~~//1H--k.E.E 2/4 5JJKKMMM++-++DKKM488D	FG OODNN,-##%%"499~!$Y^^!4y7S7S!S&*nn&B&B++55$ 'C 'H#

++++c1DII79 : C			:;.2>,.O D*J
JJ //%33JOOD&00A C DD
 Jyy$$!!%$++-"78--||#!!$))";";DKKM"JK**c1#33%55	&%%DKKM9CXCXCbCbcjCk&lmzz"))*FG"))*<=||z&&(;;=!DKKM1C||		(=(= '~tyy#FC,,3+D$((sC<P=AYY=R=RDKKMX\,5,E,EtzzS "%)%7%7J8OQUQYQY%Z
%'
JJS#zBC99((T[[]OODNN$45%%++D,?,?@ &o $rP   )rV   rW   rX   r   rT   rx  ry  r  r  r   r  r  r  r4  rk  r  rv  rp  r   r  r   rr  rm  rY   rZ   s   @rO   r  r  w  sq     IHDLILEHM- "-^	O=b"<7)rEArP   r  c                        e Zd ZdgZdZdZd Zy)r  ry  Tc                    |j                  | j                         | j                  |       | j                  j                  J | j                  j
                  }|D ]  }|j                  |        |j                  d       |j                  d| j                         z         |j                  d| j                         d| j                         d| j                  ddj                  d |D              d		       y )
Nz.// function evaluation code for numpy functionr  r  r  r  z{}(rk  c              3   <   K   | ]  }|j                           y wrI   )r   )r^   r  s     rO   ra   z?NumPyMethodCallNode.generate_evaluation_code.<locals>.<genexpr>v  s     7Qa&&(7   )};)rl  r}   rW  ry  r   r   rr  r   r   r  r<  )rT   r   r   r  s       rO   rr  z,NumPyMethodCallNode.generate_evaluation_codeg  s    dhh!!$'~~))11~~"" 	/C((.	/ 	

CD

/$++-?@

KKMKKMII7$77	9 	:rP   N)rV   rW   rX   r   r   re  rr  rR   rP   rO   r  r  ]  s     }HGO:rP   r  c                       e Zd ZddgZdZd Zy)PyMethodCallNoder  ry  Tc                    |j                  | j                         | j                  |       | j                  j	                  |       | j
                  j                  J | j
                  j                  }|D ]  }|j	                  |        | j                  j                  }|r| j                  j                         }n|j                  j                  t        d      }| j                  j                  |       |j                  |d| j                  j                         d       | j                  j!                  |       | j                  j#                  |       |j                  j                  t        d      }|j%                  d|z         d }t'        |      dkD  r?|j                  j                  t(        j*                  d      }|j%                  d|z         d	 }| j                  j,                  r || j                        rd
nd}	n| j                  j.                  r| j                  j0                  r~| j                  j0                  D ]b  }
|
j2                  }|s|j,                  s|j4                  j6                  s6|j4                  j6                  j8                  sW ||      s`d
}	 n d}	nd}	|j%                  d|	d|d       |j%                  |d|d       |j%                  d|z         |j%                  d|z         |j;                  |t               |j;                  dt               |j=                  |d       t'        |      dkD  r|j%                  d|z         |j%                  d       |j%                  d       |s|j>                  jA                  tC        jD                  dd             |j>                  jA                  tC        jD                  dd             |j%                  | j                         d|d|d|d|d
       |jG                  |t               |j                  jI                  |       |j%                  |jK                  | j                         | j                               |jM                  | j                                nt'        |      dk(  r`|j>                  jA                  tC        jD                  dd             |j>                  jA                  tC        jD                  dd             |d   }|j%                  | j                         d|d|d|d|j                         d |d|j                         d       |jG                  |t               |j                  jI                  |       |j!                  |       |j#                  |       |j%                  |jK                  | j                         | j                               |jM                  | j                                nx|j>                  jA                  tC        jD                  d!d             |j>                  jA                  tC        jD                  d"d             d#D ]`  \  }}|j%                  d$|jO                         z         |j%                  d%|d&|d'       |j%                  d(tP        jR                  t'        |      dz   |djU                  d) |D              fz         |j%                  d*| j                         ||tP        jR                  |t'        |      ||jK                  | j                         | j                        fz         |jG                  |t               |jM                  | j                                |D ]  }|j!                  |        |j%                  d+       |j%                  d,       c |j%                  d-       |j                  j                  t        d      }|j%                  d.|t'        |      ||jK                  || j                        fz         |jM                  |       t'        |      dkD  r|j%                  d/|z         |j%                  d0|d1|d2|d3|d4	       |j                  jI                  |       t'        |      dkD  r|j%                  d       tW        |      D ][  \  }}|j                  |       |jY                  |j                                |j%                  d5||||j                         fz         ] t'        |      dkD  r|j                  jI                  |       |D ]$  }|j[                  |       |j#                  |       & |j>                  jA                  tC        jD                  d6d             |j%                  | j                         d7|d|d8|jK                  | j                         | j                               |jM                  | j                                |j]                  |t               |j                  jI                  |       t'        |      dk(  r|j%                  d       |j%                  d       |r7| j                  j!                  |       | j                  j#                  |       y |j]                  |t               |j                  jI                  |       y )9NTrO  r  r  r  r&   Fr~  c                 b    | j                   }|j                  r|j                  j                  ryyr  )r  r  r   rG  )r  r  s     rO   attribute_is_likely_methodzMPyMethodCallNode.generate_evaluation_code.<locals>.attribute_is_likely_method  s$    ((C{{syy44rP   likelyunlikelyzif (CYTHON_UNPACK_METHODS && z(PyMethod_Check(r6  z = PyMethod_GET_SELF(rl  if (likely(%s)) {z/PyObject* function = PyMethod_GET_FUNCTION(%s);r  r  r   r  rp  r  ry  z) ? __Pyx_PyObject_CallOneArg(rk  z) : __Pyx_PyObject_CallNoArg(PyObjectCall2Argsr   z) ? __Pyx_PyObject_Call2Args(z) : __Pyx_PyObject_CallOneArg(PyFunctionFastCallPyCFunctionFastCall))PyFunction_Checkr  )__Pyx_PyFastCFunction_CheckPyCz#if CYTHON_FAST_%sCALLr  r  r  zPyObject *%s[%d] = {%s, %s};c              3   <   K   | ]  }|j                           y wrI   r   r^   r  s     rO   ra   z<PyMethodCallNode.generate_evaluation_code.<locals>.<genexpr>  s     >#cmmo>r  z6%s = __Pyx_%sFunction_FastCall(%s, %s+1-%s, %d+%s); %sz} elser  r  z%s = PyTuple_New(%d+%s); %sr=  z__Pyx_GIVEREF(z); PyTuple_SET_ITEM(z, 0, r    = NULL;z PyTuple_SET_ITEM(%s, %d+%s, %s);r>  r?  r  )/rl  r}   rW  r  rr  ry  r   r   r   r   rT  rU  r   rc  r  r   r{  r  r   r   r   r  r  r  r   r   r  r   rl   ra  r  rt  ru  r	   r{  put_xdecref_clearr^  r   r  upperr   quick_temp_cnamer<  r}  r  r  ry  )rT   r   r   r  reuse_function_tempr  self_argarg_offset_cnamer  likely_methodrV  r   	test_funccall_prefix
args_tupler  s                   rO   rr  z)PyMethodCallNode.generate_evaluation_code  s   dhh!!$'..t4~~))11~~"" 	/C((.	/ #mm33}}++-H~~33Nt3THMM..t4HHHdmm.E.E.GHIMM006MM$$T*>>//4/P

<(*+t9q=#~~;;J<Q<Q^c;dJJy#334	 ==%%(B4==(QHWaM]]""t}}'='="mm44 +
"U//EIINNuyy~~GaGa1%8(0+ !+&M

}^fgh

HhGH 	

&12

DxOP.1
N3Hj1t9q=JJy#334

3

3--''(;=OPR--''(<>PQSJJKKM8h
 ""8^<NN''1JJt..t{{}dhhGHOODNN,-Y!^--''(;=OPR--''(<>PQSq'CJJKKM8hcmmo/0
 ""8^<NN''1&&t,NN4 JJt..t{{}dhhGHOODNN,---''(<>PQS--''(=?QRT*n %&	;

3k6G6G6IIJ

iBC

9++IaKII>>>	=@ @ A
 

SKKM++$I$++DKKM488DWF F G &&x@ 01 5C..t45

8$

8$-%0 JJsO55nQU5VJJJ4CI'7''
DHH=8? ? @ OOJ'4y1}

;12JJ*h: ;NN''14y1}

3#D/ G3((.  1

=#3S]]_AF F GG
 4y1}++,<= %11$7t$% --''8JKMJJKKMj++DKKM488DFG
 OODNN,-!!*n=NN''
34yA~

3JJsOMM006MM$$T*!!(N;NN''1rP   N)rV   rW   rX   r   r   rr  rR   rP   rO   r  r  y  s     K(HGn2rP   r  c                   6    e Zd ZddgZdZeZdZdZd Z	d Z
d Zy)InlinedDefNodeCallNoder   function_namer&   Nc                     | j                   j                  }|j                  s|j                  ryt	        |j
                        t	        | j
                        k7  ry|j                  ryyr  )r  def_nodestar_argstarstar_argr   r   num_kwonly_argsr  s     rO   can_be_inlinedz%InlinedDefNodeCallNode.can_be_inlinedA  sP    ==))	!7!7y~~#dii.0$$rP   c                    | j                   j                  |      | _         | j                  D cg c]  }|j                  |       c}| _        | j                  j                  }t        | j                        }d}t        |      D ]  }|j                  |   j                  }| j                  |   j                  ||      }|j                  r|dkD  rNd}nK|j                  j                  r5|j                  s)|j                         rn|dkD  rd}|j                  |      }|| j                  |<    |rt        |dz
        D ]{  }| j                  |   }|j                         r#|j                  j                  r:|j                  r|j                  j                  r]|dkD  sct        |j                   dd        | S  | S c c}w )NFr   Tr&   r  )r  r  r   r  r  r   r  r   r  r   rl   r   r%  r  r  r   r}   )rT   rn   r  r  r  r  r  r  s           rO   r  z$InlinedDefNodeCallNode.analyse_typesK  s   !//==cB8<		Cc'',C	MM**	499~ #|$ 	A#..+00K))A,((c:C{{q5)-&%%cii++- 1u-1*,,S1CDIIaL'	*  <>* iil++-XX**YY388#7#7  1u)  BC  D'& i Ds   Gc                    | j                   j                         g}| j                  j                  }t	        | j
                  |j
                        D ]e  \  }}|j                  j                  r+|j                  |j                  |j                               G|j                  |j                                g dj                  |      }|j                  | j                         d| j                  j                  j                  j                  d|d|j                  | j                         | j                                |j#                  | j                                y )Nrk  r  r  r   )r  r   r  r  r  r   r   rl   r   r   r   r<  r   r   pyfunc_cnamer   r}   r  )rT   r   r  r  r  	proto_args         rO   rm  z+InlinedDefNodeCallNode.generate_result_code  s    &&0023MM**	!$))Y^^< 	.NCxx##inn =>

-		.
 99X&

&&,,99''txx@	B	C 	()rP   )rV   rW   rX   r   r   r   r   r  r  r  r  rm  rR   rP   rO   r  r  4  s2     (HGDHM7r*rP   r  c                   *    e Zd Zg ZddZd Zd Zd Zy)PythonCapiFunctionNodeNc                 :    t         j                  | |||||       y )N)rm   r   r   rs  rJ  )rT   r}   py_namer   r  rs  s         rO   rQ  zPythonCapiFunctionNode.__init__  s#    $'(| 	 	ErP   c                     | S rI   rR   r	  s     rO   r  z$PythonCapiFunctionNode.analyse_types  r  rP   c                 h    | j                   r&|j                  j                  | j                          y y rI   )rs  rt  ru  rb  s     rO   rm  z+PythonCapiFunctionNode.generate_result_code  s*    --d.?.?@ rP   c                     | j                   S rI   ri  rS   s    rO   r   z,PythonCapiFunctionNode.calculate_result_code  r  rP   rI   )rV   rW   rX   r   rQ  r  rm  r   rR   rP   rO   r  r    s    HEArP   r  c                       e Zd ZdZ	 ddZy)PythonCapiCallNodeFNc                     |j                   | _        | j                  | _        t        |||||      | _        t        j                  | |fi | y )N)rs  )r  r   r   r  r  r  rQ  )rT   r}   r  r  rs  r   r  s          rO   rQ  zPythonCapiCallNode.__init__  sJ    ))	 II.-')
 	c4V4rP   rm  )rV   rW   rX   re  rQ  rR   rP   rO   r  r    s     O /3	5rP   r  c                   6     e Zd ZddgZdZ fdZd Zd Z xZS )CachedBuiltinMethodCallNoder  r   Tc                 t    t         t        |   |j                  ||||j                  |j
                         y )N)r  r   r   re  r   )rK   r  rQ  r}   re  r   )rT   	call_noder  r   r   rN   s        rO   rQ  z$CachedBuiltinMethodCallNode.__init__  s6    )49MM4%55	 	: 	!rP   c                 \    | j                   | j                   S t        j                  |       S rI   )re  r   r  rS   s    rO   r  z'CachedBuiltinMethodCallNode.may_be_none  s+    +'''##D))rP   c           
         | j                   j                  j                  }| j                   j                         }| j                  D cg c]  }|j                          }}|j
                  j                  ||| j                  |      }|j                  | j                         d|d|j                  | j                         | j                               |j                  | j                                y c c}w )Nr  r  )r  r   r   r   r   rt  cached_unbound_method_call_coder   r   r   r   r}   r  )rT   r   
type_cname	obj_cnamer  r   	call_codes          rO   rm  z0CachedBuiltinMethodCallNode.generate_result_code  s    XX]]((
HH&&(	+/995C55$$DDz4#3#3T;	

KKM9##DKKM488<
 	 	& 6s   	C9)	rV   rW   rX   r   r   rQ  r  rm  rY   rZ   s   @rO   r  r    s"     vHG!*

'rP   r  c                   N    e Zd ZeZg dZej                  Zd Z	d Z
d Zd Zd Zy)GeneralCallNode)r  r  r  c                    | j                   j                  |      }| j                  j                  |      }| j                  j                  |      }	  ||i |S # t        $ r}| j                  |       Y d }~y d }~ww xY wrI   )r  r  r  r  r  r  )rT   r  r  r  r  r  s         rO   r  z"GeneralCallNode.compile_time_value  sx    ==33D9..AA$G((;;DA	-_=== 	-))!,,	-s   A 	A?$A::A?c                     | j                   r| j                   j                  r| j                  j                  st	        | j
                  d      | j                  j                  | j                   fS )Nz0Compile-time keyword arguments must be explicit.)r  r  r  r   r   r}   r   rS   s    rO   rk  z"GeneralCallNode.explicit_args_kwds  s]    d&7&7&G&G((@@txxBD D##(($*;*;;;rP   c                    | j                  |      r| S | j                  j                  |      | _        | j                  j                  j                  s| j                  j                  j
                  rt        | _        | S t        | j                  d      r| j                         }||| ur|j                  |      S | j                  j                  j                  r!| j                  j                  |      | _        n<|| u rt        | j                  d       n!n | j                  j                  |      | _        | j                  r | j                  j                  |      | _        | j                  j                  |      | _        | j                  j                  |      | _        | j!                  | j                         d| _        | S )Nr   zRNon-trivial keyword arguments and starred arguments not allowed in cdef functions.r&   )rs  r  r  r   rl   r  r,   r  map_to_simple_call_noder   r   r  r   r}   r  r  rh  r   r  s      rO   r  zGeneralCallNode.analyse_types  sl   ++C0K33C8}}!!--}}!!**&	t}}g.335#D(8--c22]]((44$(MM$D$DS$IDMT\$((EF
  $ @ @ E $ 1 1 ? ? DD#33AA#F  33C8 	.rP   c                 x	   t        | j                  t              s| S | j                  j                  s| S | j
                  }t        |dd      }|s| S |j                  }|j                  r|j                  }|j                  s| S | j                  j                  }| j                  }|j                  }|j                  r|dd }t        |      t        |      kD  r.t        | j                  dt        |      t        |      fz         yt!        |dt        |       D cg c]  }|j"                  r|j"                   c}      }|t        |      d }	d}
t%        |      }t!        |      }d}|j&                  D ]H  }|j(                  j*                  }||v rt        |j                  d|z         d}|j-                  |       J t/        |	|j&                        D ]]  \  }}|j(                  j*                  }|j"                  |k(  r2|j-                  |       |
dz  }
|j1                  |j*                         ] n dd	lm}m} g }t        |j&                        |
kD  r|t        |      d }	t9        t;        |j&                        D cg c]+  \  }}|j(                  j*                  |t        |      z   |ff- c}}      }d}|	D ]  }|j"                  }||vr|s|}|r+|j<                  r| c S t        | j                  d
|z          y||   \  }}|j-                  |       |
dz  }
|j*                  j?                         r|j1                  |j*                          ||j*                        }|j?                         sJ |j1                  |       |j1                  ||f        |rg }g }|d   d   }|D ]T  }||u r nN|j?                         r|j1                  |       + ||      }|j1                  |       |j1                  |       V |r|}|tA        |      D cg c]  \  }}|	 c}}z   }|j&                  D ]8  }|j(                  j*                  }||vsd}t        |j                  d|z         : |rytC        | j                  ||      }|ddd   D ]  } |||      } |S c c}w c c}}w c c}}w )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 %sr   Fzargument '%s' passed twiceT)r  
LetRefNodez(C function call is missing argument '%s'r  z/C function got unexpected keyword argument '%s'r  )"rz   r  r  r  r  r  r   r   r  r  r$  r   r  r   r   r}   r   rm   r   rn  rj  r   addr  r   r  r  r  r  r}  r   r  sortedr  )rT   r  r   rv  pos_argsr  declared_argsr  matched_argsunmatched_argsmatched_kwargs_countr   seen
has_errorsrm   decl_argr  r  tempsr  keywordsfirst_missing_keywordr}   r  
final_args	new_tempsfirst_temp_arg	arg_valuer   s                                rO   r  z'GeneralCallNode.map_to_simple_call_node  s    $..	:K  00K=='40K

)33M))K'',,""%**)!"-Mx=3}--$(( 2585G58]5DD E ~H1N +# # !XX + ,&s8}~6 H~ < 
)) 	C77==Dt|cgg;dBC!
HHTN	 !1G1GH 	MHc77==D}}$  &$)$CII&	 	@v%%&)==*3t9:6N,5f6L6L,MP"(!S  #ww}}qX.DE P QH$(!* .}}x'004-*((
  $$(( %46K%L M#D>S  &$)$99&&(KK		*%cii0D>>++KK%LL#t-7.: 
	!&q"!% 0I N2 **,")))4))4!((."))$/0 %D!ve}$Feac$FF )) 	C77==D<'!
cggG		  dhhE$B$K 	4D'd3D	4M+DP` %Gs   R+0R0
R6c                 *   | j                   j                  ry | j                  r| j                  j                         }nd}|j                  j                  t        j                  dd             |j                  | j                         d| j                  j                         d| j                  j                         d|d|j                  | j                         | j                        	       |j                  | j                                y )NrE  r>  rp  r?  rk  r   )r   r  r  r   rt  ru  r	   r{  r   r   r  r  r   r}   r  )rT   r   r  s      rO   rm  z$GeneralCallNode.generate_result_code  s    99v&&002FF))+*A*A.+0 	1

'')$$..0''txx@B	C 	()rP   N)rV   rW   rX   r   r   r   r'   r;  r<  r  rk  r  r  rm  rR   rP   rO   r  r    s3     D>H..K-<@HT*rP   r  c                   P    e Zd ZdgZdZd Zd Zd Zd Ze	j                  ZdZd Zy	)
AsTupleNoder  r&   c                 L    t        | j                  j                        | _        y rI   )r   r  r{   rS   s    rO   r   z%AsTupleNode.calculate_constant_result  s    $TXX%=%=>rP   c                     | j                   j                  |      }	 t        |      S # t        $ r}| j	                  |       Y d }~y d }~ww xY wrI   )r  r  r   r  r  )rT   r  r  r  s       rO   r  zAsTupleNode.compile_time_value  sF    hh))$/	-: 	-))!,,	-s   
( 	AAAc                     | j                   j                  |      j                  |      | _         | j                   j                  t        u r| j                   j                  d      S t        | _        | S Nr  )r  r  r  r   r   r  r	  s     rO   r  zAsTupleNode.analyse_types  sU    88))#.AA#F88==J&88--.QRR	rP   c                      yr@  rR   rS   s    rO   r  zAsTupleNode.may_be_none  r  rP   Constructing Python tuplec                 b   | j                   j                  t        t        fv rdnd}|j	                  | j                         d|d| j                   j                         d|j                  | j                         | j                               |j                  | j                                y )N__Pyx_PySequence_TuplePySequence_Tupler  r  r   )
r  r   r   r   r   r   r   r   r}   r  )rT   r   r'  s      rO   rm  z AsTupleNode.generate_result_code  s|    ,0HHMMnj=Y,Y(_q

txx))+''txx@B	C
 	()rP   N)rV   rW   rX   r   r   r   r  r  r  r'   r;  r<  r  rm  rR   rP   rO   r,  r,    s9     wHG?- ..K-K*rP   r,  c                   R    e Zd ZdgZdZeZdZd Zd Z	d Z
d Zd Zd	 Zd
Zd Zd Zy)MergedDictNoder  r&   Tc                 
   i }| j                   }| j                  D ]_  }|j                  rd |j                  D        }n|j                  j                         }|D ]  \  }}|r||v rt        d|z        |||<     a || _        y )Nc              3   R   K   | ]  \  }}|j                   |j                   f ! y wrI   r{   )r^   rj  r   s      rO   ra   z;MergedDictNode.calculate_constant_result.<locals>.<genexpr>  s/      A'S% --u/D/DE As   %'$duplicate keyword argument found: %s)reject_duplicatesr  r  rn  r{   	iteritemsr   )rT   r   r<  r   rq  rj  r   s          rO   r   z(MergedDictNode.calculate_constant_result  s     22%% 	$D##A+/+?+?A ,,668# $
U$$%Kc%QRR#s$	$  &rP   c           	         i }| j                   }| j                  D ]  }|j                  r?|j                  D cg c]'  \  }}|j	                  |      |j	                  |      f) }}}n|j	                  |      j                         }	 |D ]  \  }}|r||v rt        d|z        |||<      |S c c}}w # t        $ r}| j                  |       Y d }~d }~ww xY w)Nr;  )	r<  r  r  rn  r  r=  r   r  r  )	rT   r  r   r<  r   rj  r   rq  r  s	            rO   r  z!MergedDictNode.compile_time_value  s     22%% 	1D## ,0+?+?A'S% 0068P8PQU8VW A A //5??A1"' (JC(SF]()ORU)UVV"'F3K(	1 A  1--a001s   ,B0	#B66	C?CCc                      yr  rR   r	  s     rO   r   z MergedDictNode.type_dependencies      rP   c                     t         S rI   r   r	  s     rO   r   zMergedDictNode.infer_type  s    rP   c                     | j                   D cg c]1  }|j                  |      j                  |      j                  d      3 c}| _         | S c c}w )Nz1argument after ** must be a mapping, not NoneType)r  r  r  r  rT   rn   r  s      rO   r  zMergedDictNode.analyse_types  sX    
 ((	
  c"55c:LLCE
 
s   6Ac                      yr@  rR   rS   s    rO   r  zMergedDictNode.may_be_none   r  rP   Constructing Python dictc                 
   |j                  | j                         | j                  |       t        | j                        }t        |      }|j                  |       |j                  t        ur"|j                  d|j                         z         |j                  rV|j                  |       |j                  | j                         d|j                         d       |j                  |       n|j                  | j                         d|j                         d|j                  | j                         |j                               |j!                  | j                                |j#                  |       |j                  t        ur|j                  d       |j                  | j                         d|j                         d|j                  | j                         | j                               |j!                  | j                                |j#                  |       |j                  d	       |j%                  |       t'               }|D ]  }|j                  rj|j(                  D ]X  }|j                  |       | j*                  r|j                  d
| j                         d|j,                  j                         d       |j/                  d       |j                  d|j,                  j                         d|j1                  | j                               |j                  d	       |j3                  |j,                  j                  d| j                         d|j,                  j                         d|j4                  j                         d       |j#                  |       |j%                  |       [ {|j                  |       | j*                  rQ|j/                  d       |j3                  |j                  d| j                         d|j                         d       n|j/                  d       |j                  d| j                         d|j                         d       |j                  d|j                         z         |j                  |j1                  |j                               |j                  d	       |j#                  |       |j%                  |        t7        |      D ]1  }|j8                  j;                  t=        j>                  |d             3 y )Nz$if (likely(PyDict_CheckExact(%s))) {r  r  z = PyDict_Copy(r   r  z9 = PyObject_CallFunctionObjArgs((PyObject*)&PyDict_Type, r  r   if (unlikely(PyDict_Contains(rk  r6  RaiseDoubleKeywords+__Pyx_RaiseDoubleKeywordsError("function", PyDict_SetItem(r  MergeKeywordsz__Pyx_MergeKeywords(RaiseMappingExpectedzif (unlikely(PyDict_Update(z	) < 0)) {zVif (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseMappingExpectedError(%s);FunctionArguments.c) rl  r}   rW  r  r  r  rr  r   r   r   r   r  rc  r   r  r   r  r{  r  r   rn  r<  rj  r  r   r  r   r  rt  ru  r	   r{  )rT   r   r   r   helpersr  helpers          rO   rr  z'MergedDictNode.generate_evaluation_code%  s   dhh!!$'D%%&Dz%%d+99I%JJ=~~'( ) %%d+JJT[[]DNN4DEF..t4JJ ''txx@B C OODKKM*''-99I%JJz"JJ ''txx@B C OODNN,-''-JJsO% &	&D##// )C006--

 KKMGG--/$1 2  $9:

GG--/ OODHH5$7 8 

3))#''++))+		++-8/ 0 ..t4NN4(#)& --d3))KK0))$((t~~'759 : KK 67JJt~~'7 9 :JJ  FHLHX Y ZJJttxx89JJsO++D1%M&	&P Wo 	fF--k.E.EfNc.de	frP   c                 H    | j                   D ]  }|j                  |        y rI   )r  r  rT   r   r   s      rO   r  zMergedDictNode.annotatet  s#    %% 	 DMM$	 rP   N)rV   rW   rX   r   r   r   r   r<  r   r  r   r   r  r  r  rr  r  rR   rP   rO   r7  r7    sN    
 HGD&$( -KMf^ rP   r7  c                      e Zd ZdZdgZej                  ZdZdZ	dZ
dZdZdZd Zd Zd	 Zd
 Zd Zd Zd Zd Zd&dZd Zd Zd Zd Zd Zd Zd Zd'dZd(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% Z,y)+r  r&   r  Nr   TFc                     t        | j                  t              r1| j                  j                  r| j                  dk(  s| j                  S | j                  j                         }|r|d| j                  S y )Nparallelr   )rz   r  r  rO  r  r  )rT   cys     rO   r  z!AttributeNode.as_cython_attribute  sZ    txx*))+->>!XX))+ $..11rP   c                     |t         u rQ| j                  }|rC|j                  r7|j                  r+d| _        |j                  | _        | j                  |       | S t        j                  | ||      S r  )r   r   r$  r   r   analyse_as_python_attributer   r  )rT   r  rn   r   s       rO   r  zAttributeNode.coerce_to  sd     ~%JJE++0A0A "..
005!!$#66rP   c                     | j                   }|j                  d      r|j                  d      ry t        | j                  j
                  |      | _        y )N__)r  
startswithendswithr   r  r{   )rT   r  s     rO   r   z'AttributeNode.calculate_constant_result  s>    ~~??4 T]]4%8&txx'?'?FrP   c                 0   | j                   }|j                  d      r+|j                  d      rt        | j                  d|z         y | j
                  j                  |      }	 t        ||      S # t        $ r}| j                  |       Y d }~y d }~ww xY w)NrZ  z6Invalid attribute name '%s' in compile-time expression)
r  r[  r\  r   r}   r  r  r   r  r  )rT   r  r  r  r  s        rO   r  z AttributeNode.compile_time_value  s    ~~??4 T]]4%8$((JTQShh))$/	-3%% 	-))!,,	-s   %A1 1	B:BBc                 8    | j                   j                  |      S rI   )r  r   r	  s     rO   r   zAttributeNode.type_dependencies      xx))#..rP   c                 |   | j                  |d      }|u|j                  j                  rI|j                  j                  j                  r)t	        j
                  |j                  j                        S |j                  j                  S | j                  |      }||j                  j                  S | j                  j                  |      }| j                  ||       |j                  r| j                  j                  rt        S | j                  r| j                  j                  rt        S | j                  S )NFtarget)obj_type)#analyse_as_cimported_attribute_noder   r   r$  r   r  analyse_as_type_attributer  r   analyse_attributer  r   r  )rT   rn   r   rc  s       rO   r   zAttributeNode.infer_type  s    77E7Jzz4::??#?#?!**4::??;;zz&--c2::??"88&&s+sX6##		(>(> "!ZZDJJ11 "!yyrP   c                      y rI   rR   r	  s     rO   r
  z(AttributeNode.analyse_target_declaration  r  rP   c                    | j                  |d      }|j                  j                  r#t        | j                  d| j
                  z         |j                         s#t        | j                  d| j                  z         |S )Nr&   ra  z"Assignment to const attribute '%s'r  )r  r   r  r   r}   r  r   r  s      rO   r  z"AttributeNode.analyse_target_types  sc    !!#!299$((@4>>QR~~$((CdiiOPrP   c                     |j                   d   | _        | j                  ||      }||s| j                  |      }|| j	                  ||      }|J |j
                  rd|j
                  _        |j                  r|j                  |       |S )Nr;  T)	rf   r>  rd  re  "analyse_as_ordinary_attribute_noder   r  r  wrap_obj_in_nonecheck)rT   rn   rb  r   s       rO   r  zAttributeNode.analyse_types  s    !$0B!C77VD<11#6D<::3GD##::"DJJO&&s+rP   c                 j   | j                   j                  |      }|r|j                  | j                        }|rC|j                  s$|j
                  s|j                  s|j                  r| j                  |||      S | j                  |      r%t        | j                  d| j                  z         | S y )Nz&cimported module has no attribute '%s')r  r1  r+  r  rb  r$  r5  r  as_name_noderR  r   r}   )rT   rn   rb  module_scoper   s        rO   rd  z1AttributeNode.analyse_as_cimported_attribute_node  s    
 xx11#6 ,,T^^<E$$(:(:}}((eV<<66s;dhh H4>> YZrP   c                 L   | j                   j                  ry | j                   j                  |      }|r|j                  s|j                  s|j
                  r|j                  j                  | j                        }|r|j                  s$|j
                  r|j                  j                  r|j                  r| j                  sy |}n|j                  rt        |j                  d      s|j                  }|j                  j                  s"|j                   r#|j                   j"                  r|j                  }n|j
                  r6t%        | j&                  |j(                  d|       t*        j,                  }nt/        j.                  |j                        }|j0                  d d  |_        t+        j2                  d|dd       |j0                  d<   n'|j4                  d|j6                  }|j                  }t9        j:                  |j(                  ||      }d|_        |j                  |_        d|_        |j                  |_        | j?                  ||d      S y |j@                  r| j                  |jB                  v rp|jD                  jF                  D ]1  }|j(                  | j                  k(  s| j?                  ||d      c S  t%        | j&                  | j                  d	|       y t%        | j&                  | j                  d	|       y )
Nr  z not a static member of rT   r   ->r&   Fra  z not a known value of )$r  r   r4  r  r  r  r  r+  r  r  r   r$  r  
func_cnamer  r  parent_scopeis_cpp_class_scoper   r}   rm   r   r,   r  r   r  vtabptr_cnamer   r   rN  r  rm  r  rp  r   enum_values)rT   rn   r   r   
ubcm_entryr   r   s          rO   re  z'AttributeNode.analyse_as_type_attribute  sh   
 88%%xx'',%%)=)=ARAR

..t~~>e..$2C2C

H_H_++#~~#'%*
 !++GEJJ4X$)$4$4E$zz::$'$4$49I9I9\9\(-

!%!2!2 %dhhRWR\R\^b0c d(2(=(= )-		%**(=-2ZZ]
0:0G0GPTV\^b0c

1040B0BEKK$PE$)JJE%+\\%**eU%K
23
/050@0@
-89
5+0;;
(,,S*U,KK  >>T[[0!%!7!7 _ ::7#'#4#4S%#4#NN_ dhhX\(]^  $((DNNTX$YZrP   c                 T   | j                   j                  |      }|r|j                  | j                        S | j                   j                  sZ| j                   j                  |      }|r=t        |d      r1|j                  %|j                  j                  | j                        S y )Nr  )r  r1  lookup_typer  r   r4  r  r  )rT   rn   rn  r  s       rO   r4  zAttributeNode.analyse_as_type8  s    xx11#6++DNN;;xx))005IWY8Y__=X 224>>BBrP   c                     | j                   j                  |      }|ra|j                  | j                        }|rD|j                  r8|j
                  j                  s|j
                  j                  r|j
                  S y rI   )r  r1  r+  r  r5  r   r  r  rT   rn   rn  r   s       rO   r6  z'AttributeNode.analyse_as_extension_typeB  s^     xx11#6 ,,T^^<E:://5::3M3M ::%rP   c                     | j                   j                  |      }|r5|j                  | j                        }|r|j                  r|j                  S y rI   )r  r1  r+  r  r2  rz  s       rO   r1  zAttributeNode.analyse_as_moduleM  sE     xx11#6 ,,T^^<E&rP   c                     t         j                  | | j                  |      }|r|j                  |      }n|j	                  |      }d|j
                  _        |S )N)rm   r   r&   )r  r  r  r  r#  r   r  )rT   rn   r   rb  r   s        rO   rm  zAttributeNode.as_name_nodeW  sR     !!$T^^5!I,,S1D,,S1D

rP   c                 z   | j                   j                  |      | _         | j                  |       | j                  r#| j                  j                  r| j
                  s	 | j                  r|sd| _        t        | _	        | S |r6| j                   j                  j                  rt        | j                  d       | S )Nr&   z'Assignment to an immutable object field)r  r  rf  r   r  r  
is_py_attrr   r   r   r   r  r   r}   )rT   rn   rb  s      rO   rj  z0AttributeNode.analyse_as_ordinary_attribute_nodeb  s    88))#.s#::$**// ?? $2!
 	 55$((EF rP   c                    |d u}d| _         | j                  | _        |w| j                  j                  j
                  s | j                  j                  j                  r | j                  j                  |      | _        | j                  j                  }n|j
                  s|j                  rt        }|j                  s|j                  r|j                  }d| _        nG|j                  s|j                  rd| _        n'|j                  r|j                   rd| _        nd| _        |j"                  r|j%                         r|j&                  j)                  | j                        }|j*                  r|s| j                  dk(  rJd| _        d| _        d| _        | j                  j                  j3                  | j4                        | _        y |j7                  | j                  || j4                         |j&                  j)                  | j                        }|r>|j8                  r2d }n/t;        | j4                  d|z         t<        j>                  | _        y || _         |ry|j                  r%|jB                  dk(  rt;        | j4                  d       |jD                  r|jF                  r|jH                  r#|j                  | _        |jJ                  | _        y 	 | jM                  |||       y )	Nr   rp  r   TTz/Cannot select attribute of incomplete type '%s'__weakref__z,Illegal use of special attribute __weakref__)'r~  r  rr  r  r   rn  ro  r  r   r  r#  r  r  r  r  r  is_fake_referencehas_attributesattributes_knownr  r+  r   is_memslice_transposer   rV  	transposer}   declare_attributer  r   r   r,   r   rm   r9  rE  r  r   rX  )rT   rn   rc  immutable_objr   s        rO   rf  zAttributeNode.analyse_attributeu  s7    ,nnxx}}&&$((--*H*H8866s;xx}}H!!X%>%>)??h//))HDG''8+C+CDG""x'A'ADGDG""((* 224>>B..u~~,592'+/3,$(HHMM$;$;DHH$E	 224>>3Q ( : :4>> JU__ EdhhE  '11	DJ--%**2M$(($RS %%e.C.CHXHX %

DI"'++DK
 
 	((hFrP   c                    || j                   j                  }|j                  | j                        | _        | j                  | _        t
        | _        d| _        |j                  s|j                  sr|j                  sj|j                  s^|j                  sR|j                  sF|j                  s:|j                  r|j                  |      s|j                   r5|j                  |      r$|s!| j                   j#                  |      | _         y y |j$                  r| j                   j&                  s| j                   j(                  rx| j                   j*                  j,                  rX| j                   j*                  j,                  j                  j                  r$|s!| j                   j#                  |      | _         y y t/        | j0                  d|d| j                  d       y y y )Nr&   zObject of type 'z' has no attribute 'r  )r  r   mangle_class_private_namer  rr  r   r~  rl   r  rn  r  r?  r   r_  r  can_coerce_to_pyobject	is_structr  r$  r  r  r   r   r   r}   )rT   rn   rc  r  s       rO   rX  z)AttributeNode.analyse_as_python_attribute  s]   xx}}H66t~~Fnn"	##H,=,=""h&<&<%%)D)D&&&&8+J+J3+O&&8+J+J3+O$#xx::3?DH %''TXX-=-=AVAVhhnn00hhnn0055AA$#xx::3?DH % dhh12! ->#rP   c                 L   |j                   d   sy d }d}| j                  j                  j                  rQ| j                  rE| j
                  s9dj                  t        | j                        dk  rdnd      }| j                  f}ny| j                  j                  j                  rY| j                  rd}nJ| j                  j                  j                  j                  | j                        }|rd}|j                  f}|r$| j                  j                  |d	|
      | _        y y )Nr(  rR   r  r  r  r  z&Cannot transpose None memoryview slicez5Cannot access '%s' attribute of None memoryview slicer  r  )rf   r  r   r  needs_none_checkr~  r  r   r  r   r  r  r+  rm   r  )rT   rn   r  r  r   s        rO   rk  z#AttributeNode.wrap_obj_in_nonecheck  s    ~~k*HHMM++0E0E>EEsSWSaSaObfhOhenpqC>>+KXX]]--))>++77GQC#(::-Kxx11#7M>I 2 KDH rP   c                 >    | j                   r| j                          y y rI   )r~  r;  r	  s     rO   r<  zAttributeNode.nogil_check  s    ??NN rP   zAccessing Python attributec                 8    | j                   j                  |      S rI   )r  rR  r	  s     rO   rR  z0AttributeNode.is_cimported_module_without_shadow  s    xx::3??rP   c                     | j                   r,| j                         xs | j                   j                         S t        j                  |       S rI   )r  rI  r  r  rS   s    rO   r  zAttributeNode.is_simple  s;    88&&(@DHH,>,>,@@%%d++rP   c                 F    | j                   ryt        j                  |       S r"  )r  r  r   rS   s    rO   r   zAttributeNode.is_lvalue  s    88%%d++rP   c                 x    | j                   r| j                   j                         S t        j                  |       S rI   )r  r   r  rS   s    rO   r   zAttributeNode.is_ephemeral  s-    8888((**((..rP   c                    | j                   }|j                  |j                        }| j                  r| j                  j                  r|j                  j
                  r| j                  j                  s| j                  j                  r| j                  j                  S | j                  j                  r| j                  j                  | _
        d|j                  j                  d|| j                  |j                  j                  d| j                  S | j                  r| j                  S y |j                  j                  r!d| j                  j!                         d|dS |j                  j"                  rM| j                  rA| j                  j$                  r+|j                  j'                  |j)                         d      }|| j                  | j                  S )	Nz	((struct z *))->__Pyx_Cr  r  T)to_object_struct)r  r   r   r   r  r  is_builtin_cmethodfinal_func_cname
from_fusedr   rr  vtabstruct_cnamer  vtabslot_cnamerS  r  r  r  r9  r  r   )rT   r  obj_codes      rO   r   z#AttributeNode.calculate_result_code  sO    hh==*::$**//xx))$**2O2O::..::66699''
 #'**"2"2DK HH--xHH++T[[: : $${{"
 XX  &*kk&7&7&98DDxx''DJJ4::;Q;Q88--cjjlt-T'$++>>rP   c                    | j                   r| j                  r2|j                  j                  t	        j
                  dd             d}n1|j                  j                  t	        j
                  dd             d}|j                  | j                         d|d| j                  j                         d|j                  | j                        d	|j                  | j                         | j                        	       |j                  | j                                y | j                  j                   r1| j"                  r| j                  j$                  D ]"  \  }}|d
k(  st'        | j                  d        y  |j                  | j                         d| j                  j                         d       |j)                  | j                         d       d}|j                  |j+                  || j                         z  | j                               y | j,                  r@|j                  d| j                         d|j/                  | j                        d       y y | j                  j                  r!| j                  j                  j0                  ry | j2                  r=| j2                  j4                  r&|j                  j7                  | j2                         y y y )NPyObjectLookupSpecialrp  __Pyx_PyObject_LookupSpecialPyObjectGetAttrStr__Pyx_PyObject_GetAttrStrr  r  rk  r   r  z=Transposing not supported for slices with indirect dimensionsr  Tre  z"__pyx_memslice_transpose(&%s) == 0zif (unlikely(!zR.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");r   )r~  is_special_lookuprt  ru  r	   r{  r   r   r  r   rw  r  r   r}   r  r   r   r  r  r   rg  r   r>  r   r  r   r  r  )rT   r   lookup_func_namer  r  r  s         rO   rm  z"AttributeNode.generate_result_code-  s#   ??%%  11++,CEWXZ#A   11++,@BTUW#> JJKKM$HH&&(**4>>:++DKKM488DFG OODNN,-YY))))'+yy~~ OFGdhh )C D	 

8IJK///M8

4--a$++-.?JK''


  ;;=$//$((*C	EF ( xx}}!@!@

 5 5  77

C !6rP   c                 X   | j                   r| j                  j                  rr| j                  rf|j	                  | j                         d       |j                  d| j                         z         |j                  d| j                         z         y t        j                  | |       y )NTre  rw  rx  )	r   r   r   r  rz  r   r   r   r{  rb  s     rO   r{  z$AttributeNode.generate_disposal_code]  s{    <<DII88T=W=W,,KKMD - 2JJ+dkkm;<JJ(4;;=89++D$7rP   c                 B   | j                   j                  |       | j                  r|j                  j	                  t        j                  dd             |j                  | j                  d| j                   j                         d|j                  | j                        d|j                         d       |j                  |       |j                  |       n
| j                   j                  j                  r|j!                  d| j"                  j%                         d| j                   j'                  | j                   j                        d|j'                  | j)                               d       |j                  |       |j                  |       nI| j+                         }| j                  j,                  rn| j.                  rb|j1                  |       |j3                  |j                                |j5                  |       |j7                  || j)                                nI| j                  j8                  r3d	d
lm} |j?                  |||j+                         | j                  |       | j                  j8                  s4|j!                  |d|j'                  | j)                               d       |jA                  |       |j                  |       | j                   j                  |       | j                   j                  |       y )Nr  rp  z__Pyx_PyObject_SetAttrStr(rk  r  __Pyx_SET_Cr  rl  r&   r  r  r  )!r  rr  r~  rt  ru  r	   r{  r  r}   r   rw  r  r{  r  r   r  r   rr  r  r   r   r   rl   rV  rc  r  r  r  r   r  r  put_assign_to_memviewslicer  )rT   r   r   r  r  r   select_coder  s           rO   r  z&AttributeNode.generate_assignment_codeg  s'   ))$/??--''(<>PQS!!$((HH&&(**4>>:MMO%&
 &&t,NN4 XX]]%%JJ!!#""488==1djjl+- . &&t,NN4 ++-Kyy$$)=)=((.  1,TZZ\:--(55#S#**,		4I 99//

#djjl356
 --d3NN4 ''-D!rP   c           	      v   | j                   j                  |       | j                  sB| j                  j                  j
                  rd| j                  j                  j                  v r|j                  j                  t        j                  dd             |j                  | j                  d| j                   j                         d|j                  | j                        d       nt!        | j                  d       | j                   j#                  |       | j                   j%                  |       y )N__del__r  rp  r  rk  r  z+Cannot delete C attribute of extension type)r  rr  r~  r   r  is_property_scopeentriesrt  ru  r	   r{  r  r}   r   rw  r  r   r{  r  r  s      rO   r  z$AttributeNode.generate_deletion_code  s    ))$/??tzz//AA#-1A1A1I1I#I--''(<>PQS!!$((HH&&(**4>>:<=
 $((IJ''-D!rP   c           
          | j                   rd\  }}nd\  }}|j                  | j                  t        ||| j                  z  t        | j                                     y )N)py_attrzpython attribute (%s))c_attrzc attribute (%s)r  )r~  r  r}   r1   r   r   r  )rT   r   r  r  s       rO   r  zAttributeNode.annotate  sK    ??<KE46KE4dhhudTYY6FSQUQ_Q_M` abrP   r  rI   r@  r  r  )-rV   rW   rX   r  r   r   r,   r   r   r  r  r  r  r~  r  r  r   r  r   r   r
  r  r  rd  re  r4  r6  r1  rm  rj  rf  rX  rk  r<  r  rR  r  r   r   r   rm  r{  r  r  r  rR   rP   rO   r  r  y  s     LwH  DEI!J	7G
-/2"3j		&AGF2:K0 /K@,,/#?J.D`8 IN.2)"V"crP   r  c                   R    e Zd ZdgZdZeZdZdZd Z	d Z
d Zd Zd Zd	 Zd
 Zd Zy)StarredUnpackingNoderb  r&   Fc                 4    t         j                  | ||       y )Nra  rJ  )rT   r}   rb  s      rO   rQ  zStarredUnpackingNode.__init__  s    $F3rP   c                 ~    | j                   st        | j                  d       | j                  j	                  |       y Nz&starred expression is not allowed here)starred_expr_allowed_herer   r}   rb  analyse_declarationsr	  s     rO   r  z)StarredUnpackingNode.analyse_declarations  s,    --$((DE((-rP   c                 8    | j                   j                  |      S rI   )rb  r   r	  s     rO   r   zStarredUnpackingNode.infer_type  s    {{%%c**rP   c                     | j                   st        | j                  d       | j                  j	                  |      | _        | j                  j
                  | _        | S r  )r  r   r}   rb  r  r   r	  s     rO   r  z"StarredUnpackingNode.analyse_types  sF    --$((DEkk//4KK$$	rP   c                 :    | j                   j                  |       y rI   )rb  r
  r	  s     rO   r
  z/StarredUnpackingNode.analyse_target_declaration  s    ..s3rP   c                 |    | j                   j                  |      | _         | j                   j                  | _        | S rI   )rb  r  r   r	  s     rO   r  z)StarredUnpackingNode.analyse_target_types  s.    kk66s;KK$$	rP   c                      yNr  rR   rS   s    rO   r   z*StarredUnpackingNode.calculate_result_code  r@  rP   c                      y rI   rR   rb  s     rO   rm  z)StarredUnpackingNode.generate_result_code  r  rP   N)rV   rW   rX   r   r  r   r   r   r  rQ  r  r   r  r
  r  r   rm  rR   rP   rO   r  r    sH     zHJDG %4.
+4
rP   r  c            
       <    e Zd ZddgZdZdZdZdZd Zd Z	d Z
dd	Zd
 Zd Zd Zd Zd Zd ZddZ fdZ	 	 ddZ ej,                   ej.                  ej0                   ej2                  dej0                  d      g            Zd Zd ZddZd Zd Z xZ S )SequenceNoder   r   r&   NFc                 ^    | j                   D cg c]  }|j                  |       c}S c c}w rI   )r   r  )rT   r  r  s      rO   compile_time_value_listz$SequenceNode.compile_time_value_list  s%    8<		B&&t,BBBs   *c                     d| _         g }| j                  D ][  }|j                  r<| j                   rt        |j                  d       d| _         |j
                  }d|_        |j                  |       ] || _        y )NFz,more than 1 starred expression in assignmentT)starred_assignmentr   r  r   r}   rb  r   rT   r   r  s      rO   replace_starred_target_nodez(SequenceNode.replace_starred_target_node  sn    "'99 	C~~**#''#QR*.'jj!%KK	 	rP   c                 h    | j                          | j                  D ]  }|j                  |        y rI   )r  r   r
  rD  s      rO   r
  z'SequenceNode.analyse_target_declaration  s/    ((*99 	0C**3/	0rP   c                    t        | j                        D ]6  \  }}|s|j                  |      }|j                  |      | j                  |<   8 | j                  r`| j                  j                  |      | _        | j                  j
                  j                  s | j                  j                  |      | _        d| _        | S r  )r}  r   r  r  r   r   r  r   )rT   rn   skip_childrenr  r  s        rO   r  zSequenceNode.analyse_types  s    		* 	7FAs '',11#6DIIaL	7 #//==cBD##((//#'#3#3#F#Fs#K rP   c                    | j                   |k(  r| S | j                  rJ t        | j                        |j                  k7  r8t        | j                  d|j                  t        | j                        fz         t        | j                  |j                        D cg c]  \  }}|j                  ||       }}}t        | j                  ||d      S c c}}w )NzHtrying to coerce sequence to ctuple of wrong length, expected %d, got %dTr   r   r   )r   r   r   r   r  r   r}   r  r  r  r  )rT   r  rn   r  r   coerced_argss         rO   coerce_to_ctuplezSequenceNode.coerce_to_ctuple  s    99 K###tyy>X]]*$((fs499~j/ / 0BEdiiQYQdQdBefYS$dC0ff8TRR gs   Cc           	         | j                          t        d | j                  D              s| S g }g }| j                  D ]y  }|j                  rZ|r<|j	                  t        |d   j                  |      j                  |d             g }|j	                  |j                         i|j	                  |       { |r:|j	                  t        |d   j                  |      j                  |d             t        | j                  || j                        }| j                  r?t        | j                  d|| j                  j                  |      d| j                  d      }|S )Nc              3   4   K   | ]  }|j                     y wrI   )r  r  s     rO   ra   z?SequenceNode._create_merge_node_if_necessary.<locals>.<genexpr>!  s     7c3>>7   r   r  Tr  r   )inplacer   r   )_flatten_starred_argsrg   r   r  r   r  r}   r  rb  MergedSequenceNoder   r   
binop_noder  )rT   rn   r   rp  r  r   s         rO   _create_merge_node_if_necessaryz,SequenceNode._create_merge_node_if_necessary  s$   ""$7TYY77K99 	#C~~KK	&)--f E S STWgk S lmFCJJ'c"	# KK	&)--f=KKC_cKde!$((D$))<#tT%5%5%H%H%M499d<D rP   c                 &   g }| j                   D ]q  }|j                  rR|j                  j                  r<|j                  j                  s&|j                  |j                  j                          a|j                  |       s || j                   d d  y rI   )r   r  rb  r   r   r   r   r  s      rO   r  z"SequenceNode._flatten_starred_args7  sh    99 	!C~~#**"D"DSZZMcMcCJJOO,C 		!
 		!rP   c                      yr@  rR   rS   s    rO   r  zSequenceNode.may_be_none@  r  rP   c                    | j                   rt        | j                  d       g | _        g | _        d| _        t        | j                        D ]  \  }}|j                  |      x}| j                  |<   |j                  rR|j                  j                  t              st        |j                  d       |j                  t        u rt        |_
        t        | j                  |      }|j                  |j                  |      }||urd| _        | j                  j!                  |       | j                  j!                  |        t        | _
        | S )Nz#can't assign to multiplied sequenceFz2starred target must have Python object (list) typeT)r   r   r}   unpacked_itemscoerced_unpacked_itemsany_coerced_itemsr}  r   r  r  r   r  r   r   ra  r  r   )rT   rn   r  r  unpacked_itemcoerced_unpacked_items         rO   r  z!SequenceNode.analyse_target_typesC  s   $((AB &(#!&		* 	FFAs!$!9!9#!>>C$))A,~~xx//	:#''NP88~-(CH&txx5M$1$;$;CHHc$J!$99)-&&&}5''../DE	F #	rP   c                 &    | j                  |       y rI   generate_operation_coderb  s     rO   rm  z!SequenceNode.generate_result_codeZ      $$T*rP   c                    || j                         }dx}}d }| j                  r|s| j                  }|j                  j                  ro|j                         }t	        |j
                  t              r|j
                  dkD  rd|j
                  z  }n&|j                  j                  r
d|d|d}nd|d}| j                  t        u r| j                  s| j                  rz|sx|j                  d|t        | j                        d	j                  d
 | j                  D              |j                  || j                         fz         |j#                  |       n;| j                  j$                  rGt'        | j                        D ]-  \  }}|j                  |d|d|j                         d       / n| j                  t(        u rd\  }	}
n0| j                  t        u rd\  }	}
nt+        d| j                  z        t        | j                        }|j                  |d|	d||d|j                  || j                                |j#                  |       |rRt,        j.                  }|j                  d|z         |dk(  r|}n|d|}|j                  d|d|d|d|d	       nd}t1        |      D ]  }| j                  |   }|s|j3                         s.|j5                  |j                         |j7                                |j9                  |j;                                |j                  |
d|d	|xr |xr |d|xs |xs |d	|j;                         d        |r"|j                  d       |j                  d       ||j                  j<                  r|j                  dt,        j.                  d|d	|j;                         d|j                  t,        j.                  | j                                |j#                  t,        j.                         |j?                  |t@               |j                  |dt,        j.                  d       |j                  d       y y y ) Nr  r   z * %sz * ((z<0) ? 0:r  z * (z%s = PyTuple_Pack(%d, %s); %srk  c              3   <   K   | ]  }|j                           y wrI   r  r  s     rO   ra   z>SequenceNode.generate_sequence_packing_code.<locals>.<genexpr>t  s     ?c#--/?r  r;  r  r  )
PyList_NewPyList_SET_ITEM)PyTuple_NewPyTuple_SET_ITEMz'sequence packing for unexpected type %sr  r   z{ Py_ssize_t %s;r&   z * zfor (z=0; z < r  z++) {r  rl  r   z{ PyObject* z = PyNumber_InPlaceMultiply()!r   r   r   r  rz   r{   r$   r   r   r   slowr   r   r   r<  r   r}   r  r  r}  r   r   r   r  r  rI  ra  r   r  r   rl   r  r   )rT   r   rb  plainsize_factorc_multr   r  r  create_funcset_item_func	arg_countcounteroffsets                 rO   generate_sequence_packing_codez+SequenceNode.generate_sequence_packing_code]  s   >[[]F!!fE**K&&$++-{::MJ#33a7")K,G,G"GK %%,,:@&"IK - 06"7K99
"499fJJ6DII		?TYY??''9	:; ; <
 OOF#YY  #DII. .3

Aszz|- ..
 yyI%-L*]j(-N*]#$MPTPYPY$YZZDIIIJJY''9; < OOF# !11

-78>$F*19=F

Wfg  9% 	&iil!3!3!5OOCJJL#))+>  1

!\@VQ(?QV[qQMMO	% &	& 

3

3"{'7'7'C'CJJ''1F1F1H''(?(?J  OOF334OOFN3JJVV-D-DEFJJsO (D"rP   c                    | j                   r4| j                   j                  j                  rt        t        |   |       y | j                  t        u r,| j                  s| j                  rt        t        |   |       y | j                  D ]  }|j                  |        | j                   r| j                   j                  |       y y rI   )r   r   r  rK   r  rp  r   r   r  r   r  r{  )rT   r   r  rN   s      rO   rp  z+SequenceNode.generate_subexpr_disposal_code  s     0 0 5 5 < <,DTJYY*$$//TYY,DTJ
 yy 811$78   77=  rP   c                     | j                   r| j                  ||       n| j                  ||       | j                  D ]  }|j	                  |        |j                  |       y rI   )r   generate_starred_assignment_code!generate_parallel_assignment_coder  r\  r  )rT   r   r   r  r  r   r   s          rO   r  z%SequenceNode.generate_assignment_code  sX    ""11#t<223='' 	DLL	trP   r  c                    | j                   D ]  }|j                  |        |j                  t        u xs1 |j                  t        t
        fv xs |j                  j                   }t        | j                         dkD  }|r| j                  |||       nA|j                  d       | j                  ||| j                   |       |j                  d       | j                  D ]  }|j                  |        t        t        | j                              D ].  }| j                  |   j                  | j                  |   |       0 y )NrE   use_loopr  r   )r  rZ  r   r   r   r   r  r   (generate_special_parallel_unpacking_coder   (generate_generic_parallel_unpacking_coder  rr  r  r   r  )rT   r   r   r   special_unpacklong_enough_for_a_loop
value_noder  s           rO   r  z.SequenceNode.generate_parallel_assignment_code  s8    '' 	 DMM$	 ((n4 : XX*i)@@:!$!9!99 	 "%T%8%8!9A!=99c$: : < JJsO99c4..9O : QJJsO55 	6J//5	6s499~& 	6AIIaL11++A.6	6rP   c                 x   d}d|j                         z  }|j                  t        u rdg}|j                         r^|}n[|j                  t        u rdg}|j                         r6|}n3ddg}d|j                         z  }d|j                         z  }d|d|d	}|j                  d
|z         |j                  d|j                         z         |j                  d       |j                  dt        | j                        z         |j                  j                  t               |j                  dt        | j                        t        | j                        fz         |j                  j                  t               |j                  d       |j                  |j                  | j                               |j                  d       |j                  d       t        |      dk(  r|j                  d|d   z         t        | j                        D ]-  \  }	}
|j                  d|
j!                         |d   |	fz         / t        |      dk(  rg|j                  d       t        | j                        D ]-  \  }	}
|j                  d|
j!                         |d   |	fz         / |j                  d       | j                  D ]0  }
|j#                  |
j!                         |
j%                                2 |j                  d       |st        | j                        D ]q  \  }	}
|j                  d|
j!                         |	|j'                  |
j!                         | j                        fz         |j)                  |
j!                                s n|j                  d       |j                  d       |j                  dt        | j                        ddj+                  | j                  D 
cg c]  }
d|
j!                         z   c}
      d        |j                  d!t        | j                        z         |j                  d"|j'                  d#| j                        z         |j)                  d#       |j                  d$       |j                  d       |j                  d       |j                  d%       |j-                  |       |dk(  r|j                  d       y ||k(  r|j                  d       |j                  j                  t/        j0                  d&d'             |j                  d(|j                  | j                        z         |j                  d       y |j                  d       | j3                  ||| j                  |)       |j                  d       y c c}
w )*N1zlikely(%s != Py_None)r  r  zlikely(PyTuple_CheckExact(%s))zPyList_CheckExact(%s)r  z) || (r  r=  zPyObject* sequence = %s;z2Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);zif (unlikely(size != %d)) {z1if (size > %d) __Pyx_RaiseTooManyValuesError(%d);z9else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);r   r  r0   z(if (likely(Py%s_CheckExact(sequence))) {r   z"%s = Py%s_GET_ITEM(sequence, %d); r  r&   r   z&%s = PySequence_ITEM(sequence, %d); %sr  zPy_ssize_t i;PyObject** temps[] = {r9  r3  r  zfor (i=0; i < %s; i++) {z1PyObject* item = PySequence_ITEM(sequence, i); %sr   z*(temps[i]) = item;r  RaiseNoneIterErrorrp  z%__Pyx_RaiseNoneNotIterableError(); %sr  )r   r   r   r  r   r   r   r   rt  ru  raise_too_many_values_to_unpack raise_need_more_values_to_unpackr   r}   r}  r  r   ra  r   r   r  r<  r{  r	   r{  r  )rT   r   r   r  sequence_type_test
none_checksequence_typestuple_check
list_checkr  r   s              rO   r  z5SequenceNode.generate_special_parallel_unpacking_code  s    ,s}}>
88y $XN %/"XX#%YN %/"%v.N:S]]_LK1CMMOCJ3>
!K

;!334

-?@ 	

GH

03tyy>AB))*IJ

F		NC		NJ, , 	-))*JK

NO

4??488,-

3

QR~!#JJANSTDUUV !4!45 	6GAtJJ;~a0!?5 5 6	6 ~!#JJz"$T%8%89 :4

?KKM>!#4aC9 9 :: JJsO'' 	9DOODKKM4::<8	9 	

7$T%8%89 /4

CKKM1++DKKM488DGF F G .	/ JJsOJJ'JJD''(D<O<OPD%$++-/PQS T JJ1C8K8K4LLMJJJ''9; <OOF#JJ,-JJsOJJsO

8""4($JJsO:-JJz"--''(<>PQSJJ>QUQYQYAZZ[JJsOJJz"99c4.. : CJJsO3 Qs   7V7c                    |j                   j                  t               |j                   j                  t        j                  dd             |j                  d       |rY|j                  dt        | j                        ddj                  |D cg c]  }d|j                         z   c}      d       |j                  j                  t        d	
      }|j                  |d|j                         d|j                  || j                               |j!                  |       |j#                  |       |j                  j                  | j$                  d
      }|j                  |d|d       |j'                  d      }	|d|d}
|rv|j                  dt        |      z         |j)                  d|
z         |j+                  |	       |j!                  d       |j                  d       |j                  d       nwt-        |      D ]i  \  }}|j)                  d||j                         |
|j                         fz         |j+                  |	       |j!                  |j                                k |r|j                   j                  t        j                  dd             |j/                  | j                  d|
t        |      fz         |j                  d|z         |j1                  |t               |j'                  d      }|j+                  |       |j3                  |	       |j1                  |t               |j                  d|z         |j                  d       |j                  |j5                  | j                               |j3                  |       |j                  j7                  |       |r|j                  j7                  |       d }|S c c}w )N
IterFinishrp  zPy_ssize_t index = -1;r  r  r9  r3  r  TrO  r  r   Fr  z)->tp_iternext;unpacking_failedr  r  z$for (index=0; index < %s; index++) {z*PyObject* item = %s; if (unlikely(!item)) r   z*(temps[index]) = item;r   z(index = %d; %s = %s; if (unlikely(!%s)) UnpackItemEndCheckz$__Pyx_IternextUnpackEndCheck(%s, %d)r  unpacking_donezCif (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);)rt  ru  r  r	   r{  r   r   r  r<  r   rT  rU  r   r   r   r}   r  r{  r  	new_labelr  put_gotor}  r  ry  	put_labelr   r^  )rT   r   r   r  r  	terminater   iterator_tempiternext_funcunpacking_error_labelunpack_coder  unpacking_done_labels                rO   r  z5SequenceNode.generate_generic_parallel_unpacking_codeG  sE   ))*JK))+*A*A,Pb*cd

+,JJD''(NKD%$++-/KLN O 44^PT4U

''txx@B	C
 	&""4(44T5M5MZ_4`

=* 	+ !%/A B"/?JJ=N@SSTHHAKOPMM/0OOF#JJ01JJsO$^4 24>#	B' '( 34 012 --''(<>PQS!!$((,RN#V% -% & JJ|m34!!-@#~~.>?*+,-m^<

<-/0

XY

4??488,-+,##M2NN''6 Mw Ls   O/c                 	   t        | j                        D ]C  \  }}|j                  s| j                  |   }| j                  d | }| j                  |dz   d  } n J d }|r|D ]  }	|	j	                  |        |j                  d       | j                  |||dd      }t        |      D ]%  \  }}	| j                  |   }
|
j                  |       ' |j                  d       |j	                  |       |j                         }|j                  |d|xs |j                         d|j                  || j                               |j                  |       |r2|j                  |t               |j                   j#                  |       n|j%                  |       |r|j&                  j)                  t*               |j                   j-                  t.        j0                  d	      }|j                  |d
|d       |j                  d|t3        |      fz         |j                  dt3        |      ||j5                  | j                        fz         |j                  d       |d d d   D ]  }	|	j	                  |        t        t7        |d d d   | j                  d d d               D ]  \  }\  }	}|j                  d       |j                  d|	j                         |||dz   fz         |j                  d|z         |j                  d       |j                  d|	j                         |||dz   fz         |j                  d       |j                  |	j                                |j                  |        |j                  d       |j                   j-                  t        d	      }|j                  d|||t3        |      |j                  || j                        fz         |j                  |       |j                   j#                  |       |j9                  |t               |j                  |d|d|d       |j                  d       |j                  d|z         |j                   j#                  |       |j                  d       t        | j                        D ]$  \  }}|j;                  | j                  |   |       & y )Nr&   Fr  T)r  r  r   z = PySequence_List(r   rO  z = PyList_GET_SIZE(rl  zif (unlikely(%s < %d)) {z)__Pyx_RaiseNeedMoreValuesError(%d+%s); %sr  z#if CYTHON_COMPILING_IN_CPYTHONz!%s = PyList_GET_ITEM(%s, %s-%d); z((PyVarObject*)%s)->ob_size--;r   z!%s = PySequence_ITEM(%s, %s-%d); r  z #if !CYTHON_COMPILING_IN_CPYTHONz*%s = PySequence_GetSlice(%s, 0, %s-%d); %sr  r  r  z	(void)%s;)r}  r   r  r  rZ  r   r  r  rr  r   r   r   r}   r  ry  r   rT  r^  r{  rt  ru  r  rU  r   r-  r   r   r  r  r  )rT   r   r   r  r  starred_targetunpacked_fixed_items_leftunpacked_fixed_items_rightr  r   r  target_listlength_tempcoerced_argsublist_temps                  rO   r  z-SequenceNode.generate_starred_assignment_code  s   		* 	FAs~~!%!4!4Q!7-1-@-@!-D)-1-@-@1-F*	 $1 $d#$JJsO IIc4 J 0M %%>? :4!88;
33D9: JJsO%$++-

,S]]_,##K:< 	= 	$!!-@NN''6&&t,%--.NO..66z7S7S`e6fKJJk;OPJJ1[#F`Ba4bbcJJB./*F, , - JJsO24R48 $d#$*3C8RSWUWSW8X8<8S8STXVXTX8Y5[ +\ ;&&D+

<=

>NN$k;!BE E F 

;kIJ

7#

>NN$k;!BE E F

8$ 0144T:; JJ9:>>77SW7XLJJCk;<V8W''dhh?GA A B OOL)NN''4OOK8JJ\<XYJJwJJ{\12NN''5JJx 		* 	OFAs(()D)DQ)GN	OrP   c                     | j                   D ]  }|j                  |        | j                  rE| j                  D ]  }|j                  |        | j                  D ]  }|j                  |        y y rI   )r   r  r  r  rT   r   r  s      rO   r  zSequenceNode.annotate  sq    99 	CLL	** #T"#22 #T"# rP   r  r@  r  rj  )!rV   rW   rX   r   r   r  r   r  r  r  r
  r  r  r  r  r  r  rm  r  rp  r  r   r  r  r   r  r  r  r  r  r  r  rY   rZ   s   @rO   r  r    s     &HNKDC0
S0.+Vp>  IN.2	 .*--.Bj.B.B!!#J##D**C*CTJ$/ 
64VpCJNO`#rP   r  c                   \    e Zd ZeZdZdZd ZddZd Z	d Z
d Zd Zd	 Zd
 Zd Zd Zd Zy)r  Fr2  c                    | j                   s| j                  st        S | j                  D cg c]  }|j                  |       }}t	        d |D              rt        S |j                  | j                  |      j                  S c c}w )Nc              3      K   | ]:  }|j                   xs( |j                  xs |j                  xs |j                   < y wrI   )rl   r   r  r  )r^   r   s     rO   ra   z'TupleNode.infer_type.<locals>.<genexpr>  sC      & b4#:#:bd>Q>QbUYUbUbb &s   A A)r   r   r   r   rg   declare_tuple_typer}   r   )rT   rn   r  r_  s       rO   r   zTupleNode.infer_type  st    49948II>SS^^C(>	> &$& &%%dhh	:???	 ?s   Bc                    t        | j                        dk(  rd| _        d| _        | S |sNt	        | j                        D ]6  \  }}|j
                  rd|_        |j                  |      | j                  |<   8 | j                  sat        d | j                  D              sE|j                  | j                  d | j                  D              j                  | _        d| _        | S t        j                  | |d      }|j                  |      }|j                  s|S t!        d |j                  D              s|S |j                  r:|j                  j                  r4t#        |j                  j$                  t&              rd|_        d|_        |S |j                  j                  j(                  s |j                  j+                  |      |_        d|_        d|_        |S )	Nr   FTc              3      K   | ]X  }|j                   xsF |j                  j                  xs. |j                  j                  xs |j                  j                   Z y wrI   )r  r   rl   r   r  r  s     rO   ra   z*TupleNode.analyse_types.<locals>.<genexpr>  sO      . s388+?+?s388C^C^sbebjbjbsbss .r  c              3   4   K   | ]  }|j                     y wrI   r  r  s     rO   ra   z*TupleNode.analyse_types.<locals>.<genexpr>  s     9Xs#((9Xr  r&   r  c              3   4   K   | ]  }|j                     y wrI   )r   )r^   childs     rO   ra   z*TupleNode.analyse_types.<locals>.<genexpr>  s     ;5##;r  )r   r   r   r   r}  r  r  r  r   rg   r&  r}   r   r  r  r   r   rz   r{   r$   rl   r  is_partly_literal)rT   rn   r  r  r  r   s         rO   r  zTupleNode.analyse_types  s   tyy>Q DL"DOK#DII. 63>>48C1"005		!6    .#'99. ...txx9Xdii9XY^^DIDLK))$4)H33C8++K;;;K  ++4++;;]K DL"DO 	 ##((44#'#3#3#F#Fs#K DL%)D"rP   c                     | j                   sy | j                   D cg c]  }|j                  |       }}t        d |D              ry |j                  | j                  |      }|j
                  S c c}w )Nc              3   $   K   | ]  }|d u  
 y wrI   rR   )r^   r_   s     rO   ra   z,TupleNode.analyse_as_type.<locals>.<genexpr>!  s     -QqDy-s   )r   r4  rg   r&  r}   r   )rT   rn   r  r   r   s        rO   r4  zTupleNode.analyse_as_type  se    yy:>))D3c))#.D
D-*--&&txx<zz	 Es   A1c                 J   | j                   j                  r|j                  r5| j                   j                  |j                  k(  r| j                  ||      S |t        u s|t
        u rV| j                  D cg c]  }|j                  |       }}t        | j                  |t        d      j                  |d      S | j                  |      j                  ||      S |j                  r| j                  s| j                  ||      S t        j                  | ||      S c c}w )Nr&   r  Tr  )r   r  r  r  r   r   r   r  r  r}   r  r  r   r  )rT   r  rn   r  r  s        rO   r  zTupleNode.coerce_to&  s    99!!diinn&E,,Xs;;Z'8~+EGKyyQ 6 6s ;QQ :WXYgghk{g  A  A..s3==hLL(8(8((377))$#>>  Rs   6D c                     t        | j                  | j                  | j                        }t	        | j
                  t              rt        | j
                        |_        |S N)r   r   )r  r}   r   r   rz   r{   r   r   rT   r_   s     rO   as_listzTupleNode.as_list4  sF    TXXDII4;K;KLd**E2 $T%9%9 :ArP   c                      yr"  rR   rS   s    rO   r  zTupleNode.is_simple:      rP   c                      yr"  rR   rS   s    rO   r%  zTupleNode.nonlocally_immutable>  r5  rP   c                 j    t        | j                        dkD  r| j                  S t        j                  S r   )r   r   re  r   empty_tuplerS   s    rO   r   zTupleNode.calculate_result_codeB  s*    tyy>A###%%%rP   c                 r    t        | j                  D cg c]  }|j                   c}      | _        y c c}w rI   )r   r   r{   rT   r  s     rO   r   z#TupleNode.calculate_constant_resultH  s1    $/3yy&:(+##&:  ; &:   4c                     | j                  |      }	 t        |      S # t        $ r}| j                  |       Y d }~y d }~ww xY wrI   )r  r   r  r  )rT   r  rp  r  s       rO   r  zTupleNode.compile_time_valueL  sB    --d3	-=  	-))!,,	-s   
 	A=Ac                 b   t        | j                        dk(  ry | j                  s| j                  rQt	        | j
                  | j                  r| j                  nd g| j                  z         }|j                  t        dd|      }|j                  |      }|K|j                  | j                         | j                  ||| j                          |j                  |       | j                  r|| _        y |j                  | j!                         d|d| j                  j#                         d|j%                  | j!                         | j                               |j'                  | j#                                y d	| j
                  j(                  _        | j                  |       y )
Nr   r   r0   rN  )r  z = PyNumber_Multiply(rk  r   T)r   r   r   r,  r   r   r   r  r   r  rl  r}   r  r  re  r   r   r   r   r  r   r  )rT   r   rP  tuple_targetr  s        rO   r  z!TupleNode.generate_operation_codeS  sM   tyy>Q??d44 'tyyt43C3C\`2adhdmdm2mnI,,^WTUaj,kL99,GJ%##DHH-33JX\XgXgTg3h&&|4#/ 

KKM<1A1A1K1K1M++DKKM488D   01#'DIIOO //5rP   Nr  )rV   rW   rX   r   r   r,  r  r   r  r4  r  r3  r  r%  r   r   r  r  rR   rP   rO   r  r    sM     D-K@#J?&;-6rP   r  c                   ^    e Zd Zg Z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y)r  FzConstructing Python listc                      yr  rR   r	  s     rO   r   zListNode.type_dependencies|  r@  rP   c                     t         S rI   )r   r	  s     rO   r   zListNode.infer_type      rP   c                     | j                   D ]  }|j                  sd|_         t        j	                  | |      }|j                  |      S r"  )r   r  r  r  r  r  )rT   rn   r  r   s       rO   r  zListNode.analyse_expressions  sI    99 	5C~~04-	5 //c:&&s++rP   c                     t        d      5 }t        | j                        | _        t        j                  | |      }d d d        _        |j                  rd| _        |j                  |      }|S # 1 sw Y   6xY wNTr  )
r   r   r   original_argsr  r  obj_conversion_errorsr)  r  r  )rT   rn   errorsr   s       rO   r  zListNode.analyse_types  ss    & 	9&!%diiD--dC8D	9 &,"#'D 33C8	9 	9s   1A33A<c                    |j                   rY| j                  D ]  }t        |        g | _        | j                  j	                  |      st        | j                  d|z         | S |j                  s|j                  r^|j                  t        j                  urAt        | j                        }| j                  rt        | j                  j                   t"              rM| j                  j                   dk  rt        | j                  d|z         n3|| j                  j                   z  }nt        | j                  d|z         |j                  }t        j$                  ||      | _        t'        t        | j(                              D ]L  }| j                  |   }t        |t*              r|j,                  }|j/                  ||      | j                  |<   N | S |j0                  r6t3        | j                  | t        j4                        j/                  ||      S | j                  rt        | j                  d|z         | S |j6                  r*t        | j                        t        |j8                  j:                        kD  rt        | j                  d|z         nt        | j                        t        |j8                  j:                        k  rt=        | j                  d|z  d	       t?        tA        | j(                  |j8                  j:                              D ]M  \  }\  }}t        |t*              r|j,                  }|j/                  |j                  |      | j                  |<   O || _        | S |jB                  r| jE                  ||      S tF        | _        t        | j                  d|z         | S )
NzCannot coerce list to type '%s'r   z4Cannot coerce non-positively multiplied list to '%s'z1Cannot coerce dynamically multiplied list to '%s')r~  r   z%Cannot coerce multiplied list to '%s'zToo many members for '%s'zToo few members for '%s'r&   )$rl   rG  r   r   r  r   r}   r#  r  r  r   c_void_typer   r   r   rz   r{   r$   r  r  rF  r  r  r  r  TypecastNoder   r  r  rl  r   r}  r  r  r  r,   )	rT   r  rn   ro   r0  r  r  r  rr  s	            rO   r  zListNode.coerce_to  s    11 "S!")+D&99''1dhh AH LMN M 8??8J8JR\RhRh8htyy>Ld..>>N''771<dhh(^ai(ij$(8(8(H(HH$(($WZb$bc **I"--iFDI3t1123 =iilc#56''C"}}Y<		!	=4 + ""$Z=V=VWaabjlopp$((ChNO" ! 499~HNN$>$> ??dhh ;h FGtyy>C(B(B$CCDHH&@8&KQO(1#d6H6H(..JdJd2e(f C$A}V!#'9:!gg#&==c#BDIIaLC !DI  ((377"DI$((=HIrP   c                     | S rI   rR   rS   s    rO   r3  zListNode.as_list  r  rP   c                     t        | j                  | j                  | j                        }t	        | j
                  t              rt        | j
                        |_        |S r1  )r  r}   r   r   rz   r{   r   r   r2  s     rO   as_tuplezListNode.as_tuple  sF    dhhTYYD<L<LMd**D1 %d&:&: ;ArP   c                 .   | j                   j                  ri| j                  r/|j                  j	                  | j                   ddd      | _        y |j                  j	                  | j                   dd      | _        y t        j                  | |       y )NFT)rP  staticreusable)rP  rQ  )r   r#  r  rT  rU  r   r  rW  rb  s     rO   rW  zListNode.allocate_temp_result  s|    99##!%!=!=II%u "> "N "&!=!=II%% "> "A --dD9rP   c                     | j                   r
t               | j                  D cg c]  }|j                   c}| _        y c c}w rI   )r   r   r   r{   r:  s     rO   r   z"ListNode.calculate_constant_result  s:    ,+/99 6$'C 6  6s   Ac                 |    | j                  |      }| j                  r|| j                  j                  |      z  }|S rI   )r  r   r  )rT   r  ls      rO   r  zListNode.compile_time_value  s;    ((.!!44T::ArP   c                    | j                   j                  r.| j                  D ]  }t        |        | j	                  |       y | j                   j
                  r| j                  r|j                  d       |j                  dt        j                  z         |j                  dj                  t        j                  | j                  j                                      dt        | j                        t        j                  fz  }nd}t        | j                        D ]  \  }}|j                   j
                  rz|j                  j!                  t#        j$                  dd             |j                  d	| j                         d
||d|j                         d| j                         d
       |j                  | j                         d
||d|j                         d        | j                  r#|j                  d       |j                  d       y y | j                   j&                  r}t)        | j                  | j                   j*                  j,                        D ]E  \  }}|j                  | j                         d|j.                  d|j                         d       G y t1        d      )Nr  zPy_ssize_t %s;z&for ({i} = 0; {i} < {count}; {i}++) {{)r  countz+ (%d * %s)r  r)  r{  r*  rQ  r+  r  z[0]));z] = r  r   r   r  zList type never specified)r   rl   rG  r   r  r#  r   r   r   r  r  r   r   r   r}  rt  ru  r	   r{  r  r  r  rl  r   r   )rT   r   ro   r  r  r  rr  s          rO   r  z ListNode.generate_operation_code  s   99  11 "S!"//5YY

3

+f.E.EEF

CJJ--T5E5E5L5L5N K P Q&#dii.&:Q:Q)RR#DII. '388$$$$55k6M6MN^`o6pqJJq&

dkkm  
 JJ

	 & '' 

3

3   YY  "499diioo.I.IJ #V

KKMLLJJL" ##   ;<<rP   N)rV   rW   rX   rG  r   r   r  r  r   r   r  r  r  r3  rN  rW  r   r  r  rR   rP   rO   r  r  p  sQ     DO,K,-^:6%=rP   r  c                   P     e Zd Zg ZdZdZd
dZd Zd Zd Z	d Z
 fdZd	 Z xZS )ScopedExprNodeNTc                 t    ||| _         y | j                  rt        j                  |      | _         y d | _         y rI   )
expr_scopehas_local_scoper   GeneratorExpressionScope)rT   outer_scoperZ  s      rO   
init_scopezScopedExprNode.init_scope   s1    !(DO!!$==kJDO"DOrP   c                 &    | j                  |       y rI   )r^  r	  s     rO   r  z#ScopedExprNode.analyse_declarations%   s    rP   c                      y rI   rR   r	  s     rO   analyse_scoped_declarationsz*ScopedExprNode.analyse_scoped_declarations(   r  rP   c                     | S rI   rR   r	  s     rO   r  zScopedExprNode.analyse_types,       rP   c                     | S rI   rR   r	  s     rO   analyse_scoped_expressionsz)ScopedExprNode.analyse_scoped_expressions0   rc  rP   c                     t         t        | 
  }| j                  r| j                  j
                  s	 ||       y |j                  d       g }t        d | j                  j                  j                         D              D ]G  \  }}|j                  r|j                  j                  s*|j                  s7|j                  |       I |s ||       |j                  d       y |j                         }|j!                         } ||       | j#                  ||       |j%                  d      }|j'                  |       |j(                  |fgt+        t-        |j/                         |            z   D ]K  \  }	}
|j1                  |	      s|j3                  |	       | j#                  ||       |j'                  |
       M |j3                  |       |j                  d       |j5                  |       ||_        y )Nz{ /* enter inner scope */c              3   ,   K   | ]  }|d    s	|  yw)r   NrR   )r^   r   s     rO   ra   z:ScopedExprNode.generate_evaluation_code.<locals>.<genexpr>>   s     [SWXYSZt[s   
z} /* exit inner scope */
exit_scope)rK   rX  rr  r[  rZ  rl  r   r  r  rq  rY  r   rl   r  r   new_loop_labelsnew_error_label_generate_vars_cleanupr  r  error_labelr   r  get_loop_labels
label_usedr  set_loop_labels)rT   r   generate_inner_evaluation_code
py_entriesr/  r   old_loop_labelsold_error_labelrh  label	old_labelrN   s              rO   rr  z'ScopedExprNode.generate_evaluation_code4   s   ).~t)]&##4??+F+F*40

./
[0G0G0M0M0O[[ 	-HAu##::))ejj%%e,	- *40JJ12 ..0..0&t, 	##D*5 ^^L1
j!#'#3#3_"E!F!%c$*>*>*@/&R!S"T 	)E9u%u%++D*=i(	) 	z"

-._-*rP   c                     |D ]M  }|j                   r.|j                  |       |j                  |j                  d       =|j	                  |       O y )Nr  )rb  put_var_gotrefr  r   put_var_xdecref_clear)rT   r   rq  r   s       rO   rk  z%ScopedExprNode._generate_vars_cleanup`   sJ     	2E##E*##EKK;**51	2rP   rI   )rV   rW   rX   r   rZ  r[  r^  r  ra  r  re  rr  rk  rY   rZ   s   @rO   rX  rX     s:     HJ O#*+X2rP   rX  c                   P    e Zd ZdgZdZeZd Zd Zd Z	d Z
d Zd Zd	 Zd
 Zd Zy)ComprehensionNodeloopTc                     | j                   S rI   r  r	  s     rO   r   zComprehensionNode.infer_typeq       yyrP   c                 H    | | j                   _        | j                  |       y rI   )r   rb  r^  r	  s     rO   r  z&ComprehensionNode.analyse_declarationst   s    !rP   c                 :    | j                   j                  |       y rI   )r{  r  r	  s     rO   ra  z-ComprehensionNode.analyse_scoped_declarationsx   s    		&&s+rP   c                 ^    | j                   s | j                  j                  |      | _        | S rI   r[  r{  r  r	  s     rO   r  zComprehensionNode.analyse_types{   s&    ##		55c:DIrP   c                 ^    | j                   r | j                  j                  |      | _        | S rI   r  r	  s     rO   re  z,ComprehensionNode.analyse_scoped_expressions   s&    		55c:DIrP   c                      yr@  rR   rS   s    rO   r  zComprehensionNode.may_be_none   r  rP   c                 &    | j                  |       y rI   r  rb  s     rO   rm  z&ComprehensionNode.generate_result_code   r  rP   c           
          | j                   t        j                  u rd}nV| j                   t        j                  u rd}n7| j                   t        j                  u rd}nt        d| j                   z        |j                  | j                         d|d|j                  | j                         | j                               |j                  | j                                | j                  j                  |       y )NzPyList_New(0)zPySet_New(NULL)zPyDict_New()z"illegal type for comprehension: %sr  r  )r   r   r   r   r   r   r   r   r   r}   r  r{  generate_execution_code)rT   r   create_codes      rO   r  z)ComprehensionNode.generate_operation_code   s    99))))KYY'***+KYY'+++(K Dtyy PQQ

KKM;##DKKM488<> 	? 	&		))$/rP   c                 :    | j                   j                  |       y rI   )r{  r  rb  s     rO   r  zComprehensionNode.annotate       		4 rP   N)rV   rW   rX   r  r   r   r{   r   r  ra  r  re  r  rm  r  r  rR   rP   rO   rz  rz  i   sB     (KG$O,

+0 !rP   rz  c                   F    e Zd ZdgZdZej                  Zd Zd Z	d Z
d Zy)ComprehensionAppendNoder  Nc                     | j                   j                  |      | _         | j                   j                  j                  s | j                   j	                  |      | _         | S rI   )r  r  r   rl   r  r	  s     rO   r  z+ComprehensionAppendNode.analyse_expressions   sD    II11#6	yy~~))		44S9DIrP   c           
         | j                   j                  t        u r2|j                  j	                  t        j                  dd             d}nA| j                   j                  t        u rd}n"t        d| j                   j                  z        | j                  j                  |       |j                  |j                  |d| j                   j                         d| j                  j                         d| j                               | j                  j                  |       | j                  j!                  |       y )	NListCompAppend
Optimize.c__Pyx_ListComp_Append	PySet_Addz'Invalid type for comprehension node: %sr  , (PyObject*)r  )rb  r   r   rt  ru  r	   r{  r   r   r  rr  r   r   r   r}   r{  r  rT   r   r  s      rO   r  z/ComprehensionAppendNode.generate_execution_code   s    ;;y(--''(8,GI.H[[)"H9DKK<L<LLN N 			**40

4%%KK II' xx	 	
 			((.		T"rP   c                 <    | j                   j                  ||       y rI   )r  r  r  s      rO   r  z5ComprehensionAppendNode.generate_function_definitions   s    		//T:rP   c                 :    | j                   j                  |       y rI   )r  r  rb  s     rO   r  z ComprehensionAppendNode.annotate   r  rP   )rV   rW   rX   r  rb  r   r  r   r  r  r  r  rR   rP   rO   r  r     s/     (KF  D#(;!rP   r  c                   ,    e Zd ZddgZd Zd Zd Zd Zy)DictComprehensionAppendNodekey_expr
value_exprc                    | j                   j                  |      | _         | j                   j                  j                  s | j                   j	                  |      | _         | j
                  j                  |      | _        | j
                  j                  j                  s | j
                  j	                  |      | _        | S rI   )r  r  r   rl   r  r  r	  s     rO   r  z/DictComprehensionAppendNode.analyse_expressions   s    99#>}}!!-- MM<<SADM//==cB##//"oo@@EDOrP   c                 B   | j                   j                  |       | j                  j                  |       |j                  |j	                  d| j
                  j                         d| j                   j                         d| j                  j                         d| j                               | j                   j                  |       | j                   j                  |       | j                  j                  |       | j                  j                  |       y )NrK  r  r  )
r  rr  r  r   r   rb  r   r}   r{  r  rb  s     rO   r  z3DictComprehensionAppendNode.generate_execution_code   s    ..t4006

4%%KK MM  "OO""$' xx	 	
 	,,T2  &..t4""4(rP   c                 t    | j                   j                  ||       | j                  j                  ||       y rI   )r  r  r  r  s      rO   r  z9DictComprehensionAppendNode.generate_function_definitions   s*    33C>55c4@rP   c                 p    | j                   j                  |       | j                  j                  |       y rI   )r  r  r  rb  s     rO   r  z$DictComprehensionAppendNode.annotate   s&    t$  &rP   N)rV   rW   rX   r  r  r  r  r  rR   rP   rO   r  r     s!    |,K)A'rP   r  c                   N     e Zd ZdgZdZdZdZeZd	 fd	Z	d Z
d Zd Zd Z xZS )
InlinedGeneratorExpressionNodegenNTc                 
   |j                   j                  }d|_        |M|t        t        t
        fv sJ |       ||_        |j                  t        ||t        j                        |       t        t        | 6  |fd|i| y )NT)rb  r   r  )r  gbody
is_inlinedr   r   r   inlined_comprehension_typer  re  r   retval_cnamerK   r  rQ  )rT   r}   r  comprehension_typer  r  rN   s         rO   rQ  z'InlinedGeneratorExpressionNode.__init__   s    "")%)Xy)II]K]]/AE,MM'-?ATATU'   	,d<STcTVTrP   c                     | j                   dvS )N)rg   r   r  )	orig_funcrS   s    rO   r  z*InlinedGeneratorExpressionNode.may_be_none!  s    ~~%===rP   c                     | j                   S rI   r  r	  s     rO   r   z)InlinedGeneratorExpressionNode.infer_type
!  r}  rP   c                 F    | j                   j                  |      | _         | S rI   )r  r  r	  s     rO   r  z,InlinedGeneratorExpressionNode.analyse_types!  s    88//4rP   c           
         |j                  | j                         d| j                  j                         d|j                  | j                         | j                               |j                  | j                                y )Nz = __Pyx_Generator_Next(r   )r   r   r  r   r}   r  rb  s     rO   rm  z3InlinedGeneratorExpressionNode.generate_result_code!  sW    

KKM488??,##DKKM488<> 	? 	&rP   rI   )rV   rW   rX   r   r  rb  r   r   r   rQ  r  r   r  rm  rY   rZ   s   @rO   r  r     s:     wHIFGD
U>'rP   r  c                   T    e Zd ZdZdgZdZdZd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zy)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                    |t         t        fv r_|r]|d   j                  rN|d   j                  t         ur9t	        |d   j
                  |d   j                  d|d   j                        |d<   t        j                  | |||       y )Nr   T)r   r   r   )r   r   )
r   r   r   r   r  r}   r   r   r   rQ  )rT   r}   r   r   s       rO   rQ  zMergedSequenceNode.__init__$!  su    Iz**tQ8W8WAw||9,"47;;T!W\\4]abc]d]p]pqQ$$T:rP   c                    g }| j                   D ]}  }|j                  r&|j                  r|j                  j                  dk  r5|j                  s|j                  rd |j                   D        }n|j                  }|j                  |        | j                  t        u rt        |      }|| _        y | j                  t        u rt        |      }|| _        y | j                  t        u sJ || _        y )Nr   c              3   4   K   | ]  }|j                     y wrI   r:  r  s     rO   ra   z?MergedSequenceNode.calculate_constant_result.<locals>.<genexpr>4!  s     B,,Br  )r   r   r   r{   r  r   r   r   r   r   r   r   )rT   r   r   rq  s       rO   r   z,MergedSequenceNode.calculate_constant_result+!  s    II 
	!D++0@0@##33q8""d&B&BB		B,,MM% 
	! 99 [F
  &	 YY*$6]F  & 99	))%rP   c                 2   g }| j                   D ]  }|j                  r+|j                  r|j                  j                        dk  r:|j                  s|j                  rfd|j                   D        }n|j                        }|j                  |        | j                  t        u r	 t        |      }|S | j                  t        u rt        |      }|S | j                  t        u sJ |S # t        $ r}| j                  |       Y d }~|S d }~ww xY w)Nr   c              3   @   K   | ]  }|j                          y wrI   )r  )r^   r  r  s     rO   ra   z8MergedSequenceNode.compile_time_value.<locals>.<genexpr>H!  s     K#//5Ks   )r   r   r   r  r  r   r   r   r   r  r  r   r   r   )rT   r  r   r   rq  r  s    `    rO   r  z%MergedSequenceNode.compile_time_value@!  s   II 		!D++0@0@##66t<A""d&B&BKK//5MM% 		! 99 1V 	 YY*$6]F  99	))  1--a00
 1s   /C1 1	D:DDc                      yr  rR   r	  s     rO   r   z$MergedSequenceNode.type_dependenciesW!  r@  rP   c                     | j                   S rI   r  r	  s     rO   r   zMergedSequenceNode.infer_typeZ!  r}  rP   c                 D   | j                   D cg c]1  }|j                  |      j                  |      j                  d      3 }}t	        |      dk(  r |d   j
                  | j
                  u r|d   S | j
                  t        t        t        fv sJ || _         | S c c}w )Nz2argument after * must be an iterable, not NoneTyper&   r   )	r   r  r  r  r   r   r   r   r   )rT   rn   r  r   s       rO   r  z MergedSequenceNode.analyse_types]!  s    
 yy	
  c"55c:LLDF
 
 t9>d1glldii77NyyXy*===	
s   6Bc                      yr@  rR   rS   s    rO   r  zMergedSequenceNode.may_be_nonen!  r  rP   c                    |j                  | j                         | j                  |       | j                  t        u }t        | j                        }t        |      }|j                  |       |r|j                  s |sc|j                  rW|j                  t        u rE|j                  | j                         d|j                         d       |j                  |       n|j                  | j                         d|rdndd|j                         d|j!                  | j                         | j                               |j#                  | j                                |j%                  |       |j'                  |       t)               }|rd}d}nd	}d
}|D ]s  }|r|j                  s$|j                  s|j                  r|j*                  s|s|j                  r|j-                  d       |j                  D ]v  }|j                  |       |j/                  |j                  |d| j                         d|j                         d       |j%                  |       |j'                  |       x |r|j-                  d       n|j-                  d       |j                  |       |j/                  |j                  |d| j                         d|j                         d       |j%                  |       |j'                  |       v | j                  t0        u r|j                  d       |j                  dt2        j4                  d| j                         d       |j7                  | j                         t8               |j                  | j                         dt2        j4                  d|j!                  | j                         | j                               |j#                  | j                                |j                  d       t;        |      D ]-  }	|j<                  j?                  tA        jB                  |	        / y )Nr  r  	PySet_NewPySequence_Listr  r   r  __Pyx_PySet_Updater  __Pyx_PyList_Extend)r  r  rk  r  )PySet_Updatez
Builtins.c)
ListExtendr  r  z
PyObject *z = PyList_AsTuple(rl  r  r   )"rl  r}   rW  r   r   r  r   r  rr  r  r   r   r   r   r   r  r   r  r{  r  r   r   r  r  r   r   r  r  r   r  rt  ru  r	   r{  )
rT   r   is_setr   r   rO  add_funcextend_funcr  rP  s
             rO   rr  z+MergedSequenceNode.generate_evaluation_codeq!  sJ   dhh!!$'h&DIIDz%%d+t**t;;		Y@VJJT[[]DNN4DEF..t4JJ%+<< ''txx@	B C
 OODNN,-''-%"H.K.H/K 	"DD//43O3O11$:J:J$))KK @A99 )C006))#'' 4) * ..t4NN4() :;89))$/!!$(( -" # ''-OOD!5	"8 99
"JJsOJJ''   OODKKM>:JJ''''txx@B C OODKKM*JJsOWo 	PF--k.E.Ev.NO	PrP   c                 H    | j                   D ]  }|j                  |        y rI   )r   r  rR  s      rO   r  zMergedSequenceNode.annotate!  s!    II 	 DMM$	 rP   N)rV   rW   rX   r  r   r   r  rQ  r   r  r   r   r  r  rr  r  rR   rP   rO   r  r  !  sJ     xHG2K;&*."IPV rP   r  c                   @    e Zd ZdZdgZeZdZdZd Z	d Z
d Zd Zd	 Zy
)SetNodez
    Set constructor.
    r   TzConstructing Python setc                     t        t        | j                              D ]@  }| j                  |   }|j                  |      }|j	                  |      | j                  |<   B t
        | _        d| _        | S r  )r  r   r   r  r  r   r   r   )rT   rn   r  r  s       rO   r  zSetNode.analyse_types!  sh    s499~& 	7A))A,C##C(C11#6DIIaL	7 	rP   c                      yr@  rR   rS   s    rO   r  zSetNode.may_be_none!  r  rP   c                 r    t        | j                  D cg c]  }|j                   c}      | _        y c c}w rI   )r   r   r{   r:  s     rO   r   z!SetNode.calculate_constant_result!  s'    "499#MCC$7$7#MN#Mr;  c                     | j                   D cg c]  }|j                  |       }}	 t        |      S c c}w # t        $ r}| j	                  |       Y d }~y d }~ww xY wrI   )r   r  r   r  r  )rT   r  r  rp  r  s        rO   r  zSetNode.compile_time_value!  s\    :>))D3#((.DD	-v; E  	-))!,,	-s   5
: 	AAAc           	      $   | j                   D ]  }|j                  |        | j                  |       |j                  | j	                         d|j                  | j	                         | j                               |j                  | j                                | j                   D ]c  }|j                  | j                  d| j	                         d|j                         d       |j                  |       |j                  |       e y )Nz = PySet_New(0); z
PySet_Add(rk  r  )r   rr  rW  r   r   r   r}   r  r   r  r{  r  r"  s      rO   rr  z SetNode.generate_evaluation_code!  s    99 	/C((.	/!!$'

''txx@B	C 	()99 	!C!!'+{{}cmmoFH &&t,NN4 	!rP   N)rV   rW   rX   r  r   r   r   r  r  r  r  r   r  rr  rR   rP   rO   r  r  !  s9     xHDN+KO-!rP   r  c                   z    e Zd ZdgZdZdZeZdZdZ	g Z
ed        Zd Zd Zd Zd	 Zd
 Zd Zd Zd ZdZd Zd Zy)ro  rn  r&   FTc                 `     | ||D cg c]  \  }}t        |||       c}}      S c c}}w )Nrj  r   rn  )rm  )rM   r}   pairskrr  s        rO   
from_pairszDictNode.from_pairs"  s;    3>C)E6:aSaq1)E F 	F )Es   *c                 r    t        | j                  D cg c]  }|j                   c}      | _        y c c}w rI   )r  rn  r{   )rT   r   s     rO   r   z"DictNode.calculate_constant_result"  s7    #151E1E%G)-$$%G  H %Gr;  c                    | j                   D cg c]8  }|j                  j                  |      |j                  j                  |      f: }}	 t	        |      S c c}w # t
        $ r}| j                  |       Y d }~y d }~ww xY wrI   )rn  rj  r  r   r  r  r  )rT   r  r   r  r  s        rO   r  zDictNode.compile_time_value"  s    ,,. ((--d3TZZ5R5RSW5XY . .	-;.  	-))!,,	-s   =A
A 	B(A>>Bc                      yr  rR   r	  s     rO   r   zDictNode.type_dependencies"  r@  rP   c                     t         S rI   rB  r	  s     rO   r   zDictNode.infer_type"  rB  rP   c                     t        d      5 }| j                  D cg c]  }|j                  |       c}| _        d d d        | _        | S c c}w # 1 sw Y   xY wrE  )r   rn  r  rG  )rT   rn   rH  r   s       rO   r  zDictNode.analyse_types"  sc    & 	& !00$ ""3'$D 	
 &,"$	 	s   AAAAAc                      yr@  rR   rS   s    rO   r  zDictNode.may_be_none#"  r  rP   c                 v   |j                   r| j                          | j                  j                  rt	        j
                  |      st        | j                  d|z         t        | j                  | j                  D cg c]L  }t        |j                  |j                  j                  |      |j                  j                  |            N c}      S | j                  j                  |      st        | j                  d|z         | S |j                  r|| _        |j                  s2t        | j                        dk7  rt        | j                  d|z         n[|j                  rOt        | j                        t        |j                   j"                        k  rt%        | j                  d|z  d       | j                  D ]B  }t'        |j                  t(              r|j                  j*                  |_        |j                  j,                  sGt        |j                  j                  d       t/        |j                  j                  d	
      |_        t1        |j                  j                        }|j                   j3                  |      }|s(t        |j                  j                  d|d|d       |j                  }t'        |t(              r|j*                  }|j5                  |j                  |      |_        E | S t6        | _        t        | j                  d|z         | S c c}w )Nz-Cannot interpret struct as non-dict type '%s'r  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 identifierrh  r  zstruct 'z' has no field 'r  )rl   release_errorsr   r  r   r  r   r}   ro  rn  rm  rj  r  r   r  r   r  rl  r   rz   r  r  r   r  rs   r+  r  r,   )rT   r  rn   r   rj  rr  r   s          rO   r  zDictNode.coerce_to&"  sh   !yy++ ++H5$(($SV^$^_ !% 4 4;6  !txx/J/J3/O'+zz'D'DS'IK;6 7 7 99''1dhh Dx OP4 3 (( DI%%#d.B.B*Cq*Hdhh ^ai ij##D,@,@(ACHbHbDc(c"IH"TVWX,, Gdhh(:;#xx||DHxx11$((,,(IJ)$((,,iHDHdhhnn-C%^^77<F!dhhllxY\,]^ $

%e-?@$)IIE%*__V[[#%F
G&  #DI$((@8KL?;6s    AL6
c                 J    | j                   D ]  }t        |        g | _         y rI   )rG  r   )rT   ro   s     rO   r  zDictNode.release_errorsM"  s'    -- 	C	%'"rP   rF  c                 j   |j                  | j                         | j                  |       | j                  j                  }|r| j                          |j                  d| j                         t        | j                        |j                  | j                         | j                        fz         |j                  | j                                t               }d }d}| j                  D ]  }|j                  |       |r| j                  r,|j                  d|j                   j                         z         |j"                  }| j$                  r||j&                  sd }ny|j                   |v rd }nh|t        |j                         ur6|1t        |j                         }|j)                  |j                          nd }n|j)                  |j                          ||j                  d| j                         d|j                         d       d}|j                  d|j                         d	|j+                  |j                               |j                  d
       |j-                  | j                  d| j                         d|j"                  j                         d|j                   j                         d       | j$                  r||j                  d       | j                  rf|j                  d       nT|j                  | j                         d|j"                  j                   d|j                   j                         d       |j/                  |       |j1                  |        |r0|j2                  j5                  t7        j8                  dd             y y )Nz%%s = __Pyx_PyDict_NewPresized(%d); %sFr=  rH  rk  r6  TrJ  r   r  rK  r  r   r   r  r  rI  rN  )rl  r}   rW  r   rl   r  r   r   r   rn  r   r  r   r   rr  exclude_null_valuesr   rj  r<  r   r  r   r  r{  r  rt  ru  r	   r{  )rT   r   is_dict	keys_seenkey_typeneeds_error_helperr   rj  s           rO   rr  z!DictNode.generate_evaluation_codeT"  s    	dhh!!$'))''!JJ7KKM,,-++DKKM488D;F FG
 OODNN,-E	"(( 0	"D))$/++JJ{TZZ-A-A-CCDhh)) ,"44(,I YY)3(,I%T#))_<'/+/		? )cii 8 -1	%MM#))4 (

 KKM3==?$< = .2*

MMO OODHH5$7 8 

:.%%dhhKKMHH&&(JJ((*1, - ))i.?JJsO++JJsO



))+- . ''-OOD!a0	"d --''(=?TUW rP   c                 H    | j                   D ]  }|j                  |        y rI   )rn  r  rR  s      rO   r  zDictNode.annotate"  s#    (( 	 DMM$	 rP   N)rV   rW   rX   r   r   r  r   r   r  r<  rG  r  r  r   r  r   r   r  r  r  r  r  rr  r  rR   rP   rO   ro  ro  !  s     ""HGDOF FH-%N(
 -KHWT rP   ro  c                   <    e Zd ZddgZdZd Zd Zd Zd Zd Z	d	 Z
y)
rm  rj  r   Nc                 f    | j                   j                  | j                  j                  f| _        y rI   )rj  r{   r   rS   s    rO   r   z&DictItemNode.calculate_constant_result"  s&    HH$$djj&@&@ BrP   c                    | j                   j                  |      | _         | j                  j                  |      | _        | j                   j                  |      | _         | j                  j                  |      | _        | S rI   )rj  r  r   r  r	  s     rO   r  zDictItemNode.analyse_types"  s_    88))#.ZZ--c2
88..s3ZZ2237
rP   c                 p    | j                   j                  |       | j                  j                  |       y rI   )rj  rr  r   rb  s     rO   rr  z%DictItemNode.generate_evaluation_code"  s&    ))$/

++D1rP   c                 p    | j                   j                  |       | j                  j                  |       y rI   )rj  r{  r   rb  s     rO   r{  z#DictItemNode.generate_disposal_code"  s&    ''-

))$/rP   c                 p    | j                   j                  |       | j                  j                  |       y rI   )rj  r  r   rb  s     rO   r  zDictItemNode.free_temps"  s&    D!

d#rP   c                 D    t        | j                  | j                  g      S rI   )r  rj  r   rS   s    rO   __iter__zDictItemNode.__iter__"  s    TXXtzz*++rP   )rV   rW   rX   r   r<  r   r  rr  r{  r  r  rR   rP   rO   rm  rm  "  s2    
 wHKB20$,rP   rm  c                   .    e Zd ZdgZdZd Zd Zd Zd Zy)SortedDictKeysNoder  Tc                 r    t         j                  | |j                  |       t        j                  | _        y )N)r  )r   rQ  r}   r   r   r   r:  s     rO   rQ  zSortedDictKeysNode.__init__"  s(    $S1%%	rP   c                     | j                   j                  |      }|j                  t        j                  u r|j                  d      }|| _         | S r0  )r  r  r   r   r   r  rD  s      rO   r  z SortedDictKeysNode.analyse_types"  sG    hh$$S)88w(((''35CrP   c                      yr@  rR   rS   s    rO   r  zSortedDictKeysNode.may_be_none"  r  rP   c                    | j                   j                         }| j                   j                  t        j                  u rp|j                  | j                         d|d|j                  | j                         | j                               |j                  | j                                n|j                  j                  t        j                  dd             |j                  t        j                   d            }|j                  | j                         d|d|d|j                  | j                         | j                               |j                  | j                                |j                  d| j                         z         |j#                  | j                         d	| j                         z         |j                  |j                  | j                         | j                               |j                  | j                                |j                  d
       |j%                  | j                  d| j                         z         y )Nz = PyDict_Keys(r   PyObjectCallMethod0rp  keysz = __Pyx_PyObject_CallMethod0(rk  z"if (unlikely(!PyList_Check(%s))) {zPySequence_List(%s)r   zPyList_Sort(%s))r  r   r   r   r   r   r   r   r}   r  rt  ru  r	   r{  rw  r   r  r  r  )rT   r   dict_result
keys_cnames       rO   rm  z'SortedDictKeysNode.generate_result_code"  s   hh((*88==G---JJ{''txx@B C OODNN,- --k.E.E%'9/; <//0L0LV0TUJJJ{J''txx@B C OODNN,-JJ;dkkmKL/Dt{{}/TUJJt..t{{}dhhGHOODNN,-JJsOHH'$..*::	<rP   N)	rV   rW   rX   r   r   rQ  r  r  rm  rR   rP   rO   r  r  "  s"    wHG&<rP   r  c                       e Zd Zd Zd Zy)ModuleNameMixinc                 <    |j                  | j                  d      S NT)r  )r  r  rb  s     rO   get_py_mod_namezModuleNameMixin.get_py_mod_name"  s%    '' ( / 	/rP   c                 <    |j                  | j                  d      S r  )r  qualnamerb  s     rO   get_py_qualified_namez%ModuleNameMixin.get_py_qualified_name"  s#    ''MMd ( , 	,rP   N)rV   rW   rX   r  r  rR   rP   rO   r  r  "  s    /,rP   r  c                   6    e Zd ZdgZeZdZd Zd Zd Z	dZ
d Zy)		ClassNodedocTc                     t         S rI   r+  r	  s     rO   r   zClassNode.infer_type#      rP   c                     | j                   r@| j                   j                  |      | _         | j                   j                  |      | _         |j                  t	        j
                  dd             | S )NCreateClassrp  )r  r  r  ru  r	   r{  r	  s     rO   r  zClassNode.analyse_types#  sV    88xx--c2DHxx2237DH[44]DVWXrP   c                      yr"  rR   rS   s    rO   r  zClassNode.may_be_none#  r  rP   Constructing Python classc                    | j                   }|j                  | j                        }| j                  rx|j	                  | j
                  d|j                  j                         d|j                  t        j                  d            d| j                  j                         d       | j                  |      }| j                  |      }|j                  | j                         d|j                  j                         d|j                  j                         d|d|d|d|j                  | j                         | j
                               |j!                  | j                                y )NrK  rk  r  r  z = __Pyx_CreateClass(r   )class_def_noderw  rm   r  r  r}   r  r   r   r  r  r  r   r   basesr   r  )rT   r   r	  r   py_mod_namer  s         rO   rm  zClassNode.generate_result_code#  s   ,,&&tyy188!!$(("''113**&44Y?AHH&&(	*+ **40--d3

$$..0##--/''txx@B	C 	()rP   NrV   rW   rX   r   r   r   r   r   r  r  r  rm  rR   rP   rO   r  r  "  s0     wHDG .K*rP   r  c                   4    e Zd Zg ZeZdZd Zd Zd Z	dZ
d Zy)Py3ClassNodeTc                     t         S rI   r+  r	  s     rO   r   zPy3ClassNode.infer_typeE#  r  rP   c                     | S rI   rR   r	  s     rO   r  zPy3ClassNode.analyse_typesI#  r  rP   c                      yr"  rR   rS   s    rO   r  zPy3ClassNode.may_be_noneL#  r  rP   r	  c                    |j                   j                  t        j                  dd             |j	                  | j
                        }| j                  }|j                  r|j                  j                         nd}|j                  r|j                  j                         }nd}|j                  d| j                         |||j                  j                         |j                  j                         || j                  | j                  |j!                  | j                         | j"                        f	z         |j%                  | j                                y )NPy3ClassCreaterp  rE  z$((PyObject*)&__Pyx_DefaultClassType)z9%s = __Pyx_Py3ClassCreate(%s, %s, %s, %s, %s, %d, %d); %s)rt  ru  r	   r{  rw  rm   r	  mkwr   	metaclassr   r   r	  r  calculate_metaclassallow_py2_metaclassr   r}   r  )rT   r   r   r	  r	  r	  s         rO   rm  z!Py3ClassNode.generate_result_codeQ#  s   ))+*A*ABRTf*gh&&tyy1,,0>0B0Bn  **,##&00::<I>I

G$$..0##--/((((''txx@	KB 	B
	C 	()rP   Nr	  rR   rP   rO   r	  r	  6#  s.     HDG .K*rP   r	  c                   "    e Zd Zg Zd Zd Zd Zy)PyClassMetaclassNodec                 *    t         | _        d| _        | S r"  )r   r   r   r	  s     rO   r  z"PyClassMetaclassNode.analyse_typeso#  s    "	rP   c                      yr"  rR   rS   s    rO   r  z PyClassMetaclassNode.may_be_nonet#  r  rP   c           
      j   | j                   j                  }| j                   j                  }|rU|j                  j	                  t        j                  dd             d|j                         d|j                         d}nB|j                  j	                  t        j                  dd             d|j                         z  }|j                  | j                         d|d	|j                  | j                         | j                               |j                  | j                                y )
NPy3MetaclassGetrp  z__Pyx_Py3MetaclassGet(rk  r  CalculateMetaclassz"__Pyx_CalculateMetaclass(NULL, %s)r  r  )r	  r	  r	  rt  ru  r	   r{  r   r   r   r}   r  r   )rT   r   r	  r	  calls        rO   rm  z)PyClassMetaclassNode.generate_result_codew#  s    ##))!!%%--''(9;MNP 

D --''(<>PQS7 D

t''txx@B	C 	()rP   NrV   rW   rX   r   r  r  rm  rR   rP   rO   r	  r	  h#  s    
 H
*rP   r	  c                   $    e Zd ZdgZd Zd Zd Zy)PyClassNamespaceNoder  c                     | j                   r/| j                   j                  |      j                  |      | _         t        | _        d| _        | S r  )r  r  r  r   r   r   r	  s     rO   r  z"PyClassNamespaceNode.analyse_types#  s=    88xx--c2EEcJDH"	rP   c                      yr"  rR   rS   s    rO   r  z PyClassNamespaceNode.may_be_none#  r  rP   c                    |j                  | j                        }| j                  |      }| j                  |      }| j                  }d}| j
                  r| j
                  j                         n|}|j                  r|j                  j                         n|}|j                  r|j                  j                         n|}	|j                  | j                         d|	d|j                  j                         d|d|d|d|d|d|j                  | j                         | j                               |j                  | j                                y )Nz(PyObject *) NULLz = __Pyx_Py3MetaclassPrepare(rk  r   )rw  rm   r  r  r	  r  r   r	  r   r	  r   r	  r   r}   r  )
rT   r   r   r	  r  r	  nulldoc_coder	  r	  s
             rO   rm  z)PyClassNamespaceNode.generate_result_code#  s
   &&tyy1**40--d3,,"(,488??$d0>0B0Bn  **,<J<T<TN,,668Z^	

$$++-''txx@	B
	C 	()rP   Nr	  rR   rP   rO   r	  r	  #  s     wH*rP   r	  c                   .    e Zd ZdZeZg ZdZd Zd Z	d Z
y)ClassCellInjectorNodeTFc                     | S rI   rR   r	  s     rO   r  z)ClassCellInjectorNode.analyse_expressions#  r  rP   c                     | j                   sJ |j                  | j                         d|j                  | j                         | j                               |j                  | j                                y )Nz = PyList_New(0); )	is_activer   r   r   r}   r  rb  s     rO   rm  z*ClassCellInjectorNode.generate_result_code#  sV    ~~

''txx@B	C 	&rP   c                     | j                   sJ |j                  j                  t        j                  dd             |j                  | j                  d| j                         d|d       y )NCyFunctionClassCellCythonFunction.cz__Pyx_CyFunction_InitClassCell(rk  r  )r&	  rt  ru  r	   r{  r  r}   r   )rT   r   classobj_cnames      rO   generate_injection_codez-ClassCellInjectorNode.generate_injection_code#  sW    ~~))##$9;MN	PdhhKKM>)+ 	,rP   N)rV   rW   rX   r   r   r   r   r&	  r  rm  r+	  rR   rP   rO   r#	  r#	  #  s%    GDHI',rP   r#	  c                   (    e Zd Zg ZdZdZeZd Zd Z	y)ClassCellNodeTFc                     | S rI   rR   r	  s     rO   r  zClassCellNode.analyse_types#  r  rP   c                    | j                   s4|j                  | j                         dt        j                  d       n3|j                  | j                         dt        j
                  d       |j                  d| j                         d|j                  | j                        d       |j                  | j                         t               y )Nz  = __Pyx_CyFunction_GetClassObj(rl  z =  z->classobj;zif (!zI) { PyErr_SetString(PyExc_SystemError, "super(): empty __class__ cell"); r  )
is_generatorr   r   r   
self_cnamegenerator_cnamer   r}   ra  r   rb  s     rO   rm  z"ClassCellNode.generate_result_code#  s      JJ!!# $ JJv557 8

 )+	,
 	~6rP   N)
rV   rW   rX   r   r   r0	  r   r   r  rm  rR   rP   rO   r-	  r-	  #  s     HGLD7rP   r-	  c                       e Zd Zg dZdZdZdZdZdZdZ	dZ
dZdZdZeZdZdZdZed        Zd Zd Zd	 Zd
 ZdZd Zd Zd Zd Zy)PyCFunctionNode)code_objectdefaults_tupledefaults_kwdictannotations_dictNFr   r&   c           
           | |j                   ||j                  j                  |xs |j                  |j                  t	        |            S )N)r  pymethdef_cnamebindingspecialized_cpdefsr5	  )r}   r   r:	  r<	  CodeObjectNode)rM   r   r;	  s      rO   from_defnodezPyCFunctionNode.from_defnode
$  sD    488 #'::#=#="=d&=&=&*&=&=-d35 	5rP   c                 @    | j                   r| j                  |       | S rI   )r;	  analyse_default_argsr	  s     rO   r  zPyCFunctionNode.analyse_types$  s    <<%%c*rP   c                    g }g }g }g }g }|j                   xs$ | j                  j                  xr |j                  }| j                  j                  D ]  }|j
                  r|s|j
                  j                  sAd|_        |j                  j                  r|j                  |       n7|j                  |       n%t        |j                  |j
                        |_        |j                  r|j                  |       n|j                  |       |j                  s| j                  ||j                        |_        |j                  |j                  |j                   |j                  f        | j                  j"                  | j                  j$                  fD ]e  }|s|j                  s| j                  ||j                        |_        |j                  |j                  |j                   |j                  f       g | j                  j&                  }	|	rT| j                  ||	      }	|	| j                  _        |j                  |	j                  t)        j*                  d      |	f       |s|r|j-                         }
|
j/                  t0        j2                        }t5        j6                  |      }g | _        |D ]d  }|j;                  |j                   |j                  dt0        j<                  |j                   z   d      }| j8                  j                  ||f       f |D ]e  }|j;                  |j                   |j                  dt0        j<                  |j                   z   dd      }| j8                  j                  ||f       g |
j?                  dd|dd|	      }|| _         tC        |      | _"        | j8                  D ])  \  }}t0        jF                  d
|jH                  |_%        + | j@                  j                   | j                  _         |s|rB| j@                  |rTtM        | j                  |D cg c]  }|j
                   c}      }|jO                  |      jQ                  |      | _)        |rtU        | j                  |D cg c]C  }tW        |j                  tY        |j                  |j                         |j
                        E c}      }|jO                  |      | _-        na|r"t]        | j                  || j@                        }nt_        | j                        }|r"ta        | j                  || j@                        }nt_        | j                        }tc        jd                  | j                  g ddtc        jf                  | j                  th        tM        | j                  ||g            dt)        j*                  d            }|j-                         }
|jk                  |
       |jm                  |
      }|jn                  jm                  |jp                        |_7        d|_9        d|_:        || j                  _;        |r[tU        | j                  |D cg c]  \  }}}tW        |tY        ||      |      ! c}}}      }|jO                  |      | _<        yyc c}w c c}w c c}}}w )zB
        Handle non-literal function's default arguments.
        TreturnN)allow_pyobjectF)rC	  allow_memoryviewstructr&   ri  rp  r  r  r  r  )r  r   __defaults__)r   r  r  body
decoratorsrm   )=is_c_class_scoper  
is_wrapperr)  r   rc   r   
is_dynamicr   rl   r   DefaultLiteralArgNoder}   kw_onlyr  analyse_annotationrm   r  r  return_type_annotationr   r  r  next_idr   defaults_struct_prefixr   StructOrUnionScopedefaultsr,  
arg_prefixdeclare_struct_or_uniondefaults_structr   defaults_pyobjectsdynamic_args_cnamer   r  r  r  r  r6	  ro  rm  r  r7	  DefaultsTupleNoder  DefaultsKwDictNoder   DefNodeReturnStatNoder   r  r  rG	  local_scopepy_wrapper_requiredpymethdef_requireddefaults_getterr8	  )rT   rn   nonliteral_objectsnonliteral_otherdefault_argsdefault_kwargsannotationsmust_use_constantsr  r  rn  r   r  r   r6	  r7	  r`	  r}   rm   r   r8	  s                        rO   r@	  z$PyCFunctionNode.analyse_default_args$  s      !11gdmm6N6N6fSVSfSf==%% 	HC{{#5{{--%)CNxx++*11#6(//4"7"MCK;;"))#. '',~~!%!8!8cnn!M""CGGSXXs~~#FG!	H$ MM**DMM,F,FG 	HCs~~!%!8!8cnn!M""CGGSXXs~~#FG	H
 ]]99
00jAJ3=DMM0
0L0LX0VXbcd!1++-L (()F)FGE--e4EDM) 3))#((CHHd*0*;*;chh*F9= * ? $$c5\2	3
 ( 3))#((CHHd*0*;*;chh*F9>QU * W $$c5\2	3
 !88hq$e 9 =E#(D &)*<&=D#"mm <
U--u{{%<!< -1,@,@,E,EDMM)>##+%.txx/;?=(+?= &>N*8*F*Fs*K*^*^_b*cD'!&.txx
 $2J3
  	 %GG 4SWWCHH M"%++/J3 '4O ,;+H+H+MD(%6,0D0D&FN &.dhh%7N!&8.$2F2F'HO '/txx&8O"'--HH24--n' HHNO+LNO  $'55nE#G  #//144\B"1"E"El"S'6';';'O'O#//(1$6;35:20?-' )4	C5 C5 %Cu 1#TB!C5  6
 %5$B$B3$GD! Q?=J3JC5s   [
A[
 $[c           	         |y |j                  |      }|;t        |j                  t        j                  |j                  dd                  }|j                  |      }|j                  j                  s|j                  |      }|S )Nr  T)for_displayr  )
r4  r  r}   r   r  r   r  r   rl   r  )rT   rn   r  r.  s       rO   rN	  z"PyCFunctionNode.analyse_annotation$  s    **3/$$2253I3I"Z^3I3_`bJ  --c2
**#66s;JrP   c                      yr@  rR   rS   s    rO   r  zPyCFunctionNode.may_be_none$  r  rP   zConstructing Python functionc                 Z    | j                   d}|S | j                   j                         }|S )NrE  )self_objectr   )rT   self_results     rO   self_result_codez PyCFunctionNode.self_result_code$  s7    # K  **446KrP   c                 b    | j                   r| j                  |       y | j                  |       y rI   )r;	  generate_cyfunction_codegenerate_pycfunction_coderb  s     rO   rm  z$PyCFunctionNode.generate_result_code$  s%    <<))$/**40rP   c                 >   | j                  |      }|j                  | j                         d| j                  d| j	                         d|d|j                  | j                         | j                        	       |j                  | j                                y )Nz = PyCFunction_NewEx(&rk  r   )	r  r   r   r:	  rm	  r   r}   r  r   )rT   r   r	  s      rO   rp	  z)PyCFunctionNode.generate_pycfunction_code$  su    **40

$$%%'''txx@B	C 	()rP   c                 	   | j                   r| j                   d   }n| j                  }| j                   s| j                  r2|j                  j	                  t        j                  dd             d}n1|j                  j	                  t        j                  dd             d}| j                  r| j                  j                         }nd}g }|j                  r|j                  d       n|j                  r|j                  d	       |j                  j                  j                  r'|j                  j                   s|j                  d
       |rdj#                  |      }nd}|j%                  | j'                         d|d| j(                  d|d| j+                  |      d| j-                         d| j/                  |      dt0        j2                  d|d|j5                  | j'                         | j6                               |j9                  | j                                |j:                  r|j<                  sJ d       |j<                  d   }|j?                  | j                         t@               |j%                  d|jB                  j'                         d| j'                         d       |jE                  | j                                | jF                  r|j%                  d| j'                         | jH                  jJ                  | jL                  |jO                  | j6                        fz         d| jH                  jJ                  d| j'                         d}| jF                  D ]'  \  }}	|jQ                  ||d|	jR                         ) | jT                  r>|j%                  d| j'                         d| jT                  j                         d       | jV                  r>|j%                  d| j'                         d| jV                  j                         d       |jX                  rP| j                   sD|j%                  d| j'                         d|jX                  j                  jZ                  d       | j\                  r?|j%                  d| j'                         d| j\                  j                         d       y y )Nr   FusedFunctionr)	  __pyx_FusedFunction_NewCythonFunction__Pyx_CyFunction_NewrE  __Pyx_CYFUNCTION_STATICMETHOD__Pyx_CYFUNCTION_CLASSMETHOD__Pyx_CYFUNCTION_CCLASSz | ri  r  z(&rk  r   zpyclass_stack is emptyr  zPyList_Append(rl  z:if (!__Pyx_CyFunction_InitDefaults(%s, sizeof(%s), %d)) %s__Pyx_CyFunction_Defaults(r  rp  ra  z"__Pyx_CyFunction_SetDefaultsTuple(z#__Pyx_CyFunction_SetDefaultsKwDict(z#__Pyx_CyFunction_SetDefaultsGetter(z$__Pyx_CyFunction_SetAnnotationsDict()/r<	  r  is_specializationrt  ru  r	   r{  r5	  r   is_staticmethodr   is_classmethodr]	  rr  rI	  r   is_anonymousr<  r   r   r:	  r  rm	  r  r   r  r   r}   r  requires_classobjpyclass_stackra  r   
class_cellr  rS	  rV	  rm   rW	  r   r  r   r6	  r7	  r`	  r  r8	  )
rT   r   r  r  code_object_resultflags
class_noderS	  r  r   s
             rO   ro	  z(PyCFunctionNode.generate_cyfunction_code$  s   ""..q1H}}H""d&<&<--''9KLN3K--''(8:LMO0K!%!1!1!;!;!=!'##LL89$$LL78,,==hnnFaFaLL23JJu%EE

$$**40%%'$$T*$$"''txx@
B	C 	()%%%%?'??++B/JOODNN,n=JJ))002KKM#$ T^^-.==JJLKKM4#7#7#<#<++T__TXX-FPH HI
 $$))4;;=:H"mm ,
U,,Tekk;+, ,, JJt22<<>@ AJJt33==?A B##D,C,CJJx77==JJL M  JJt44>>@B C !rP   )rV   rW   rX   r   rk	  r5	  r;	  r  rS	  rV	  rW	  r6	  r7	  r8	  r   r   r   r<	  r{	  r  r>	  r  r@	  rN	  r  r  rm	  rm  rp	  ro	  rR   rP   rO   r4	  r4	  #  s    $H KKGHHONODG5 5
wHr 1K1
*RCrP   r4	  c                       e Zd ZdZdZd Zy)InnerFunctionNodeTc                 B    | j                   rdt        j                  z  S y)Nz((PyObject*)%s)rE  )needs_self_coder   cur_scope_cnamerS   s    rO   rm	  z"InnerFunctionNode.self_result_code%  s    $v'='===rP   N)rV   rW   rX   r;	  r	  rm	  rR   rP   rO   r	  r	  %  s     GOrP   r	  c                   4    e Zd ZdgZdZdZd Zd ZddZd Z	y)	r=	  varnamesFNc           
         t         j                  | |j                  |       t        |j                        }|j
                  j                  D cg c]  }|j                  s| }}t        |j                  ||z   D cg c]#  }t        |j                  |j                        % c}dd      | _
        y c c}w c c}w )N)r  r  r   r&   )r   r   r   )r   rQ  r}   r   r   r]	  rl  rm   r  r  r	  )rT   r  r   r  
local_varss        rO   rQ  zCodeObjectNode.__init__)%  s    $x@HMM"%-%9%9%E%ERccR
R!LL!J.0 'swwchh? 0 S0s   B7"B7?(B<
c                      yr@  rR   rS   s    rO   r  zCodeObjectNode.may_be_none5%  r  rP   c                 l    | j                   |j                  t        dd      | _         | j                   S )Ncodeobjr0   rO  )re  r  r   rb  s     rO   r   z$CodeObjectNode.calculate_result_code8%  s5    ##00Z[0\DrP   c                    | j                   |j                  t        dd      | _         |j                  | j                         }|y |j	                  | j
                         | j                  }|j                  |j                  dd|j                        }t        j                  |j
                  d   j                         j                  d      d      }|j                  |dd	      }d
dg}| j                  j                  r|j                  d       | j                  j                  r|j                  d       |j!                  d| j                   t#        |j$                        |j&                  z
  |j&                  t#        | j(                  j$                        dj+                  |      xs dt,        j.                  t,        j0                  t,        j0                  | j(                  j3                         t,        j0                  t,        j0                  ||| j
                  d   t,        j.                  |j5                  | j                   | j
                        fz         y )Nr	  r0   r	  TFr  r   utf8)r  r  CO_OPTIMIZEDCO_NEWLOCALS
CO_VARARGSCO_VARKEYWORDSz_%s = (PyObject*)__Pyx_PyCode_New(%d, %d, %d, 0, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %s); %s|ri  r&   )re  r  r   r  rl  r}   r  r  rm   r   r  get_filenametable_entryr  r  r   r  r   r   r   r  r	  r<  r   empty_bytesr8  r   r   )rT   r   func	func_name	file_pathfile_path_constr	  s          rO   rm  z#CodeObjectNode.generate_result_code=%  s   ##00Z[0\D//0@0@A<dhh}},,II$uDII - O	 #00!1T1T1V1]1]^d1egmn	229W[2\  0==!!LL&==%%LL)*

t		NT111  ""#HHUO"sMM  "HHQK##D$4$4dhh?!x  	rP   rI   )
rV   rW   rX   r   r   re  rQ  r  r   rm  rR   rP   rO   r=	  r=	  %  s)     |HGK
 
(rP   r=	  c                   B     e Zd Zg ZdZdZ fdZd Zd Zd Z	d Z
 xZS )rL	  TFc                 ~    t         t        |   |       || _        | j                  j                  | _        d| _        y r@  )rK   rL	  rQ  r  r   	evaluated)rT   r}   r  rN   s      rO   rQ  zDefaultLiteralArgNode.__init__q%  s0    #T3C8HHMM	rP   c                     | S rI   rR   r	  s     rO   r  z#DefaultLiteralArgNode.analyse_typesw%  r  rP   c                      y rI   rR   rb  s     rO   rm  z*DefaultLiteralArgNode.generate_result_codez%  r  rP   c                 b    | j                   s#| j                  j                  |       d| _         y y r"  )r	  r  rr  rb  s     rO   rr  z.DefaultLiteralArgNode.generate_evaluation_code}%  s'    ~~HH--d3!DN rP   c                 h    | j                   j                  | j                  j                               S rI   )r   r  r  r   rS   s    rO   r   zDefaultLiteralArgNode.result%  s"    yy""488??#455rP   )rV   rW   rX   r   r   r   rQ  r  rm  rr  r   rY   rZ   s   @rO   rL	  rL	  h%  s-    
 HJG"
6rP   rL	  c                   4     e Zd Zg Z fdZd Zd Zd Z xZS )DefaultNonLiteralArgNodec                 H    t         t        |   |       || _        || _        y rI   )rK   r	  rQ  r  rV	  )rT   r}   r  rV	  rN   s       rO   rQ  z!DefaultNonLiteralArgNode.__init__%  s"    &6s;.rP   c                 J    | j                   j                  | _        d| _        | S r@  )r  r   r   r	  s     rO   r  z&DefaultNonLiteralArgNode.analyse_types%  s    HHMM	rP   c                      y rI   rR   rb  s     rO   rm  z-DefaultNonLiteralArgNode.generate_result_code%  r  rP   c                     d| j                   j                  dt        j                  d| j                   j	                  | j
                  j                        j                  S )Nrz	  rk  r  )rV	  rm   r   r1	  r  r  r   rS   s    rO   r   zDefaultNonLiteralArgNode.result%  sE      %%v'8'8  ''6<<> 	>rP   )	rV   rW   rX   r   rQ  r  rm  r   rY   rZ   s   @rO   r	  r	  %  s     H/

>rP   r	  c                   *     e Zd Z fdZd fd	Z xZS )rY	  c                     g }|D ]C  }|j                   j                  st        |||      }n|j                   }|j                  |       E t        t
        |   ||       y )Nr  )rc   r   r	  r   rK   rY	  rQ  )rT   r}   rS	  rV	  r   r  rN   s         rO   rQ  zDefaultsTupleNode.__init__%  s^     	C;;)).sCIkkKK	 	/$/?rP   c                 J    t         t        |   ||      j                  |      S rI   )rK   rY	  r  r  )rT   rn   r  rN   s      rO   r  zDefaultsTupleNode.analyse_types%  s$    &;CObbcfggrP   r  rV   rW   rX   rQ  r  rY   rZ   s   @rO   rY	  rY	  %  s    @h hrP   rY	  c                        e Zd Z fdZ xZS )rZ	  c                 2   g }|D ]z  }t        |j                  |j                        }|j                  j                  st        |||      }n|j                  }|j                  t        |j                  ||             | t        t        | +  ||       y )Nr  r  r  )r  r}   rm   rc   r   r	  r   rm  rK   rZ	  rQ  )rT   r}   rS	  rV	  rq  r  rm   rN   s          rO   rQ  zDefaultsKwDictNode.__init__%  s     	EC'sxx@D;;)).sCIkkLLcgg4sCD	E 	 $0e0LrP   )rV   rW   rX   rQ  rY   rZ   s   @rO   rZ	  rZ	  %  s    	M 	MrP   rZ	  c                   X     e Zd ZdgZ ej
                  d      Zd Z fdZ fdZ	 xZ
S )
LambdaNoder  z<lambda>c                 n   |j                  d      x| _        | j                  _        d| j                  _        d| j                  _        | j                  j                  |       d| j                  _        | j                  j                  j                  | _        |j                  | j                         y )NlambdaT)
rP	  lambda_namer  no_assignment_synthesisr_	  r  is_cyfunctionr   r:	  add_lambda_defr	  s     rO   r  zLambdaNode.analyse_declarations%  s    7:{{87LL4==404-+/(**3/&*##}}22BB4==)rP   c                 j    | j                   j                  |      | _         t        t        |   |      S rI   )r  r  rK   r	  r  rT   rn   rN   s     rO   r  zLambdaNode.analyse_types%  s+    99#>Z4S99rP   c                 b    | j                   j                  |       t        t        |   |       y rI   )r  r  rK   r	  rm  rT   r   rN   s     rO   rm  zLambdaNode.generate_result_code%  s$    --d3j$4T:rP   )rV   rW   rX   r  r   r  rm   r  r  rm  rY   rZ   s   @rO   r	  r	  %  s2     ,K'>''
3D*:; ;rP   r	  c                   L     e Zd Z ej                  d      ZdZ fdZd Z xZ	S )GeneratorExpressionNodegenexprFc                    |j                  d      | _        t        t        |   |       d| j
                  _        d| j
                  _        d| j
                  _        t        j                  | j
                  j                  _        y )Nr	  F)rP	  genexpr_namerK   r	  r  r  r_	  r^	  r	  r.   pyfunction_noargsr   r  r	  s     rO   r  z,GeneratorExpressionNode.analyse_declarations%  s`    KK	2%tA#F+0(,1)&+#(1(C(C%rP   c                 >   |j                  | j                         d| j                  j                  j                  d| j                         d|j                  | j                         | j                               |j                  | j                                y Nr  r  r   )
r   r   r  r   r  rm	  r   r}   r  r   rb  s     rO   rm  z,GeneratorExpressionNode.generate_result_code%  sl    

##00%%'''txx@	B	C 	()rP   )
rV   rW   rX   r   r  rm   r;	  r  rm  rY   rZ   s   @rO   r	  r	  %  s'     (>''	2DGD*rP   r	  c                   H    e Zd ZdgZeZdZdZdZdZ	dZ
d Zd Zd Zd Zd	 Zy
)YieldExprNoder  r   Fyieldc                 \   | j                   r| j                  r/| j                  r#t        | j                  d| j
                  z         d| _        | j                  Q| j                  j                  |      | _        | j                  j                  j                  s| j                  |       | S )Nz'%s' not supported herer&   )	label_numis_yield_fromin_async_genr   r}   expr_keywordr   r  r  r   rl   coerce_yield_argumentr	  s     rO   r  zYieldExprNode.analyse_types&  s~    ~~$"4"49J9J$((58I8IIJ88xx--c2DH88==,,**3/rP   c                 D    | j                   j                  |      | _         y rI   r  r  r	  s     rO   r	  z#YieldExprNode.coerce_yield_argument&  s    88..s3rP   c                    | j                   r| j                   j                  |       | j                   j                  |       |j                  t        j
                  d| j                   j                  t              d       | j                   j                  |       | j                   j                  |       n$|j                  t        j
                  t               | j                  |       y Nr  r  )r  rr  rc  r   r   r  r   r   r  r  put_init_to_py_nonegenerate_yield_coderb  s     rO   rr  z&YieldExprNode.generate_evaluation_code&  s    88HH--d3HH))$/JJ''HH&&~689 HH2248HH%$$V%8%8.I  &rP   c           	         |j                  | j                  j                  dd            \  }}|j                  |       g }|j                  j
                  j                          |j                  j                         D ]  \  }}}|j                  j
                  j                  |      }|j                  |||f       |j                  r|j                  |       |j                  t        j                  d|d|d        |j                  t        j                         |j                   j"                  d   }	|j                   j"                  d   }
|	s|
r6|j%                  t        j                  |j                  j&                          |j)                          |j                  j*                  #|j                  d
t        j,                  z         n"|j                  dt        j,                  z         |j                  d| j.                  rdndd| j0                  rdndd       |j                  dt        j,                  |fz         | j.                  r/| j0                  s#|j                  dt        j                  z         n"|j                  dt        j                  z         |j3                  |       |D ]q  \  }}}|j                  |dt        j                  d|d       |j                  s<|j                  t        j                  d|d       |j5                  |       s | j7                  |t        j8                         | j:                  ri| j=                  |       |j?                  | jA                         dt        j8                  d       |jC                  | jA                         tD               y	y	)z
        Generate the code to return the argument in 'Naming.retval_cname'
        and to continue at the yield label.
        r  r/  rp  r  r  profile	linetrace)r   Nz"__Pyx_Coroutine_SwapException(%s);z+__Pyx_Coroutine_ResetAndClearException(%s);z/* return from zasync r  zgenerator, awaitr	  zing value */z%s->resume_label = %d;z,return __Pyx__PyAsyncGenValueWrapperNew(%s);z
return %s;z = 0;r  )#new_yield_labelr	  replace	use_labelrT  closure_tempsresettemps_in_userU  r   rl   r  r   r   r	  r  rt  rf   put_trace_return	gil_ownedput_finish_refcount_contextcurrent_exceptr2	  r	  is_awaitr  r  !generate_sent_value_handling_codesent_value_cnamerS  rW  r  r   ra  r   )rT   r   r	  
label_namesavedr   r   rP  
save_cnamer	  r	  s              rO   r	  z!YieldExprNode.generate_yield_code'&  s   
 !% 4 4%%c3/!1	:z"$$**,'+~~'B'B'D 	U#E455CCDIJLL%T23!!%(JJ)?)?UST	U 	&--.""--i8$$//<	i!!&"5"5,0NN,D,D(D " F((*>>((4JJ;f>T>TTU JJDvG]G]]^

))Hr1}}G'13 	4 	

+""I// / 	0T]]JJEH[H[[\JJ|f&9&99:z"', 	(#E:tJJ0F0F
ST

F,B,BJOP  '		(
 	..tV5L5LM%%d+HHDKKM63J3JKLOODKKM>: rP   c                 Z    |j                  |j                  || j                               y rI   )r   r   r}   rT   r   value_cnames      rO   r	  z/YieldExprNode.generate_sent_value_handling_code_&  s    

4**;ABrP   N)rV   rW   rX   r   r   r   r	  r	  r	  r	  r	  r  r	  rr  r	  r	  rR   rP   rO   r	  r	  %  sD     wHDIMHLL4'6;pCrP   r	  c                   &    e Zd Zd ZddZd Zd Zy)_YieldDelegationExprNodec                     t               rI   )NotImplementedErrorrb  s     rO   yield_from_funcz(_YieldDelegationExprNode.yield_from_funcd&  s    !##rP   Nc           
         || j                   j                  |       |j                  t        j                  d| j                  |      dt        j                  d|| j                   j                         n|d       |7| j                   j                  |       | j                   j                  |       n|r|j                  |t               |j                  t        j                         |j                  dt        j                  z         | j                  |       |j                  d       | j                  r| j                  |       n| j!                  |       |j                  d       y )Nr  r  rk  rl  r  r  r   )r  rr  r   r   r  r	  r2	  r   r{  r  ry  r   r  r	  rS  fetch_iteration_resulthandle_iteration_exception)rT   r   r@  rA  s       rO   rr  z1_YieldDelegationExprNode.generate_evaluation_codeg&  s   HH--d3

  &""$0$8DHH lJ	L 	M
 HH++D1HH%!!,?,,-

&)<)<<=  &

:''-++D1

3rP   c                     |j                  d| j                         z         |j                  | j                  d| j                         z         |j	                  | j                                y )Nr  z(__Pyx_PyGen_FetchStopIterationValue(&%s))r   r   r  r}   r  rb  s     rO   r	  z/_YieldDelegationExprNode.fetch_iteration_result&  sO    

<$++-/0dhh(RUYU`U`Ub(bc&rP   c                     |j                  d       |j                  d       |j                  d       |j                  d|j                  | j                        z         |j                  d       y )N,PyObject* exc_type = __Pyx_PyErr_Occurred();r  zif (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();r  r   )r   r   r}   rb  s     rO   r	  z3_YieldDelegationExprNode.handle_iteration_exception&  sX    

AB

$%

 i 	j

9ttxx889

3rP   r@  )rV   rW   rX   r	  rr  r	  r	  rR   rP   rO   r	  r	  c&  s    $2'rP   r	  c                        e Zd ZdZdZd Zd Zy)YieldFromExprNodeTz
yield fromc                     | j                   j                  j                  st        | j                  d       | j                   j                  |      | _         y )Nz-yielding from non-Python object not supported)r  r   rn  r   r}   r  r	  s     rO   r	  z'YieldFromExprNode.coerce_yield_argument&  s8    xx}}&&$((KL88..s3rP   c                 b    |j                   j                  t        j                  dd             y)NGeneratorYieldFromr0  __Pyx_Generator_Yield_Fromrt  ru  r	   r{  rb  s     rO   r	  z!YieldFromExprNode.yield_from_func&  (    ))+*A*ABVXe*fg+rP   N)rV   rW   rX   r	  r	  r	  r	  rR   rP   rO   r	  r	  &  s    ML4,rP   r	  c                        e Zd ZdZdZd Zd Zy)AwaitExprNodeTr	  c                 ^    | j                   !| j                   j                  |      | _         y y rI   r	  r	  s     rO   r	  z#AwaitExprNode.coerce_yield_argument&  s'    88xx2237DH  rP   c                 b    |j                   j                  t        j                  dd             y)NCoroutineYieldFromr0  __Pyx_Coroutine_Yield_Fromr	  rb  s     rO   r	  zAwaitExprNode.yield_from_func&  r	  rP   N)rV   rW   rX   r	  r	  r	  r	  rR   rP   rO   r 
  r 
  &  s     HL8
,rP   r 
  c                   *     e Zd Zd Z fdZd Z xZS )AwaitIterNextExprNodec                    |j                   j                  t        j                  dd             |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       y )NStopAsyncIterationr0  r	  zif (unlikely(exc_type && (exc_type == __Pyx_PyExc_StopAsyncIteration || ( exc_type != PyExc_StopIteration && exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, __Pyx_PyExc_StopAsyncIteration))))) {rn  r  r   )rt  ru  r	   r{  r   rb  s     rO   _generate_breakz%AwaitIterNextExprNode._generate_break&  sk    ))+*A*ABVXe*fg

AB

 h 	i 	

#$

8

3rP   c                 t    |j                   sJ d       | j                  |       t        t        |   |       y )N1AwaitIterNextExprNode outside of 'async for' loop)break_labelr	
  rK   r
  r	  r	  s     rO   r	  z,AwaitIterNextExprNode.fetch_iteration_result&  s3    T!TTT"#TA$GrP   c                     |j                   sJ d       |j                  d|z         | j                  |       |j                  |j                  | j                               |j                  d       y )Nr
  rm  r   )r
  r   r	
  r   r}   r	  s      rO   r	  z7AwaitIterNextExprNode.generate_sent_value_handling_code&  sX    T!TT

)K78T"

4??488,-

3rP   )rV   rW   rX   r	
  r	  r	  rY   rZ   s   @rO   r
  r
  &  s    
H
rP   r
  c                   *    e Zd ZeZdZd ZdZd Zd Z	y)GlobalsExprNoder&   c                 D    |j                  t        j                         | S rI   )ru  r   globals_utility_coder	  s     rO   r  zGlobalsExprNode.analyse_types&  s    W99:rP   zConstructing globals dictc                      yr@  rR   rS   s    rO   r  zGlobalsExprNode.may_be_none&  r  rP   c                     |j                  | j                         d|j                  | j                         | j                               |j	                  | j                                y )Nz = __Pyx_Globals(); )r   r   r   r}   r  rb  s     rO   rm  z$GlobalsExprNode.generate_result_code&  sJ    

KKM##DKKM488<> 	? 	&rP   N)
rV   rW   rX   r   r   r   r  r  r  rm  rR   rP   rO   r
  r
  &  s"    DG .K'rP   r
  c                       e Zd Zd Zy)LocalsDictItemNodec                 b   | j                   j                  |      | _         | j                  j                  |      | _        | j                   j                  |      | _         | j                  j                  j                  |      r"| j                  j                  |      | _        | S d | _        | S rI   )rj  r  r   r  r   r  r	  s     rO   r  z LocalsDictItemNode.analyse_types&  s    88))#.ZZ--c2
88..s3::??11#666s;DJ  DJrP   N)rV   rW   rX   r  rR   rP   rO   r
  r
  &  s    rP   r
  c                   $     e Zd Zd Z fdZ xZS )FuncLocalsExprNodec                 >   t        |j                  j                         D cg c]  }|j                  s|j                   c}      }|D cg c]'  }t	        |t        ||      t        ||d            ) }}t        j                  | ||d       y c c}w c c}w )Nr  T)rm   r~  r  )rn  r  )	r  r  rp  rm   r
  r  r  ro  rQ  )rT   r}   rn   r   r	  rM  rq  s          rO   rQ  zFuncLocalsExprNode.__init__&  s    $'KK$6$6$8H EJJEJJH I

 '(  $)#S93ST:< ( ( 	$U.2 	 	4H(s   BB,Bc                     t         t        |   |      }|j                  D cg c]  }|j                  | c}|_        |S c c}w rI   )rK   r
  r  rn  r   )rT   rn   r   r  rN   s       rO   r  z FuncLocalsExprNode.analyse_types&  sI    '<SA,0,@,@  :q$%GG$7 "#  : :s   Ar	  rZ   s   @rO   r
  r
  &  s    4 rP   r
  c                   *    e Zd Zd Zd Zd Zd Zd Zy)PyClassLocalsExprNodec                 >    t         j                  | |       || _        y rI   )r  rQ  pyclass_dict)rT   r}   r
  s      rO   rQ  zPyClassLocalsExprNode.__init__'  s    c*(rP   c                 J    | j                   j                  | _        d| _        | S r@  )r
  r   r   r	  s     rO   r  z#PyClassLocalsExprNode.analyse_types'  s!    %%**	rP   c                      yr@  rR   rS   s    rO   r  z!PyClassLocalsExprNode.may_be_none'  r  rP   c                 6    | j                   j                         S rI   )r
  r   rS   s    rO   r   zPyClassLocalsExprNode.result'  s      ''))rP   c                      y rI   rR   rb  s     rO   rm  z*PyClassLocalsExprNode.generate_result_code'  r  rP   N)rV   rW   rX   rQ  r  r  r   rm  rR   rP   rO   r
  r
  '  s    )
*rP   r
  c                     |j                   rt        |       S |j                  rt        | |j                        S t        | |      S rI   )r)  r
  r*  r
  r  r
  )r}   
scope_nodern   s      rO   LocalsExprNoder%
  '  s=    
s##
$S*//::c3''rP   )not~rh  r  c                   x    e Zd ZdgZdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd ZddZy)UnopNoder~  Tc                 l    t         | j                     } || j                  j                        | _        y rI   )compile_time_unary_operatorsr   r~  r{   rT   r	  s     rO   r   z"UnopNode.calculate_constant_result9'  s'    +DMM:#DLL$@$@ArP   c                     t         j                  | j                        }|s#t        | j                  d| j                  z         | j
                  j                  |      }	  ||      S # t        $ r}| j                  |       Y d }~y d }~ww xY w)Nz3Unary '%s' not supported in compile-time expression)	r+
  re   r   r   r}   r~  r  r  r  )rT   r  r	  r~  r  s        rO   r  zUnopNode.compile_time_value='  s|    +//>$((Emm$% ,,11$7	-=  	-))!,,	-s   !A) )	B2BBc                     | j                   j                  |      }|j                  s|j                  r|j	                  | j
                        }||S | j                  ||      S rI   )r~  r   r  r  find_cpp_operation_typer   infer_unop_type)rT   rn   operand_typecpp_types       rO   r   zUnopNode.infer_typeI'  sY    ||..s3$$(;(;#;;DMMJH###C66rP   c                 *    |j                   rt        S |S rI   )rl   r   rT   rn   r1
  s      rO   r0
  zUnopNode.infer_unop_typeQ'  s    ##!!rP   c                     | j                   j                  r=| j                   j                  j                  r| j                   j                  t        uryt        j                  |       S r@  )r~  r   r  r   r   r  rS   s    rO   r  zUnopNode.may_be_noneW'  sG    <<!2!2!B!B||  	1##D))rP   c                    | j                   j                  |      | _         | j                  |      rAt        t	        | j
                  | j                   j                              | _        d| _        | S | j                         r%| j                  |       t        | _        d| _        | S | j                         r| j                  |       | S | j                  |       | S r  )r~  r  is_pythran_operationrC   r:   r   r   r   is_py_operationcoerce_operand_to_pyobjectr   is_cpp_operationanalyse_cpp_operationanalyse_c_operationr	  s     rO   r  zUnopNode.analyse_types]'  s    ||11#6$$S)#$8HYHY$Z[DIDL  !!#++C0&DIDL
 	 ""$&&s+  $$S)rP   c                 6    | j                   j                         S rI   r~  r  rS   s    rO   r  zUnopNode.check_constl'      ||''))rP   c                     | j                   j                  j                  xs  | j                   j                  j                  S rI   )r~  r   rl   r  rS   s    rO   r8
  zUnopNode.is_py_operationo'  s-    ||  ,,K0A0A0K0KKrP   c                     t        |      }| j                  j                  }|xr |j                  xs |j                  S rI   )r;   r~  r   r?  r7   )rT   rn   
np_pythranop_types       rO   r7
  zUnopNode.is_pythran_operationr'  s7    #C(
,,##Lw00KG4K4KLrP   c                 F    | j                         r| j                          y y rI   r8
  r;  r	  s     rO   r<  zUnopNode.nogil_checkw'      !NN "rP   c                 F    | j                   j                  }|j                  S rI   )r~  r   r  r   s     rO   r:
  zUnopNode.is_cpp_operation{'  s    ||     rP   c                 D    | j                   j                  |      | _         y rI   )r~  r  r	  s     rO   r9
  z#UnopNode.coerce_operand_to_pyobject'  s    ||66s;rP   c           
         | j                   j                  r|j                  d       |j                  d| j                         z         |j                  d| j                         d| j                         d| j                  | j
                  j                         d       y | j
                  j                   j                  r| j                  |       y | j                  r| j                         r| j                  dk(  rt        || j                  | j                         d| j                  d	| j
                  j                         d
| j                   j                  r| j                         nd | j                  | j                         y |j                  | j                         d| j                  d	| j
                  j                         d
       y y )Nz// Pythran unaryopr  r  r  r  r  r  r  r  r  )r   r7   r   r   r   r~  r   rl   generate_py_operation_coder   r:
  r  r   r}   r   rh  rb  s     rO   rm  zUnopNode.generate_result_code'  s<   99$$JJ+,JJ3dkkmCDJJ++-	/ 0
 \\**++D1\\$$&4+?+?3+F'dhh%)[[]DMM4<<CVCVCXY%)YY%:%:DKKM(($*?*?A
 

DKKM4==$,,J]J]J_`a rP   c                 8   | j                  |      }|j                  | j                         d|d| j                  j	                         d|j                  | j                         | j                               |j                  | j	                                y r	  )py_operation_functionr   r   r~  r   r   r}   r  r  s      rO   rJ
  z#UnopNode.generate_py_operation_code'  sp    --d3

&&(''txx@	B	C 	()rP   c                     | j                   j                  j                  s;t        | j                  d| j
                  d| j                   j                  d       t        j                  | _        y )NzInvalid operand type for '' (r  )r~  r   r  r   r}   r   r   r,   rS   s    rO   
type_errorzUnopNode.type_error'  sH    ||  ))$(( 1 13 4))	rP   c                    |j                  | j                  | j                  g      }|r|s| j                          y |r~|j                  j
                  | _        |j                  j                  | _        | j
                  dk(  rGd| _        | j                  4|j                  t        j                  dd             nd| _        d| _        | j                  j                  j                  | j                        }|r=|;t        | j                  d| j                  dt               | j                          y || _        y )Nr  Tr  r  r  r  z' operator not defined for )r  r   r~  rO
  r   r  r   r   ru  r	   r{  r/
  r   r}   )rT   rn   overload_checkr   r2
  s        rO   r;
  zUnopNode.analyse_cpp_operation'  s    ##DMMDLL>B%OO#(::#=#=D #(::#=#=D ##s*#''/(()@)@AY[k)lm#%D #%D <<$$<<T]]Kh.$((t% &OO	rP   Nrj  )rV   rW   rX   r   infixr   r  r   r0
  r  r  r  r8
  r7
  r<  r:
  r9
  rm  rJ
  rO
  r;
  rR   rP   rO   r)
  r)
  *'  sd     {HEB
-7 **LM
!<b(**rP   r)
  c                   F    e Zd ZdZej
                  Zd Zd Zd Z	d Z
d Zy)NotNode!c                 <    | j                   j                   | _        y rI   )r~  r{   rS   s    rO   r   z!NotNode.calculate_constant_result'  s    #'<<#?#??rP   c                     | j                   j                  |      }	 | S # t        $ r}| j                  |       Y d }~y d }~ww xY wrI   )r~  r  r  r  )rT   r  r~  r  s       rO   r  zNotNode.compile_time_value'  sD    ,,11$7	-; 	-))!,,	-s     	A?Ac                 "    t         j                  S rI   )r   rA  r4
  s      rO   r0
  zNotNode.infer_unop_type'  s    %%%rP   c                     | j                   j                  |      | _         | j                   j                  }|j                  r| j	                  |       | S | j                   j                  |      | _         | S rI   )r~  r  r   r  r;
  r  r4
  s      rO   r  zNotNode.analyse_types'  sb    ||11#6||(($$&&s+   <<99#>DLrP   c                 <    d| j                   j                         z  S )Nz(!%s)r~  r   rS   s    rO   r   zNotNode.calculate_result_code'      ,,...rP   N)rV   rW   rX   r   r   rA  r   r   r  r0
  r  r   rR   rP   rO   rT
  rT
  '  s.     H!!D@-&/rP   rT
  c                   "    e Zd ZdZd Zd Zd Zy)UnaryPlusNoder  c                 ~    t        j                  | j                  j                  t         j                        | _        y rI   )r   rZ  r~  r   r  r	  s     rO   r<
  z!UnaryPlusNode.analyse_c_operation'  s)    22LLz446	rP   c                      y)NPyNumber_PositiverR   rb  s     rO   rL
  z#UnaryPlusNode.py_operation_function'      "rP   c                     | j                         rd| j                  j                         z  S | j                  j                         S )Nz(+%s))r:
  r~  r   rS   s    rO   r   z#UnaryPlusNode.calculate_result_code'  s9      "T\\00222<<&&((rP   N)rV   rW   rX   r   r<
  rL
  r   rR   rP   rO   r^
  r^
  '  s     H6#)rP   r^
  c                   (    e Zd ZdZd Zd Zd Zd Zy)UnaryMinusNoderh  c                    | j                   j                  j                  r>t        j                  | j                   j                  t        j
                        | _        nF| j                   j                  j                  rt        j
                  | _        n| j                          | j                  j                  rd| _	        y y r@  )
r~  r   r_  r   rZ  r  r  rO
  r  rR
  r	  s     rO   r<
  z"UnaryMinusNode.analyse_c_operation'  s    <<''"66!!:#8#8:DI\\&&"--DIOO99DJ  rP   c                      y)NPyNumber_NegativerR   rb  s     rO   rL
  z$UnaryMinusNode.py_operation_function(  rb
  rP   c                     | j                   rd| j                  j                         z  S | j                  j                  j	                  d      d| j                  j                         dS )N(-%s)rh  r  r  )rR
  r~  r   r   unary_oprS   s    rO   r   z$UnaryMinusNode.calculate_result_code(  sN    ::T\\00222#||0099#>@S@S@UVVrP   c                 F    | j                   j                         }|rd|z  S y )Nrj
  )r~  r   )rT   r   s     rO   r   z)UnaryMinusNode.get_constant_c_result_code(  s&    779U?" rP   N)rV   rW   rX   r   r<
  rL
  r   r   rR   rP   rO   re
  re
  '  s     H	#W#rP   re
  c                       e Zd Zd Zd Zd Zy)	TildeNodec                 L   | j                   j                  j                  r>t        j                  | j                   j                  t        j
                        | _        y | j                   j                  j                  rt        j
                  | _        y | j                          y rI   )r~  r   r  r   rZ  r  r  rO
  r	  s     rO   r<
  zTildeNode.analyse_c_operation(  sf    <<##"66!!:#8#8:DI\\&&"--DIOOrP   c                      y)NPyNumber_InvertrR   rb  s     rO   rL
  zTildeNode.py_operation_function(  s     rP   c                 <    d| j                   j                         z  S )Nz(~%s)r[
  rS   s    rO   r   zTildeNode.calculate_result_code (  r\
  rP   N)rV   rW   rX   r<
  rL
  r   rR   rP   rO   rn
  rn
  (  s    !/rP   rn
  c                       e Zd Zd Zy)	CUnopNodec                      yr@  rR   rS   s    rO   r8
  zCUnopNode.is_py_operation&(  r  rP   N)rV   rW   rX   r8
  rR   rP   rO   rt
  rt
  $(  s    rP   rt
  c                   "    e Zd ZdZd Zd Zd Zy)DereferenceNoder   c                 R    |j                   r|j                  S t        j                  S rI   )r  r  r   r,   r4
  s      rO   r0
  zDereferenceNode.infer_unop_type.(  s#    )))(((rP   c                     | j                   j                  j                  r&| j                   j                  j                  | _        y | j	                          y rI   )r~  r   r  r  rO
  r	  s     rO   r<
  z#DereferenceNode.analyse_c_operation4(  s6    <<##))33DIOOrP   c                 <    d| j                   j                         z  S r}  r[
  rS   s    rO   r   z%DereferenceNode.calculate_result_code:(  r\
  rP   N)rV   rW   rX   r   r0
  r<
  r   rR   rP   rO   rw
  rw
  )(  s     H)/rP   rw
  c                       e Zd Zd Zd Zy)DecrementIncrementNodec                 X   | j                   j                  j                  r>t        j                  | j                   j                  t        j
                        | _        y | j                   j                  j                  r| j                   j                  | _        y | j                          y rI   )r~  r   r_  r   rZ  r  r  rO
  r	  s     rO   r<
  z*DecrementIncrementNode.analyse_c_operationA(  sj    <<''"66!!:#8#8:DI\\%%))DIOOrP   c                     | j                   r*d| j                  | j                  j                         dS d| j                  j                         | j                  dS )Nr  r  )	is_prefixr   r~  r   rS   s    rO   r   z,DecrementIncrementNode.calculate_result_codeJ(  sH    >>#}}dll.A.A.CDD   $||224dmmDDrP   N)rV   rW   rX   r<
  r   rR   rP   rO   r|
  r|
  >(  s    ErP   r|
  c                       fdS )Nc                 "    t        | fd|S )Nr
  r   )r|
  )r}   rS  r
  r   s     rO   <lambda>z%inc_dec_constructor.<locals>.<lambda>Q(  s    5cjYYajeij rP   rR   r
  s   ``rO   inc_dec_constructorr
  P(  s	    jjrP   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	AmpersandNode&c                 ,    t        j                  |      S rI   )r   r  r4
  s      rO   r0
  zAmpersandNode.infer_unop_typeZ(  s    $$\22rP   c                    | j                   j                  |      | _         | j                   j                  }|j                  r| j	                  |d       |j
                  s[|j                  sO| j                   j                         s5|j                  r| j                  d       | S | j                  d|z         | S |j                  rt| j                  d| j                   j                  rd| j                   j                  z  n0| j                   j                  rd| j                   j                  z  ndz         | S |j                  r| j                  st        j                   |      | _        | S )	NF)rQ
  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'object)r~  r  r   r  r;
  r$  r  r   r   r   rl   r  rm   r  r  r   r  )rT   rn   argtypes      rO   r  zAmpersandNode.analyse_types](  s#   ||11#6,,##&&s5&A$$(<(<@[@[@]))

DE K 

CgMNKJJ97;||7K7K$,,"3"33DHLLD]D]'$,,*@*@@  K##499"--g6DIrP   c                 6    | j                   j                         S rI   )r~  rE  rS   s    rO   r  zAmpersandNode.check_constr(  s    ||,,..rP   c                 h    t        | j                  |       t        j                  | _        d| _        y rg  r   r}   r   r,   r   re  rT   messs     rO   r   zAmpersandNode.erroru(  %    dhh))	$rP   c                 <    d| j                   j                         z  S )Nz(&%s)r[
  rS   s    rO   r   z#AmpersandNode.calculate_result_codez(  r\
  rP   c           
         | j                   j                  j                  r| j                  dk(  rt	        || j
                  | j                         d| j                  d| j                   j                         d| j                  j                  r| j                         nd | j                  | j                         y y y )Nr  r  r  r  )r~  r   r  r  r   r}   r   r   rl   r   rh  rb  s     rO   rm  z"AmpersandNode.generate_result_code}(  s    LL**t/C/Cs/J#D$((!%t||?R?R?TU!%!6!6D$$d&;&;= 0K*rP   N)
rV   rW   rX   r   r0
  r  r  r   r   rm  rR   rP   rO   r
  r
  T(  s'     H3*/%
/=rP   r
  )r  rh  r'
  c                 l   t        |t              rY|dk(  rTt        |j                  t        t	        j
                  |j                               |j                  |j                        S t        |t              r+|j                  |cxk(  rdv rn nt        | d|fdz  z  d       t        |   | ||      S )Nrh  )r}   r   rX  rW  z+-zAPython has no increment/decrement operator: %s%sx == %s(%sx) == x      )r   r~  )rz   r,  r}   rs   r   rc  r   rX  rW  r)
  r   r   unop_node_classes)r}   r   r~  s      rO   	unop_noder
  (  s     '7#CW[[#u7J7J7==7Y6Y2Z ' 0 07;K;KM 	M	GX	&7+;+;x+O4+OX]e\ghi\ijlmnX&s rP   c                   n    e Zd ZdgZdxZxZZd Zd Zd Z	d Z
d Zd Zd	 Zd
 Zd ZddZd Zd Zd Zy)rK  r~  Nc                      yr  rR   r	  s     rO   r   zTypecastNode.type_dependencies(  r@  rP   c                     | j                   ?| j                  j                  |      }| j                  j                  ||      \  }| _         | j                   S rI   )r   r  r  
declarator)rT   rn   r  r/  s       rO   r   zTypecastNode.infer_type(  sF    99..s3I??229cBLAtyyyrP   c                    | j                   ?| j                  j                  |      }| j                  j                  ||      \  }| _         | j                  j                         r| j                          | j                   j                  r+t        | j                  d       t        j                  | _         | j                  j                  |      | _        | j                   t        j                  u r| j                  j                  |      S | j                   j                  }| j                  j                   j                  }|r^|s\| j                  j!                         rB| j                   j"                  s,| j                   j$                  st        | j                  d       |r|s| j                   t&        u r6| j                  j                   j(                  rt+        | j                  |      S | j                  j                   j-                  |      r8t.        | _        | j                  j3                  | j                   |      | _        n| j                  j                   j4                  rk| j                  j                   j                  j6                  s|| j                  j                   j                  j8                  sRt        | j                  d       n;t;        | j                  d| j                  j                   d| j                   d       | j                  j=                  |      | _        n|r|s| j                   j?                  |      r-| j                  j3                  | j                   |      | _        n| j                   j4                  rZ| j                   j                  j6                  s| j                   j                  j8                  svt        | j                  d       n^t;        | j                  d| j                   d| j                  j                   d       n!|r}|r{| j@                  r)tC        | j                  | j                   |d	      | _        ntE        | j                  tF              r| j                  j3                  | j                   |      | _        n| j                   jH                  rA| j                  j                   jH                  r!| j                  j=                  |      | _        nK| j                  j                   jJ                  r+| j                  j3                  | j                   |      | _        | j                   j4                  r| j                   j                  j                  r}| j                   j                  jL                  r]| j                  j                   }|j4                  r|j                  }|j                  r#|jL                  st;        | j                  d
d       | S )NzCannot cast to a function typez>Casting temporary Python object to non-numeric non-Python typez>Python objects cannot be cast from pointers of primitive typeszNo conversion from z to z, python object pointer used.z<Python objects cannot be cast to pointers of primitive typesT)notnonezQCasting a GIL-requiring function into a nogil function circumvents GIL validationr&   )'r   r  r  r
  r~  r   r   r$  r   r}   r   r,   r  rA  r  rl   r   r_  r  r   r  r  r  r   r   r  r  rR  r  r   r  create_from_py_utility_code	typecheckr  rz   r  r  r  r   )rT   rn   r  r/  to_pyfrom_pyrC
  s          rO   r  zTypecastNode.analyse_types(  s   99..s3I??229cBLAty<<++-**,99!!$((02"--DI||11#699
...<<11#66		%%,,##//5T\\%>%>%@99''		0F0Fdhh `ayyJ&4<<+<+<+C+C+DLL#>>""99#>$2!#||55diiE<<$$++ LL--77??4<<CTCTC^C^ChChdhh(hi DHH))499'6 7#||<<SAUyy44S9#||55diiE!!		++33tyy7J7J7T7T$(($bcIIt||00#2 3~~-dllDIIsTXYDLL.9#||55diiEYY!!dll&7&7&B&B<<88=DL\\''<<11$))SADL99		 3 3 @ @TYYEXEXE^E^ll''G~~!++##GMMkmnprP   c                 6    | j                   j                         S rI   )r~  r  rS   s    rO   r  zTypecastNode.is_simple(  s    ||%%''rP   c                 6    | j                   j                         S rI   )r~  r   rS   s    rO   r   zTypecastNode.is_ephemeral(  s    ||((**rP   c                 R    | j                   xs | j                  j                         S rI   )r   r~  r%  rS   s    rO   r%  z!TypecastNode.nonlocally_immutable(  s    ||Bt||@@BBrP   c                     | j                   r5| j                   j                  r| j                  r| j                          y y y y rI   )r   rl   r   r;  r	  s     rO   r<  zTypecastNode.nogil_check(  s0    99..4<<NN 4@.9rP   c                 6    | j                   j                         S rI   r>
  rS   s    rO   r  zTypecastNode.check_const(  r?
  rP   c                 X    | j                  | j                  j                        | _        y rI   )r   r~  r{   rS   s    rO   r   z&TypecastNode.calculate_constant_result)  s    #99$,,:V:VWrP   c                 >   || j                   j                         }| j                  j                  r| j                   j                         }| j                   j                  j                  rQ| j                  j                  j                  d|z        }| j                  j                  j                  d|z        }n'| j                  j                  j                  |      }d}| j                  j                  d|d|dS | j                  j                  |      S Nz__Pyx_CREAL(%s)z__Pyx_CIMAG(%s)ri  r  rk  r  )r~  r   r   r  	real_typer  r  )rT   operand_result	real_part	imag_parts       rO   r   z"TypecastNode.calculate_result_code)  s    !!\\002N99!\\002N||  ++ II//99:Kn:\]	 II//99:Kn:\]	 II//99.I		II(( 
 99&&~66rP   c                 r    | j                   j                         }|r| j                  j                  |      S y rI   )r~  r   r   r  )rT   r
  s     rO   r   z'TypecastNode.get_constant_c_result_code)  s1    @@B99&&~66 rP   c                     | j                   j                  r'| j                  s| j                  j	                  |      S t
        j	                  | |      S rI   )r   rl   r   r~  r   r   r   s     rO   r   zTypecastNode.result_as)  s=    99  <<))$//%%dD11rP   c                     | j                   rl|j                  | j                         d| j                  j                         d       |j	                  | j                         | j                                y y )Nz = (PyObject *)r  )r   r   r   r~  ra  r   rb  s     rO   rm  z!TypecastNode.generate_result_code")  sT    <<JJKKMLL'')+, OODKKM4::<8 rP   rI   )rV   rW   rX   r   r  r
  r   r   r   r  r  r   r%  r<  r  r   r   r   r   rm  rR   rP   rO   rK  rK  (  s^     {H$((I(
T>@(+C*X7$7
29rP   rK  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                   n    e Zd ZdZddgZdZdZdZdZe	j                  Zd Zd Zd	 Zd
 Zd Zed        Zy)r  an  
    Used when a pointer of base_type is cast to a memoryviewslice with that
    base type. i.e.

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

    creates a fortran-contiguous cython.array.

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

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


    operand             ExprNode                 the thing we're casting
    base_type_node      MemoryViewSliceTypeNode  the cast expression node
    r~  shapesNTcc                 `   ddl m} | j                  j                  |      | _        | j                  r| j                  }n%| j
                  j
                  j                  |      }| j
                  j                  }t        | _	        g | _
        t        |      }| j                  j                  }| j                  j                  j                  sF| j                  j                  j                  s&t        | j                  j                  t                | S g }|j                  rA|j                  ri|j#                  |j$                         |j&                  }|j                  r4n4|j                  r|j&                  }nt        | j                  d|z         | S |j)                  |      s2|j*                  s&t        | j                  j                  t,               | S | j                  j                  j                  r>t        |      |k7  r0t        | j                  j                  d|t        |      fz         | S t/        |      D ]  \  }}	|	j0                  j2                  s(t        |	j0                  j                  t4               | c S |	j6                  j2                  r[|r;||   }
t9        | j                  t;        |
      |
t<        j>                        |	_        nt        |	j                  t@               | c S |	j6                  j                  |      |	_        |	j6                  jC                  | jD                  |      }|jF                  s|jI                  |       | j                  j#                  |       |d|dz
  fv }|	jJ                  j2                  s|r|	jJ                  j                  |      |	_%        |	jJ                  j                  jL                  sZ|	jJ                  jF                  rD|	jJ                  j                  jN                  s$t        |	jJ                  j                  d       | c S |	jJ                  jQ                  |      dk7  r(t        |	jJ                  j                  tR               | c S |dk(  s<d| _*        E|	jJ                  j2                  r]|rat        |	jJ                  j                  tR               | c S  | j                  jV                  s | j                  jI                  |      | _        d	gt        |      z  }| jT                  dk(  rd
|d<   nd
|d<   t=        jX                  ||      | _-        | jZ                  j]                  | j                         | j_                  |      | _	        |ja                  |       |jc                  |jd                         | S )Nr&   r  zunexpected base type %s foundz/Expected %d dimensions, array has %d dimensionsr'  r   zExpected an integer literalfortran)r  follow)r  contigr  )3r  r  r~  r  array_dtypebase_type_noder  r  r,   r   r
  r   r  r#  r   r}   ERR_NOT_POINTERr   r  r  r  rR  ERR_BASE_TYPEr}  r   r%  	ERR_STARTr   r,  rs   r   r  ERR_NOT_STOPr  
shape_typer   r  r   r  r  r  	ERR_STEPSmoder  r  r  validate_memslice_dtypeget_cython_array_typeuse_cython_array_utility_coderu  typeinfo_to_format_code)rT   rn   r  r
  r  r  r  array_dimension_sizesaxis_noaxisdimsizeshapefirst_or_lasts                rO   r  zCythonArrayNode.analyse_typesQ)  s:    ||11#6**K--<<DDSIK""''	4y LL%%	||  ''0A0A0J0J$,,""O4K !#$$%,,Y^^<%//	 $$ !++I$((;iGHK!!+.)2C2C$,,""M2K\\''C0E,F$,N$,,""C-137L3M,NOP K
 't_ )	MGT::%%djjnni0yy  (3G<G 'G8?-7-B-B!DDI $((L1K		//4DIII''=E##$$S)KKu%#4!8}4M99$$ II33C8			--$))2F2F		//$))--)FGK99//49$))--3Ka< )DIYY&&}diimmY/S)	V ||##<<66s;DL$%D	199	!*DG+DH';;KN22488<..s3	005Z??@rP   c                     | j                   rt        d      |j                  j                  | j                  d      | _         y )Nztemp allocated multiple timesT)r   rQ  rT  rU  r   rb  s     rO   rW  z$CythonArrayNode.allocate_temp_result)  s1    >>>??55diiFrP   c                 $    | j                  |      S rI   )r
  r	  s     rO   r   zCythonArrayNode.infer_type)  s    ))#..rP   c                     |j                         j                  j                  }|j                          |j                  j                  d      j                  S )Narray)r  r  cython_scopeload_cythonscope	viewscoper  r   )rT   rn   r
  s      rO   r
  z%CythonArrayNode.get_cython_array_type)  sE    '')11>>%%'%%,,W5:::rP   c                    ddl m} | j                  D cg c]+  }| j                  j	                  |j                               - }}| j                  j                  }j                  j                  t        d      }j                  j                  t        d      }d|j                         z  }|j                  |      }	| j                  j                  j                  rj!                  d| j                  j                         z         j!                  d       j!                  j#                  | j                  j$                               j!                  d       j!                  |d|	d	j'                  || j$                               j)                  |       d
t+        |      z  }
j!                  |d|
ddj-                  |      d	j'                  || j$                               j)                  |       | j                         |||| j.                  | j                  j                         f}j!                  d|z         j!                  j'                  | j                         | j$                               j)                  | j                                fd} ||        ||       y c c}w )Nr&   r<  Tr  z
if (!%s) {zQPyErr_SetString(PyExc_ValueError,"Cannot create cython.array from NULL pointer");r   z = __pyx_format_from_typeinfo(&r   z __PYX_BUILD_PY_SSIZE_T z = Py_BuildValue((char*) "(" z ")", rk  zP%s = __pyx_array_new(%s, %s, PyBytes_AS_STRING(%s), (char *) "%s", (char *) %s);c                 h    j                  | t               j                  j                  |        y rI   )ry  r   rT  r^  )r  r   s    rO   disposez5CythonArrayNode.generate_result_code.<locals>.dispose)  s%    !!$7NN''-rP   )r  r=  r
  r
  r  r   r  r  rT  rU  r   r  get_type_information_cnamer~  r   r  r   r   r}   r   r  r   r<  r
  )rT   r   r=  r
  r
  r  shapes_tempformat_tempitemsize	type_infobuildvalue_fmtr  r
  s    `           rO   rm  z$CythonArrayNode.generate_result_code)  s5    $(;;0 //++ELLN; 0 0""((nn22>4Hnn22>4H%">">"@@55dEB	<<##JJ|dll&9&9&;;<JJ S TJJtt||'7'789JJsO

##K:
 	
 	$3c&kA

IIf##K:	
 	 	${{}k8[yy$,,--/1

 ;=@A 	B 	

4**4;;=$((CD&	. 	]0s   0Kc                 r   |j                   }|j                  }t        |      }g }|j                  r7|j	                  t        ||||             |j                  }|j                  r7t        |dd      |d   _        t        j                  |||      }t        ||||      }|j                  |      }|S )z@
        Given a C array type, return a CythonArrayNode
        r  r   T)r   rV  r  )r  r
  )r
  r~  r
  )r}   r   r  r#  r   r  r  r,  r   r   MemoryViewSliceTypeNoder  r  )	rM   src_nodern   r}   r  r  r  memslicenoder   s	            rO   r  zCythonArrayNode.from_carray)  s    
 llMM	SM	  KK	#YY,57 8!++I     3TBR44StDMO \)1yJ%%c*rP   )rV   rW   rX   r  r   r
  r   r
  r
  r   r-  r
  r  rW  r   r
  rm  r  r  rR   rP   rO   r  r  3)  sc    ( 8$HFGDK--JfPG/;
1f  rP   r  c                   0    e Zd Zej                  Zd Zd Zy)
SizeofNodec                      yr"  rR   rS   s    rO   r  zSizeofNode.check_const*  r  rP   c                      y rI   rR   rb  s     rO   rm  zSizeofNode.generate_result_code*  r  rP   N)rV   rW   rX   r   r  r   r  rm  rR   rP   rO   r
  r
  *  s     ##DrP   r
  c                   &    e Zd Zg ZdZd Zd Zd Zy)r  Nc                     	 | j                  A| j                   j                  |      }| j                  j                  ||      \  }}	|	| _
        | j                          | S rI   )r  module_pathr  r2  r  r}   r  rm   SizeofVarNoder  r  r  r
  
check_type)
rT   rn   rZ  r  r~  r  r   r  r/  r  s
             rO   r  zSizeofTypeNode.analyse_types'*  sW      == ..s3I//11)SAKAx$DMrP   c                    | j                   }|sy |j                  r#|j                  st        | j                  d       y |j
                  rt        | j                  d       y |j                         st        | j                  d|z         y y )Nz Cannot take sizeof Python objectzCannot take sizeof voidz'Cannot take sizeof incomplete type '%s')r  rl   r  r   r}   rR  is_complete)rT   r  s     rO   r
  zSizeofTypeNode.check_type;*  sn    ==(B(B$((>?$((56%%'$((EPQ (rP   c                     | j                   j                  r"| j                   j                  dd      }d|z  S | j                   j                         }d|z  S )Nr  r&   )deref(sizeof(%s)))r  r  r   r  )rT   r  s     rO   r   z$SizeofTypeNode.calculate_result_codeF*  sV    ==** }}55b5BH (( }};;=H((rP   )rV   rW   rX   r   r  r  r
  r   rR   rP   rO   r  r  *  s     HH(	R)rP   r  c                   $    e Zd ZdgZd Zd Zd Zy)r
  r~  c                 H   | j                   j                  |      }|rd|| _        | j                  j                  r*| j                  j	                  |j
                        | _        t        | _        | j                          | S | j                   j                  |      | _         | S rI   )
r~  r4  r  r  r  r6  r  rN   r
  r  )rT   rn   operand_as_types      rO   r  zSizeofVarNode.analyse_typesW*  s     ,,66s;+DM}}%% $ 8 89N9N O+DNOO   <<55c:DLrP   c                 <    d| j                   j                         z  S )Nr
  r[
  rS   s    rO   r   z#SizeofVarNode.calculate_result_codee*  s     3 3 555rP   c                      y rI   rR   rb  s     rO   rm  z"SizeofVarNode.generate_result_codeh*  r  rP   N)rV   rW   rX   r   r  r   rm  rR   rP   rO   r
  r
  P*  s    
 {H6rP   r
  c                   ^    e Zd Zej                  ZdgZdZdZdZ	d Z
dZd Zd Zd Zd	 Zd
 Zy)
TypeidNoder~  Nr&   c                    |}|j                   s|j                  }|j                   s|j                  d| j                        }|j	                  d      }t        j                  t        j                  |j                              S )Nzlibcpp.typeinfor
  )	r)  r]  find_moduler}   r  r   r  c_const_typer   )rT   rn   
env_moduletypeinfo_moduletypeinfo_entrys        rO   get_type_info_typezTypeidNode.get_type_info_type{*  so    
,,#//J ,,$001BDHHM(//<,,Z-D-D^EXEX-YZZrP   ztypeid operatorc                    | j                  |       | j                  |      }|s| j                  d       | S || _        | j                  j                  |      }|r|| _        d| _        n| j                  j                  |      | _        d| _        | j                  j                  j                  r| j                  d       | S | j                  j                  j                  r| j                  d       | S | j                  j                  j                         s*| j                  d| j                  j                  z         | S |j                  t        j                  dd             | S )	NzKThe 'libcpp.typeinfo' module must be cimported to use the typeid() operatorTFz$Cannot use typeid on a Python objectzCannot use typeid on voidz)Cannot use typeid on incomplete type '%s'r  r  )r  r
  r   r   r~  r4  r  r5  r  rl   rR  r
  ru  r	   r{  )rT   rn   r
  as_types       rO   r  zTypeidNode.analyse_types*  s   s++C0	JJdeK	,,..s3#DMDL LL66s;DM DL}}!!--

AB##++

67]]''335

FI[I[[\[445MO_`arP   c                 h    t        | j                  |       t        j                  | _        d| _        y rg  r
  r
  s     rO   r   zTypeidNode.error*  r
  rP   c                      yr"  rR   rS   s    rO   r  zTypeidNode.check_const*  r  rP   c                     | j                   S rI   r  rS   s    rO   r   z TypeidNode.calculate_result_code*  r  rP   c                     | j                   r| j                  j                         }n| j                  j                         }t	        || j
                  | j                  d|dd d | j                         y )Nz
 = typeid(rl  )r5  r  r  r   r   r}   r   rh  )rT   r   r  s      rO   rm  zTypeidNode.generate_result_code*  sV    <<}};;=H}}++-Hdhh"&..(;$--	/rP   )rV   rW   rX   r   r,   r   r   r  r9  r   r
  cpp_messager  r   r  r   rm  rR   rP   rO   r
  r
  l*  sK       D{HHKG[ $K4%
/rP   r
  c                   8    e Zd ZdZeZdgZd Zd Zd Z	d Z
d Zy)
TypeofNodeNrm  c                 &   | j                   j                  |      | _         t        j                  t	        | j                   j
                              }t        | j                  |      }|j                  |      }|j                  |      | _	        | S )Nr  )
r~  r  r   r  rs   r   r  r}   r  rm  )rT   rn   r   rm  s       rO   r  zTypeofNode.analyse_types*  sn    ||11#6,,S1B1B-CDTXXU3'',11#6rP   c                 n    | j                   j                  |      | _         | j                   j                  S rI   )r~  r  r   r	  s     rO   r4  zTypeofNode.analyse_as_type*  s(    ||11#6||   rP   c                      yr@  rR   rS   s    rO   r  zTypeofNode.may_be_none*  r  rP   c                 :    | j                   j                  |       y rI   )rm  rr  rb  s     rO   rr  z#TypeofNode.generate_evaluation_code*  s    --d3rP   c                 6    | j                   j                         S rI   )rm  r   rS   s    rO   r   z TypeofNode.calculate_result_code*  s    ||1133rP   )rV   rW   rX   rm  r   r   r   r  r4  r  rr  r   rR   rP   rO   r  r  *  s.     GD{H!44rP   r  c                 d    	 | j                   } || |      S # t        $ r |j                  }Y  w xY wrI   )
__matmul__r   __rmatmul__)r  br	  s      rO   matmul_operatorr  *  s8    	!<<D Aqz  	!==D	!s    //r8  <===r  >=r:  r  is_notr  r
  ///<<%r   r	  **c                 
    | |v S rI   rR   xseqs     rO   r
  r
  *  s
    c rP   c                 
    | |vS rI   rR   r  s     rO   r
  r
  *  s
    Qc\ rP   )>>rh  ^@innot_inc                     t         j                  | j                        }|s#t        | j                  d| j                  z         |S )Nz4Binary '%s' not supported in compile-time expression)compile_time_binary_operatorsre   r   r   r}   )r   r	  s     rO   get_compile_time_binopr$  *  s=    (,,T]];DdhhB-- 	! KrP   c                        e Zd ZddgZdZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Z fdZd Zd Z xZS )	BinopNoder  r  Fc                     t         | j                     } || j                  j                  | j                  j                        | _        y rI   )r#  r   r  r{   r  r,
  s     rO   r   z#BinopNode.calculate_constant_result+  s7    ,T]];#MM))MM)) +rP   c                     t        |       }| j                  j                  |      }| j                  j                  |      }	  |||      S # t        $ r}| j                  |       Y d }~y d }~ww xY wrI   )r$  r  r  r  r  r  )rT   r  r	  r  r  r  s         rO   r  zBinopNode.compile_time_value+  sg    %d+==33D9==33D9	-(++ 	-))!,,	-s   A 	A0A++A0c                     | j                  | j                  j                  |      | j                  j                  |      |      S rI   )ra  r  r   r  r	  s     rO   r   zBinopNode.infer_type%+  s<     8 8 = $ 8 8 =sD 	DrP   c                     | j                   j                  |      | _         | j                  j                  |      | _        | j                  |       | S rI   )r  r  r  r  r	  s     rO   r  zBinopNode.analyse_types)+  sA    33C833C8s#rP   c                 N   | j                  |      r`| j                  | j                  j                  | j                  j                  |      | _        | j                  j
                  sJ d| _        y | j                         rq| j                  |       | j                  | j                  j                  | j                  j                  |      | _        | j                  j                  sJ d| _        y | j                         r| j                  |       y | j                  |       y r  )r7
  ra  r  r   r  r7   r   r8
  coerce_operands_to_pyobjectsrl   r:
  r;
  r<
  r	  s     rO   r  zBinopNode.analyse_operation/+  s    $$S)((););)-););SBDI99,,,DL!!#--c2((););)-););SBDI99(((DL""$&&s+$$S)rP   c                 v    | j                  | j                  j                  | j                  j                        S rI   )is_py_operation_typesr  r   r  rS   s    rO   r8
  zBinopNode.is_py_operation@+  s)    ))$--*<*<dmm>P>PQQrP   c                 n    |j                   xs( |j                   xs |j                  xs |j                  S rI   )rl   r  rT   type1type2s      rO   r.  zBinopNode.is_py_operation_typesC+  s+      [E$5$5[[EOO[rP   c                 x    | j                  | j                  j                  | j                  j                  |      S rI   )is_pythran_operation_typesr  r   r  r	  s     rO   r7
  zBinopNode.is_pythran_operationF+  s,    ..t}}/A/A4==CUCUWZ[[rP   c                     t        |      xr2 t        |      xr t        |      xr t        |      xs t        |      S rI   )r;   r6   r7   )rT   r1  r2  rn   s       rO   r4  z$BinopNode.is_pythran_operation_typesI+  sB    c" B3E:i?bch?iB&@/%*@	BrP   c                     | j                   j                  j                  xs  | j                  j                  j                  S rI   r  r   r  r  rS   s    rO   r:
  zBinopNode.is_cpp_operationO+  s2    ""// /}}!!..	0rP   c                 L   |j                  | j                  | j                  | j                  g      }|s| j	                          y |j
                  }|j                  | _        |j                  | _        | j                  dk(  r8d| _        | j                  %|j                  t        j                  dd             |j                  r|j                  }t        |j                        dk(  r9| j                  j!                  |j                  d   j
                  |      | _        np| j                  j!                  |j                  d   j
                  |      | _        | j                  j!                  |j                  d   j
                  |      | _        |j"                  | _        y )Nr  r&   r  r  r   )r  r   r  r  rO
  r   r  r   r   ru  r	   r{  r  r  r   r   r  r  )rT   rn   r   r  s       rO   r;
  zBinopNode.analyse_cpp_operationS+  sA   ##DMMDMM4==3QROOJJ	(88(883& DL##+$$[%<%<=UWg%hi!++Iy~~!# MM33INN14E4J4JCPDM MM33INN14E4J4JCPDM MM33INN14E4J4JCPDM))	rP   c                 t   | j                  |||      r t        t        | j                  ||            S | j	                  ||      r|j
                  rt        j                  }n|j                  rt        j                  }|j
                  rt        j                  }n|j                  rt        j                  }|j                  s|j                  r*||u r| j                  dv r|S | j                  ||      }||S t        S |j                  s|j                  rt        j                  S | j!                  ||      S )Nz**%+|&^)r4  rC   r9   r   r.  rn  r   r   ro  r   r  infer_builtin_types_operationr   r  r   r,   compute_c_result_type)rT   r1  r2  rn   ra  s        rO   ra  zBinopNode.result_typej+  s   **5%=1$--NOO%%eU3**'',,**'',,$$(=(=E>dmmy&@ L"@@N*&&!!^^u~~(((--eU;;rP   c                      y rI   rR   r0  s      rO   r:  z'BinopNode.infer_builtin_types_operation+  r  rP   c                 F    | j                         r| j                          y y rI   rE
  r	  s     rO   r<  zBinopNode.nogil_check+  rF
  rP   c                     | j                   j                  |      | _         | j                  j                  |      | _        y rI   )r  r  r  r	  s     rO   r,  z&BinopNode.coerce_operands_to_pyobjects+  s.    88=88=rP   c                 n    | j                   j                         xr | j                  j                         S rI   r  r  r  rS   s    rO   r  zBinopNode.check_const+  '    }}((*Jt}}/H/H/JJrP   c                     t         t        |          xs6 | j                  j                         xs | j                  j                         S rI   )rK   r&  r   r  r  )rT   rN   s    rO   r   zBinopNode.is_ephemeral+  sB    i35 M**,M040J0J0L	NrP   c                     | j                   j                  r%|j                  d       |j                  d| j                         z         | j                  dk(  rk|j                  d| j                         d| j                         d| j
                  j                         d| j                  j                         d	       y |j                  d| j                         d| j                         d	| j
                  j                         d
| j                  d
| j                  j                         d       y | j
                  j                   j                  r| j                  |      }| j                  dk(  rd}nd}|j                  | j                         d|d| j
                  j                         d| j                  j                         |d|j                  | j                         | j                        
       |j                  | j                                y | j                  r| j                         r| j                   dk(  rwt#        || j                  | j                         d| j%                         d| j                   j                  r| j                         nd | j&                  | j(                         y |j                  | j                         d| j%                         d       y y )Nz// Pythran binopr  r  r  r  z$){pythonic::numpy::functor::power{}(rk  r  r  r  r  z	, Py_Noner  r  r  r   r  r  )r   r7   r   r   r   r  r   r  rl   rL
  r   r   r}   r  r   r:
  r  r   r   r   rh  )rT   r   r  
extra_argss       rO   rm  zBinopNode.generate_result_code+  s   99$$JJ)*JJ3dkkmCD}}$

KKMKKMMM002MM002	4 5 

KKMKKMMM002MMMM0024 5 ]]++11$7H}}$(

JJKKMMM++-MM++-++DKKM488DFG OODNN,-\\ $$&4+?+?3+F'dhh6:kkmTE_E_Ea(b9=9N9NTX(,(<(<d>S>SU
 

8R8R8TUV rP   c           
      R   | j                   j                  j                  sr| j                  j                  j                  sRt	        | j
                  d| j                  d| j                   j                  d| j                  j                  d       t        j                  | _        y )NzInvalid operand types for 'rN
  r  r  )	r  r   r  r  r   r}   r   r   r,   rS   s    rO   rO
  zBinopNode.type_error+  sj    ""++==%%..$(( 2 2MM&&( ) ))	rP   )rV   rW   rX   r   r  r   r  r   r  r  r8
  r.  r7
  r4  r:
  r;
  ra  r:  r<  r,  r  r   rm  rO
  rY   rZ   s   @rO   r&  r&  +  s|     J'HG+-D*"R\\B0*.<2>KN)WV*rP   r&  c                   $    e Zd Zd Zd Zd Zd Zy)
CBinopNodec                 |    t         j                  | |      }|j                         rt        j                  |_        |S rI   )r&  r  r8
  r   r,   r   r  s      rO   r  zCBinopNode.analyse_types+  s2    &&tS1!"--DIrP   c                      yr  rR   rb  s     rO   rL
  z CBinopNode.py_operation_function+  r@  rP   c                     d| j                   j                         d| j                  d| j                  j                         dS Nr  r  r  )r  r   r   r  rS   s    rO   r   z CBinopNode.calculate_result_code+  s3    MM  "MMMM  "$ 	$rP   c                     d }|j                   s|j                  r|j                  | j                  |      }|4|j                   s|j                  r|j                  | j                  |      }|S rI   )r  r  r/
  r   )rT   r1  r2  r2
  s       rO   r;  z CBinopNode.compute_c_result_type+  s[    44T]]EJH!3!3u||44T]]EJHrP   N)rV   rW   rX   r  rL
  r   r;  rR   rP   rO   rG  rG  +  s    $rP   rG  c                       fd}|S )Nc                      t        | fdi|S )Nr   )rG  )r}   r  r   s     rO   make_binop_nodez,c_binop_constructor.<locals>.make_binop_node+  s    #==H==rP   rR   )r   rO  s   ` rO   c_binop_constructorrP  +  s    >rP   c                        e Zd ZdZdZdZd Zd Z fdZd Z	d Z
 fd	Zd
 Zd Zd ZddddddddddddddZdddddZ xZS ) NumBinopNodeTFNc                 $   | j                   j                  }| j                  j                  }| j                  ||      | _        | j                  s| j	                          y | j                  j
                  rd| _        | j                  j                  r |j                  d   r| j                  | j                  v r| j                  dv rW| j                   j                         r=| j                  j                         s#| j                  | j                   c| _         | _        d| _        |j                  d   | _        | j                  j                  | j                  | j                     || j                  j                               | _        d| _        | j                  r|j"                  rd|j"                  rW| j                   j%                  | j                  |      | _         | j                  j%                  | j                  |      | _        y y y )NFr  )r  r   Tzoverflowcheck.fold)	const_rhs)r  r   r  r;  rO
  r  rR
  r  rf   r   overflow_op_namesr   overflow_checkoverflow_foldoverflow_check_binopr	  r   r_  r  rT   rn   r1  r2  s       rO   r<
  z NumBinopNode.analyse_c_operation+  s   """"..ue<	yyOO99DJIINN?3MMT%;%;;+99; MM==?/3}}dmm,t}"&D!$0D!ED		66&&t}}5 MM==? 7 ADI  DLzze..53C3C MM33DIIsCDM MM33DIIsCDM 4D.rP   c                    | j                  ||      rnt        j                  ||      }|t        j                  u r | j                  dvrt        j
                  }|S t        j                  |t        j
                        }|S y )Nz|^&)c_types_okayr   rZ  rA  r   r  rT   r1  r2  widest_types       rO   r;  z"NumBinopNode.compute_c_result_type,  sw    UE*$88FKj444==-","7"7K  )<<!6!68rP   c                     | j                   r| j                   j                  ry| j                  j                   }| j                  j                   }|r|j                  r|r|j                  ryt        t
        |          S r@  )r   r  r  r  rK   rR  r  )rT   r1  r2  rN   s      rO   r  zNumBinopNode.may_be_none,  sa    9922""""U**u9N9N \4466rP   c                     | j                   j                         }| j                  j                         }|r|rd|d| j                  d|dS y rK  )r  r   r  r   )rT   value1value2s      rO   r   z'NumBinopNode.get_constant_c_result_code&,  s?    99;99;f#)4==&AArP   c                 n    |j                   xs |j                  xr |j                   xs |j                  S rI   )r_  r  r0  s      rO   r[  zNumBinopNode.c_types_okay.,  s0      2U]] 5!!3emm	5rP   c                 &   | j                   rU| | _        |j                  j                  t        j
                  d      | _        |j                  d| j                  z         t        t        | +  |       | j                   r|j                  d| j                  z         |j                  d       |j                  |j                  | j                               |j                  d       |j                  j                  | j                         y y )NFrO  r~  ra  z8PyErr_SetString(PyExc_OverflowError, "value too large");r   )rV  overflow_bit_noderT  rU  r   r  overflow_bitr   rK   rR  rr  r   r}   r^  r	  s     rO   rr  z%NumBinopNode.generate_evaluation_code3,  s    %)D" $ < <Z=R=R_d < eDJJy4#4#445lD:4@JJ,t/@/@@AJJQRJJttxx01JJsONN''(9(9: rP   c                 b   | j                   \| j                  d| j                  j                         d| j                  j                         d| j                   j
                  dS | j                  j                  s| j                  rt        | j                        r5| j                  j                         | j                  j                         }}n4| j                  j                         | j                  j                         }}d|d| j                  d|dS | j                  j                  | j                        }|0t        | j                  d| j                  d| j                         |d| j                  j                         d| j                  j                         dS )Nr  rk  z, &r  r  zbinary operator z not supported for )rd  r	  r  r   r  re  r   r  rR
  r7   r   r   	binary_opr   r}   )rT   result1result2r	  s       rO   r   z"NumBinopNode.calculate_result_code@,  s/   !!-		$$&$$&&&33	5 5
 YY##tzztyy)#'==#?#?#A4==C_C_Ca#'==#7#7#94==;O;O;Q#*DMM7CC99&&t}}5D|dhhT]]\`\e\e fg$$&$$&( (rP   c                 h    |j                   xs% |j                   xs t        j                  | ||      S rI   )r  r&  r.  r0  s      rO   r.  z"NumBinopNode.is_py_operation_typesV,  s8    %% D%%D//eUC	ErP   c                 t    | j                   | j                     }| j                  r|j                  dd      }|S )N	PyNumber_PyNumber_InPlace)py_functionsr   r  r	  )rT   r   r  s      rO   rL
  z"NumBinopNode.py_operation_function[,  s6    ))$--8<<)11+?QRMrP   PyNumber_OrPyNumber_XorPyNumber_AndPyNumber_LshiftPyNumber_RshiftPyNumber_AddPyNumber_SubtractPyNumber_Multiply__Pyx_PyNumber_MatrixMultiply__Pyx_PyNumber_DividePyNumber_FloorDividePyNumber_RemainderPyNumber_Power)r	  r  r
  r  r  r  rh  r   r  r  r  r  r  r  r  mullshift)r  rh  r   r  )rV   rW   rX   rR
  rV  rd  r<
  r;  r  r   r[  rr  r   r.  rL
  rn  rU  rY   rZ   s   @rO   rR  rR  +  s     END675
;(,E
 """%%"''3+*($L" 	rP   rR  c                       e Zd Zd Zy)IntBinopNodec                 n    |j                   xs |j                  xr |j                   xs |j                  S rI   )r  r  r0  s      rO   r[  zIntBinopNode.c_types_okay|,  s,    - 0.	0rP   N)rV   rW   rX   r[  rR   rP   rO   r  r  y,  s    0rP   r  c                   0     e Zd Zd Zd Zd Z fdZ xZS )AddNodec                     |j                   r|j                   s|j                  r|j                  ryt        j                  | ||      S r  )rn  ro  rR  r.  r0  s      rO   r.  zAddNode.is_py_operation_types,  s7    ??u%2H2HUMcMc55dE5IIrP   c                     t         t        t        t        t        f}||v r1||v r-|t        |j                  |      |j                  |               S y rI   )r   r"   r   r/   r   r  r*  rT   r1  r2  string_typess       rO   r:  z%AddNode.infer_builtin_types_operation,  sW     #NHo|\L Ul%:L$6$6u$=$0$6$6u$=!? @ @rP   c                     |j                   s|j                  r|j                  s|j                  r|S |j                   s|j                  r|j                  s|j                  r|S t        j                  | ||      S rI   )r  r#  r  r  rR  r;  r0  s      rO   r;  zAddNode.compute_c_result_type,  sX    LLENNLllenn5<<5==L55eU$ $rP   c                    | j                   j                  | j                  j                  }}|t        u s|t        u r|t        t        fv r|t        t        fv rd}n9t        | j                   t              st        | j                  t              rd}nd}|r6| j                   j                         s| j                  j                         ryyt        t        | +  |      S )NTF__Pyx_PyUnicode_ConcatSafe__Pyx_PyUnicode_Concat)r  r   r  r   r   rz   r  r  rK   r  rL
  )rT   r   r1  r2  is_unicode_concatrN   s        rO   rL
  zAddNode.py_operation_function,  s    }}))4==+=+=uL E\$9x00U|X>V5V$(!DMM+=>*T]]\nBo$(! %*! ==,,.$--2K2K2M73Wd9$??rP   )rV   rW   rX   r.  r:  r;  rL
  rY   rZ   s   @rO   r  r  ,  s    J$@ @rP   r  c                       e Zd Zd Zy)SubNodec                    |j                   s|j                  r|j                  s|j                  r|S |j                   s|j                  r(|j                   s|j                  rt        j
                  S t        j                  | ||      S rI   )r  r#  r  r  r   c_ptrdiff_t_typerR  r;  r0  s      rO   r;  zSubNode.compute_c_result_type,  s_    LLENNLllenn5<<5>>...55eU$ $rP   N)rV   rW   rX   r;  rR   rP   rO   r  r  ,  s    $rP   r  c                       e Zd Zd Zd Zy)MulNodec                     |j                   r|j                  s|j                   r|j                  ryt        j                  | ||      S r  )rn  r  rR  r.  r0  s      rO   r.  zMulNode.is_py_operation_types,  s4    __U\\55dE5IIrP   c                     t         t        t        t        t        f}||v r|j
                  r|S ||v r|j
                  r|S |j                  r|S |j                  r|S y rI   )r   r"   r   r/   r   r  r  r  s       rO   r:  z%MulNode.infer_builtin_types_operation,  s[     #NHo|\L U%:%:LL U%:%:L <<L<<LrP   N)rV   rW   rX   r.  r:  rR   rP   rO   r  r  ,  s    JrP   r  c                   $     e Zd Zd Z fdZ xZS )MatMultNodec                      yr"  rR   r0  s      rO   r.  z!MatMultNode.is_py_operation_types,  r  rP   c                     |j                   j                  t        j                  dd             t        t
        |   |       y )NMatrixMultiplyrp  )rt  ru  r	   r{  rK   r  rr  r	  s     rO   rr  z$MatMultNode.generate_evaluation_code,  s5    ))+*A*ABRTf*ghk49$?rP   )rV   rW   rX   r.  rr  rY   rZ   s   @rO   r  r  ,  s    @ @rP   r  c                   b    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y)DivNodeNFc                     t         | j                     }| j                  dk(  r5| j                  )t        |t              rt        |t              r	t         d   }|S )Nr  r  )r#  r   truedivisionrz   r$   rT   op1op2r	  s       rO   !find_compile_time_binary_operatorz)DivNode.find_compile_time_binary_operator,  sI    ,T]];==CD$5$5$=#}-*S-2P4T:rP   c                     | j                   j                  }| j                  j                  }| j                  ||      } || j                   j                  | j                  j                        | _        y rI   )r  r{   r  r  r  s       rO   r   z!DivNode.calculate_constant_result,  sY    mm++mm++55c3?#MM))MM)) +rP   c                     | j                   j                  |      }| j                  j                  |      }	 | j                  ||      } |||      S # t        $ r}| j                  |       Y d }~y d }~ww xY wrI   )r  r  r  r  r  r  )rT   r  r  r  r	  r  s         rO   r  zDivNode.compile_time_value -  sr    ==33D9==33D9	-99($D(++ 	-))!,,	-s   A 	A7A22A7c                 l    | j                   s|j                  d   rd| _        y | j                  | _        y )N	cdivisionF)r  rf   ctruedivisionr  r	  s     rO   _check_truedivisionzDivNode._check_truedivision
-  s*    >>S^^K8!&D!%!2!2DrP   c                     | j                  |       | j                  | j                  j                  |      | j                  j                  |      |      S rI   )r  ra  r  r   r  r	  s     rO   r   zDivNode.infer_type-  sI      %MM$$S)MM$$S)30 	0rP   c                     | j                  |       t        j                  | |       | j                         rd| _        | j
                  j                  s| j                  d u xrH |j                  d    xr6 | j                  j                          xs | j                  j                  dk(  | _        | j                  s|j                  d   rA| j                  j                  |      | _        | j                  j                  |      | _        y y y )NTr  r   cdivision_warnings)r  rR  r  r:
  r  r   rl   rf   r  r   r{   zerodivision_checkr  r  r	  s     rO   r  zDivNode.analyse_operation-  s      %&&tS1  "!DNyy$$$& 9s~~k/J+J 9::<< 8]]22a7 # &&#..9M*N $ > >s C $ > >s C +O %rP   c                 >   | j                   dk(  rx| j                  rl|j                  s`|j                  sT|j                  sH|j                  s<t	        j
                  |t        j                        }t	        j
                  ||      }|S t        j                  | ||      S )Nr  )	r   r  r  r  r   rZ  r  rR  r;  r\  s       rO   r;  zDivNode.compute_c_result_type%-  sy    ==CD$6$6u?Q?QZ_ZlZl>>%..(<<UJD\D\](<<UKP""11$uEErP   c                 2    | j                   j                  ryy)N"integer division or modulo by zerozfloat divisionr  rS   s    rO   zero_division_messagezDivNode.zero_division_message--      997#rP   c                 h   | j                   j                  s| j                   j                  s| j                  |j                  j
                  d   xs_ | j                   j                  xsG | j                   j                  xs | j                   j                  xr | j                   j                   | _        | j                  sH|j                  j                  t        j                  dd      j                  | j                                t        j                  | |       | j!                  |       y )Nr  DivIntCMath.c)r   rl   r  r  rt  rf   r  r_  r  r   ru  r	   r{  r  rR  rr  generate_div_warning_coderb  s     rO   rr  z DivNode.generate_evaluation_code3-  s    yy$$TYY-A-A~~%$$//< ^yy))^--B1B1B\DIIL\L\H\ 
 >>  11++Hi@KKDIIVX--dD9&&t,rP   c           	      	   | j                   }| j                  j                  sh| j                  r| j                  s:| j                  j                  d      d| j                  j                         d}nd| j                  j                         z  }|j                  d|z         |r|j                          |j                  d| j                         z         |r|j                          |j                  |j                  | j                               |j                  d       | j                  j                  r| j                  j                  r| j                   dk7  rs|j"                  j%                  t'        j(                  d	d
             | j                  j                  j                  dk(  rd| j                  j                         z  }nH| j                  j                  j+                         }d|d| j                  j                         d|d}|j                  d| j                  j+                         d|d| j,                  j                         d       |r|j                          |j                  d       |r|j                          |j                  |j                  | j                               |j                  d       |j"                  j.                  d   r| j                   dk7  r|j"                  j%                  t'        j(                  dd             |j                  d| j,                  j                         d| j                  j                         d       dt0        j2                  t0        j4                  dz  }|rzd}|j                  d |z         |j                          |j                  |j7                  | j                  d!"             |j                  |d#|d$       |j                          n.|}|j                  |j7                  | j                  d!"             |j9                  d%|z         |j;                  |j<                         |j                  d       y y y y )&Nzeror  r  z%s == 0ra  z/PyErr_SetString(PyExc_ZeroDivisionError, "%s");r   r  UnaryNegOverflowsr  r0   zunlikely(%s == -1)z(!(((z)-1) > 0)) && unlikely(z == (z)-1)zelse if (sizeof(z) == sizeof(long) && z'  && unlikely(UNARY_NEG_WOULD_OVERFLOW(r6  zLPyErr_SetString(PyExc_OverflowError, "value too large to perform division");r  r  CDivisionWarningr  r5  z	 < 0) ^ (z	 < 0))) {z1__Pyx_cdivision_warning(%(FILENAME)s, %(LINENO)s))FILENAMELINENOr   zint %s;T)r  r  r  zif (unlikely(%s)) )rh  r   rl   r  rR
  rk
  r  r   r   r   r  r   r   r}   r  r   r   rt  ru  r	   r{  r  r  rf   r   filename_cnamelineno_cnameset_error_infor  r  rl  )rT   r   in_nogil	zero_testminus1_checktype_of_op2warning_codere  s           rO   r  z!DivNode.generate_div_warning_codeA-  sj   ((yy$$&&zz,0II,>,>v,FH\H\H^ _I )DMM,@,@,B BI

09<='')

LtOiOiOkkl002

4??48845

399##		(8(8T]]c=Q$$55k6M6MNaco6pq}}))00A5';dmm>R>R>T'T&*mm&8&8&O&O&Q')=)=)?(NJJ#yy??A+#}}335	 7 8
  ++-JJmn446JJttxx89JJsO**+?@T]]VYEY  11++,>	JL

 $ 4 4 6 $ 4 4 68 9  S & 5 5%22V  
 "*KJJy;67'')JJt22488$2GHJJ[,GH002".KJJt22488$2GH-;<d../

31 FZ@G %rP   c                    | j                   j                  s| j                         rt        j	                  |       S | j                   j
                  rH| j                  dk(  r9d| j                  j                         d| j                  j                         dS | j                  s| j                  r| j                  j                         }| j                  j                         }| j                  r|| j                   | j                  j                   k7  r| j                   j                  |      }| j                   | j                  j                   k7  r| j                   j                  |      }d|d|dS d| j                   j                         d| j                  j                         d| j                  j                         dS )Nr  zfloor(z / r  r  
__Pyx_div_rk  )r   r  r:
  rR  r   r  r   r  r   r  r  r  r  specialization_name)rT   r  r  s      rO   r   zDivNode.calculate_result_code-  sL   994#8#8#:55d;;YYDMMT$9$$&$$&( ( $..--&&(C--&&(C  99 2 22))--c2C99 2 22))--c2C"%s++ #1 		--/$$&$$&( (rP   )rV   rW   rX   r  r  r  r  r  r  r   r  r  r   r  r;  r  rr  r  r   rR   rP   rO   r  r  ,  sY     ILM+-30DF$-= ~(rP   r  s'   %(?:%|(?:\([^)]+\))?[-+#,0-9 ]*([a-z])))   d   i   o   u   x   X   e   E   f   F   g   G   c   b   ac                   B     e Zd Zd Zd Zd Zd Zd Zd Z fdZ	 xZ
S )ModNodec                 h    |j                   xs% |j                   xs t        j                  | ||      S rI   )rn  rR  r.  r0  s      rO   r.  zModNode.is_py_operation_types-  s4     J??J55dE5I	KrP   c                    |t         u r)|j                  s| j                  j                         s|S y |t        t
        t        fv r|t         u r|S |j                  r|S | j                  j                  rG|t
        u s|t        u r1t        t        | j                  j                              t        k  r|S t        S |t        u r|j                  sy t        S y rI   )r   r  r  r  r   r   r/   r_  r   r   _find_formatting_typesr   _safe_bytes_formatsr0  s      rO   r:  z%ModNode.infer_builtin_types_operation-  s    L $$DMM,E,E,G  z8_==$!!00H$(;1$--2E2EFGK^^$&&*$U-B-B&&rP   c                 2    | j                   j                  ryy)Nr  zfloat divmod()r  rS   s    rO   r  zModNode.zero_division_message-  r  rP   c                    t         j                  | |       | j                  j                  s| j                  -|j
                  d   xs | j                  j                   | _        | j                  sR| j                  j                  s;| j                  j                  s$t        | j                  d| j                  z         y y y y y )Nr  z(mod operator not supported for type '%s')r  r  r   rl   r  rf   r   r  r  r   r}   r	  s     rO   r  zModNode.analyse_operation-  s    !!$,yy$$~~%!$!<!TDIIDTDT@T>>$))*:*:499CUCUdhh JTYY VW DV*:> %rP   c                    | j                   j                  s| j                  s| j                   j                  rI|j                  j                  t        j                  dd      j                  | j                                n^|j                  j                  t        j                  dd      j                  | j                   | j                   j                               t        j                  | |       | j                  |       y )NModIntr  ModFloat)math_h_modifier)r   rl   r  r  rt  ru  r	   r{  r  r  rR  rr  r  rb  s     rO   rr  z ModNode.generate_evaluation_code-  s    yy$$T^^yy  11++Hi@KKDIIVX   11++J	BMM		4993L3L N NO 	--dD9&&t,rP   c                     | j                   r| j                  j                  rPd| j                  j                  d| j                  j                         d| j                  j                         dS d| j                  j                         d| j                  j                         dS d| j                  j                         d| j                  j                         d| j                  j                         dS )Nfmodr  rk  r  z % 
__Pyx_mod_)r  r   r  r  r  r   r  r  rS   s    rO   r   zModNode.calculate_result_code-  s    >>yy!!II--MM((*MM((*, , " MM((*MM((*, ,  II113MM((*MM((*, ,rP   c                    | j                   j                  | j                  j                  }}|t        u r[| j                   j	                         s?|j
                  r|j                  |      s"|t        u rt        | j                  t              syy|t        u r[| j                   j	                         s?|j
                  r|j                  |      s"|t        u rt        | j                  t              syyt        t        | 7  |      S )N__Pyx_PyUnicode_FormatSafePyUnicode_Format__Pyx_PyString_FormatSafe__Pyx_PyString_Format)r  r   r  r   r  r  r  r   rz   r  r   rK   r  rL
  )rT   r   r1  r2  rN   s       rO   rL
  zModNode.py_operation_function-  s    }}))4==+=+=uL }}((*++0@0@0G^+Jt}}N`4a3)h}}((*++0@0@0G^+Jt}}N`4a2.Wd9$??rP   )rV   rW   rX   r.  r:  r  r  rr  r   rL
  rY   rZ   s   @rO   r  r  -  s/    K
,$X-,"@ @rP   r  c                   4     e Zd Z fdZd Zd Z fdZ xZS )PowNodec                 t    |j                   d   st        | j                  d       t        t        |   |      S )NcpowzKThe 'cpow' directive is provided for forward compatibility and must be True)rf   r   r}   rK   r  r  r	  s     rO   r  zPowNode.analyse_types.  s6    ~~f% $(( % &Wd1#66rP   c                 b   t         j                  | |       | j                  j                  r| j                  j                  j
                  rw| j                  j                  | j                  |      | _        | j                  j                  | j                  |      | _        | j                  j                  d      | _
        y t        | j                  d       d| _
        y | j                  j
                  rd| j                  j                  z   | _
        y | j                  j                  rd| j                  j                         j!                  dd      z  | _
        |j#                  t%        j&                  dd	      j)                  | j                  | j                  j                         | j                  j*                  xr d
xs d             y | j                  j,                  sEt        | j                  d| j                  j                  d| j                  j                         y y )Nr  z complex int powers not supportedrh  powz__Pyx_pow_%sr  r/  IntPowr  r&   r   )r	  r   r   z+got unexpected types for C power operator: rk  )rR  r<
  r   r  r
  r  r  r  r  rg  pow_funcr   r}   r  r  r  r	  ru  r	   r{  r  r   r  r	  s     rO   r<
  zPowNode.analyse_c_operation.  s   ((s399yy""++ $ 7 7		3 G $ 7 7		3 G $		 3 3D 9dhh BC )YY!DII$=$==DMYY*TYY-M-M-O-W-WX[]`-aaDM  '')<GG"mm99;99++16Q H 89
 ##$((!]]//1C1CE F $rP   c                 x      fd} j                   d | j                        d | j                        dS )Nc                     j                   | j                   k(  r| j                         S j                   j                  | j                               S rI   )r   r   r  )r~  rT   s    rO   r+   z/PowNode.calculate_result_code.<locals>.typecast'.  s<    yyGLL(~~''yy**7>>+;<<rP   r  rk  r  )r  r  r  )rT   r+   s   ` rO   r   zPowNode.calculate_result_code%.  s3    	= MMT]]#T]]#% 	%rP   c                    | j                   j                  r| j                  j                  dk(  r}t	        | j                  j                  t
              rY| j                  j                   t        u r=|j                  j                  t        j                  dd             | j                  ryyt        t        | ?  |      S )Nr0   PyNumberPow2r  __Pyx_PyNumber_InPlacePowerOf2__Pyx_PyNumber_PowerOf2)r   rl   r  r{   rz   r$   r  r   rt  ru  r	   r{  r  rK   r  rL
  r	  s     rO   rL
  zPowNode.py_operation_function1.  s    II!!--24==88-H""n4--k.E.EnVb.cd||70Wd9$??rP   )rV   rW   rX   r  r<
  r   rL
  rY   rZ   s   @rO   r  r  .  s    7F.
%
@ 
@rP   r  c                       e Zd ZdZddgZdZdZdZdZd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd ZdZd Zd Zd Zd Zy)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                     | j                   j                  |      }| j                  j                  |      }t        j                  ||      S rI   )r  r   r  r   independent_spanning_typerY  s       rO   r   zBoolBinopNode.infer_typeO.  s=    ((-((-33E5AArP   c                     | j                   dk(  r| j                  j                         S | j                  j                         xs | j                  j                         S )Nor)r   r  r  r  rS   s    rO   r  zBoolBinopNode.may_be_noneT.  sF    ==D ==,,..==,,.M$--2K2K2MMrP   c                     | j                   j                  }| j                  j                  }| j                  dk(  r|xr || _        y |xs || _        y Nand)r  r{   r  r   )rT   r  r  s      rO   r   z'BoolBinopNode.calculate_constant_resultZ.  sF    ==00==00==E!#+#8D #+#7xD rP   c                     | j                   j                  |      }| j                  j                  |      }| j                  dk(  r|xr |S |xs |S r  )r  r  r  r   )rT   r  r  r  s       rO   r  z BoolBinopNode.compile_time_valueb.  sL    ==33D9==33D9==E!(('x'rP   c                 n    | j                   j                         xs | j                  j                         S rI   )r  r   r  rS   s    rO   r   zBoolBinopNode.is_ephemeralj.  s'    }}))+Kt}}/I/I/KKrP   c                 ,   | j                   j                  |      }| j                  j                  |      }t        j                  |j
                  |j
                        | _        | j                  ||      | _         | j                  ||      | _        | S rI   )r  r  r  r   r  r   _wrap_operand)rT   rn   r  r  s       rO   r  zBoolBinopNode.analyse_typesm.  sx     ==..s3==..s388MM8==*	**8S9**8S9rP   c                 `    t        |t        t        f      st        || j                  |      }|S rI   )rz   r  BoolBinopResultNoder   )rT   r~  rn   s      rO   r  zBoolBinopNode._wrap_operandy.  s)    'M3F#GH)'499cBGrP   c                     | j                  | j                  |      | _        | j                  | j                  |      | _        y)z
        Must get called by transforms that want to create a correct BoolBinopNode
        after the type analysis phase.
        N)r  r  r  r	  s     rO   wrap_operandszBoolBinopNode.wrap_operands~.  s4    
 **4==#>**4==#>rP   c                 B    | j                  t        j                  |      S rI   r  r   rA  r	  s     rO   r  zBoolBinopNode.coerce_to_boolean.      ~~j44c::rP   c                     | j                   j                  ||      }| j                  j                  ||      }t        j	                  | || j
                  ||      S )N)r   r   r  r  )r  r  r  r  r  r   )rT   r  rn   r  r  s        rO   r  zBoolBinopNode.coerce_to.  sW    ==**8S9==**8S9&&x]] ' 2 	2rP   c           	      ^   |j                  | j                         ||f}| j                  dk(  r|j                  d      x}	}n|j                  d      x}	}| j                  j                  |||||||	       |\  }}|j                  |	       | j                  j                  |||||||       y )Nr  next_andnext_or)rl  r}   r   r  r  generate_bool_evaluation_coder  r  )
rT   r   final_result_tempfinal_result_type	and_labelor_label	end_labelfall_throughouter_labelsmy_labels
             rO   r  z+BoolBinopNode.generate_bool_evaluation_code.  s    dhh!8,==E!#'>>*#==Hy"&..";;Hx33#%6	8YX`	b +	8x 33#%6	8YXd	frP   c           	          | j                  |       | j                  j                  rt        j                  n| j                  }d x}}|j                  d      }| j                  || j                         |||||       |j                  |       y )Nbool_binop_done)	rW  r   rl   r   r   r  r  r   r  )rT   r   ra  r  r  r  s         rO   rr  z&BoolBinopNode.generate_evaluation_code.  su    !!$'37993H3Hj//dii##9NN#45	**4YX`bkmvwy!rP   Truth-testing Python objectc                 n    | j                   j                         xr | j                  j                         S rI   r@  rS   s    rO   r  zBoolBinopNode.check_const.  rA  rP   c                      y rI   rR   rb  s     rO   rp  z,BoolBinopNode.generate_subexpr_disposal_code.  r  rP   c                      y rI   rR   rb  s     rO   rq  z BoolBinopNode.free_subexpr_temps.  r  rP   c           
         | j                   j                  rw|j                  j                  t        j
                  d      }|j                  |d| j                  j                         d|j                  || j                               n| j                  j                         }|| j                   j                  fS NFrO  rB  r   )r   rl   rT  rU  r   rA  r   r  r   r  r}   r   rT   r   test_results      rO   generate_operand1_testz$BoolBinopNode.generate_operand1_test.  s    99  ..66&&5 7 :KJJMM++-**;ACD --..0KTYY2233rP   )rV   rW   rX   r  r   r   r   r  r  r   r  r   r  r   r  r  r  r  r  r  rr  r  r  rp  rq  r!  rR   rP   rO   r  r  >.  s    	 J'HGHHHB
N8(L

?;2f"" 0KK4rP   r  c                   T     e Zd ZdZddgZdZdZdZ fdZd Z	d Z
d	 Zd
 Zd Z x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           	          |j                  |      }t        |      }t        t        |   |j
                  ||t        |      j                  ||             y )N)r  r   r   )r  	ProxyNoderK   r  rQ  r}   r#  r  )rT   r  ra  rn   rN   s       rO   rQ  zBoolBinopResultNode.__init__.  sP    ""3'n!41GG;C.**;< 	2 	>rP   c                 B    | j                  t        j                  |      S rI   r  r	  s     rO   r  z%BoolBinopResultNode.coerce_to_boolean.  r	  rP   c                     | j                   j                   }|t        j                  u r|j                  |      }t	        |||      S rI   )r  r   rA  r  r  )rT   r  rn   r  s       rO   r  zBoolBinopResultNode.coerce_to.  s<    hhllz---'',C"3#66rP   c                      y rI   rR   r	  s     rO   r<  zBoolBinopResultNode.nogil_check.  r  rP   c           
         | j                   j                  j                  rw|j                  j	                  t
        j                  d      }|j                  |d| j                   j                         d|j                  || j                               n| j                   j                         }|| j                   j                  j                  fS r  )r  r   rl   rT  rU  r   rA  r   r   r  r}   r   r  s      rO   generate_operand_testz)BoolBinopResultNode.generate_operand_test.  s    88==$$..66&&5 7 :KJJHH&&(**;ACD ((//+KTXX]]6677rP   c                    |j                  | j                         | j                  j                  |       |s|r| j	                  |      \  }}	|	r|r|r| j                  j                  |       |rdnd}
|j                  d|
|d       |	r|j                  j                  |       |	r|r|s| j                  j                  |       |r||k7  r|j                  |       |rF|r.|j                  d       |	s| j                  j                  |       ||k7  r|j                  |       |r|s|s|r|j                  d       | j                  j                  |       | j                  j                  |       |j                  |d| j                  j                  |      d       | j                  j                  |       | j                  j                  |       | j                  j                  |       ||k7  r|j                  |       |s|r|j                  d       | j                  j                  |       y )	NrU
  r  r  z) {r  r  r  r   )rl  r}   r  rr  r)  r{  r   rT  r^  r  r   rc  r   r  r  )rT   r   r  r  r  r  r  r  r   	uses_tempsenses              rO   r  z1BoolBinopResultNode.generate_bool_evaluation_code.  s   dhh 	))$/%)%?%?%E"KiH //5#CEJJ{;<++K8Y8//5H4h'JJz*$77=,MM),H

:&JJ//5JJ++D1JJ%6

8L8LM^8_`aJJ44T:HH++D1JJ!!$'L(i(JJsOD!rP   )rV   rW   rX   r  r   r   r  r   rQ  r  r  r<  r)  r  rY   rZ   s   @rO   r  r  .  sA    
 wHG
CE>;785"rP   r  c                   t    e Zd ZdZdZdZg 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y)r  NT)r  r  r  c                 p    | j                   j                  |      | j                  j                  |      z   S rI   )r  r   r  r	  s     rO   r   zCondExprNode.type_dependenciesA/  s,    }}..s3dnn6V6VWZ6[[[rP   c                     t        j                  | j                  j                  |      | j                  j                  |            S rI   )r   r  r  r   r  r	  s     rO   r   zCondExprNode.infer_typeD/  s9    33MM$$S)NN%%c*, 	,rP   c                     | j                   j                  r| j                  j                  | _        y | j                  j                  | _        y rI   )r  r{   r  r  rS   s    rO   r   z&CondExprNode.calculate_constant_resultI/  s3    99$$#'==#@#@D #'>>#A#AD rP   c                 n    | j                   j                         xs | j                  j                         S rI   )r  r   r  rS   s    rO   r   zCondExprNode.is_ephemeralO/  s'    }}))+Lt~~/J/J/LLrP   c                    | j                   j                  |      j                  |      | _         | j                  j                  |      | _        | j                  j                  |      | _        | j                  |      S rI   )r  r  r  r  r  r  r	  s     rO   r  zCondExprNode.analyse_typesR/  s`    II++C0BB3G	33C855c:'',,rP   c                 X   | j                   j                  }| j                  j                  }t        j                  ||      | _        | j                  j
                  r.t        j                  | j                  j                        | _        | j                  j                  rt        | _
        nJ| j                   j                         s| j                  j                         rt        | j                  d       |j                  s|j                  rt|| j                  k7  r+| j                   j                  | j                  |      | _         || j                  k7  r+| j                  j                  | j                  |      | _        | j                  j                  r| j!                          | S )NzPUnsafe C derivative of temporary Python reference used in conditional expression)r  r   r  r   r  r  r  r  rl   r   r   r   r   r}   r  r  rO
  )rT   rn   true_val_typefalse_val_types       rO   r  z CondExprNode.analyse_result_typeX/  s   **,,88W	99!!"55dii6M6MNDI99   .D]]'')T^^-H-H-J$((no$$(B(B		) $ 7 7		3 G*!%!9!9$))S!I99OOrP   c                 2   | j                   j                  j                  s | j                   j                  |      | _         | j                  j                  j                  s | j                  j                  |      | _        d | _        | j                  |      S rI   )r  r   r  r  r  r   r  r	  s     rO   r  zCondExprNode.coerce_to_integern/  sm    }}!!(( MM;;C@DM~~""))!^^==cBDN '',,rP   c                    | j                   j                  |k7  r!| j                   j                  ||      | _         | j                  j                  |k7  r!| j                  j                  ||      | _        d | _        | j                  |      S rI   )r  r   r  r  r   r  rB  s      rO   r  zCondExprNode.coerce_tov/  so    ==) MM33HcBDM>>(*!^^55hDDN '',,rP   c                 8   | j                   j                  j                  se| j                  j                  j                  sEt	        | j
                  d| j                   j                  d| j                  j                  d       t        j                  | _        y )Nz.Incompatible types in conditional expression (r  r  )r  r   r  r  r   r}   r   r,   rS   s    rO   rO
  zCondExprNode.type_error~/  s`    ""++t~~/B/B/K/K$((##T^^%8%8: ;))	rP   c                     | j                   j                         xr6 | j                  j                         xr | j                  j                         S rI   )r  r  r  r  rS   s    rO   r  zCondExprNode.check_const/  sA    		%%' -))+-**,	.rP   c                 
   |j                  | j                         | j                  |       | j                  j	                  |       |j                  d| j                  j                         z         | j                  || j                         |j                  d       | j                  || j                         |j                  d       | j                  j                  |       | j                  j                  |       y )Nr=  r  r   )rl  r}   rW  r  rr  r   r   eval_and_getr  r  r{  r  rb  s     rO   rr  z%CondExprNode.generate_evaluation_code/  s     	dhh!!$'		**40

;!1!1!334$.

:$/

3		((.		T"rP   c                 `   |j                  |       | j                  j                  r|j                  |       n|j	                  |       |j                  | j                         d|j                  | j                               d       |j                  |       |j                  |       y r	  )rr  r   r   ri  rc  r   r   r   r   r  r  )rT   r   r  s      rO   r;  zCondExprNode.eval_and_get/  sy    %%d+99''++D1%%d+

tzz|0LMN**40rP   c                      y rI   rR   rb  s     rO   rp  z+CondExprNode.generate_subexpr_disposal_code/  r  rP   c                      y rI   rR   rb  s     rO   rq  zCondExprNode.free_subexpr_temps/  r  rP   )rV   rW   rX   r  r  r   r   r   r   r   r   r  r  r  r  rO
  r  rr  r;  rp  rq  rR   rP   rO   r  r  4/  sa     HIG0H\,
BM-,--*.
#rP   r  Py_LTPy_LEPy_EQPy_NEPy_GTPy_GE)	r8  r  r  r  z<>r:  r  r   r!  c                   r    e Zd ZdZdZd Zd Zd Zd Zd Z	ddZ
d Zd	 Zd
 Zd Zd Zd ZddZd Zd Zy)CmpNodeNc                     t         S rI   r+  r	  s     rO   r   zCmpNode.infer_type/  r  rP   c                    t         | j                     }| j                  j                  }t	        |t
              r(t	        |t
              rt        |      t        |      k7  ry | j                  dv rt	        | j                  t        t        t        f      rq| j                  j                  s| j                  dk(  | _        y t	        | j                  t              rq| j                  se| j                  j                         | _        nEt	        | j                  t              r+| j                  j                  s| j                  dk(  | _        y  |||      | _        y )Nr   r!  r!  )r#  r   r  r{   rz   any_string_typer   r  r  r  r   cascaderN  ro  rn  )rT   operand1_resultr	  operand2_results       rO   "calculate_cascaded_constant_resultz*CmpNode.calculate_cascaded_constant_result/  s    ,T]];--778?O<_%o)>>==,,$--(Iw)GH}}))+/==H+DD(x8$(MM$:$:$<DMDMM84}}44+/==H+DD(#O_ErP   c                    t        |       }| j                  j                  |      }	  |||      }|r$| j
                  }|r|xr |j                  ||      }|S # t        $ r}| j	                  |       d }Y d }~Id }~ww xY wrI   )r$  r  r  r  r  rK  cascaded_compile_time_value)rT   r  r  r	  r  r   r  rK  s           rO   rP  z#CmpNode.cascaded_compile_time_value/  s    %d+==33D9	(H-F llGWG$G$GRV$W  	))!,F	s   	A 	A?"A::A?c                     | j                   j                  j                  xs  | j                  j                  j                  S rI   r7  rS   s    rO   is_cpp_comparisonzCmpNode.is_cpp_comparison/  s-    }}!!..Q$--2D2D2Q2QQrP   c                 h   |j                   }|j                   }d}d}|j                  r|j                         rd}|j                  r|j                         rd}|j                  r|r|S y |j                  r|r|S y |r6|r4t        j
                  ||fv rt        j                  S t        j                  S y r  )	r   r   r  r  r   r   r   r|  r  )	rT   rn   r  r  r  r1  r2  type1_can_be_inttype2_can_be_ints	            rO   find_common_int_typezCmpNode.find_common_int_type/  s      %%(*M*M*O#%%(*M*M*O#<<  \\  ''E5>9%444%222rP   c                 ^   | j                   }|j                  }|j                  }d }|t        k(  r|j                  s1|t        t
        fv s#|t        k(  r8|j                  s|t        t
        fv rt        | j                  d       t        }nU|j                  s|j                  r|dvrM|j                  s|j                  r5|j                  s|j                  rt        | j                  d       t        }n|j                  r6|j                  t        j                        rt        j                  nt        }n|j                  r6|j                  t        j                        rt        j                  nt        }nht!        j"                  ||      }nQ|j                  r#|j                  rt!        j"                  ||      }n"||j                  s| j%                  ||||      }|=|j&                  s|j&                  rt        }n||k(  r|}n|j                  s|j                  r|j                  s|j                  r |j)                  ||      rt        }nt        }n|j                  s|j                  r |j)                  ||      rt        }nt        }nt        j*                  |      rt        j*                  |      rt        }n[| j-                  |||       t        }nA|j+                  |      r|}n-|j+                  |      r|}n| j-                  |||       t        }|j                  r&t/        |t0              st/        |t0              rt        }||j2                  r|}nt!        j4                  ||      }| j6                  r(| j6                  j9                  || j:                  ||      }|S )NzFComparisons between bytes/unicode and str are not portable to Python 3r  r  zcomplex types are unordered)r  r   r   rn  r   r   r   r}   r,   r  r_  rl   r  r   r  r   r   rZ  rV  r  r  r  invalid_types_errorrz   r  r  spanning_typerK  find_common_typer   )	rT   rn   r  r  common_typer  r1  r2  new_common_types	            rO   r[  zCmpNode.find_common_type0  s   == X5??e
L?Y6Y!u%JP\C]:]$((de(O !1!1,&))U-=-=))U-=-=dhh =>","":?:J:J7K_K_:`'"6"6ft"":?:J:J7K_K_:`'"6"6ft","@"@"N%"2"2(<<UEJO (?(?"77R8TO"%//"0%"'""e&7&7##u88D*4*8%%88D*4*8#33E:~?]?]^c?d&4O ,,Xr8D&0O&&u-"'&&u-"' ((2x@",$$*Xy*I*4Xy*I )O /":":)K
 %22;PK<<,,77T]]HVabKrP   c           
      l    t        | j                  d|d|j                  d|j                  d       y )NInvalid types for 'rN
  rk  r  r  )rT   r  r  r  s       rO   rY  zCmpNode.invalid_types_errorX0  s$    dhh8==(--1 	2rP   c                     | j                          xr] | j                          xrJ | j                         xs8 | j                  xr | j                  j	                         xs | j
                  dv S NrI  )is_ptr_containsis_c_string_containshas_python_operandsrK  is_python_comparisonr   rS   s    rO   re  zCmpNode.is_python_comparison\0  sk    ((** 7--//7))+ 6\\Idll&G&G&I6MM%55		8rP   c                     | j                   }|j                  |k7  r|j                  ||      | _         | j                  r| j                  j	                  ||       y y rI   )r  r   r  rK  coerce_operands_to)rT   r  rn   r  s       rO   rg  zCmpNode.coerce_operands_toc0  sK    ====H$$..x=DM<<LL++Hc: rP   c                    | j                         xrD | j                  d u xr4 | j                  dvxr$ | j                          xr | j	                          xs( | j
                  xr | j
                  j                         S )N)r  r  r   r!  )rd  special_bool_cmp_functionr   rc  rb  rK  is_python_resultrS   s    rO   rj  zCmpNode.is_python_resultj0  s    ))+ ,//47,&FF, ..00, ))++	B
 @!>!>!@	CrP   c                 b   | j                   dv xr | j                  j                  j                  xr> | j                  j                  j
                  xs | j                  j                  t        u xs> | j                  j                  j                  xr | j                  j                  t        u S ra  )	r   r  r   r  r  rn  r   r  r   rS   s    rO   rc  zCmpNode.is_c_string_containsr0  s    }} 00 :##** Xmm((22Vdmm6H6HJ6V9##33 8]]''<7		:rP   c                     | j                   dv r?| j                  j                  }|j                  xs |j                  xr |j
                   S y ra  )r   r  r   r  r#  rn  )rT   container_types     rO   rb  zCmpNode.is_ptr_containsy0  sM    ==,,!]]//N"))D^-D-D 1&0001 -rP   c                 2   | j                   dv r[|j                  | j                  j                  }}|s|j                  r)|j                  r|t        j
                  u s|t        j
                  u r#t        j                  dd      | _        d| _	        y|t        j                  u s|t        j                  u r#t        j                  dd      | _        d| _	        y|t        j                  u s|t        j                  u r#t        j                  dd      | _        d| _	        y|t        j                  u s|t        j                  u r#t        j                  dd      | _        d	| _	        yy| j                   d
v r| j                  j                  t        j                  u rC| j                  j                  d      | _        t        j                  dd      | _        d| _	        y| j                  j                  t        j                  u rC| j                  j                  d      | _        t        j                  dd      | _        d| _	        y| j                  j                  t        j
                  u rC| j                  j                  d      | _        t        j                  dd      | _        d| _	        y| j                  j                  j                   s | j                  j#                  |      | _        t        j                  dd      | _        d| _	        yy)NrX  UnicodeEqualsr{  __Pyx_PyUnicode_EqualsTBytesEquals__Pyx_PyBytes_Equals	StrEquals__Pyx_PyString_EqualsrI  r  PyDictContainsrp  __Pyx_PyDict_ContainsTFPySetContains__Pyx_PySet_ContainsTFPyUnicodeContains__Pyx_PyUnicode_ContainsTFPySequenceContains__Pyx_PySequence_ContainsTFF)r   r   r  r  r   r   r	   r{  special_bool_cmp_utility_coderi  r   r/   r   r   r  r   rl   r  )rT   rn   r  result_is_boolr1  r2  s         rO   "find_special_bool_compare_functionz*CmpNode.find_special_bool_compare_function0  s   ==L(#==$--*<*<5E%"7"7E<Q<QG000EW=Q=Q4Q9D9P9PQ`bq9rD65MD2g000EW=O=O4O9D9P9PQ^`o9pD65KD2g555'BYBY9Y9D9P9PQ`bq9rD65MD2g...%7;K;K2K9D9P9PQ\^m9nD65LD2. - ]]..}}!!W%6%66 $ ? ?@c d5@5L5LM]_q5r21J.##w'7'77 $ ? ?@c d5@5L5L_^p5q21I.##w';';; $ ? ?@c d5@5L5LM`bq5r21M.}}))55$(MM$D$DS$IDM5@5L5LMacu5v21N.rP   c                    | j                   j                  rR|j                  }d|z  }| j                  r2|j                  j                  t        j                  dd             d}nd}n|j                  }d}d}| j                  r|j                   j                  r|j                         }	n|j                         }	|j                   j                  r|j                         }
n|j                         }
| j                  r%|j                  j                  | j                         |j                  |d|d| j                  d|	d	|
d	t        |   d
| ||| j                               y |j                   j                  re|dvra|dvsJ |       |j                  |d|j                         d	|j                         d	t        |   d| ||| j                        
       y |j                   j                  rc|j                  |d|d|dk(  xr dxs d|j                   j!                  d      d|j                         d	|j                         d       y |j                   }|j                   }|j"                  s|j"                  r|j%                  |      st&        }n%|j(                  rt+        j,                  ||      }n|}|j/                  |      }|j/                  |      }|d|d|d| j1                  |      d|d
}| j3                         rV| j4                  dk(  rGt7        || j                  || j                   j                  r|nd | j8                  | j:                         y |j                  |       y )Nz__Pyx_XGOTREF(%s); PyBoolOrNullFromLongrp  __Pyx_PyBoolOrNull_FromLong__Pyx_PyBool_FromLongr  r  r  rk  z)); )r  r  rI  z = PyObject_RichCompare(r   r  rU
  eqr,  r  rl  r  )r   rl   r   ri  rt  ru  r	   r{  r  r   r   r}  r   richcmp_constantsr}   r  rk
  r  r  r   r_  r   rZ  r   
c_operatorrR  r  r   r   rh  )rT   r   re  r  r  r  error_clausegot_refcoerce_resultrh  ri  r1  r2  r\  code1code2	statements                    rO   r  zCmpNode.generate_operation_code0  s   99  22L+k9G--  11++,BDVWY = 711LGM))}}((",,."//+}}((",,."//+11  11$2T2TUJJ!22W&7&; dhh79: ]]&&25E+E--1r1JJ&&(&&(%b) dhh79 : ]]%%JJd
"s(b(&&t,!!# $ MMEMME''5+B+B!MM%0,!!(<<UEJ#&&{3E&&{3E#I %%'D,@,@C,G'HH#'99#8#8Kd(())+ 

9%rP   c                     |dk(  ry|dk(  ry|S )Nr  r  r  r  rR   )rT   r  s     rO   r  zCmpNode.c_operator 1  s    :8^IrP   rI   r  )rV   rW   rX   ri  r}  r   rN  rP  rR  rV  r[  rY  re  rg  rj  rc  rb  r  r  r  rR   rP   rO   rF  rF  /  sc     !%$(!F0R6Qf28;C:1+ZR&hrP   rF  c                   z    e Zd Zg dZdZdZdZd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zy)r  )r  r  coerced_operand2rK  NFc                    | j                   j                  |      }| j                  j                  |      }t        |      st        |      r6t	        |      r+t	        |      r t        t        | j                  ||            S t        S rI   )	r  r   r  r7   r5   rC   r9   r   r   rY  s       rO   r   zPrimaryCmpNode.infer_type1  sj    ((-((-5!_U%;(/4Me4T"#5dmmUE#RSS rP   c                      yr  rR   r	  s     rO   r   z PrimaryCmpNode.type_dependencies'1  r@  rP   c                 j    | j                   rJ | j                  | j                  j                         y rI   )rK  rN  r  r{   rS   s    rO   r   z(PrimaryCmpNode.calculate_constant_result*1  s$    <<//0M0MNrP   c                 \    | j                   j                  |      }| j                  ||      S rI   )r  r  rP  )rT   r  r  s      rO   r  z!PrimaryCmpNode.compile_time_value.1  s)    ==33D9//$??rP   c                    | j                   j                  |      | _         | j                  j                  |      | _        | j                         r5| j	                  |       | j
                  rt        | j                  d       | S | j                   j                  }| j                  j                  }t        |      st        |      rDt        |      r9t        |      r.t        t        | j                  ||            | _        d| _        | S | j                  |      r| S | j
                  r | j
                  j                  |      | _        | j                  dv r| j!                         rLd| _        d }| j
                  rt        | j                  d       | S | j                  j                  t"        u r&|j%                  t'        j(                  dd             n| j                   j                  t*        j,                  u r/| j                   j/                  t*        j0                  |      | _         | j                  j                  t2        ur%| j                  j/                  t2        |      | _        |j%                  t'        j(                  dd             | j                  j5                  d      | _        n[| j7                         r9| j
                  rt        | j                  d	       t*        j8                  | _        | S | j;                  || j                         rJ| j                   j                  j<                  s | j                   j?                  |      | _         d }d| _        nt@        }d
| _        n| j;                  || j                         rJ| j                   j                  j<                  s | j                   j?                  |      | _         d }d| _        n8| jC                  || j                  | j                         }|j<                  | _        |X|jD                  sL| j                   j                  |k7  r!| j                   j/                  ||      | _         | jG                  ||       | j
                  rv| j                  jI                  |      | _        | j
                  jK                  |       | j
                  jM                  | j                  |      }|| j                  ur|| _'        | jQ                         rt*        j@                  | _        nt*        j8                  | _        | j
                  }|r | j                  |_        |j
                  }|r | j                  s| j
                  s| jR                  rd| _*        | S )Nz5Cascading comparison not yet supported for cpp types.FrI  z?Cascading comparison not yet supported for 'int_val in string'.PyUCS4InUnicoder{  BytesContainsz+argument of type 'NoneType' is not iterablez?Cascading comparison not supported for 'val in sliced pointer'.Tr&   )+r  r  r  rR  analyse_cpp_comparisonrK  r   r}   r   r7   r5   rC   r9   r   is_pycmp"analyse_memoryviewslice_comparisonrc  r   ru  r	   r{  r   r  r  r   r   r  rb  rA  r  rl   r  r   r[  r  rg  r   coerce_cascaded_operands_to_tempoptimise_comparisonr  rj  ri  r   )rT   rn   r1  r2  r\  r  cdrs          rO   r  zPrimaryCmpNode.analyse_types21  s   33C833C8!!#'',||dhh WXK""""5!_U%;(/4Me4T'(:4==%QV(WX	 %2237K<<<<55c:DL==,,((* %"<<$(($efK==%%5(()@)@ARTc)de}}))Z-D-DD(,(?(?
@V@VX[(\}}));(,(?(?
C(P(()@)@Ra)bc $ ? ?A!C%%'<<$(($ef&22	88dmmL}}))55$(MM$D$DS$IDM" %, $44S$--H==%%11 $ @ @ EK!DM//T]]DMMRK'33DM";+?+?}}!![0 $ 7 7S I##K5<< MM::3?DMLL99#>||77sKHt}},(0%  ""11DI"..DIllyyCH++C  ==DLLD,J,JDLrP   c           
         | j                   j                  }| j                  j                  }d| _        |j	                  | j
                  | j                   | j                  g      }|Gt        | j                  d| j
                  d|d|d       t        j                  | _        d| _
        y |j                  }|j                  r|j                  }|j                  | _        |j                  | _        | j                  dk(  r8d| _        | j                  %|j!                  t#        j$                  d	d
             t'        |j(                        dk(  r9| j                  j+                  |j(                  d   j                  |      | _        np| j                   j+                  |j(                  d   j                  |      | _         | j                  j+                  |j(                  d   j                  |      | _        |j,                  | _        y )NFr_  rN
  rk  r  rh  r  Tr  r  r&   r   )r  r   r  r  r  r   r   r}   r   r,   re  r  r  r  r   r   ru  r	   r{  r   r   r  r  )rT   rn   r1  r2  r   r  s         rO   r  z%PrimaryCmpNode.analyse_cpp_comparison1  s   """"##DMMDMM4==3QR=$((u. /"--DI(DJJ	!++I(88(883&DL##+$$[%<%<=UWg%hiy~~!# MM33INN14E4J4JCPDM MM33INN14E4J4JCPDM MM33INN14E4J4JCPDM))	rP   c                 T   | j                   j                  xs | j                  j                  }| j                   j                  j                  xs  | j                  j                  j                  }d}|r4|r2| j
                  |v r$d| _        t        j                  | _        d| _	        yy)N)r  r  r  r  FT)
r  r%  r  r   r   r   r  r   rA  is_memslice_nonecheck)rT   rn   	have_none
have_sliceopss        rO   r  z1PrimaryCmpNode.analyse_memoryviewslice_comparison1  s    MM))BT]]-B-B	mm((;; <mm((;; 	*)(<!DM"..DI)-D&rP   c                 ^   | j                   r| j                  || j                  d      rnd| _         t        j                  | _        d| _        | j                  r=| j                  j                  | j                  |d      }|| j                  ur|| _
        | S t        j                  | |      S )NT)r~  Fr&   )r  r  r  r   rA  r   r   rK  r  r  r  r   r  )rT   rn   r  s      rO   r  z PrimaryCmpNode.coerce_to_boolean1  s    ==66t 7 = %&22	 <<#||??s4  @  AHt}}408-))$44rP   c                     | j                   j                  j                  xs  | j                  j                  j                  S rI   )r  r   rl   r  rS   s    rO   rd  z"PrimaryCmpNode.has_python_operands1  s2    "".. .}}!!--	/rP   c                     | j                   r| j                          y| j                  j                         xr | j                  j                         S r@  )rK  rA  r  r  r  rS   s    rO   r  zPrimaryCmpNode.check_const1  s;    <<NN==,,.N4==3L3L3NNrP   c                 &   | j                   | j                  }}|j                  j                  rW| j                  dk(  rd}nd}d||j                  j                  d      d|j                         d|j                         dS | j                         rU|j                  t        u rd}nd	}| j                  d
k(  rd}nd}d||d|j                         d|j                         dS t        | j                        r!|j                         |j                         }}nM|j                         |j                         }}| j                  r!|j                  j                  rd|z  }nd|z  }d|d| j                  | j                        d|dS )Nr  rU
  r  r  r  rk  z))__Pyx_UnicodeContainsUCS4__Pyx_BytesContainsr!  ((PyObject *) %s.memview)r  r  )r  r  r   r  r   rg  r   rc  r   r7   r   r  r   r  )rT   r  r  negationmethodrh  ri  s          rO   r   z$PrimaryCmpNode.calculate_result_code1  sV   !]]DMM(==##}}$''-!!	# #
 &&(}},4.}}(!!	# # tyy)#+#:#:#<h>U>U>W#+??#4hoo6G--}}77"="G"="G . rP   c                    | j                   j                  |       | j                  j                  |       | j                  r| j	                  |       | j                  || j                         | j                   | j                  | j                         | j                  rQ| j                  j                  || j                         | j                  xs | j                  | j                  d u       | j                   j                  |       | j                   j                  |       | j                  j                  |       | j                  j                  |       y y )Nneeds_evaluation)r  rr  r  r   rW  r  r   r   rK  r  r{  r  rb  s     rO   rr  z'PrimaryCmpNode.generate_evaluation_code1  s    ..t4..t4<<%%d+((t{{}t}}dmm=||55$++-)>)>)O$--%)%:%:$%F 6 H MM006MM$$T*MM006MM$$T* rP   c                 p    | j                   j                  |       | j                  j                  |       y rI   )r  r{  r  rb  s     rO   rp  z-PrimaryCmpNode.generate_subexpr_disposal_code2  s(     	,,T2,,T2rP   c                 p    | j                   j                  |       | j                  j                  |       y rI   )r  r  r  rb  s     rO   rq  z!PrimaryCmpNode.free_subexpr_temps2  s(     	  &  &rP   c                     | j                   j                  |       | j                  j                  |       | j                  r| j                  j                  |       y y rI   )r  r  r  rK  rb  s     rO   r  zPrimaryCmpNode.annotate2  sD    t$t$<<LL!!$' rP   )rV   rW   rX   r  rK  r  r  r   r   r   r  r  r  r  r  rd  r  r   rr  rp  rq  r  rR   rP   rO   r  r  1  sl     JKG!	O@Un*65"/O(T+ 3'(rP   r  c                   f    e Zd Zg dZdZdZeZd Zd Z	d Z
d Zd Zd Zdd	Zd
 Zd ZddZd Zy)CascadedCmpNode)r  r  rK  Nc                     t         S rI   r+  r	  s     rO   r   zCascadedCmpNode.infer_type*2  r  rP   c                      yr  rR   r	  s     rO   r   z!CascadedCmpNode.type_dependencies.2  r@  rP   c                 N    | j                   t        uxr | j                   t        uS rI   r   rS   s    rO   r   z#CascadedCmpNode.has_constant_result12  r   rP   c                     | j                   j                  |      | _         | j                  r | j                  j                  |      | _        | S rI   )r  r  rK  r	  s     rO   r  zCascadedCmpNode.analyse_types52  s:    33C8<<<<55c:DLrP   c                 B    | j                   j                  j                  S rI   )r  r   rl   rS   s    rO   rd  z#CascadedCmpNode.has_python_operands;2  s    }}!!---rP   c                      yr@  rR   rS   s    rO   rR  z!CascadedCmpNode.is_cpp_comparison>2  rt  rP   c                 B   | j                  |||      rCd| _        t        j                  | _        |j                  j
                  s|j                  |      }| j                  r<| j                  j                  | j                  ||      }|| j                  ur|| _
        |S r@  )r  r  r   rA  r   rl   r  rK  r  r  r  )rT   r  rn   r~  r  s        rO   r  z#CascadedCmpNode.optimise_comparisonB2  s    223.Q!DM"..DI==,,#66s;<<||77sN[Ht}},(0%rP   c                 (   | j                   j                  |      | _         | j                   j                  t        u r.| j                  dv r | j                   j                  d      | _         | j                  r| j                  j                  |       y y )NrI  r  )r  r  r   r   r   r  rK  r,  r	  s     rO   r,  z,CascadedCmpNode.coerce_operands_to_pyobjectsN2  sk    88===*t}}@P/P MM;;<_`DM<<LL55c: rP   c                     | j                   r<| j                  j                  |      | _        | j                   j                  |       y y rI   )rK  r  r  r  r	  s     rO   r  z0CascadedCmpNode.coerce_cascaded_operands_to_tempU2  s6    << MM::3?DMLL99#> rP   c                    | j                   j                  r1|j                  d|z         |j                  || j                          n|j                  d|z         |r|j	                  |       | j
                  j	                  |       | j                  |||| j                  | j
                         | j                  rC| j                  j	                  ||| j                  xs | j
                  | j                  d u       |r"|j                  |       |j                  |       | j
                  j                  |       | j
                  j                  |       |j                  d       y )Nz if (__Pyx_PyObject_IsTrue(%s)) {r=  r  r   )r   rl   r   r  rr  r  r  r   rK  r  r{  r  )rT   r   r   r  r  s        rO   rr  z(CascadedCmpNode.generate_evaluation_code[2  s   99  JJ9FBCOOFDII.JJ{V+,--d3..t4$$T6dmmT]]	4<<LL11fd33Dt}}!%!6!6d!B 2 D ++D1%,,T2  &

3rP   c                     | j                   j                  |       | j                  r| j                  j                  |       y y rI   )r  r  rK  rb  s     rO   r  zCascadedCmpNode.annotater2  s2    t$<<LL!!$' rP   r  )rV   rW   rX   r  rK  r  r   r{   r   r   r   r  rd  rR  r  r,  r  rr  r  rR   rP   rO   r  r  2  sP     >KG,O:.
;?.(rP   r  )r  r  r	  r  r
  r  r  r  rh  r   r  r  r  r  r  c                 *    t        |   | f||||d|S )N)r   r  r  r  )binop_node_classes)r}   r   r  r  r  r  s         rO   r  r  2  s4     h'  rP   c                   4     e Zd ZdgZeZ fdZd Zd Z xZ	S )CoercionNoder  c                     t         t        |   |j                         || _        t
        rt        | d| j                         y y )Nz
 Coercing )rK   r  rQ  r}   r  r!   r  rT   r  rN   s     rO   rQ  zCoercionNode.__init__2  s6    lD*3773dDHH56 rP   c                      y rI   rR   rS   s    rO   r   z&CoercionNode.calculate_constant_result2  r  rP   c                 4   | j                   j                  |       | j                   j                  | j                  k7  rZ| j                  \  }}}|j                  |||dz
  ft	        ddd| j                   j                  d| j                  d             y y )Nr&   coercerQ  z] to [])r  tagr  )r  r  r   r}   r1   )rT   r   filelinecols        rO   r  zCoercionNode.annotate2  sy    $88==DII%"hhOD$MM4s1u-~HTXX]]TXT]T]3^0` a &rP   )
rV   rW   rX   r   r   r{   rQ  r   r  rY   rZ   s   @rO   r  r  2  s!    
 wH$O7arP   r  c                       e Zd ZdZd Zd Zy)r  zc
    Coerce an object to a memoryview slice. This holds a new reference in
    a managed temp.
    c                     |j                   sJ |j                  j                   rJ t        j                  | |       || _        d| _        d| _        || _        | j                  j                  |       y )Nr&   T)r   r   r  rQ  r   rV  r  r
  rT   r  r  rn   s       rO   rQ  z!CoerceToMemViewSliceNode.__init__2  s]    ***88...dC(	#		--c2rP   c                     |j                  | j                  j                  | j                  j	                         | j                         | j                  |             y rI   )r   r   from_py_call_coder  r   r   r}   rb  s     rO   rm  z-CoerceToMemViewSliceNode.generate_result_code2  sB    

499..HH KKMHH	
 	rP   N)rV   rW   rX   r  rQ  rm  rR   rP   rO   r  r  2  s    
3rP   r  c                   $    e Zd Zd Zd Zd Zd Zy)r  c                 >    t         j                  | |       || _        y rI   )r  rQ  r   )rT   r  new_types      rO   rQ  zCastNode.__init__2  s    dC(	rP   c                 6    | j                   j                         S rI   r  r  rS   s    rO   r  zCastNode.may_be_none2      xx##%%rP   c                 L    | j                   j                  | j                        S rI   )r  r   r   rS   s    rO   r   zCastNode.calculate_result_code2  s    xx!!$)),,rP   c                 :    | j                   j                  |       y rI   r  rm  rb  s     rO   rm  zCastNode.generate_result_code2      %%d+rP   N)rV   rW   rX   rQ  r  r   rm  rR   rP   rO   r  r  2  s    &-,rP   r  c                       e Zd ZdZddZej                  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y)r  Tc                     |j                   s|j                  sJ d       t        j                  | |       || _        |j                         | _        || _        y )Nz PyTypeTest on non extension type)r  r  r  rQ  r   r   r   r
  )rT   r  r  rn   r
  s        rO   rQ  zPyTypeTestNode.__init__2  sJ     ))X-E-EiGiidC(	IIKrP   zPython type testc                     | S rI   rR   r	  s     rO   r  zPyTypeTestNode.analyse_types2  r  rP   c                 P    | j                   ry| j                  j                         S r@  )r
  r  r  rS   s    rO   r  zPyTypeTestNode.may_be_none2  s    <<xx##%%rP   c                 6    | j                   j                         S rI   r  r  rS   s    rO   r  zPyTypeTestNode.is_simple3      xx!!##rP   c                 6    | j                   j                         S rI   r  rI  rS   s    rO   rI  zPyTypeTestNode.result_in_temp3      xx&&((rP   c                 6    | j                   j                         S rI   )r  r   rS   s    rO   r   zPyTypeTestNode.is_ephemeral3  s    xx$$&&rP   c                 6    | j                   j                         S rI   r  r%  rS   s    rO   r%  z#PyTypeTestNode.nonlocally_immutable
3      xx,,..rP   c                 x   | j                   | j                  j                   k7  s| j                  j                  s| S | j                   j                         s| S | j                  j	                         r>| j
                  r2| j                  j                  d| j                   j                  z        S | j                  S )Nz!Cannot convert NoneType to %.200s)r   r  r   typeobj_is_availabler  r
  r  rm   rS   s    rO   	reanalysezPyTypeTestNode.reanalyse3  s    99%TXX-=-=Kyy--/K88!dll88--.QTXT]T]TbTb.bccxxrP   c                      y rI   rR   rS   s    rO   r   z(PyTypeTestNode.calculate_constant_result3  r  rP   c                 6    | j                   j                         S rI   r  r   rS   s    rO   r   z$PyTypeTestNode.calculate_result_code3      xx  rP   c                 b   | j                   j                         r| j                   j                  rK| j                   j                  | j                  j                         | j                  | j                        }nm| j                   j                  | j                  j                         | j                        }|j                  j                  t        j                  dd             |j                  d|d|j                  | j                               y t        | j                  d       y )N)exactExtTypeTestrp  r
  z)) zICannot test type of extern C class without type object name specification)r   r  r  type_test_coder  r   r
  r  rt  ru  r	   r{  r   r   r}   r   )rT   r   	type_tests      rO   rm  z#PyTypeTestNode.generate_result_code3  s    99))+yy(( II44HH&&(LL(?(? 5 A	 !II44HH&&($,,8	  11++M;MNPJJ4??48846 7 $(( 9 :rP   c                 :    | j                   j                  |       y rI   r  r  rb  s     rO   r  z,PyTypeTestNode.generate_post_assignment_code.3      ..t4rP   c                      y rI   rR   rb  s     rO   rW  z#PyTypeTestNode.allocate_temp_result13  r  rP   c                      y rI   rR   rb  s     rO   r_  z"PyTypeTestNode.release_temp_result43  r  rP   c                 :    | j                   j                  |       y rI   r  r  rb  s     rO   r  zPyTypeTestNode.free_temps73      D!rP   c                 :    | j                   j                  |       y rI   )r  rq  rb  s     rO   rq  z!PyTypeTestNode.free_subexpr_temps:3  s    ##D)rP   Nr  )rV   rW   rX   r  rQ  r'   r;  r<  r  r  r  r  rI  r   r%  r  r   r   rm  r  rW  r_  r  rq  rR   rP   rO   r  r  2  sj    
  ..K$K&
$)'/!:"5"*rP   r  c                       e Zd ZdZ	 ddZdZd Zd Zd Zd Z	d Z
d	 Zd
 Ze	 dd       Ze	 dd       Zd Zd Zd Zd Zy)r  Tc                     t         j                  | |       |j                  | _        |j                         | _        || _        || _        t        |xs d      | _        y r  )	r  rQ  r   r   r   exception_type_cnameexception_messager   exception_format_args)rT   r  r  r  r  s        rO   rQ  zNoneCheckNode.__init__E3  sN    dC(HH	IIK$8!!2%*+@+FB%G"rP   Nc                     | S rI   rR   r	  s     rO   r  zNoneCheckNode.analyse_typesP3  r  rP   c                      yr@  rR   rS   s    rO   r  zNoneCheckNode.may_be_noneS3  r  rP   c                 6    | j                   j                         S rI   r  rS   s    rO   r  zNoneCheckNode.is_simpleV3  r  rP   c                 6    | j                   j                         S rI   r  rS   s    rO   rI  zNoneCheckNode.result_in_tempY3  r  rP   c                 6    | j                   j                         S rI   r  rS   s    rO   r%  z"NoneCheckNode.nonlocally_immutable\3  r  rP   c                 6    | j                   j                         S rI   r  rS   s    rO   r   z#NoneCheckNode.calculate_result_code_3  r  rP   c                     | j                   j                  r| j                  j                         S | j                   j                  rd| j                  j                         z  S t        d      )Nr  zunsupported type)r   rl   r  r   r   r   r  rS   s    rO   	conditionzNoneCheckNode.conditionb3  sQ    99  88%%''YY)).1BBB.//rP   c                 J     | ||||      }||_         |j                  |       y rI   )rh  put_nonecheck)rM   r  r   r  r  r  rh  r   s           rO   generatezNoneCheckNode.generatej3  s-     3,.?AVW 04 rP   c                 R    |j                         r| j                  ||||||       y y rI   )r  r  )rM   r  r   r  r  r  rh  s          rO   generate_if_neededz NoneCheckNode.generate_if_neededq3  s-     ??LLd$57KMbdtu rP   c                 &   |j                  d| j                         z         | j                  r|j                          t        j
                  }| j                  r|j                  d| j                  dt	        j
                  | j                  j                  d            ddj                  | j                  D cg c]%  }d |t        |      j                  d            z  ' c}      d       nA|j                  d	| j                  d || j                  j                  d            d
       | j                  r|j                          |j                  |j                  | j                               |j                  d       y c c}w )Nzif (unlikely(%s == Py_None)) {zPyErr_Format(z, "zUTF-8z", rk  z"%s"rl  zPyErr_SetString(z");r   )r   r  rh  r   r   escape_byte_stringr  r  r  r  r<  rs   r   r   r}   )rT   r   escaper  s       rO   r  zNoneCheckNode.put_nonecheckw3  sA   

,t~~/??	A   !22%%JJ))11**11':<		'+'A'AD # #VCHOOG,D%EE D E	F G JJ))t--44W=>@ A   ((*

4??488,-

3Ds   <*Fc                 &    | j                  |       y rI   )r  rb  s     rO   rm  z"NoneCheckNode.generate_result_code3  s    4 rP   c                 :    | j                   j                  |       y rI   r  rb  s     rO   r  z+NoneCheckNode.generate_post_assignment_code3  r  rP   c                 :    | j                   j                  |       y rI   r  rb  s     rO   r  zNoneCheckNode.free_temps3  r  rP   )rR   )r  rR   F)rV   rW   rX   r  rQ  r<  r  r  r  rI  r%  r   r  r  r  r  r  rm  r  r  rR   rP   rO   r  r  >3  s    
 L (*H K$)/!0 di! ! nsv v
4!5"rP   r  c                   D    e Zd ZeZeZdZefdZdZd Z	d Z
d Zd Zd Zy	)
r  r&   c                 |   |j                   j                  |      s$t        |j                  d|j                   z         n'|j                   j                  r|j                  |      }t        j                  | |       |t        u r|j                   j                  s|j                   j                  rt        |      | _         nc|j                   j                  s|j                   j                  rt        | _         n+|j                   j                  rt        j                   | _         | j                   | _        y |j                   j                  s|j                   j                  rS|t$        t&        fvr6|j(                  d   s't        |j                  d|j                   d|d       |x| _         | _        y || _        y )Nz$Cannot convert '%s' to Python objectr\   r  r  r  )r   r  r   r}   r  r  r  rQ  r   rn  r  rv   ro  r  r   r   r  target_typer   r"   rf   )rT   r  rn   r   s       rO   rQ  zCoerceToPyTypeNode.__init__3  s8   xx11#6#''ACHHLMXX   &&s+CdC(>!xx!!SXX%;%;,S1	**chh.F.F(	$$#00	#yyDXX388#9#9Z88NN+>?cggXXt%& ,0/DI(  $DrP   zConverting to Python objectc                      yr@  rR   rS   s    rO   r  zCoerceToPyTypeNode.may_be_none3  rt  rP   c                     | j                   j                  }|t        j                  k(  s|j                  r*|j
                  dk(  r| j                   j                  |      S t        | |      S )Nr  )r  r   r   rA  rl   rm   r  r  )rT   rn   r  s      rO   r  z$CoerceToPyTypeNode.coerce_to_boolean3  sS    88==
...!!hmmv&=88**3//&tS11rP   c                     | j                   j                  j                  r| j                   S | j                   j                  t        j
                  |      S rI   )r  r   r  r  r   r*   r	  s     rO   r  z$CoerceToPyTypeNode.coerce_to_integer3  s9    88==88O88%%j&<&<cBBrP   c                     | S rI   rR   r	  s     rO   r  z CoerceToPyTypeNode.analyse_types3  rc  rP   c                 h   |j                  | j                  j                  j                  | j                  j	                         | j	                         | j
                        d|j                  | j	                         | j                               |j                  | j                                y )Nr  )
r   r  r   to_py_call_coder   r  r   r}   r  r   rb  s     rO   rm  z'CoerceToPyTypeNode.generate_result_code3  sz    

HHMM))!  " ##DKKM488<> 	? 	()rP   N)rV   rW   rX   r   r   r  r   rQ  r  r  r  r  r  rm  rR   rP   rO   r  r  3  s<     D KG&4 $: 0K2C*rP   r  c                       e Zd ZdZd Zd Zy)r  r&   c                 |    |j                  |      }t        j                  | |       t        j                  | _        y rI   )r  r  rQ  r   r   r   rT   r  rn   s      rO   rQ  zCoerceIntToBytesNode.__init__3  s/    ""3'dC(&&	rP   c           
         | j                   }|j                         }|j                  t        j                  t        j
                  t        j                  fvr|j                  j                  r|j                  d|d|d       n|j                  d|z         |j                  d|j                  | j                        z         |j                  d       d }|j                  t        j                  urD|j                  j                  t        j                  d      }|j                  |d	|d
       |}|j                  | j                         d|d|j                  | j                         | j                               ||j                  j                  |       |j                  | j!                                y )Nzif ((z
 < 0) || (z
 > 255)) {zif (%s > 255) {zOPyErr_SetString(PyExc_OverflowError, "value too large to pack into a byte"); %sr   FrO  z	 = (char)r  z = PyBytes_FromStringAndSize(&z, 1); )r  r   r   r   r   r  rb  r   r   r   r}   rT  rU  r   r^  r  r   )rT   r   r  
arg_resultr  s        rO   rm  z)CoerceIntToBytesNode.generate_result_code3  s]   hhZZ\
88J22&33&335 5 xx


, - 

,z9:JJ D??48846 7 JJsO88:111>>//
0F0FSX/YDJJ4<=J

KKM##DKKM488<> 	? NN''-()rP   N)rV   rW   rX   r   rQ  rm  rR   rP   rO   r  r  3  s     G'
*rP   r  c                   *    e Zd Zd Zd Zd Zd Zd Zy)r  c                    t         j                  | |       || _        d| _        |j	                  |      st        |j                  d|z         | j                  j                  s| j                  j                  rk| j                  j                  rT| j                  j                  r=| j                  j                  j                  rt        |j                  d|z  d       y y y y y )Nr&   z$Cannot convert Python object to '%s'z=Obtaining '%s' from externally modifiable global Python valuerx   )r  rQ  r   r   r
  r   r}   rn  ro  r  r  r   rG  r   )rT   ra  r  rn   s       rO   rQ  zCoerceFromPyTypeNode.__init__4  s    dC(	66s;#''8;FH99$))"<"<xxDHHNNtxx~~7Q7QWZee! 8RN #=rP   c                     | S rI   rR   r	  s     rO   r  z"CoerceFromPyTypeNode.analyse_types4  rc  rP   c                     | j                   j                  xr | j                   j                   xr | j                  j	                         S rI   )r   r  r#  r  r   rS   s    rO   r   z!CoerceFromPyTypeNode.is_ephemeral!4  s6    		  ;););%;XAVAVAXXrP   c           	      l   d }| j                   j                  r| j                  j                   t        u rk| j                   j                  j                  d      rFd| j                   j                  t        d      d  z   }t        j                  | j                  |d       |j                  | j                   j                  | j                  j                         | j                         | j                  ||             | j                   j                  r |j                  | j                                y y )N__Pyx_PyObject_As__Pyx_PyBytes__Pyx_PyObjectzexpected bytes, NoneType found)from_py_function)r   rn  r  r   r-  r[  r   r  r  r   r  r   r   r}   rl   r  )rT   r   r-  s      rO   rm  z)CoerceFromPyTypeNode.generate_result_code$4  s    99488==J#>yy))445HI#2TYY5O5OPSTdPePf5g#g 004Aab

499..HH $++-4Rb / d 	e99  OODNN,- !rP   c                 0    t        | j                  d       y )Nz0Coercion from Python not allowed without the GILr   r	  s     rO   r<  z CoerceFromPyTypeNode.nogil_check14  s    dhhJKrP   N)rV   rW   rX   rQ  r  r   rm  r<  rR   rP   rO   r  r  4  s    !Y.LrP   r  c                       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 Zd Zd	Zd
 Zd Zd Zy)r  PyList_GET_SIZEPyTuple_GET_SIZEPySet_GET_SIZEPyBytes_GET_SIZEPyByteArray_GET_SIZE__Pyx_PyUnicode_IS_TRUEc                 l    t         j                  | |       |j                  j                  rd| _        y y r  )r  rQ  r   rl   r   r"  s      rO   rQ  zCoerceToBooleanNode.__init__E4  s+    dC(88DL  rP   c                     | j                   j                  j                  rA| j                  j	                  | j                   j                        | j                          y y y rI   )r  r   rl   _special_builtinsre   r;  r	  s     rO   r<  zCoerceToBooleanNode.nogil_checkJ4  sD    88==$$)?)?)C)CDHHMM)R)ZNN *[$rP   r  c                 p    | j                   r| j                          y| j                  j                         S r@  )r   rA  r  r  rS   s    rO   r  zCoerceToBooleanNode.check_constP4  s)    <<NNxx##%%rP   c                 <    d| j                   j                         z  S )Nz	(%s != 0)r  rS   s    rO   r   z)CoerceToBooleanNode.calculate_result_codeV4  s    TXX__...rP   c           
         | j                   sy | j                  j                  | j                  j                        }|| j                  j                         rd| j                  j                         z  gng }|j                  d|d| j                  j                         d       |j                  | j                         ddj                  |      d       y |j                  | j                         d| j                  j                         d|j                  | j                         | j                               y )	Nz(%s != Py_None)r  z) != 0)r  z&&r  rB  r   )r   r8  re   r  r   r  r   r   r   r   r<  r  r}   )rT   r   r  checkss       rO   rm  z(CoerceToBooleanNode.generate_result_codeY4  s    ||**..txx}}=	 CG88CWCWCY'$((*<*<*>>?_aFMMY8J8J8LMNJJT[[]DIIf4EFGJJKKMHH&&(**4;;=$((CEFrP   N)rV   rW   rX   r   rA  r   r   r   r   r   frozenset_typer   r"   r   r8  rQ  r<  r  r  r   rm  rR   rP   rO   r  r  54  s     !!D 	!2!3!1!1!3!7!:
 0K&/FrP   r  c                       e Zd Zd Zd Zd Zy)r  c                     |j                   j                  r|j                  |      }|| _         t        j	                  | |       |j                  |       y rI   )r   r  r  r  rQ  r  r  s       rO   rQ  zCoerceToComplexNode.__init__k4  sD    88&&s+C	dC(005rP   c                 .   | j                   j                  j                  r;d| j                   j                         z  }d| j                   j                         z  }n| j                   j                         }d}| j                  j                  d|d|dS r
  )r  r   r  r   r  )rT   r
  r
  s      rO   r   z)CoerceToComplexNode.calculate_result_coder4  so    88==##)DHHOO,==I)DHHOO,==I)II		$$ 	rP   c                      y rI   rR   rb  s     rO   rm  z(CoerceToComplexNode.generate_result_code~4  r  rP   N)rV   rW   rX   rQ  r   rm  rR   rP   rO   r  r  i4  s    6
rP   r  c                   (    e Zd Zd ZdZd Zd Zd Zy)r  c                 
   t         j                  | |       | j                  j                  j	                         | _        | j                  j
                  | _        d| _        | j                  j                  rt        | _	        y y r  )
r  rQ  r  r   as_argument_typer{   r   rl   r   r   r"  s      rO   rQ  zCoerceToTempNode.__init__4  s]    dC(HHMM224	#xx7799   .D !rP   z#Creating temporary Python referencec                     | S rI   rR   r	  s     rO   r  zCoerceToTempNode.analyse_types4  rc  rP   c                     | j                   j                  |      | _         | j                   j                         r| j                   S | j                   j                  | _        | j                  | _        | S rI   )r  r  r  r   r   r	  s     rO   r  z"CoerceToTempNode.coerce_to_boolean4  sQ    88--c28888OHHMM	 IIrP   c                    |j                  | j                         d| j                  j                  | j	                               d       | j
                  r| j                  j                  r/|j                  | j                         | j	                                y | j                  j                  r,|j                  | j                         | j                          y y y r	  )r   r   r  r   r   rV  r   rl   ra  r   rg  rh  rb  s     rO   rm  z%CoerceToTempNode.generate_result_code4  s     	

KKM488--djjl;= 	>yy$$tzz|<--//484I4I0IK .  rP   N)rV   rW   rX   rQ  r  r  r  rm  rR   rP   rO   r  r  4  s    
/ 8K
KrP   r  c                   b     e Zd ZdZdZ fdZd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Z x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                 n    t         t        |   |       |j                  | _        | j	                          y rI   )rK   r$  rQ  r{   _proxy_typer  s     rO   rQ  zProxyNode.__init__4  s,    i',"22rP   c                 f    | j                   j                  |      | _         | j                          | S rI   )r  r  rJ  r	  s     rO   r  zProxyNode.analyse_types4  s)    88//4rP   c                 8    | j                   j                  |      S rI   r  r   r	  s     rO   r   zProxyNode.infer_type4      xx""3''rP   c                     t        | j                  d      r6| j                  j                  | _        | j                  j                  | _        t        | j                  d      r| j                  j                  | _        y y Nr   r   )r  r  r   r   r   rS   s    rO   rJ  zProxyNode._proxy_type4  sS    488V$DI $ 5 5D488W%DJ &rP   c                 :    | j                   j                  |       y rI   r  rb  s     rO   rm  zProxyNode.generate_result_code4  r  rP   c                 6    | j                   j                         S rI   r  rS   s    rO   r   zProxyNode.result4  r  rP   c                 6    | j                   j                         S rI   r  rS   s    rO   r  zProxyNode.is_simple4  r  rP   c                 6    | j                   j                         S rI   r  rS   s    rO   r  zProxyNode.may_be_none4  r  rP   c                 :    | j                   j                  |       y rI   )r  rr  rb  s     rO   rr  z"ProxyNode.generate_evaluation_code4  s    ))$/rP   c                 :    | j                   j                  |       y rI   )r  r{  rb  s     rO   r{  z ProxyNode.generate_disposal_code4  s    ''-rP   c                 :    | j                   j                  |       y rI   r  rb  s     rO   r  zProxyNode.free_temps4  r  rP   )rV   rW   rX   r  r<  rQ  r  r   rJ  rm  r   r  r  rr  r{  r  rY   rZ   s   @rO   r$  r$  4  sF     K

((,!$&0."rP   r$  c                   h     e Zd Zg ZdZd Zd Zd Zd Zd Z	d Z
 fdZd	 Zd
 Zd Zd Zd Z xZS )r#  Nc                     t         j                  | |       |j                  | _        t        |d      r"|j                  | _        |j
                  | _        t        |d      r|j                  | _        y y rP  )r  rQ  r{   r  r   r   r   r:  s     rO   rQ  zCloneNode.__init__4  s]    dC("223DI # 0 0D3 DJ !rP   c                 6    | j                   j                         S rI   r  rS   s    rO   r   zCloneNode.result4  r  rP   c                 6    | j                   j                         S rI   r  rS   s    rO   r  zCloneNode.may_be_none4  r  rP   c                 8    | j                   j                  |      S rI   )r  r   r	  s     rO   r   zCloneNode.type_dependencies4  r_  rP   c                 8    | j                   j                  |      S rI   rM  r	  s     rO   r   zCloneNode.infer_type4  rN  rP   c                     | j                   j                  | _        | j                   j                  | _        d| _        t	        | j                   d      r| j                   j
                  | _        | S )Nr&   r   )r  r   r   r   r  r   r	  s     rO   r  zCloneNode.analyse_types4  sL    HHMM	 HH11488W%DJrP   c                     | j                   j                  r| j                   j                  ||      S t        t        |   ||      S rI   )r  r   r  rK   r#  )rT   	dest_typern   rN   s      rO   r  zCloneNode.coerce_to5  s;    8888%%i55Y/	3??rP   c                      yr"  rR   rS   s    rO   r  zCloneNode.is_simple	5  r  rP   c                      y rI   rR   rb  s     rO   rr  z"CloneNode.generate_evaluation_code5  r  rP   c                      y rI   rR   rb  s     rO   rm  zCloneNode.generate_result_code5  r  rP   c                      y rI   rR   rb  s     rO   r{  z CloneNode.generate_disposal_code5  r  rP   c                      y rI   rR   rb  s     rO   r  zCloneNode.free_temps5  r  rP   )rV   rW   rX   r   r<  rQ  r   r  r   r   r  r  r  rr  rm  r{  r  rY   rZ   s   @rO   r#  r#  4  sL     HK#!&/(@
rP   r#  c                       e Zd Zd Zy)r  c                     |j                   r| j                  j                  |      r| S t        j	                  | ||      S rI   )r  r   r  r#  r  rB  s      rO   r  zCMethodSelfCloneNode.coerce_to5  s6    ##		(<(<X(FK""4377rP   N)rV   rW   rX   r  rR   rP   rO   r  r  5  s    8rP   r  c                   0    e Zd ZeZdZg Zd Zd Zd Z	d Z
y)ModuleRefNodeFc                     | S rI   rR   r	  s     rO   r  zModuleRefNode.analyse_types,5  r  rP   c                      yr@  rR   rS   s    rO   r  zModuleRefNode.may_be_none/5  r  rP   c                 "    t         j                  S rI   )r   r  rS   s    rO   r   z#ModuleRefNode.calculate_result_code25  s    """rP   c                      y rI   rR   rb  s     rO   rm  z"ModuleRefNode.generate_result_code55  r  rP   N)rV   rW   rX   r   r   r   r   r  r  r   rm  rR   rP   rO   ri  ri  %5  s'     DGH#rP   ri  c                   ,    e Zd ZdgZeZdZd Zd Zd Z	y)DocstringRefNoderG	  Tc                 n    t         j                  | |       |j                  j                  sJ || _        y rI   )r   rQ  r   rl   rG	  )rT   r}   rG	  s      rO   rQ  zDocstringRefNode.__init__?5  s)    $$yy$$$	rP   c                     | S rI   rR   r	  s     rO   r  zDocstringRefNode.analyse_typesD5  r  rP   c                 Z   |j                  | j                         d| j                  j                         d|j                  t	        j
                  d            d|j                  | j                         | j                               |j                  | j                                y )Nz = __Pyx_GetAttr(rk  r  r   )	r   r   rG	  rw  r   r  r   r}   r  rb  s     rO   rm  z%DocstringRefNode.generate_result_codeG5  sr    

KKM499++-"">#?#?	#JK##DKKM488<> 	? 	&rP   N)
rV   rW   rX   r   r   r   r   rQ  r  rm  rR   rP   rO   ro  ro  85  s$     xHDG
'rP   ro  zF
static CYTHON_INLINE int __Pyx_ErrOccurredWithGIL(void); /* proto */
z
static CYTHON_INLINE int __Pyx_ErrOccurredWithGIL(void) {
  int err;
  #ifdef WITH_THREAD
  PyGILState_STATE _save = PyGILState_Ensure();
  #endif
  err = !!PyErr_Occurred();
  #ifdef WITH_THREAD
  PyGILState_Release(_save);
  #endif
  return err;
}
)protoimplzN
static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname);
z
static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) {
    PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname);
}
zM
static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname);
z
static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname) {
    PyErr_Format(PyExc_NameError, "free variable '%s' referenced before assignment in enclosing scope", varname);
}
zJ
static void __Pyx_RaiseUnboundMemoryviewSliceNogil(const char *varname);
a  
static void __Pyx_RaiseUnboundMemoryviewSliceNogil(const char *varname) {
    #ifdef WITH_THREAD
    PyGILState_STATE gilstate = PyGILState_Ensure();
    #endif
    __Pyx_RaiseUnboundLocalError(varname);
    #ifdef WITH_THREAD
    PyGILState_Release(gilstate);
    #endif
}
)rs  rt  requiresRaiseTooManyValuesToUnpackrp  RaiseNeedMoreValuesToUnpackUnpackTupleErrorrR   rm  r  (4  
__future__r   cythondeclarer
  bintresysr  os.pathrY  r   Errorsr   r   r   r   r   r   Coder	   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   Annotater1   r2   	Debuggingr3   
DebugFlagsr   r    r!   Pythranr4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   __builtin__rD   rq   rt   rJ  ImportErrorrs   version_infor%   r=  r$   longrG   r   r   rh   rj   ri   rk   r  c_const_py_unicode_ptr_typerd   r   rv   r   r   r   r   r   r   r   r   r  r  r  r'  r,  r  rD  rI  r,  r^  r  r  r  r  r  r  r  r  r  r  r  r  r)  r3  r9  rH  rS  ra  re  ro  r  r  r  r  r+  r"  r  r  r  r  r  r  r  r!  rY  r  r  r  r  r  r  r  r  r,  r7  r  r  r  r  r  rX  rz  r  r  r  r  r  ro  rm  r  r  r  r	  r	  r	  r#	  r-	  r4	  r	  r=	  rL	  r	  rY	  rZ	  r	  r	  r	  r	  r	  r 
  r
  r
  r
  r
  r
  r%
  not_invnegr}   r+
  r)
  rT
  r^
  re
  rn
  rt
  rw
  r|
  r
  r
  r
  r
  rK  r
  r
  r
  r
  r
  r  r
  r  r
  r
  r  matmulr  r   ltler  negegtis_r  r  and_truedivfloordivr}  modr|  or_r  rshiftr  xorr#  r$  r&  rG  rP  rR  r  r  r  r  r  r  compilefindallr  r   r  r  r  r  r  r  r  rF  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r$  r#  r  ri  ro  r  &raise_unbound_local_error_utility_code%raise_closure_name_error_utility_code+raise_unbound_memoryview_utility_code_nogilr{  r  r  tuple_unpacking_error_coderR   rP   rO   <module>r     sh  
 '   	'V 	'V 	'v 	'V 	'"	'06	'KQ	'$	'/5	'DJ	'Y_	' 	' %+	' 8>	' OU	'  		' -3		' >D		' PV		'
 #	'
 .4	'
 AG	'
 SY	' 	' '-	' 5;	' QW	' $*	' =C	' TZ	' %	' 28	' HN	' !++	' 
 
   M M 1    J J   U U U U    $  ( V V V V V $'& g&O A!JMJ$KM
 & 
   !8  W! : i	!
 :--.0g! :3346m! :../1h! :4457n!  h! k! ! %D! 1124r! 778F!  j!#r!!" |  M#!& z_'!( z))*,n)!* z//02t+!, z**+-o-!. z0013uz//02vz556L.0q%%|4I  ,/1r&&5IA! F"+*"4(6,D$<\'t \'~
X 
. ,>{ >.;  B8y 8Dy 
?y 
?D/i D/L+'	 +'\:U 	 U pn) nbF. F.R: /.~ /.d!A. !AH]
]~ ]
]~*H *:=* =*@F(8 F(R2J~ 2Jj' '@'N '<9x 9x> ..x .`E Ex 8]2H ]2@Y* Y*D> :> < <H&! H&VF>' F>Rl/ l^N- NbX .n 4+~ +\gX gTA/ A/F49 4nC3x C3LcAX cAL:( :8x2~ x2v_*X _*DX $5 5*'( '>W*h W*t'*( '*TV X V rmcH mcl08 0fA#8 A#HG6 G6T[=| [=|X2X X2v3! 3!l'!d '!R'"9 'D+'X +'\f  f R-!h -!`o x o d!,8 !,H+< +<\,f ,4*/ 4*n/*8 /*d!*8 !*H'*8_ '*T,H ,47H 74eCh eCP	
 
FX FR6H 6<>x >0h	 h"M M;" ;@*j *>cCH cCL)} )X,0 , ,, ,&M :'n '(	 	 $N (( ==				  Qx Qh/h /D)H )&#X #</ /& 
/i /*EY E$k.=I .=d 

 
P98 P9f %	84	FI]h ]~	 	/)Z /)dJ 8E/ E/N4 4LooO!!(++! 	(++! 	(++	!
 	(++! ! 	(,,! hoo! ! ! 		! 	(

! 	(//! ! !  !!" 	(,,#!$ //			
!)/! 4@* @*F 6
M9 M`0< 0/@l /@d
$l 
$l 6@, @m(l m(` $

 7     [@g [@|8@l 8@vC4H C4Lm"( m"`r8 rl 





 Pf Pd
O(Xw O(d[(dG [(~  &	.a8 a4| 2,| ,"U*\ U*pZ"L Z"zF* F*R%*- %*P&L< &LR1F, 1Fh, 0%K| %KN2" 2"h: :z	89 	8H &'x '< &1		& #* *5		* & )4		) % /:	
 33/5 +& #:+"9"9:VXj"k #:;#:#:;XZl#m  4[445GI[\ j  #JclO#JU  s$   q (q qq	q'&q'