U
    ,d                     @   s   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 )    N)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	   6/tmp/pip-unpacked-wheel-eu7e0c37/numba/core/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   cname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
   chop1   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>@   s     z!create_events.<locals>.<listcomp>c                 S   s   g | ]}t |qS r	   )strr)   r	   r	   r
   r.   A   s     c                    s   g | ]}d | | f qS r'   r	   )r*   kr,   r	   r
   r.   B   s     , c                 S   s   g | ]}|r|qS r	   r	   )r*   fr	   r	   r
   r.   C   s      z>>  ()z<< )dictdefaultszipr   r   updatelistsortedkeysr   r   tlsr   )
fnamer   r   kwds
positionalZ	anonymouskeywordsparamsenterleaver	   r,   r
   create_events9   s    "
"rE   c                  O   sF  | dd}dd }t| r$| d p&d}|rtt|rt|tjD ]\}}t|||| qHt|tjD ]\}}t	|f| d|i qpn4t|rt|dd D ]\}}t|||| qt
|st|ttfkr||S t|tkr>d	\}}	}
|jr||j}|jr ||j}	|jr2||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  _z"zdt_ | |}W 5 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 5 t jd8  _d	| X W 5 dt_X |S )NFT   r   z => exception thrown
	raise r   r   r4   r1   c                 s   s   | ]}t |V  qd S N)r&   )r*   vr	   r	   r
   	<genexpr>z   s     z>dotrace.<locals>.decorator.<locals>.wrapper.<locals>.<genexpr>r5   z()z -> )isEnabledForloggingINFOr=   r   r!   rE   r   infor   sysexc_infor   r   r   r   r&   )r   r?   r>   ZftyperC   rD   resulttyper$   	tracebackZmnamer   loggerr   r	   r
   wrapper]   sF    







z+dotrace.<locals>.decorator.<locals>.wrapperc                 S   s   | S rI   r	   xr	   r	   r
   <lambda>       z,dotrace.<locals>.decorator.<locals>.<lambda>T)rM   	getLoggerrS   classmethod__get____func__staticmethodpropertyNotImplementedErrorinspectgetfullargspecr   )r   rW   rR   Zrewrapr	   rU   r
   	decoratorY   s    
.
zdotrace.<locals>.decoratorr   Nc                 S   s   t | pt | S rI   )rc   
isfunctionismethodrX   r	   r	   r
   rZ      s   
zdotrace.<locals>.<lambda>)NNN)getr   rb   rc   ismodule
getmembersrf   setattrisclassdotracecallablerS   r]   r`   ra   fgetfsetfdel)r   r?   rF   re   arg0nr2   cZpgetZpsetZpdelr	   r	   r
   rm   J   s2    D





rm   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 rI   r	   )r   r	   r	   r
   re      s    znotrace.<locals>.decoratorr   N)r   rn   rS   r]   r`   )r   r?   re   rr   r	   r	   r
   notrace   s
    ru   c                 C   s.   dt jd | g} td}|d|  d S )Nz== r3   rG   r   )r=   r   rM   r\   rO   r   )msgrV   r	   r	   r
   doevent   s    
rw   c                 C   s   d S rI   r	   )rv   r	   r	   r
   noevent   s    rx   rG   )rM   rP   types	threadingrc   	functoolsr   	itertoolsr   Z
numba.corer   localr   r=   r!   r&   rE   rm   ru   rw   rx   TRACEr\   rV   setLevelrN   StreamHandlerhandlersrG   eventr	   r	   r	   r
   <module>   s0   s
