B
     \<                 @   s   d dl mZ d dlZd dl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 G dd dejZe Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd ZejredZeej e ge_eZeZneZeZdS )    )absolute_importN)wraps)chain   )configc               @   s   e Zd ZdZdd ZdS )TLSzGUse a subclass to properly initialize the TLS variables in all threads.c             C   s   d| _ d| _d S )NFr   )tracingindent)self r   ,lib/python3.7/site-packages/numba/tracing.py__init__   s    zTLS.__init__N)__name__
__module____qualname____doc__r   r   r   r   r   r      s   r   c             C   s   t | dd}t | dd}t | dd}d}|r4|j}nHt|jrZ|jd dkrZ|d jj}n"t|jr||jd dkr||d j}|rg }|r|dkr|| |d	 |r|| |d	 || d
|}|dfS )z7Return function meta-data in a tuple.

    (name, type)r   Nr   __self__r   r
   cls__main__. )getattrr   lenargs	__class__appendjoin)funcspecr   modulenamer
   ZcnameZqnamer   r   r   find_function_info   s*    






r!   c             C   s8   d}t | }t||kr0|d | d |d  S |S d S )Ni@  z...)reprr   )valueZMAX_SIZEsr   r   r   chop3   s
    r&   c       
         s   t   |jr.t t|jt|j d  |j  |  tt|jd t| |  fdd|jD }dd |t|d  D } fddt  D }d	dd t
|||D }dtjd | d	|d
g}dtjd | g}	||	fS )Nc                s   g | ]}d |  |f qS )z%s=%r)pop).0a)valuesr   r   
<listcomp>B   s    z!create_events.<locals>.<listcomp>c             S   s   g | ]}t |qS r   )str)r(   r)   r   r   r   r+   C   s    c                s   g | ]}d | | f qS )z%s=%rr   )r(   k)r*   r   r   r+   D   s    z, c             S   s   g | ]}|r|qS r   r   )r(   fr   r   r   r+   E   s    z>>  ()z<< )dictdefaultszipr   r   updatelistsortedkeysr   r   tlsr	   )
fnamer   r   kwdsZ
positionalZ	anonymouskeywordsZparamsenterleaver   )r*   r   create_events;   s    "
"r?   c              O   sR  | dd}dd }t| r$| d p&d}|rtt|rx*t|tjD ]\}}t|||| qJW xht|tjD ]\}}t	|f| d|i qvW n8t|rx,t|dd D ]\}}t|||| qW t
|st|ttfkr||S t|tkrJd	\}}	}
|jr||j}|jr,||j}	|jr>||j}
t||	|
S |S dS )
zFunction decorator to trace a function's entry and exit.

    *args: categories in which to trace this function. Example usage:

    @trace
    def function(...):...

    @trace('mycategory')
    def function(...):...


    	recursiveFc                s   d t d fdd}d }dd }t tkrLt } dj n0t tkrlt } d nt tkr|tt	
 |t |S )Ntracec                 s|   tjrtjr | |S t | \}}z@dt_t|| |\}}z d| t j	d7  _	y"zdt_ | |}W d dt_X W n   t
 \}}}	|d |j}
|
dkr||
 |d ||j |jr|d |d	d
d |jD  |d n
|d  Y n$X |d k	rH|d |t| W d t j	d8  _	d| X W d dt_X |S )NTr   r   Fz => exception thrown
	raise r   r   r0   z, c             s   s   | ]}t |V  qd S )N)r&   )r(   vr   r   r   	<genexpr>|   s    z>dotrace.<locals>.decorator.<locals>.wrapper.<locals>.<genexpr>r1   z()z -> )ZisEnabledForloggingINFOr9   r   r!   r?   infor   r	   sysexc_infor   r   r   r   r&   )r   r;   r:   Zftyper=   r>   resulttyper$   	tracebackZmname)r   loggerr   r   r   wrapper_   sF    







z+dotrace.<locals>.decorator.<locals>.wrapperc             S   s   | S )Nr   )xr   r   r   <lambda>   s    z,dotrace.<locals>.decorator.<locals>.<lambda>T)rD   	getLoggerrJ   classmethod__get____func__staticmethodpropertyNotImplementedErrorinspectZ
getargspecr   )r   rM   rI   Zrewrapr   )r   rL   r   r   	decorator[   s    
.
zdotrace.<locals>.decoratorr   Nc             S   s   t | pt | S )N)rW   
isfunctionZismethod)rN   r   r   r   rO      s   
zdotrace.<locals>.<lambda>)NNN)getr   rV   rW   ZismoduleZ
getmembersrY   setattrZisclassdotracecallablerJ   rQ   rT   rU   fgetfsetfdel)r   r;   r@   rX   arg0nr.   cZpgetZpsetZpdelr   r   r   r\   L   s2    D





r\   c              O   sD   dd }t | r| d pd}t|s4t|ttfkr<||S |S dS )z)Just a no-op in case tracing is disabled.c             S   s   | S )Nr   )r   r   r   r   rX      s    znotrace.<locals>.decoratorr   N)r   r]   rJ   rQ   rT   )r   r;   rX   ra   r   r   r   notrace   s
    rd   c             C   s.   dt jd | g} td}|d|  d S )Nz== r/   rA   r   )r9   r	   rD   rP   rF   r   )msgrL   r   r   r   doevent   s    
rf   c             C   s   d S )Nr   )re   r   r   r   noevent   s    rg   rA   ) Z
__future__r   rD   rG   typesZ	threadingrW   	functoolsr   	itertoolsr   r   r   Zlocalr   r9   r!   r&   r?   r\   rd   rf   rg   ZTRACErP   rL   ZsetLevelrE   ZStreamHandlerZhandlersrA   Zeventr   r   r   r   <module>   s2   s
