� c��j���`�dZddlZddlZddlZddlZgd�ZiZd�Zd d�Zd d�Z d d�Z d d�Z d �Z y) z�Cache lines from Python source files. This is intended to read lines from modules imported -- hence if a filename is not found, it will look down the module search path for a file by that name. �N)�getline� clearcache� checkcache� lazycachec�,�tj�y)zClear the cache entirely.N)�cache�clear���"/usr/lib64/python3.12/linecache.pyrrs �� �K�K�Mr c�Z�t||�}d|cxkrt|�kr ny||dz Sy)z~Get a line for a Python source file from the cache. Update the cache if it doesn't contain an entry for this file already.��)�getlines�len)�filename�lineno�module_globals�liness r rrs8�� �X�~� .�E��F� �c�%�j� � ��V�a�Z� � � r c��|tvr#t|}t|�dk7r t|dS t||�S#t$rt �gcYSwxYw)z�Get the lines for a Python source file from the cache. Update the cache if it doesn't contain an entry for this file already.r�)rr� updatecache� MemoryErrorr)rr�entrys r rr$sZ���5���h��� �u�:��?���?�1�%� %���8�^�4�4�� ��� �� ��s� 9�A�Ac��|�#tj�j�}n|g}|D]p} t|}t |�dk(r�|\}}}}|��& t j |�}||jk7s||jk7s�[tj|d��ry#t$rY�wxYw#ttf$rtj|d�Y��wxYw)zUDiscard cache entries that are out of date. (This is not checked upon each call!)Nr) r�copy�keys�KeyErrorr�os�stat�OSError� ValueError�pop�st_size�st_mtime)r� filenamesr�size�mtimer�fullnamer s r rr4s������J�J�L�%�%�'� ��J� ��� ��(�O�E� �u�:��?� �',�$��e�U�H� �=� � ��7�7�8�$�D� �4�<�<� �5�D�M�M�#9� �I�I�h�� %�%��� � � ����$� � �I�I�h�� %� � �s#� B�B.� B+�*B+�.%C�Cc��|tvr+tt|�dk7rtj|d�|r"|jd�r|j d�rgS|} t j |�} t%j&|�5}|j)�} ddd� r!| dj d�s | dxxdz cc<|j.|j0} } | | | |ft|<| S#t$�r&|}t||�ru t|d�}|�gcYSt|�d|j�D�cgc]}|dz�� ncc}wc}|ft|<t|dcYS#ttf$rYnwxYwt jj|�rgcYStjD]e} t jj||�}n#tt f$rY�6wxYw t j |�}n#tt"f$rY�cwxYwgcYSY���t"$rgcYSwxYw#1swY���xYw#tt*t,f$rgcYSwxYw) z�Update a cache entry and return its list of lines. If something's wrong, print a message, discard the cache entry, and return an empty list.rN�<�>r� r�����)rrr#� startswith�endswithrr r!r� splitlines� ImportError�path�isabs�sys�join� TypeError�AttributeErrorr"�tokenize�open� readlines�UnicodeDecodeError� SyntaxErrorr$r%) rrr)r �basename�data�line�dirname�fprr'r(s r rrSs>�� �5�� �u�X�� �1� $� �I�I�h�� %� ��+�+�C�0�X�5F�5F�s�5K�� ��H�,��w�w�x� ��X� �]�]�8� $���L�L�N�E�%� �U�2�Y�'�'��-� �b� �T�� ��,�,�� � �%�D��E�5�(�2�E�(�O� �L��i �(��� �X�~� .� *��X��q�)�+���<��I���I��-1�_�_�->�?�->�T�T�D�[�->��?�� #��h�� �X��q�)�)�� ��)� �� ��" �7�7�=�=�� "��I��x�x�G� ��7�7�<�<���:����~�.� �� �� ��w�w�x�(�����Z�(� �� �� ��I� � ��� ���%� $�� �'�� 5��� ��s��C+�3H7�H*�H7�+H'�E#�H'�H'�7 E �H'�#E5�2H'�4E5�5$H'�H'�/ G�H'�G"�H'�!G"�"H'�&G=�;H'�=H� H'�H�H'� H'�&H'�*H4�/H7�7I�Ic��|tvrtt|�dk(ryy|r"|jd�r|jd�ry|r{d|vrw|j d�}t |dd �xs|d}t |d d �}|�|j d �}t |d d �}|r#|r!t j||�}|ft|<yy) a�Seed the cache for filename with module_globals. The module loader will be asked for the source only when getlines is called, not immediately. If there is an entry in the cache already, it is not altered. :return: True if a lazy load is registered in the cache, otherwise False. To register such a load a module loader with a get_source method must be found, the filename must be a cacheable filename, and the filename must not be already cached. rTFr+r,�__name__�__spec__�nameN�loader� __loader__� get_source)rrr/r0�get�getattr� functools�partial)rr�specrFrGrI� get_liness r rr�s����5�� �u�X�� �1� $��� ��+�+�C�0�X�5F�5F�s�5K���*��6��!�!�*�-���t�V�T�*�H�n�Z�.H����x��.�� �>�#�'�'� �5�F��V�\�4�8� � �J�!�)�)�*�d�;�I�(�l�E�(�O�� r )N) �__doc__rLr5rr9�__all__rrrrrrrr r r �rRsD���� � �� >�� ��� � � &�>B�J!r