ó
\K]c           @` s²  d  Z  d d l m Z m Z m Z d d l m Z m Z d d l Z d d l	 Z	 d d l
 Z
 d d l Z d d l m Z m Z d d l m Z m Z e d d g ƒ Z d	 „  Z d
 „  Z d „  Z e e j ƒ Z e e j ƒ Z e e BZ e e d d g ƒ ƒ Z e j Z e j Z d e f d „  ƒ  YZ  e
 j! d  d k rQd Z" d Z# d Z$ n d Z" d Z# d Z$ d „  Z% d e f d „  ƒ  YZ& d e f d „  ƒ  YZ' d e f d „  ƒ  YZ( d S(   s   
From NumbaPro

i    (   t   print_functiont   divisiont   absolute_import(   t
   namedtuplet   OrderedDictN(   t   CodeTypet
   ModuleType(   t   errorst   utilst   opcode_infot   argsizec         C` s)   t  |  d d ƒ } | r% t  |  | ƒ S|  S(   s°   
    Objects that wraps function should provide a "__numba__" magic attribute
    that contains a name of an attribute that contains the actual python
    function object.
    t	   __numba__N(   t   getattrt   None(   t   objt   attr(    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   get_function_object   s    c         C` s   t  |  d t  |  d d ƒ ƒ S(   s"   Shamelessly borrowed from llpythont   __code__t	   func_codeN(   R   R   (   R   (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   get_code_object    s    c         C` sI   g  } x< |  D]4 } t  j j | ƒ } | d  k	 r | j | ƒ q q W| S(   N(   t   dist   opmapt   getR   t   append(   t   seqt   lstt   st   c(    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   _as_opcodes%   s    t   RETURN_VALUEt   RAISE_VARARGSt   ByteCodeInstc           B` s\   e  Z d  Z d Z d „  Z e d „  ƒ Z e d	 „  ƒ Z d
 „  Z d „  Z	 e d „  ƒ Z
 RS(   sÄ   
    Attributes
    ----------
    - offset:
        byte offset of opcode
    - opcode:
        opcode integer value
    - arg:
        instruction arg
    - lineno:
        -1 means unknown
    t   offsett   nextt   opcodet   opnamet   argt   linenoc         C` sA   | |  _  | |  _ | |  _ t j | |  _ | |  _ d |  _ d  S(   Niÿÿÿÿ(   R    R!   R"   R   R#   R$   R%   (   t   selfR    R"   R$   t
   nextoffset(    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   __init__E   s    				c         C` s   |  j  t k S(   N(   R"   t   JUMP_OPS(   R&   (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   is_jumpM   s    c         C` s   |  j  t k S(   N(   R"   t   TERM_OPS(   R&   (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   is_terminatorQ   s    c         C` sL   |  j  s t ‚ |  j t k r, |  j |  j S|  j t k sA t ‚ |  j Sd  S(   N(   R*   t   AssertionErrorR"   t   JREL_OPSR!   R$   t   JABS_OPS(   R&   (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   get_jump_targetU   s
    c         C` s   d |  j  |  j |  j f S(   Ns   %s(arg=%s, lineno=%d)(   R#   R$   R%   (   R&   (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   __repr__]   s    c         C` s1   |  j  j d ƒ r d S|  j  d k r) d Sd Sd S(   sR   Effect of the block stack
        Returns +1 (push), 0 (none) or -1 (pop)
        t   SETUP_i   t	   POP_BLOCKiÿÿÿÿi    N(   R#   t
   startswith(   R&   (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   block_effect`   s
    (   R    R!   R"   R#   R$   R%   (   t   __name__t
   __module__t   __doc__t	   __slots__R(   t   propertyR*   R,   R0   R1   R5   (    (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyR   6   s   			i   i   i   i   c         c` s  t  j d d k  r+ t t t |  ƒ ƒ }  n  d } t |  ƒ } d } } xÉ | | k  r|  | } | t 7} | t k râ |  | | B} x. t t	 ƒ D]  } | |  | | d | >O} q‘ W| t	 7} | t
 k rò | d t	 >} qJ qò n d } | t 7} d } | | | | f V| } qJ Wd S(   sd   
    Returns a 4-int-tuple of
    (bytecode offset, opcode, argument, offset of next bytecode).
    i    i   i   N(   t   syst   version_infot   listt   mapt   ordt   lent   CODE_LENt   HAVE_ARGUMENTt   ranget   ARG_LENt   EXTENDED_ARGR   t
   NO_ARG_LEN(   t   codet   extended_argt   nR    t   it   opR$   t   j(    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   _unpack_opargsx   s*    



	
t   ByteCodeIterc           B` s;   e  Z d  „  Z d „  Z d „  Z d „  Z e Z d „  Z RS(   c         C` s(   | |  _  t t |  j  j ƒ ƒ |  _ d  S(   N(   RG   t   iterRM   t   co_code(   R&   RG   (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyR(   ˜   s    	c         C` s   |  S(   N(    (   R&   (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   __iter__œ   s    c         C` s   t  |  j ƒ S(   N(   R!   RO   (   R&   (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   _fetch_opcodeŸ   s    c      
   C` s=   |  j  ƒ  \ } } } } | t d | d | d | d | ƒ f S(   NR    R"   R$   R'   (   RR   R   (   R&   R    R"   R$   R'   (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyR!   ¢   s    c         C` sH   d } x; t  | ƒ D]- } t |  j ƒ \ } } | | d | >O} q W| S(   Ni    i   (   RC   R!   RO   (   R&   t   sizet   bufRJ   t   _offsett   byte(    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   read_arg©   s
    (   R6   R7   R(   RQ   RR   R!   t   __next__RW   (    (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyRN   —   s   				t   ByteCodec           B` sh   e  Z d  Z d Z d	 „  Z e d
 „  ƒ Z d „  Z d „  Z d „  Z	 d „  Z
 e d „  ƒ Z d „  Z RS(   sF   
    The decoded bytecode of a function, and related information.
    t   func_idt   co_namest   co_varnamest	   co_constst   co_cellvarst   co_freevarst   tablet   labelsc         C` s±   | j  } t t j | j ƒ ƒ } | j d ƒ t t | ƒ ƒ } |  j | | ƒ | |  _	 | j
 |  _
 | j |  _ | j |  _ | j |  _ | j |  _ | |  _ t | ƒ |  _ d  S(   Ni    (   RG   t   setR   t
   findlabelsRP   t   addR   RN   t   _compute_linenoRZ   R[   R\   R]   R^   R_   R`   t   sortedRa   (   R&   RZ   RG   Ra   R`   (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyR(   ¸   s    			c         C` s   x9 t  j | ƒ D]( \ } } | | k r | | | _ q q Wd } x8 | j ƒ  D]* } | j d k rp | j } qO | | _ qO W| S(   sI   
        Compute the line numbers for all bytecode instructions.
        iÿÿÿÿi    (   R   t   findlinestartsR%   t   values(   t   clsR`   RG   R    R%   t   knownt   inst(    (    s-   lib/python2.7/site-packages/numba/bytecode.pyRe   Ë   s    c         C` s   t  j |  j ƒ S(   N(   R   t
   itervaluesR`   (   R&   (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyRQ   Û   s    c         C` s   |  j  | S(   N(   R`   (   R&   R    (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   __getitem__Þ   s    c         C` s   | |  j  k S(   N(   R`   (   R&   R    (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   __contains__á   s    c         ` s8   ‡ f d †  ‰  d j  ‡  f d †  t j ˆ j ƒ Dƒ ƒ S(   Nc         ` s"   |  d j  ˆ  j k r d Sd Sd  S(   Ni   t   >t    (   R    Ra   (   RJ   (   R&   (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   label_markerå   s    s   
c         3` s&   |  ] } d  ˆ  | ƒ f | Vq d S(   s
   %s %10s	%sN(    (   t   .0RJ   (   Rq   (    s-   lib/python2.7/site-packages/numba/bytecode.pys	   <genexpr>ë   s   (   t   joinR   t	   iteritemsR`   (   R&   (    (   Rq   R&   s-   lib/python2.7/site-packages/numba/bytecode.pyt   dumpä   s    c         C` s  i  } | j  } | j d t j ƒ } t | t ƒ r? | j } n  xx | j ƒ  D]j } | j d k rL | | j	 }	 |	 | k r¶ y | |	 }
 Wn t
 k
 r¥ | |	 }
 n X|
 | |	 <q¶ qL qL WxW | D]O } t | t ƒ rÁ t t | ƒ ƒ } | j |  j | | | j | j ƒ ƒ qÁ qÁ W| S(   sa   
        Compute the globals used by the function with the given
        bytecode table.
        t   __builtins__t   LOAD_GLOBAL(   t   __globals__R   R   t   builtinst
   isinstanceR   t   __dict__Rh   R#   R$   t   KeyErrorR   R   RN   t   updatet   _compute_used_globalsR]   R[   (   Ri   t   funcR`   R]   R[   t   dt   globsRy   Rk   t   namet   valuet   cot   subtable(    (    s-   lib/python2.7/site-packages/numba/bytecode.pyR~   î   s(    	c         C` s%   |  j  |  j j |  j |  j |  j ƒ S(   sv   
        Get a {name: value} map of the globals used by this code
        object and any nested code objects.
        (   R~   RZ   R   R`   R]   R[   (   R&   (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   get_used_globals  s    (   RZ   R[   R\   R]   R^   R_   R`   Ra   (   R6   R7   R8   R9   R(   t   classmethodRe   RQ   Rm   Rn   Ru   R~   R†   (    (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyRY   ±   s    					
t   FunctionIdentityc           B` s5   e  Z d  Z e j d ƒ Z e d „  ƒ Z d „  Z RS(   sò   
    A function's identity and metadata.

    Note this typically represents a function whose bytecode is
    being compiled, not necessarily the top-level user function
    (the two might be distinct, e.g. in the `@generated_jit` case).
    i   c         C` sb  t  | ƒ } t | ƒ } t j | ƒ } | sC t j d | ƒ ‚ n  y | j } Wn t k
 rl | j } n X|  ƒ  } | | _	 | | _
 | j d ƒ d | _ | | _ t j | ƒ | _ | j d k rÑ t j n	 | j j | _ t j | ƒ | _ | | _ | j | _ | j | _ t | j ƒ | _ t | j ƒ | _ t  |  j! ƒ } d j" | j
 | ƒ | _# | S(   sD   
        Create the FunctionIdentity of the given function.
        s    %s does not provide its bytecodet   .iÿÿÿÿs   {}${}N($   R   R   R   t   pysignatureR   t   ByteCodeSupportErrort   __qualname__t   AttributeErrorR6   R   t   func_qualnamet   splitt	   func_nameRG   t   inspectt	   getmodulet   moduleR   t   _dynamic_modnamet   modnamet   isgeneratorfunctiont   is_generatort   pysigt   co_filenamet   filenamet   co_firstlinenot   firstlinenoR@   t
   parameterst	   arg_countR=   t	   arg_namesR!   t   _unique_idst   formatt   unique_name(   Ri   t   pyfuncR   RG   R˜   RŽ   R&   t   uid(    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   from_function  s6    					c         C` s   |  j  |  j ƒ S(   s:   Copy the object and increment the unique counter.
        (   R¥   R   (   R&   (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   deriveG  s    (	   R6   R7   R8   t	   itertoolst   countR    R‡   R¥   R¦   (    (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyRˆ     s   )(   i   i   ()   R8   t
   __future__R    R   R   t   collectionsR   R   R   R‘   R;   R§   t   typesR   R   t   numbaR   R   R	   R   R   R   t	   frozensett   hasjrelR.   t   hasjabsR/   R)   R+   RE   RB   t   objectR   R<   RA   RD   RF   RM   RN   RY   Rˆ   (    (    (    s-   lib/python2.7/site-packages/numba/bytecode.pyt   <module>   s<   				
		7		c