B
    b                 @   s  d Z ddlZddlZddlZddlZddlZddlZdZi Zd1ddZ	dd Z
d2d	d
ZejfddZejfddZejfddZejdd dkrdd Znlejdd dkrdd ZnPejdkrddlmZ eZn4yddlZW n ek
r    dd ZY n
X dd Zdd Zi ai ad3ddZd4d d!Zejfd"d#Zd$d%d&gZejd'kr`d(d) eD Zd*d+ Zi Zejdkr~d,a nd-a da!e" Z#e#a$d5d/d0Z%dS )6zCode for debugging SCons internal things.

Shouldn't be needed by most users. Quick shortcuts:

from SCons.Debug import caller_trace
caller_trace()
    NFc             C   sR   |d kr| j j}|tkr g t|< t| dr@t| t|  nt| |  d S )N__dict__)	__class____name__tracked_classeshasattrappendweakrefref)instancename r   *lib/python3.7/site-packages/SCons/Debug.pylogInstanceCreation-   s    
r   c             C   s    | dkrt t S |  S d S )N*)sortedr   keyssplit)sr   r   r   string_to_classes9   s    r   r   c             C   s   t | }dd |D S )Nc             S   s   g | ]}|t t| fqS r   )lenr   ).0Zcnr   r   r   
<listcomp>A   s    z(fetchLoggedInstances.<locals>.<listcomp>)r   )classesZ
classnamesr   r   r   fetchLoggedInstances?   s    r   c             C   s0   x*t | D ]}|d|tt| f  q
W d S )Nz%s: %d
)r   writer   r   )r   file	classnamer   r   r   countLoggedInstancesC   s    r   c             C   sf   x`t | D ]T}|d|  x@t| D ]4}t|r<| }n|}|d k	r&|dt|  q&W q
W d S )Nz
%s:
z    %s
)r   r   r   inspectZisclassrepr)r   r   r   r	   objr   r   r   listLoggedInstancesG   s    
r!   c             C   s|   xvt | D ]j}|d|  xVt| D ]J}| }|d k	r&|d|  x(|j D ]\}}|d||f  qRW q&W q
W d S )Nz
%s:
z    %s:
z        %20s : %s
)r   r   r   r   items)r   r   r   r	   r    keyvaluer   r   r   dumpLoggedInstancesR   s    r%      Zlinuxc           	   C   s0   t d} |  }W d Q R X | d }t|S )Nz/proc/self/stat   )openreadr   int)fZmstrr   r   r   memory_   s    
r,      darwinc               C   s   dS )Nr   r   r   r   r   r   r,   f   s    Zwin32)get_peak_memory_usagec               C   s   dS )Nr   r   r   r   r   r   r,   o   s    c              C   s   t t j} | d S )N   )resourceZ	getrusageZRUSAGE_SELF)Zresr   r   r   r,   r   s    c              C   sP   ddl } |  }|dd }g }x*|D ]"}|dd }|dt|  q&W |S )zreturn caller's stackr   N   z	%s:%d(%s))	tracebackextract_stackr   func_shorten)r4   tbresultbackr#   r   r   r   caller_stackw   s    
r:   c          	   C   s   ddl }|jd|  d}|  |d dd }t|dd t|< xj|dd D ]Z}||dd  }yt| }W n  tk
r   i  t|< }Y nX ||dd ||< |}qRW dS )z
    Trace caller stack and save info into global dicts, which
    are printed automatically at the end of SCons execution.
    r   Nr3   )limit      )r4   r5   reversecaller_basesgetcaller_dictsKeyError)r9   r4   r7   ZcalleeZcallerentryr   r   r   caller_trace   s    rD   c          	   C   sp   d| }xbt dd t|   D D ]D\}}|d|| ft|dd     |tkr$t|||d  q$W d S )Nz      c             S   s   g | ]\}}| |fqS r   r   )r   cvr   r   r   r      s    z$_dump_one_caller.<locals>.<listcomp>z%s  %6d %s:%d(%s)
r<   )r   rA   r"   r   r6   _dump_one_caller)r#   r   levelZleaderrF   rE   r   r   r   rH      s
    $$rH   c             C   s@   x:t t D ]*}| dt|t| f   t||  qW d S )Nz Callers of %s:%d(%s), %d calls:
)r   r?   r   r   r6   rH   )r   kr   r   r   dump_caller_counts   s    rK   )z/scons/SCons/r<   )z/src/engine/SCons/r<   )z/usr/lib/pythonr   /c             C   s&   g | ]}|d   dtj|d fqS )r   rL   r<   )replaceossep)r   tr   r   r   r      s    r   c             C   sb   | d }xTt D ]L}||d }|dkr|d r@|t|d  }||d  f| dd   S qW | S )Nr   r<   )shorten_listfindr   )Z
func_tupler+   rP   ir   r   r   r6      s    
r6   Zconz/dev/ttywc             C   s   dd }|dkrt }n|a |s$t}n|ayt| }W nP tk
r   y"t|| }t|< t|| W n tk
r~   |}Y nX Y nX |rt	 }|
d|t |t f  |a|
|  |  dS )a  Write a trace message.

    Write messages when debugging which do not interfere with stdout.
    Useful in tests, which monitor stdout and would break with
    unexpected output. Trace messages can go to the console (which is
    opened as a file), or to a disk file; the tracefile argument persists
    across calls unless overridden.

    Args:
        tracefile: file to write trace message to. If omitted,
          write to the previous trace file (default: console).
        mode: file open mode (default: 'w')
        tstamp: write relative timestamps with trace. Outputs time since
          scons was started, and time since last trace (default: False)

    c             S   s   |    d S )N)close)ZtraceFPr   r   r   trace_cleanup   s    zTrace.<locals>.trace_cleanupNz%8.4f %8.4f:  )TraceDefaultTimeStampDefaultTraceFPrB   r(   atexitregister	TypeErrortimeperf_counterr   	StartTimePreviousTimeflush)msgZ	tracefilemodeZtstamprV   fpZnowr   r   r   Trace   s*    
re   )N)r   )r   )r   )NrT   F)&__doc__rZ   rN   sysr]   r   r   Ztrack_instancesr   r   r   r   stdoutr   r!   r%   platformr,   ZSCons.compat.win32r/   r1   ImportErrorr:   r?   rA   rD   rH   rK   rQ   rO   r6   rY   rW   rX   r^   r_   r`   re   r   r   r   r   <module>   s\   






