๓
\K]c           @@ s;  d  Z  d d l m Z m Z d d l m Z m Z d d l m Z d d l	 m
 Z
 m Z d d l m Z m Z m Z d d l	 m Z d d l m Z d	 d
 l m Z d Z d Z d Z d   Z e e d e d d Z e e d e d d Z d   Z i  Z d   Z e e
 j  d    Z e e
 j  d    Z  d S(   s   
Implement logic relating to wrapping (box) and unwrapping (unbox) instances
of jitclasses for use inside the python interpreter.
i    (   t   print_functiont   absolute_import(   t   wrapst   partial(   t   ir(   t   typest   cgutils(   t   boxt   unboxt   NativeValue(   t   njit(   t   exec_i   (   t   _boxs;   
def accessor(__numba_self_):
    return __numba_self_.{0}
sN   
def mutator(__numba_self_, __numba_val):
    __numba_self_.{0} = __numba_val
sL   
def method(__numba_self_, *args):
    return __numba_self_.{method}(*args)
c         C@ s0   | j  |   } i  } t | |  t | |  S(   sG   
    Generate simple function that get/set a field of the instance
    (   t   formatR   R
   (   t   fieldt   templatet   fnamet   sourcet   glbls(    (    s4   lib/python2.7/site-packages/numba/jitclass/boxing.pyt   _generate_property"   s    R   R   t   accessort   mutatorc         @ sT   t  j d |   } i  } t | |  t | d    t |    f d    } | S(   so   
    Generate a wrapper for calling a method.  Note the wrapper will only
    accept positional arguments.
    t   methodc          @ s     |  |   S(   N(    (   t   argst   kwargs(   R   (    s4   lib/python2.7/site-packages/numba/jitclass/boxing.pyt   wrapper<   s    (   t   _method_code_templateR   R   R
   R   (   t   namet   funcR   R   R   (    (   R   s4   lib/python2.7/site-packages/numba/jitclass/boxing.pyt   _generate_method2   s    c      
   C@ s[  |  t  k r t  |  Si d
 d 6|  d 6|  j j d 6} x< |  j D]1 } t |  } t |  } t | |  | | <q? Wxฎ |  j j   D] \ } } d } d } d | k rท t |  } n  d | k rา t |  } n  | j
 d  p๓ | j
 d  p๓ d } t | d d  } t | | d | | | <q Wxj |  j j   D]Y \ } }	 | d k sx| d k sx| j d	  ot| j d	  r5t | |	  | | <q5q5Wt |  j t j f |  }
 |
 t  |  <x | j   D] \ } } t | t  rฤt |
 |  } | j d k	 rS| j } | j |  f  } | j   t |
 | t | | j | j d | j  qSqฤqฤW|
 S(   s   
    Create a subclass of Box that is specialized to the jitclass.

    This function caches the result to avoid code bloat.
    t	   __slots__t   _numba_type_t   __doc__t   gett   sett   doct   __getitem__t   __setitem__t   __(    N(   t   _cache_specialized_boxt
   class_typet	   class_doct   structt   _generate_gettert   _generate_settert   propertyt   jitpropst   itemst   NoneR!   t   getattrt   methodst
   startswitht   endswithR   t   typet	   classnameR   t   Boxt
   isinstancet   fgett   compilet   disable_compilet   setattrt   fsett   fdelR    (   t   typt   dctR   t   gettert   settert   impdctt   impR#   R   R   t   subclst   kt   vt   propR9   t	   fast_fget(    (    s4   lib/python2.7/site-packages/numba/jitclass/boxing.pyt   _specialize_boxF   sH    
$
	
	c         @ s๓   t  j  j |  \ } } t |   }  j j  j t |  d d }  j j |  j j	  }  j j
 | d    t j d  j     j j |   }  j j |   }	     f d   }
 |
 t j |  |
 t j |	    S(   Nt   infot   box_class_instancei   c         @ sb    j  j t j |   } t j  j   |  }  j j |  j    }  j j	 | |  d  S(   N(
   t   contextt   get_constantR   t   uintpR   t   pointer_addt   buildert   bitcastt
   as_pointert   store(   t   member_offsett   valuet   offsett   ptrt   casted(   R   t   ct	   llvoidptr(    s4   lib/python2.7/site-packages/numba/jitclass/boxing.pyt
   set_member   s    (    (   R   t   unpack_tupleRQ   RJ   RM   t   add_dynamic_addrt   idRR   t   pyapit   pyobjt   call_function_objargsR   t   IntTypeRS   R   t   box_meminfoptr_offsett   box_dataptr_offset(   R?   t   valRZ   t   meminfot   dataptrt   box_subclassedt   voidptr_boxclst   box_clst   addr_meminfot	   addr_dataR\   (    (   R   RZ   R[   s4   lib/python2.7/site-packages/numba/jitclass/boxing.pyt   _box_class_instance   s    		c   	      @ sั      f d   } t  j |   } |   j   j  } | t j  } | t j  }   j j | | j j	  | _   j j | | j
 j	  | _
 | j   }   j j j   j |  |  t | d   j j   S(   Nc         @ sp     j  j t j |   } t j d  j   } t j   j	  |  }   j	 j
 | | j    }   j	 j |  S(   Ni   (   RM   RN   R   RO   R   Rc   RS   R   RP   RQ   RR   t   load(   RU   RW   R[   RX   RY   (   RZ   Rf   (    s4   lib/python2.7/site-packages/numba/jitclass/boxing.pyt   access_memberฆ   s
    t   is_error(   R   t   create_struct_proxyRM   RQ   R   Rd   Re   RR   Rg   R5   t   datat	   _getvaluet   nrtt   increfR	   R`   t   c_api_error(	   R?   Rf   RZ   Rp   t
   struct_clst   instt   ptr_meminfot   ptr_dataptrt   ret(    (   RZ   Rf   s4   lib/python2.7/site-packages/numba/jitclass/boxing.pyt   _unbox_class_instanceค   s    N(!   R    t
   __future__R    R   t	   functoolsR   R   t   llvmliteR   t   numbaR   R   t   numba.pythonapiR   R   R	   R
   t	   numba.sixR   t    R   t   _getter_code_templatet   _setter_code_templateR   R   R+   R,   R   R'   RJ   t   ClassInstanceTypeRn   R}   (    (    (    s4   lib/python2.7/site-packages/numba/jitclass/boxing.pyt   <module>   s*   	
				=!