
۳Y]c           @   s%  d  d l  Z  d  d l Z d  d l m Z m Z d  d l m Z m Z m	 Z	 m
 Z
 m Z m Z m Z m Z m Z d  d l m Z m Z d  d l m Z d  d l m Z d  d l m Z d  d l m Z m Z m Z m Z d  d	 l m Z d  d
 l m Z e e j   d e j! f d     Y Z" e	 e j  d d  e	 e j  d d  e	 e j  d d  d   Z# e e j$ e j%  d    Z& e e j%  d    Z' e
 e j   d    Z( e e j   d    Z) d   Z* e d    Z+ e d    Z, e d    Z- e d    Z. e d    Z/ e d e0  d    Z1 d    Z2 e d!    Z3 e d"    Z4 e d#    Z5 e d$    Z6 e d%    Z7 e d&    Z8 e d'    Z9 e d(    Z: e e;  d)    Z< e e  j=  d*    Z> e e  j?  d+    Z@ e e  jA  d,    ZB e e  jC  d-    ZD e e  jE  d.    ZF e e  jG  d/    ZH e e  jI  d0    ZJ e e j  d1  d2    ZK e e j  d3  d4    ZL e e j  d5  d6    ZM e eN d7   ZO e d8    ZP e d9    ZQ e e  jR  d:    ZS e e  jT  d;    ZU d S(<   iN(   t   IntTypet   Constant(	   t   modelst   register_modelt   make_attribute_wrappert   unboxt   boxt   NativeValuet   overloadt   overload_methodt	   intrinsic(   t   lower_constantt
   lower_cast(   t   cgutils(   t   types(   t   njit(   t   PY_UNICODE_1BYTE_KINDt   PY_UNICODE_2BYTE_KINDt   PY_UNICODE_4BYTE_KINDt   PY_UNICODE_WCHAR_KIND(   t   slicing(   t	   c_helperst   UnicodeModelc           B   s   e  Z d    Z RS(   c         C   sh   d t  j f d t  j f d t  j f d t  j t  j  f d t  j f g } t j j |  | | |  d  S(   Nt   datat   lengtht   kindt   meminfot   parent(	   R   t   voidptrt   intpt   int32t   MemInfoPointert   pyobjectR   t   StructModelt   __init__(   t   selft   dmmt   fe_typet   members(    (    s,   lib/python2.7/site-packages/numba/unicode.pyR"   #   s    (   t   __name__t
   __module__R"   (    (    (    s,   lib/python2.7/site-packages/numba/unicode.pyR   !   s   R   t   _dataR   t   _lengthR   t   _kindc         C   s  d d l  m } m } m } m } m } m } m } m } m	 }	 t
 d }
 | | | | |  | |   } | |
  } |   } |   } | |  | |  | |   } | d k r t d   n  | j } | j } | d t |  } |	 | j |  } t |  | | f S(   st   Get string data from a python string for use at compile-time to embed
    the string data into the LLVM module.
    i(	   t	   CFUNCTYPEt   c_void_pt   c_intt	   py_objectt	   c_ssize_tt   POINTERt   byreft   castt   c_ubytet   extract_unicodes1   cannot extract unicode data from the given stringi   N(   t   ctypesR,   R-   R.   R/   R0   R1   R2   R3   R4   R   t   Nonet
   ValueErrort   valuet   _kind_to_byte_widtht   from_addresst   bytes(   t   objR,   R-   R.   R/   R0   R1   R2   R3   R4   t   extract_unicode_fnt   protot   fnR   R   R   t   nbytest   out(    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   compile_time_get_string_data7   s    @
!				c         C   s   | j  } t |  \ } } } | j }	 |  j |	 |  }
 t j |  |  |  } |
 | _ | j j |  | _ | j	 j |  | _	 | j
   S(   N(   t   literal_valueRC   t   modulet   insert_const_bytesR   t   create_struct_proxyR   R   t   typeR   t	   _getvalue(   t   contextt   buildert   fromtyt   totyt   valt   literal_stringt	   databytesR   R   t   modt   gvt   uni_str(    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   cast_from_literalO   s    			c         C   s"   t  j |  |  |  } | j   S(   N(   R   RG   RI   (   RJ   RK   t   typt   pyvalRS   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   constant_unicode_   s    c   	      C   s   | j  j |  \ } } } } t j |   | j | j  } | | _ | | _ | | _ | j  j	 | |  | _
 | | _ t j | j | j  j    } t | j   d | S(   sE   
    Convert a unicode str object to a native unicode structure.
    t   is_error(   t   pyapit   string_as_string_size_and_kindR   RG   RJ   RK   R   R   R   t   nrt_meminfo_new_from_pyobjectR   R   t   is_not_nullt   err_occurredR   RI   (	   RU   R=   t   ct   okR   R   R   RS   RX   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   unbox_unicode_strj   s    					c         C   se   t  j |   | j | j d | } | j j | j | j | j  } | j j	 j
 | j |  |  | S(   s@   
    Convert a native unicode structure to a unicode string
    R9   (   R   RG   RJ   RK   RY   t   string_from_kind_and_dataR   R   R   t   nrtt   decref(   RU   RN   R^   RS   t   res(    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   box_unicode_str~   s    $!c            s     f d   } | S(   Nc            s^   | \ } } | j  | t    j    } | j | j | | g   } | j | t d   S(   Ni    (   t   bitcastR    t
   as_pointert   loadt   gept   zext(   RJ   RK   t	   signaturet   argsR   t   idxt   ptrt   ch(   t   bitsize(    s,   lib/python2.7/site-packages/numba/unicode.pyt   codegen   s    (    (   Rp   Rq   (    (   Rp   s,   lib/python2.7/site-packages/numba/unicode.pyt   make_deref_codegen   s    c         C   s(   t  j t  j t  j  } | t d  f S(   Ni   (   R   t   uint32R   R   Rr   (   t	   typingctxR   t   offsett   sig(    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   deref_uint8   s    c         C   s(   t  j t  j t  j  } | t d  f S(   Ni   (   R   Rs   R   R   Rr   (   Rt   R   Ru   Rv   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   deref_uint16   s    c         C   s(   t  j t  j t  j  } | t d  f S(   Ni    (   R   Rs   R   R   Rr   (   Rt   R   Ru   Rv   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   deref_uint32   s    c         C   s1   d   } t  j t  j t  j t  j  } | | f S(   s   make empty string with data buffer of size alloc_bytes.

    Must set length and kind values for string after it is returned
    c   
      S   s   | \ } } } t  j t j  } | |  |  } | j | | j | t | j d    }	 |  j j	 | |	  | _
 | | _ | | _ |  j j | | j
  | _ t  j | j j  | _ | j   S(   Ni   (   R   RG   R   t   unicode_typet   mult   addR   RH   Rb   t   meminfo_allocR   R   R   t   meminfo_dataR   t   get_null_valueR   RI   (
   RJ   RK   Rk   Rl   t   kind_valt   char_bytes_valt
   length_valt   uni_str_ctorRS   t
   nbytes_val(    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   details   s    				(   R   Rz   R   R   (   Rt   R   t
   char_bytesR   R   Rv   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   _malloc_string   s    	c         C   s;   t  |   } t |  | |  } t | | t j d   | S(   Ni    (   R:   R   t   _set_code_pointt   npRs   (   R   R   t
   char_widtht   s(    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   _empty_string   s    t   _nrtc         C   se   |  j  t k r t |  j |  S|  j  t k r> t |  j |  S|  j  t k r] t |  j |  Sd Sd  S(   Ni    (   R+   R   Rw   R)   R   Rx   R   Ry   (   t   at   i(    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   _get_code_point   s    c            s     f d   } | S(   Nc            s}   | \ } } }   d k  r6 | j  | t     } n  | j | t    j    } | j | | j | | g   |  j   S(   Ni    (   t   truncR    Rf   Rg   t   storeRi   t   get_dummy_value(   RJ   RK   Rk   Rl   R   Rm   Ro   Rn   (   Rp   (    s,   lib/python2.7/site-packages/numba/unicode.pyRq      s    (    (   Rp   Rq   (    (   Rp   s,   lib/python2.7/site-packages/numba/unicode.pyt   make_set_codegen   s    c         C   s.   t  j t  j t  j t  j  } | t d  f S(   Ni   (   R   t   voidR   t   int64Rs   R   (   Rt   R   Rm   Ro   Rv   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt	   set_uint8   s    c         C   s.   t  j t  j t  j t  j  } | t d  f S(   Ni   (   R   R   R   R   Rs   R   (   Rt   R   Rm   Ro   Rv   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt
   set_uint16   s    c         C   s.   t  j t  j t  j t  j  } | t d  f S(   Ni    (   R   R   R   R   Rs   R   (   Rt   R   Rm   Ro   Rv   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt
   set_uint32   s    c         C   s   |  j  t k r% t |  j | |  nV |  j  t k rJ t |  j | |  n1 |  j  t k ro t |  j | |  n t d   d  S(   Ns4   Unexpected unicode representation in _set_code_point(	   R+   R   R   R)   R   R   R   R   t   AssertionError(   R   R   Ro   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyR      s    c         C   sz   |  t  k s | t  k r' t d   n  |  t k r7 | S|  t k rZ | t k rS | S|  Sn |  t k rj |  St d   d  S(   Ns!   PY_UNICODE_WCHAR_KIND unsupporteds/   Unexpected unicode representation in _pick_kind(   R   R   R   R   R   (   t   kind1t   kind2(    (    s,   lib/python2.7/site-packages/numba/unicode.pyt
   _pick_kind  s    c         C   s[   |  t  k r d S|  t k r  d S|  t k r0 d S|  t k rK t d   n t d   d  S(   Ni   i   i   s!   PY_UNICODE_WCHAR_KIND unsupporteds'   Unexpected unicode encoding encountered(   R   R   R   R   R   (   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyR:     s    c         C   s   | d k r d S| | |  j  k r' d S| | | j  k r> d SxZ t |  D]L } t |  | |  } t | | |  } | | k  r d S| | k rK d SqK Wd S(   Ni    ii   (   R*   t   rangeR   (   R   t   a_offsett   bt   b_offsett   nR   t   a_chrt   b_chr(    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   _cmp_region,  s    c         C   sW   xP t  t |  t |   d  D]. } t | | |  d t |    d k r! | Sq! Wd S(   Ni   i    i(   R   t   lenR   (   t   substrR   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   _find@  s    '$c         C   s#   t  |  t j  r d   } | Sd  S(   Nc         S   s   |  j  S(   N(   R*   (   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   len_implN  s    (   t
   isinstanceR   t   UnicodeType(   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   unicode_lenK  s    	c         C   s5   t  |  t j  r1 t  | t j  r1 d   } | Sd  S(   Nc         S   s>   t  |   t  |  k r t St |  d | d t  |    d k S(   Ni    (   R   t   FalseR   (   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   eq_implV  s    (   R   R   R   (   R   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt
   unicode_eqS  s    $	c         C   s5   t  |  t j  r1 t  | t j  r1 d   } | Sd  S(   Nc         S   s   |  | k S(   N(    (   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   ne_impl`  s    (   R   R   R   (   R   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt
   unicode_ne]  s    $	c         C   s5   t  |  t j  r1 t  | t j  r1 d   } | Sd  S(   Nc         S   si   t  t |   t |   } t |  d | d |  } | d k rC t S| d k re t |   t |  k  St S(   Ni    i(   t   minR   R   t   TrueR   (   R   R   t   minlent   eqcode(    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   lt_implh  s    (   R   R   R   (   R   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt
   unicode_lte  s    $	c         C   s5   t  |  t j  r1 t  | t j  r1 d   } | Sd  S(   Nc         S   si   t  t |   t |   } t |  d | d |  } | d k rC t S| d k re t |   t |  k St S(   Ni    i   (   R   R   R   R   R   (   R   R   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   gt_implv  s    (   R   R   R   (   R   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt
   unicode_gts  s    $	c         C   s5   t  |  t j  r1 t  | t j  r1 d   } | Sd  S(   Nc         S   s   |  | k S(   N(    (   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   le_impl  s    (   R   R   R   (   R   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt
   unicode_le  s    $	c         C   s5   t  |  t j  r1 t  | t j  r1 d   } | Sd  S(   Nc         S   s   |  | k  S(   N(    (   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   ge_impl  s    (   R   R   R   (   R   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt
   unicode_ge  s    $	c         C   s5   t  |  t j  r1 t  | t j  r1 d   } | Sd  S(   Nc         S   s   t  d | d |   d k S(   NR   R   i(   R   (   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   contains_impl  s    (   R   R   R   (   R   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   unicode_contains  s    $	t   findc         C   s#   t  | t j  r d   } | Sd  S(   Nc         S   s   t  d | d |   S(   NR   R   (   R   (   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt	   find_impl  s    (   R   R   R   (   R   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   unicode_find  s    	t
   startswithc         C   s#   t  | t j  r d   } | Sd  S(   Nc         S   s"   t  |  d | d t |   d k S(   Ni    (   R   R   (   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   startswith_impl  s    (   R   R   R   (   R   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   unicode_startswith  s    	t   endswithc         C   s#   t  | t j  r d   } | Sd  S(   Nc         S   sH   t  |   t  |  } | d k  r& t St |  | | d t  |   d k S(   Ni    (   R   R   R   (   R   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   endswith_impl  s    (   R   R   R   (   R   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   unicode_endswith  s    	c         C   sa   |  d k r | r d S| Sn |  d k  r6 |  | 7}  n  |  d k  sN |  | k r] t d   n  |  S(   s%  
    Parameters
    ----------
    idx : int or None
        the index
    length : int
        the string length
    is_start : bool; optional with defaults to True
        Is it the *start* or the *stop* of the slice?

    Returns
    -------
    norm_idx : int
        normalized index
    i    s   string index out of rangeN(   R7   t
   IndexError(   Rm   R   t   is_start(    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   normalize_str_idx  s    c         C   s"   | | |  } d   } | | f S(   s   Fix slice object.
    c   	      S   sc   | j  \ } } | \ } } |  j | | |  } t j |  | | |  t j | | |  | j   S(   N(   Rl   t   make_helperR   t   guard_invalid_slicet	   fix_sliceRI   (	   RJ   RK   Rv   Rl   t	   slicetypet
   lengthtypet   sliceobjR   t   slice(    (    s,   lib/python2.7/site-packages/numba/unicode.pyRq     s    (    (   Rt   R   R   Rv   Rq   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   _normalize_slice  s    	c         C   s"   t  j |  } d   } | | f S(   s2   Compute the span from the given slice object.
    c         S   s@   | j  \ } | \ } |  j | | |  } t j | |  } | S(   N(   Rl   R   R   t   get_slice_length(   RJ   RK   Rv   Rl   R   R   R   t   result_size(    (    s,   lib/python2.7/site-packages/numba/unicode.pyRq     s
    	(   R   R   (   Rt   R   Rv   Rq   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   _slice_span  s    	c         C   sW   t  |  t j  rS t  | t j  r1 d   } | St  | t j  rS d   } | Sn  d  S(   Nc         S   sD   t  | t |    } t |  j d  } t | d t |  |   | S(   Ni   i    (   R   R   R   R+   R   R   (   R   Rm   t   ret(    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   getitem_char  s    c         S   s}   t  | t |    } t |  } t |  j |  } | j } x: t |  D], } t | | t |  |   | | j	 7} qI W| S(   N(
   R   R   R   R   R+   t   startR   R   R   t   step(   R   t	   slice_idxt   spanR   t   curR   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   getitem_slice  s    	(   R   R   R   t   Integert	   SliceType(   R   Rm   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   unicode_getitem  s    			c         C   s5   t  |  t j  r1 t  | t j  r1 d   } | Sd  S(   Nc         S   s   |  j  | j  } t |  j | j  } t | |  } x3 t t |    D] } t | | t |  |   qG Wx= t t |   D]) } t | t |   | t | |   q} W| S(   N(   R*   R   R+   R   R   R   R   R   (   R   R   t
   new_lengtht   new_kindt   resultR   t   j(    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   concat_impl  s    '(   R   R   R   (   R   R   R   (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   unicode_concat  s    $		(V   t   operatort   numpyR   t   llvmlite.irR    R   t   numba.extendingR   R   R   R   R   R   R   R	   R
   t   numba.targets.imputilsR   R   t   numbaR   R   R   t   numba.pythonapiR   R   R   R   t   numba.targetsR   t   numba._helperlibR   R   R!   R   RC   t   StringLiteralRz   RT   RW   R`   Re   Rr   Rw   Rx   Ry   R   R   R   R   R   R   R   R   R   R   R:   R   R   R   R   t   eqR   t   neR   t   ltR   t   gtR   t   leR   t   geR   t   containsR   R   R   R   R   R   R   R   t   getitemR   R|   R   (    (    (    s,   lib/python2.7/site-packages/numba/unicode.pyt   <module>   sj   @"		
		
	