U
    adV                     @   sz   d Z dddgZddlZddlZdddZdddZejj e_ ejj e_ G d	d dejZd
d Z	dd Z
edkrve
  dS )zUPython interface for the 'lsprof' profiler.
   Compatible with the 'profile' module.
runrunctxProfile    Nc                 C   s   t t| ||S N)
_pyprofile_Utilsr   r   )	statementfilenamesort r   /usr/lib/python3.8/cProfile.pyr      s    c                 C   s   t t| ||||S r   )r   r   r   r   )r	   globalslocalsr
   r   r   r   r   r      s     c                   @   s`   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
de
_dd Zdd ZdS )r   a`  Profile(timer=None, timeunit=None, subcalls=True, builtins=True)

    Builds a profiler object using the specified timer function.
    The default timer is a fast built-in one based on real time.
    For custom timer functions returning integers, timeunit can
    be a float specifying a scale (i.e. how long each integer unit
    is, in seconds).
    r   c                 C   s$   dd l }||  |  d S Nr   )pstatsStatsZ
strip_dirsZ
sort_statsprint_stats)selfr   r   r   r   r   r   (   s    zProfile.print_statsc              	   C   s8   dd l }t|d}|   || j| W 5 Q R X d S )Nr   wb)marshalopencreate_statsdumpstats)r   filer   fr   r   r   
dump_stats,   s    zProfile.dump_statsc                 C   s   |    |   d S r   )disablesnapshot_statsr   r   r   r   r   2   s    zProfile.create_statsc              
   C   s,  |   }i | _i }|D ]P}t|j}|j}||j }|j}|j}i }	|	|t|j< |||||	f| j|< q|D ]}|j	rlt|j}|j	D ]}
z|t|
j }	W n t
k
r   Y qY nX |
j}||
j }|
j}|
j}||	kr|	| }||d 7 }||d 7 }||d 7 }||d 7 }||||f|	|< qqld S )Nr            )Zgetstatsr   labelcodeZ	callcountZreccallcountZ
inlinetimeZ	totaltimeidZcallsKeyError)r   entriesZcallersdictsentryfuncZncZccZttZctZcallersZsubentryprevr   r   r   r   6   s>    






zProfile.snapshot_statsc                 C   s   dd l }|j}| |||S r   )__main____dict__r   )r   cmdr,   dictr   r   r   r   \   s    zProfile.runc                 C   s(   |    zt||| W 5 |   X | S r   )enabler   exec)r   r.   r   r   r   r   r   r   a   s
    
zProfile.runctxc                  O   s   t | dkr| ^}}} nV| s&tdnHd|krZ|d}| ^}} dd l}|jdtdd ntdt | d  |  z|| |W S |  X d S )	Nr"   z:descriptor 'runcall' of 'Profile' object needs an argumentr*   r   z0Passing 'func' as keyword argument is deprecated)
stacklevelz7runcall expected at least 1 positional argument, got %dr!   )len	TypeErrorpopwarningswarnDeprecationWarningr0   r   )argskwr   r*   r6   r   r   r   runcallj   s&    

 
zProfile.runcallz($self, func, /, *args, **kw)c                 C   s   |    | S r   )r0   r    r   r   r   	__enter__   s    zProfile.__enter__c                 G   s   |    d S r   )r   )r   exc_infor   r   r   __exit__   s    zProfile.__exit__N)r   )__name__
__module____qualname____doc__r   r   r   r   r   r   r;   __text_signature__r<   r>   r   r   r   r   r      s   
&	c                 C   s(   t | trdd| fS | j| j| jfS d S )N~r   )
isinstancestrco_filenameco_firstlinenoco_name)r%   r   r   r   r$      s    

r$   c               
   C   s  dd l } dd l}dd l}dd l}ddlm} d}||d}d|_|jdddd	d d
 |jdddddt|j	j
d |jdddddd |jdd  s|  |d | \}}||jd d < |jd k	r| j|j|_t|dkr|jrd}	|j|d d}
nR|d }|jd| j| t|d}t| |d}	W 5 Q R X |dd d d}
zt|	|
d |j|j W n6 tk
r } zd |_||j W 5 d }~X Y nX n|  |S )Nr   )OptionParserzNcProfile.py [-o output_file_path] [-s sort] [-m module | scriptfile] [arg] ...)usageFz-oz	--outfileoutfilezSave stats to <outfile>)desthelpdefaultz-sz--sortr   z?Sort order when printing to stdout, based on pstats.Stats classr   )rM   rN   rO   choicesz-mmodule
store_truezProfile a library module)rM   actionrN   rO   r!   r"   z(run_module(modname, run_name='__main__'))
run_modulemodnamerbr1   r,   )__file__r?   __package__
__cached__)ossysrunpyr   ZoptparserJ   Zallow_interspersed_argsZ
add_optionsortedr   Zsort_arg_dict_defaultargvZprint_usageexit
parse_argsrL   pathabspathr3   rQ   rT   insertdirnamer   compilereadr   r   BrokenPipeErrorstdouterrno)rZ   r[   r\   r   rJ   rK   parserZoptionsr9   r%   ZglobsZprognamefpexcr   r   r   main   sd    

 


 

 rm   r,   )Nr   )Nr   )rB   __all__Z_lsprofZprofiler   r   r   ZProfilerr   r$   rm   r?   r   r   r   r   <module>   s   




o;