ó
\K]c           @` s  d  d l  m Z m Z m Z d  d l Z d  d l m Z m Z m Z d d l	 m
 Z
 m Z m Z m Z m Z d   Z d   Z d   Z e e j e j e j  e  e e j e j e j  e  e e j e j e j  e  e e j  d	    Z e e j  d
    Z e
 e j e j  d    Z e
 e j e j  d    Z e
 e j e j  e
 e j e j  d     Z d S(   i    (   t   print_functiont   absolute_importt   divisionN(   t   typest   cgutilst   typingi   (   t
   lower_castt   lower_builtint   lower_getattr_generict   impl_ret_untrackedt   lower_setattr_genericc         C` s   t  j S(   N(   R   t   true_bit(   t   contextt   buildert   sigt   args(    (    s5   lib/python2.7/site-packages/numba/targets/optional.pyt   always_return_true_impl   s    c         C` s   t  j S(   N(   R   t	   false_bit(   R   R   R   R   (    (    s5   lib/python2.7/site-packages/numba/targets/optional.pyt   always_return_false_impl   s    c         C` s   | j  \ } } | \ } } | t j k rG | | } } | | } } n  | } | }	 |  j | | |	  }
 | j t j | |
 j   } t |  | | j	 |  S(   s/   
    Check if an Optional value is invalid
    (
   R   R   t   nonet   make_helpert   not_R   t   as_bool_bitt   validR	   t   return_type(   R   R   R   R   t   ltyt   rtyt   lvalt   rvalt   opt_typet   opt_valt   optt   res(    (    s5   lib/python2.7/site-packages/numba/targets/optional.pyt   optional_is_none   s    c         C` sI   | j  } |  j | | | |  } |  j | |  } | |  | | | |  S(   s?   
    Optional.__getattr__ => redirect to the wrapped type.
    (   t   typet   castt   get_getattr(   R   R   t   typt   valuet   attrt
   inner_typet   valt   imp(    (    s5   lib/python2.7/site-packages/numba/targets/optional.pyt   optional_getattr/   s    	c         C` sy   | j  \ } } | \ } } | j }	 |  j | | | |	  } t j | j |	 |  }
 |  j | |
  } | | | | f  S(   s?   
    Optional.__setattr__ => redirect to the wrapped type.
    (   R   R"   R#   R   t	   signatureR   t   get_setattr(   R   R   R   R   R'   t   basetyt   valtyt   targetR)   t   target_typet   newsigR*   (    (    s5   lib/python2.7/site-packages/numba/targets/optional.pyt   optional_setattr:   s    	c   
      C` sŐ   |  j  | | d | } t j | | j  } |  j  | |  } | j |  { \ } }	 | 5 t j | _ |  j | | j | j | j  | _ Wd QX|	 ) t j	 | _ t j
 | j j  | _ Wd QXWd QX| j   S(   sŤ  
    The handling of optional->optional cast must be special cased for
    correct propagation of None value.  Given type T and U. casting of
    T? to U? (? denotes optional) should always succeed.   If the from-value
    is None, the None value the casted value (U?) should be None; otherwise,
    the from-value is casted to U. This is different from casting T? to U,
    which requires the from-value must not be None.
    R&   N(   R   R   R   R   t   if_elseR   R#   t   dataR"   R   t   get_null_valuet	   _getvalue(
   R   R   t   fromtyt   totyR)   t   optvalt   validbitt	   outoptvalt   is_validt   is_not_valid(    (    s5   lib/python2.7/site-packages/numba/targets/optional.pyt   optional_to_optionalI   s    
c         C` sW   | t  j k r" |  j | | j  S|  j | | | | j  } |  j | | j |  Sd  S(   N(   R   R   t   make_optional_noneR"   R#   t   make_optional_value(   R   R   R8   R9   R)   (    (    s5   lib/python2.7/site-packages/numba/targets/optional.pyt   any_to_optionalh   s    c         C` s   |  j  | | d | } t j | | j  } | j | j |  d t . d | j f } |  j j	 | t
 | f  Wd  QX|  j | | j | j |  S(   NR&   t   likelys   expected %s, got None(   R   R   R   R   t   if_thenR   t   FalseR"   t	   call_convt   return_user_exct	   TypeErrorR#   R5   (   R   R   R8   R9   R)   R:   R;   t   msg(    (    s5   lib/python2.7/site-packages/numba/targets/optional.pyt   optional_to_anyq   s    (   t
   __future__R    R   R   t   operatort   numbaR   R   R   t   imputilsR   R   R   R	   R
   R   R   R!   t   is_R   t   OptionalR+   R3   R?   t   AnyRB   t   BooleanRJ   (    (    (    s5   lib/python2.7/site-packages/numba/targets/optional.pyt   <module>   s   (				