
\K]c           @@ s  d  d l  m Z m Z d  d l m Z d  d l Z d  d l Z d  d l Z d  d l	 m
 Z d  d l m Z d  d l m Z d  d l m Z d  d l m Z d  d	 l m Z m Z d  d
 l m Z d  d l m Z m Z m Z d  d l m Z m Z d d l m Z d e j f d     YZ  d e j f d     YZ! e j" e j# e   e j" e j$ e!  e j" e j% e j&  d   Z' d Z( d   Z) d e* f d     YZ+ d   Z, d   Z- d   Z. d   Z/ d e j0 f d     YZ1 d   Z2 d e3 f d      YZ4 e j5 d! e j6 f d"     Y Z7 e4 j8 j9 e j#  d#    Z: e4 j8 j; e j#  d$    Z< d%   Z= e4 j8 j> e j% e j? e j@   d&    ZA d S('   i    (   t   absolute_importt   print_function(   t   OrderedDictN(   t   ir(   t   types(   t
   cpu_target(   t   njit(   t	   templates(   t   default_managert   models(   t   imputils(   t   cgutilst   utilst   errors(   t   exec_t   Sequencei   (   t   _boxt   InstanceModelc           B@ s   e  Z d    Z RS(   c         C@ sr   t  j |  } t  j d t |   } d t  j |  f d t  j |  f g } t t |   j | | |  d  S(   Ns   Opaque.t   meminfot   data(	   R   t   ClassDataTypet   Opaquet   strt   MemInfoPointert   CPointert   superR   t   __init__(   t   selft   dmmt   fe_typt   cls_data_tyt   dtypet   members(    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR      s
    (   t   __name__t
   __module__R   (    (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR      s   t   InstanceDataModelc           B@ s   e  Z d    Z RS(   c         C@ s]   | j  } g  | j j   D] \ } } t |  | f ^ q } t t |   j | | |  d  S(   N(   t
   class_typet   structt   itemst   _mangle_attrR   R#   R   (   R   R   R   t   clstyt   kt   vR    (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR   )   s    	4(   R!   R"   R   (    (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR#   (   s   c         C@ s   d |  S(   sZ   
    Mangle attributes.
    The resulting name does not startswith an underscore '_'.
    t   m_(    (   t   name(    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR'   4   s    s3   
def ctor({args}):
    return __numba_cls_({args})
c         C@ su   |  j  } g  } x_ | j   D]Q \ } } | j | j @| j k rQ | j |  q d | j } t j |   q W| S(   sI   
    Returns list of positional and keyword argument names in order.
    s(   %s argument type unsupported in jitclass(   t
   parametersR&   t   kindt   POSITIONAL_OR_KEYWORDt   appendR   t   UnsupportedError(   t   fn_sigt   paramst   argsR)   R*   t   msg(    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyt   _getargsE   s    	t   JitClassTypec           B@ s2   e  Z d  Z d   Z d   Z d   Z d   Z RS(   s#   
    The type of any jitclass.
    c         C@ s   t  |  d k r! t d   n  | \ } t | t  rH t d   n  d | k s` t d   t j |  | | |  } | j   | S(   Ni   s    must have exactly one base classs   cannot subclass from a jitclassR$   s   missing "class_type" attr(   t   lent	   TypeErrort
   isinstanceR7   t   AssertionErrort   typet   __new__t	   _set_init(   t   clsR,   t   basest   dctt   baset   outcls(    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR=   X   s    	
c         C@ s   |  j  j j d } t j |  } t |  d } | |  _ t j d d j	 |   } i |  d 6} t
 | |  | d } t |  |  _ d S(   s   
        Generate a wrapper for calling the constructor from pure Python.
        Note the wrapper will only accept positional arguments.
        R   i   R4   s   , t   __numba_cls_t   ctorN(   R$   t   instance_typet   methodsR   t   pysignatureR6   t	   _ctor_sigt   _ctor_templatet   formatt   joinR   R   t   _ctor(   R?   t   initt   init_sigR4   t   ctor_sourcet   glblsRE   (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR>   c   s    	
c         C@ s)   t  | t j  r% | j j |  j k St S(   N(   R:   R   t   Boxt   _numba_type_R$   t   False(   R?   t   instance(    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyt   __instancecheck__t   s    c         O@ s<   |  j  j d  | |  } | j   |  j | j d | j   S(   Ni   (   RI   t   bindt   Nonet   apply_defaultsRM   R4   t   kwargs(   R?   R4   RZ   RW   (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyt   __call__y   s    
(   R!   R"   t   __doc__R=   R>   RV   R[   (    (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR7   T   s
   			c         C@ sn   xg |  j    D]Y \ } } t | t  s> t d | f   n  t | t j  s t d | f   q q Wd  S(   Ns#   spec keys should be strings, got %rs2   spec values should be Numba type instances, got %r(   R&   R:   R   R9   R   t   Type(   t   specR)   R*   (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyt   _validate_spec   s    c         C@ sd   t    } xT | j   D]F \ } } | j d  rR | j d  rR d |  | } n  | | | <q W| S(   sB   
    Apply the same changes to dunder names as CPython would.
    t   __t   _(   R   R&   t
   startswitht   endswith(   t   clsnameR^   t   outR)   R*   (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyt   _fix_up_private_attr   s    	c         C@ s,   t  | d d  } | r( |  j |  n  d S(   sC   
    Add the required libs for the callable to allow inlining.
    t   libsN(    (   t   getattrt   add_linking_libs(   t   contextt   callRg   (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyt   _add_linking_libs   s    c         @ s  t  | t  r t |  } n  t |  t |  j |  } i  } x- t t j |    D] } | j	 | j
  qV Wt d   | j   D    t d   | j   D   t    f d   | j   D  } t    t   Bt |  @} | rt d j d j |     n  | j d d  } t |  | rid }	 d j | j    }
 t |	 j |
    n  xA  j   D]3 \ } } | j d k	 rvt d	 j |    qvqvWi  } x*   j   D] \ } } t |  | | <qWi  } xh  j   D]Z \ } } i  } | j r$t | j  | d
 <n  | j rCt | j  | d <n  | | | <qW| |  t | | |  } t |  j |  f t d | d |   }  t j } | j |  |  t j } | |   | |  j    |  S(   s$  
    Internal function to create a jitclass.

    Args
    ----
    cls: the original class object (used as the prototype)
    spec: the structural specification contains the field types.
    class_ctor: the numba type to represent the jitclass
    builder: the internal jitclass builder
    c         s@ s3   |  ]) \ } } t  | t j  r | | f Vq d  S(   N(   R:   t   pytypest   FunctionType(   t   .0R)   R*   (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pys	   <genexpr>   s    	c         s@ s0   |  ]& \ } } t  | t  r | | f Vq d  S(   N(   R:   t   property(   Ro   R)   R*   (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pys	   <genexpr>   s    	c         3@ s9   |  ]/ \ } } |   k r |  k r | | f Vq d  S(   N(    (   Ro   R)   R*   (   RG   t   props(    s2   lib/python2.7/site-packages/numba/jitclass/base.pys	   <genexpr>   s    	s   name shadowing: {0}s   , R\   t    s(   class members are not yet supported: {0}s   deleter is not supported: {0}t   gett   setR$   N(!   R:   R   R   R_   Rf   R!   t   reversedt   inspectt   getmrot   updatet   __dict__t   dictR&   Rt   t	   NameErrorRK   RL   t   popt   _drop_ignored_attrst   keysR9   t   fdelRX   R   t   fgett   fsett   ConstructorTemplateR7   R   t   typing_contextt   insert_globalt   target_contextt   register(   R?   R^   t
   class_ctort   buildert   clsdctt   baseclst   otherst   shadowedt	   docstringR5   R    R)   R*   t
   jitmethodst   jitpropsRA   R$   t	   typingctxt	   targetctx(    (   RG   Rq   s2   lib/python2.7/site-packages/numba/jitclass/base.pyt   register_class_type   sT    
% !
					R   c           B@ s   e  Z d  Z d   Z RS(   s8   
    Base class for jitclass constructor templates.
    c   	      C@ sp   |  j  j } | j d } | j   f | } t j |  } | j |  j | |  } t j	 | | j
 d  } | S(   NR   i   (   t   keyRF   R   t   get_reference_typeR   t
   Dispatchert   get_call_typeRj   R   t	   signatureR4   (	   R   R4   t   kwsRF   RE   t	   boundargst	   disp_typet   sigRe   (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyt   generic   s    (   R!   R"   R\   R   (    (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR      s   c         C@ s   t  d d d g  } xm |  j   D]_ \ } } t | t j t j f  rY | j |  q" t | d d   t	 k r" | j |  q" q" Wx | D] } |  | =q Wd  S(   Nt   __weakref__R"   Ry   t   __objclass__(
   Rt   R&   R:   Rm   t   BuiltinFunctionTypet   BuiltinMethodTypet   addRh   RX   t   object(   RA   t   dropR)   R*   (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR}     s    t   ClassBuilderc           B@ sG   e  Z d  Z e j   Z e   Z d   Z d   Z	 d   Z
 d   Z RS(   s   
    A jitclass builder for a mutable jitclass.  This will register
    typing and implementation hooks to the given typing and target contexts.
    c         C@ s(   | |  _  | |  _ | |  _ | |  _ d  S(   N(   R$   RG   R   R   (   R   R$   RG   R   R   (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR     s    			c         C@ s0   |  j  |  j |  j j  |  j j |  j  d S(   s7   
        Register to the frontend and backend.
        N(   t   _register_methodst   class_impl_registryR$   RF   R   t   install_registry(   R   (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR      s    c         C@ sJ   xC | j  D]8 } | |  j k r
 |  j | |  |  j j |  q
 q
 Wd S(   sN   
        Register method implementations for the given instance type.
        N(   R   t   implemented_methodst   _implement_methodR   (   R   t   registryRF   t   meth(    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR   +  s    c         @ s~     f d     f d   }   j  d  } | d k rF | |  n4 | j t j   f t j t j t j       d  S(   Nc          @ s     f d   }  |  S(   Nc   	      @ sp   | j  d } | j   } t j |  } |  j | |  } | | |  } t |  |  t j |  | | j |  S(   Ni    (	   R4   R   R   R   t   get_functionRl   R
   t   impl_ret_new_reft   return_type(	   Rj   R   R   R4   RF   t   methodR   Rk   Re   (   t   attr(    s2   lib/python2.7/site-packages/numba/jitclass/base.pyt   imp;  s    (    (   R   (   R   (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyt   get_imp:  s    	c         @ s   d |    t  t |   } t j |  d t j f   f d     Y } t j t j   f t j t j	 t j
       t j | t j t j	 t j
       d  S(   Ns   __%s__t
   GetSetItemc           @ s   e  Z   f d    Z RS(   c         @ sg   | d } t  | t j  rc   | j k rc | j   } t j |  } | j |  j | |  } | Sd  S(   Ni    (   R:   R   t   ClassInstanceTypeR   R   R   Rj   (   R   R4   R   RU   R   R   R   (   t   _dunder_meth(    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR   L  s    
(   R!   R"   R   (    (   R   (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR   J  s   (   Rh   t   operatorR   t   infer_globalt   AbstractTemplateR
   t   lower_builtinR   R   t   VarArgt   Any(   t   getsett   opR   (   R   (   R   s2   lib/python2.7/site-packages/numba/jitclass/base.pyt   _getsetitem_genF  s    
	Ra   t   getitemt   setitem(   R   R   (   t   stript   lowerR   R   R   R   (   R   R   R   R   t   dunder_stripped(    (   R   R   s2   lib/python2.7/site-packages/numba/jitclass/base.pyR   8  s    (   R!   R"   R\   R
   t   RegistryR   Rt   R   R   R   R   R   (    (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR     s   				t   ClassAttributec           B@ s   e  Z e j Z d    Z RS(   c         @ s      j  k r  j    S   j k r}  j   } t j |   d t j f      f d     Y} t j |   S   j k r  j   } | d } t j |    j  j	  f i   } | j
 Sd  S(   Nt   MethodTemplatec           @ s)   e  Z  j   f Z   f d    Z RS(   c         @ s5    f t  |  }   j |  j | |  } | j   S(   N(   t   tupleR   Rj   t	   as_method(   R   R4   R   R   (   R   RU   (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR   x  s    (   R!   R"   R   R   (    (   R   R   RU   R   (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR   u  s   Rs   (   R%   R   R   R   R   R   t   BoundFunctionR   R   Rj   R   (   R   RU   R   R   R   t   impdctt   getterR   (    (   R   R   RU   R   s2   lib/python2.7/site-packages/numba/jitclass/base.pyt   generic_resolvek  s    (
(   R!   R"   R   R   R   R   (    (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyR   g  s   	c         C@ s9  | | j  k rz |  j | | d | } | j } |  j | | j   d | } t j |  | | j  | t | t |    S| | j	 k r | j	 | d } t
 j d |  }	 t j |  }
 |
 j |  j | g i   }	 |  j |
 |	  } | | | g  } t |  |  t j |  | |	 j |  St d j |    d S(   s4   
    Generic getattr() for @jitclass instances.
    t   valuet   refRs   s   attribute {0!r} not implementedN(   R%   t   make_helperR   t   make_data_helpert   get_data_typeR
   t   impl_ret_borrowedRh   R'   R   R   R   RX   R   R   R   R   R   Rl   R   R   t   NotImplementedErrorRK   (   Rj   R   t   typR   R   t   instt   data_pointerR   R   R   t
   dispatcherRk   Re   (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyt   get_attr_impl  s$    		
c         C@ sk  | j  \ } } | \ } } | | j k r |  j | | d | }	 |	 j }
 |  j | | j   d |
 } | j | } t | t |   } t | t |  |  |  j	 j
 | | |  |  j	 j | | |  n | | j k rR| j | d } t j |  } | j |  j | | f i   } |  j | |  } | | | | f  t |  |  n t d j |    d S(   s4   
    Generic setattr() for @jitclass instances.
    R   R   Rt   s   attribute {0!r} not implementedN(   R4   R%   R   R   R   R   Rh   R'   t   setattrt   nrtt   increft   decrefR   R   R   R   R   R   Rl   R   RK   (   Rj   R   R   R4   R   R   t   valtyt   targett   valR   t   data_ptrR   t	   attr_typet   oldvaluet   setterR   Rk   (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyt   set_attr_impl  s,    		c         C@ s	  |  j  t j  } |  j  t j  } t j t j   | | | g  } d j | j  } | j	 | d | } | j
 rt j | j    } | j   }	 |  j  |	  }
 | j | j d |
 j    } |  j | |	 d | } |  j j | |	 | j    | j   n  | S(   Ns	   _Dtor.{0}R,   i    R   (   t   get_value_typeR   t   voidptrt   uintpt   llvmirRn   t   VoidTypeRK   R,   t   get_or_insert_functiont   is_declarationt	   IRBuildert   append_basic_blockR   t   bitcastR4   t
   as_pointerR   R   R   t	   _getvaluet   ret_void(   Rj   t   moduleRF   t	   llvoidptrt   llsizet
   dtor_ftypet   fnamet   dtor_fnR   t   alloc_fe_typet
   alloc_typet   ptrR   (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyt   imp_dtor  s     		c         C@ sl  | j  } |  j | j    } |  j |  } |  j j | |  j t j |  t |  | j	 |   } |  j j
 | |  } | j | | j    } | j t j |  |  |  j | |  }	 | |	 _ | |	 _ | j  f | j }
 | j d } t j |  } |  j | t j |
    } t |  |  |	 j   g t |  } | | |  |	 j   } t j |  | | |  S(   s7   
    Generic constructor (__new__) for jitclasses.
    R   (   R   R   t   get_abi_sizeofR   t   meminfo_alloc_dtort   get_constantR   R   R   R   t   meminfo_dataR   R   t   storeR   t   get_null_valueR   R   R   R4   R   R   R   t   voidRl   R   t   listR
   R   (   Rj   R   R   R4   t   inst_typR   t
   alloc_sizeR   R   t   inst_structRO   RN   R   Rk   t   realargst   ret(    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyt	   ctor_impl  s0    					(B   t
   __future__R    R   t   collectionsR   R   Rm   Rv   R   t   llvmliteR   R   t   numbat   numba.targets.registryR   R   t   numba.typingR   t   numba.datamodelR   R	   t   numba.targetsR
   R   R   R   t	   numba.sixR   R   Rr   R   t   StructModelR   R#   R   R   R   t	   ClassTypet   OpaqueModelR'   RJ   R6   R<   R7   R_   Rf   Rl   R   R   R   R}   R   R   t   infer_getattrt   AttributeTemplateR   R   t   lower_getattr_genericR   t   lower_setattr_genericR   R   R   R   R   R	  (    (    (    s2   lib/python2.7/site-packages/numba/jitclass/base.pyt   <module>   sJ   		0						O	U	 (	