o
    éT•j:  ã                   @   sl   d Z ddlZddlZddlZddlZg d¢Zi Zdd„ Zddd„Zddd	„Z	dd
d„Z
ddd„Zdd„ ZdS )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                   C   s   t  ¡  dS )zClear the cache entirely.N)ÚcacheÚclear© r   r   ú /usr/lib/python3.10/linecache.pyr      s   r   c                 C   s8   t | |ƒ}d|  krt|ƒkrn dS ||d  S dS )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Úlinesr   r   r	   r      s
   
ÿr   c                 C   sR   | t v rt |  }t|ƒdkrt |  d S zt| |ƒW S  ty(   tƒ  g  Y S w )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
   é   )r   r   ÚupdatecacheÚMemoryErrorr   )r   r   Úentryr   r   r	   r   $   s   þr   c              	   C   s²   | du rt t ¡ ƒ}n
| tv r| g}ndS |D ]?} t|  }t|ƒdkr$q|\}}}}|du r/qzt |¡}W n tyE   t | d¡ Y qw ||jksP||j	krVt | d¡ qdS )zUDiscard cache entries that are out of date.
    (This is not checked upon each call!)Nr
   )
Úlistr   Úkeysr   ÚosÚstatÚOSErrorÚpopÚst_sizeÚst_mtime)r   Ú	filenamesr   ÚsizeÚmtimer   Úfullnamer   r   r   r	   r   4   s,   þ€òr   c                 C   sì  | t v rtt |  ƒdkrt  | d¡ | r|  d¡r |  d¡r g S | }zt |¡}W n€ ty©   | }t| |ƒrmz	t |  d ƒ }W n t	tfyK   Y n"w |du rTg  Y S t|ƒddd„ | 
¡ D ƒ|ft | < t |  d  Y S tj | ¡rwg  Y S tjD ](}z	tj ||¡}W n ttfy�   Y qzw zt |¡}W  n ty¢   Y qzw g  Y S Y nw zt |¡�}| ¡ }W d  ƒ n1 s¿w   Y  W n tttfyÓ   g  Y S w |rå|d	  d
¡så|d	  d
7  < |j|j}	}
|	|
||ft | < |S )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.r
   Nú<ú>r   c                 S   s   g | ]}|d  ‘qS )Ú
r   )Ú.0Úliner   r   r	   Ú
<listcomp>p   s    zupdatecache.<locals>.<listcomp>r   éÿÿÿÿr$   )r   r   r   Ú
startswithÚendswithr   r   r   r   ÚImportErrorÚ
splitlinesÚpathÚisabsÚsysÚjoinÚ	TypeErrorÚAttributeErrorÚtokenizeÚopenÚ	readlinesÚUnicodeDecodeErrorÚSyntaxErrorr   r   )r   r   r!   r   ÚbasenameÚdataÚdirnameÚfpr   r   r    r   r   r	   r   P   sl   
ÿü
þ
ÿüÜ)
ÿ€ÿr   c                 C   sÀ   | t v rtt |  ƒdkrdS dS | r|  d¡r|  d¡rdS |r^d|v r^|d }| d¡ }du rG| d	¡ }rGz|j}W n	 tyF   Y nw t|d
dƒ}|r^|r^t 	||¡}|ft | < dS dS )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.
    r
   TFr"   r#   Ú__name__Ú
__loader__NÚ__spec__Ú
get_source)
r   r   r)   r*   ÚgetÚloaderr2   ÚgetattrÚ	functoolsÚpartial)r   r   ÚnamerA   Úspecr?   Ú	get_linesr   r   r	   r   “   s*   
ÿ
r   )N)Ú__doc__rC   r/   r   r3   Ú__all__r   r   r   r   r   r   r   r   r   r   r	   Ú<module>   s    




C