o
    2g9                     @  s   d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	m
Z
 ddlmZmZ ddlmZ ddlmZ dddZddddZdddZdS )zUtility for dumping memory usage stats.

This is tailored to mypy and knows (a little) about which list objects are
owned by particular AST nodes, etc.
    )annotationsN)defaultdict)DictIterablecast)FakeInfoNode)Type)get_class_descriptorsreturn%tuple[dict[str, int], dict[str, int]]c            	      C  sv  t  } t|  i }| D ]x}t|tu rqt|j}t|dr)| d|t|j< t	|t
tfrt|drY|j D ]}t	|trJ| d|t|< t	|trX| d|t|< q:tt|D ]$}t||d}t	|tru| d|t|< t	|tr| d|t|< q_qi }i }| D ]+}t||v r|t| }nt|j}||dd ||< ||dt| ||< q||fS )zReturn stats about memory use.

    Return a tuple with these items:
      - Dict from object kind to number of instances of that kind
      - Dict from object kind to total bytes used by all instances of that kind
    __dict__z (__dict__)z (list)z (tuple)Nr      )gcget_objectsfind_recursive_objectstyper   __name__hasattridr   
isinstancer   r	   valueslisttupler
   getattrgetsys	getsizeof)	objsinferredobjnxkfreqsmemusename r'   G/home/garg/my-data/venv/lib/python3.10/site-packages/mypy/memprofile.pycollect_memory_stats   sB   







r)   Trun_gcboolNonec           
      C  s   t jdsdd l}||jj}nd}| rt  t	 \}}t
dd  t
d d}d}t| dd d	D ]"\}}|| }	|d
k rQt
d|	|d ||	 |f  |d7 }||7 }q7t
  t
d|d  t
d|d  d S )Nwinr   z%7s  %7s  %7s  %s)FreqzSize(k)AvgSizer	   z+-------------------------------------------c                 S  s
   | d  S )Nr   r'   )r"   r'   r'   r(   <lambda>R   s   
 z&print_memory_profile.<locals>.<lambda>)key2   z%7d  %7d  %7.0f  %si   r   zMem usage RSS   zTotal reachable )r   platform
startswithresource	getrusageRUSAGE_SELF	ru_maxrssr   collectr)   printsorteditems)
r*   r6   system_memuser$   r%   totalmemir!   memfr'   r'   r(   print_memory_profileD   s(   

rC   r   list[object]c                   s   dd  D d fdd}   D ]d}t|tu rqt|ttfv r<ttttf | D ]\}}|| || q/t|t	t
tfv rSttt |D ]}|| qLt|d	rwtt|D ]}t|d	d
D ]}t||ru|t|| qgq_qdS )zFind additional objects referenced by objs and append them to objs.

    We use this since gc.get_objects() does not return objects without pointers
    in them such as strings.
    c                 S  s   h | ]}t |qS r'   )r   ).0or'   r'   r(   	<setcomp>c   s    z)find_recursive_objects.<locals>.<setcomp>rF   objectr   r,   c                   s,   t | vr |  t |  d S d S )N)r   appendadd)rF   r   seenr'   r(   visite   s   
z%find_recursive_objects.<locals>.visit	__slots__r'   N)rF   rH   r   r,   )copyr   r   dictr   r   r   rH   r=   r   r   setr   r   mror   )r   rM   r    r2   valr"   baseslotr'   rK   r(   r   ]   s*   



r   )r   r   )T)r*   r+   r   r,   )r   rD   r   r,   )__doc__
__future__r   r   r   collectionsr   typingr   r   r   
mypy.nodesr   r   
mypy.typesr	   	mypy.utilr
   r)   rC   r   r'   r'   r'   r(   <module>   s    
1