
    %^g9                        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	Zddd
ZddZy)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_descriptorsc                    t        j                         } t        |        i }| D ]?  }t        |      t        u rt        |      j
                  }t        |d      r| d|t        |j                        <   t        |t        t        f      sit        |d      rb|j                  j                         D ]E  }t        |t              r| d|t        |      <   t        |t              s5| d|t        |      <   G t        t        |            D ]R  }t!        ||d      }t        |t              r| d|t        |      <   t        |t              sB| d|t        |      <   T B i }i }| D ]v  }t        |      |v r|t        |         }nt        |      j
                  }|j#                  |d      dz   ||<   |j#                  |d      t%        j&                  |      z   ||<   x ||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names	            /lib/python3.12/site-packages/mypy/memprofile.pycollect_memory_statsr(      s    >>D4 H9 I3
#,-3k):HR%&cD$<(sJ',,.A!!T*-.Cw-A!!U+-.Cx.A / +495CD)a&)*7mHRUOa')*8nHRUO 6% 2 EFc7hBsG$D9%%Diia(1,dzz$*S]]3-??t  &=    c                
   t         j                  j                  d      s*dd l}|j	                  |j
                        j                  }nd}| rt        j                          t               \  }}t        ddz         t        d       d}d}t        |j                         d       D ]1  \  }}||   }	|d	k  rt        d
|	|dz  ||	z  |fz         |dz  }||z  }3 t                t        d|dz         t        d|dz         y )Nwinr   z%7s  %7s  %7s  %s)FreqzSize(k)AvgSizer
   z+-------------------------------------------c                    | d    S )Nr    )r"   s    r'   <lambda>z&print_memory_profile.<locals>.<lambda>R   s
    !ur)   )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)
run_gcr6   system_memuser$   r%   totalmemir!   memfs
             r'   print_memory_profilerD   D   s    <<""5) **8+?+?@JJ


(*ME6	
 F
FG	
78H	A_=3!Hr6'1cTk37A*FFG	QC > 
G	
mt34	
h$./r)   c           	        	  D ch c]  }t        |       c}	d 	fd} j                         D ]  }t        |      t        u rt        |      t        t
        fv rCt        t        t        t        f   |      j                         D ]  \  }} ||        ||        t        |      t        t        t        fv r$t        t        t           |      D ]
  } ||        t        |d      st        j                  t        |            D ]3  }t!        |dd      D ]!  }t        ||      s |t!        ||             # 5  yc c}w )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                x    t        |       vr,j                  |        j                  t        |              y y )N)r   appendadd)or   seens    r'   visitz%find_recursive_objects.<locals>.visite   s.    a5KKNHHRUO r)   	__slots__r0   N)rI   objectreturnNone)r   copyr   r   dictr   r   r   rM   r=   r   r   setr   r   mror   )
r   rI   rK   r    r2   valr"   baseslotrJ   s
   `        @r'   r   r   ]   s      4aBqE4 D
 yy{9 9{++ ffn!5s;AACSc
c
 D 9uc**(6*C0a 13$c+#D+r:DsD)gc401 ; ,  !s   E)rN   z%tuple[dict[str, int], dict[str, int]])T)r>   boolrN   rO   )r   zlist[object]rN   rO   )__doc__
__future__r   r   r   collectionsr   typingr   r   r   
mypy.nodesr   r	   
mypy.typesr
   	mypy.utilr   r(   rD   r   r0   r)   r'   <module>r_      s7    # 	 
 # ' ' %  +.b022r)   