ó
\K]c           @   sn  d  Z  d d l m Z d d l j j Z d d l Z d d l m	 Z	 m
 Z
 m Z m Z m Z m Z m Z m Z d d l m Z m Z m Z d d l m Z e	 e j e j e j ƒ ƒ d	 „  ƒ Z e	 e j e j e j ƒ d
 „  ƒ Z d „  Z e	 e j e j e j ƒ d „  ƒ Z  e	 e j! e j e j ƒ d „  ƒ Z" e	 e j# e j e j ƒ d „  ƒ Z$ e	 e j% e j e j ƒ d „  ƒ Z& e	 e j' e j e j ƒ d „  ƒ Z( e	 e j) e j e j ƒ d „  ƒ Z* e
 e j+ ƒ d „  ƒ Z, e e j- ƒ e e j. ƒ d „  ƒ ƒ Z/ e e j0 ƒ e e j1 ƒ d „  ƒ ƒ Z/ e	 d e j- ƒ e	 d e j. ƒ d „  ƒ ƒ Z2 e	 d e j3 ƒ e e j4 ƒ d „  ƒ ƒ Z5 e	 e j6 e j- e j7 ƒ e	 e j6 e j- e j8 ƒ e	 e j6 e j. e j7 ƒ e	 e j6 e j. e j8 ƒ d „  ƒ ƒ ƒ ƒ Z9 e	 d e j e j: ƒ e	 d e j e j; ƒ d „  ƒ ƒ Z< e e j e j ƒ d „  ƒ Z= e e j d ƒ d „  ƒ Z> d S(   s!   
Implementation of tuple objects
iÿÿÿÿ(   t   irNi   (   t   lower_builtint   lower_getattr_generict
   lower_castt   lower_constantt   iternext_implt   impl_ret_borrowedt   impl_ret_untrackedt   RefTypei   (   t   typingt   typest   cgutils(   t   overload_methodc   	      C   sŠ   g  } xM t  | ƒ D]? \ } } |  j | | | j | | j | ƒ } | j | ƒ q W|  j | | j t | ƒ ƒ } t |  | | j | ƒ S(   N(   t	   enumeratet   castt   argst   return_typet   appendt
   make_tuplet   tupleR   (	   t   contextt   buildert   sigR   t   newargst   it   argt   castedt   res(    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt   namedtuple_constructor   s    &c         C   s]   g  | D] } t  j | | ƒ ^ q \ } } |  j | | j | | ƒ } t |  | | j | ƒ S(   N(   R   t   unpack_tupleR   R   R   (   R   R   R   R   t   xt   leftt   rightR   (    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt	   tuple_add   s    +c         C   s€  | j  \ } } | \ } } t j | t j ƒ }	 | j d ƒ }
 xÑ t t | j | j ƒ ƒ D]´ \ } \ } } | j | | ƒ } | j | | ƒ } |  j	 | t
 j | | f | | f ƒ } | j | ƒ F |  j	 | | | | f | | f ƒ } | j | |	 ƒ | j |
 ƒ Wd  QXq[ W| t | j ƒ t | j ƒ ƒ } |  j t j | ƒ } | j | |	 ƒ | j |
 ƒ | j |
 ƒ | j |	 ƒ S(   Nt   cmp_end(   R   R   t   alloca_once_valuet   true_bitt   append_basic_blockR   t   zipR
   t   extract_valuet   generic_comparet   operatort   net   if_thent   storet   brancht   lent   get_constantt   booleant   position_at_endt   load(   R   R   t   opR   R   t   tut   tvt   ut   vR   t   bbendR   t   tat   tbt   at   bt	   not_equalt   predt   len_compare(    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt   tuple_cmp_ordered&   s$    .'$!c         C   s  | j  \ } } | \ } } t | j ƒ t | j ƒ k rd |  j t j t ƒ } t |  | | j | ƒ S|  j t j t ƒ } xŒ t	 t
 | j | j ƒ ƒ D]o \ }	 \ }
 } | j | |	 ƒ } | j | |	 ƒ } |  j | t j |
 | f | | f ƒ } | j | | ƒ } q• Wt |  | | j | ƒ S(   N(   R   R.   R
   R/   R0   t   FalseR   R   t   TrueR   R&   R'   R(   R)   t   eqt   and_(   R   R   R   R   R4   R5   R6   R7   R   R   R9   R:   R;   R<   R>   (    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt   tuple_eq;   s    .'c         C   s4   | j  t |  | | | ƒ ƒ } t |  | | j | ƒ S(   N(   t   not_RE   R   R   (   R   R   R   R   R   (    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt   tuple_neJ   s    c         C   s1   t  |  | t j | | ƒ } t |  | | j | ƒ S(   N(   R@   R)   t   ltR   R   (   R   R   R   R   R   (    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt   tuple_ltO   s    c         C   s1   t  |  | t j | | ƒ } t |  | | j | ƒ S(   N(   R@   R)   t   leR   R   (   R   R   R   R   R   (    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt   tuple_leT   s    c         C   s1   t  |  | t j | | ƒ } t |  | | j | ƒ S(   N(   R@   R)   t   gtR   R   (   R   R   R   R   R   (    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt   tuple_gtY   s    c         C   s1   t  |  | t j | | ƒ } t |  | | j | ƒ S(   N(   R@   R)   t   geR   R   (   R   R   R   R   R   (    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt   tuple_ge^   s    c         C   s;   | j  j | ƒ } | j | | ƒ } t |  | | | | ƒ S(   s%   
    Fetch a namedtuple's field.
    (   t   fieldst   indexR'   R   (   R   R   t   typt   valuet   attrRQ   R   (    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt   namedtuple_getattre   s    c         C   sJ   g  | D] } |  j  | | j | ƒ ^ q } t |  | | t j | | ƒ ƒ S(   s.   
    Create a homogeneous tuple constant.
    (   t   get_constant_generict   dtypeR   R   t
   pack_array(   R   R   t   tyt   pyvalR7   t   consts(    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt   unituple_constanto   s    (c         C   sZ   g  t  | ƒ D]( \ } } |  j | | j | | ƒ ^ q } t |  | | t j | | ƒ ƒ S(   s0   
    Create a heterogeneous tuple constant.
    (   R   RV   R
   R   R   t   pack_struct(   R   R   RY   RZ   R   R7   R[   (    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyR\   {   s    8t   getiterc   
      C   sž   | j  \ } | \ } |  j | t j | ƒ ƒ } |  j t j d ƒ } t j | | j ƒ } | j	 | | ƒ | | _
 | | _ | j ƒ  }	 t |  | | j |	 ƒ S(   Ni    (   R   t   make_helperR
   t   UniTupleIterR/   t   intpR   t   alloca_oncet   typeR,   RQ   R   t	   _getvalueR   R   (
   R   R   R   R   t   tuptyt   tupt   itervalt   index0t   indexptrR   (    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt   getiter_unituple‹   s    			t   iternextc      
   C   sM  | j  \ } | \ } |  j | | d | ƒ} | j } | j }	 | j |	 ƒ }
 |  j t j | j j	 ƒ } | j
 t j |
 | ƒ } | j | ƒ | j | ƒ ª t j | j j | j t j ƒ } t |  | | | |
 g ƒ } |  j r|  j j | | j j | ƒ n  | j | ƒ | j |
 |  j t j d ƒ ƒ } | j | | j ƒ Wd  QXd  S(   NRS   i   (   R   R_   R   RQ   R2   R/   R
   Ra   t	   containert   countt   icmpt   lct   ICMP_SLTt	   set_validR+   R	   t	   signatureRW   t   getitem_unituplet
   enable_nrtt   nrtt   decreft   yield_t   addR,   (   R   R   R   R   t   resultt	   tupitertyt   tupiterRg   Rf   t   idxptrt   idxRm   t   is_validt   getitem_sigt   getitem_outt   nidx(    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt   iternext_unituplež   s(    				!c      
   C   s&  | j  \ } } | \ } } d } t | ƒ d k rŠ | j t j ƒ  |  j j | t | ƒ Wd  QX|  j | j	 ƒ }	 t
 |  | | j	 |	 ƒ S| j d ƒ }
 | j d ƒ } | j | |
 ƒ } | j |
 ƒ  |  j j | t | ƒ Wd  QX|  j | j ƒ } | j | ƒ  | j | ƒ } Wd  QXxÁ t | j ƒ D]° } |  j t j | ƒ } | j d | ƒ } | j | | ƒ |  j t j | j | ƒ } | j | | ƒ | j | ƒ 4 | j | | ƒ } | j | ƒ | j | | ƒ Wd  QXq-W| j | ƒ | }	 | j	 | j k st ‚ t |  | | j	 |	 ƒ Sd  S(   Ns   tuple index out of rangei    s   switch.elses
   switch.ends	   switch.%d(   s   tuple index out of range(   R   R.   R+   R   R$   t	   call_convt   return_user_exct
   IndexErrort   get_constant_nullR   R   R%   t   switcht
   goto_blockt   get_value_typeRW   t   phit   rangeRm   R/   R
   Ra   t   add_caseR'   R-   t   add_incomingR1   t   AssertionErrorR   (   R   R   R   R   Re   t   _Rf   R}   t
   errmsg_oobR   t   bbelseR8   R‡   t   lrttyt   phinodeR   t   kit   bbit   kinRS   (    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyRs   ½   sB    	t   static_getitemc   
      C   s  | j  \ } } | \ } } t | t ƒ r™ | d k  rI | t | ƒ 7} n  d | k of t | ƒ k  n s„ t d | | f ƒ ‚ n  | j | | ƒ } n] t | t ƒ rÙ t j | | ƒ | }	 |  j	 | | j
 |	 ƒ } n t d | | j  d f ƒ ‚ t |  | | j
 | ƒ S(   Ni    s   cannot index at %d in %ss   unexpected index %r for %s(   R   t
   isinstancet   intR.   R…   R'   t   sliceR   R   R   R   t   NotImplementedErrorR   (
   R   R   R   R   Re   R   Rf   R}   R   t   items(    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt   static_getitem_tupleô   s    "c   
      C   s¼   t  | t j ƒ s$ t  | t j ƒ r- t ‚ n  t | ƒ t | ƒ k rN t ‚ n  t j | | t | ƒ ƒ } g  t | | | ƒ D]' \ } } } |  j | | | | ƒ ^ q| }	 |  j	 | | |	 ƒ S(   N(
   R˜   R
   t   BaseNamedTupleR›   R.   R   R   R&   R   R   (
   R   R   t   fromtyt   totyt   valt   olditemsR7   t   ft   tRœ   (    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt   tuple_to_tuple  s    		=RQ   c         C   s   d „  } | S(   Nc         S   sA   x. t  t |  ƒ ƒ D] } |  | | k r | Sq Wt d ƒ ‚ d  S(   Ns   tuple.index(x): x not in tuple(   R‹   R.   t
   ValueError(   Rf   RS   R   (    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt   tuple_index_impl"  s    (    (   Rf   RS   R§   (    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt   tuple_index  s    	(?   t   __doc__t   llvmliteR    t   llvmlite.llvmpy.coret   llvmpyt   coreRo   R)   t   imputilsR   R   R   R   R   R   R   R   t    R	   R
   R   t	   extendingR   t   NamedTupleClasst   VarArgt   AnyR   Rx   t	   BaseTupleR!   R@   RC   RE   R*   RG   RH   RI   RJ   RK   RL   RM   RN   RO   Rž   RU   t   UniTuplet   NamedUniTupleR\   t   Tuplet
   NamedTupleRj   R`   t   BORROWEDR‚   t   getitemRa   t   uintpRs   t   IntegerLiteralt   SliceLiteralR   R¥   R¨   (    (    (    s5   lib/python2.7/site-packages/numba/targets/tupleobj.pyt   <module>   s@   :'$	$$$$$$
-4$