ó
\K]c           @   sL   d  d l  m Z d d l m Z m Z e d ƒ d e f d „  ƒ  Yƒ Z d S(   iÿÿÿÿ(   t   iri   (   t   register_rewritet   Rewrites   before-inferencet   RewriteConstRaisesc           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s?  
    Rewrite IR statements of the kind `raise(value)`
    where `value` is the result of instantiating an exception with
    constant arguments
    into `static_raise(exception_type, constant args)`.

    This allows lowering in nopython mode, where one can't instantiate
    exception instances from runtime data.
    c         C   s   t  | t ƒ o t | t ƒ S(   N(   t
   isinstancet   typet
   issubclasst	   Exception(   t   selft   const(    (    s:   lib/python2.7/site-packages/numba/rewrites/static_raise.pyt   _is_exception_type   s    c         C   s„   t  | t ƒ rT |  j | d ƒ s< t d | d f ƒ ‚ n  | d t | d ƒ f S|  j | ƒ rm | d f St d | f ƒ ‚ d S(   s0   
        Break down constant exception.
        i    s!   unsupported exception constant %ri   N(   R   t   tupleR
   t   NotImplementedErrort   None(   R   R	   (    (    s:   lib/python2.7/site-packages/numba/rewrites/static_raise.pyt   _break_constant   s    
c   
      C   s˜   i  |  _  } | |  _ xo | j t j ƒ D][ } | j d  k rM d \ } } n' | j | j ƒ }	 |  j |	 ƒ \ } } | | f | | <q) Wt	 | ƒ d k S(   Ni    (   NN(
   t   raisest   blockt
   find_instsR    t   Raiset	   exceptionR   t   infer_constantR   t   len(
   R   t   func_irR   t   typemapt	   calltypesR   t   instt   exc_typet   exc_argsR	   (    (    s:   lib/python2.7/site-packages/numba/rewrites/static_raise.pyt   match#   s    	c         C   s‹   |  j  j ƒ  } | j ƒ  xk |  j  j D]] } | |  j k rv |  j | \ } } t j | | | j ƒ } | j | ƒ q& | j | ƒ q& W| S(   sC   
        Rewrite all matching setitems as static_setitems.
        (	   R   t   copyt   cleart   bodyR   R    t   StaticRaiset   loct   append(   R   t	   new_blockR   R   R   t   new_inst(    (    s:   lib/python2.7/site-packages/numba/rewrites/static_raise.pyt   apply4   s    
(   t   __name__t
   __module__t   __doc__R
   R   R   R%   (    (    (    s:   lib/python2.7/site-packages/numba/rewrites/static_raise.pyR      s
   
			N(   t   numbaR    t    R   R   R   (    (    (    s:   lib/python2.7/site-packages/numba/rewrites/static_raise.pyt   <module>   s   