o
    ¯bÒ  ã                   @   sÂ   U d Z ddlZddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
mZmZ e ¡ aG dd„ dƒZi Ze	eef ed	< d
d„ Zdd„ ZG dd„ deƒZdd„ Zdd„ Zddd„ZdS )z&
*Real* reloading support for Python.
é    N)Úreload)Ú
ModuleType)ÚDict)ÚlogÚreflectc                   @   s,   e Zd ZdZeZdd„ Zdd„ Zdd„ ZdS )	Ú	SensitivezÐ
    A utility mixin that's sensitive to rebuilds.

    This is a mixin for classes (usually those which represent collections of
    callbacks) to make sure that their code is up-to-date before running.
    c                 C   s   | j t k }|S ©N)ÚlastRebuild)ÚselfÚyn© r   ú8/usr/lib/python3/dist-packages/twisted/python/rebuild.pyÚneedRebuildUpdate$   s   
zSensitive.needRebuildUpdatec                 C   s   t   ¡ | _d S r   )Útimer	   ©r
   r   r   r   ÚrebuildUpToDate(   s   zSensitive.rebuildUpToDatec                 C   sX   t |ƒ}|tjkrt|ƒS |tjkr%|jdu rt|j|jƒS t|j|jƒS t	 
d¡ |S )z¡
        Get the latest version of an object.

        This can handle just about anything callable; instances, functions,
        methods, and classes.
        Nzwarning returning anObject!)ÚtypeÚtypesÚFunctionTypeÚlatestFunctionÚ
MethodTypeÚ__self__ÚgetattrÚim_classÚ__name__r   Úmsg)r
   ÚanObjectÚtr   r   r   ÚlatestVersionOf+   s   



zSensitive.latestVersionOfN)r   Ú
__module__Ú__qualname__Ú__doc__r	   r   r   r   r   r   r   r   r      s    r   Ú_modDictIDMapc                 C   s,   t | jƒ}t |¡}|du r| S t|| jƒS )z/
    Get the latest version of a function.
    N)ÚidÚ__globals__r"   Úgetr   r   )ÚoldFuncÚdictIDÚmoduler   r   r   r   B   s
   

r   c                 C   sz   t  | j¡}t|| jƒ}dd„ |jD ƒ}|jdkr|S zt|ƒ|_|W S  ty<   t|ƒ}||jt|ƒt	|j
ƒƒ Y S w )z,
    Get the latest version of a class.
    c                 S   s   g | ]}t |ƒ‘qS r   )ÚlatestClass)Ú.0Úbaser   r   r   Ú
<listcomp>U   s    zlatestClass.<locals>.<listcomp>Úbuiltins)r   ÚnamedModuler   r   r   Ú	__bases__ÚtupleÚ	TypeErrorr   ÚdictÚ__dict__)ÚoldClassr(   ÚnewClassÚnewBasesÚctorr   r   r   r)   O   s   

þr)   c                   @   s   e Zd ZdZdS )ÚRebuildErrorzT
    Exception raised when trying to rebuild a class whereas it's not possible.
    N)r   r   r    r!   r   r   r   r   r8   d   s    r8   c                 C   s   t | jƒ| _dS )z,
    Updates an instance to be current.
    N)r)   Ú	__class__r   r   r   r   ÚupdateInstancej   s   r:   c                 C   sF   |dkrt dƒ‚t| ƒ t dt | j¡› d|› d�¡ t| |ƒ}|S )z<
    A getattr method to cause a class to be refreshed.
    Ú__del__zWithout this, Python segfaults.z(rebuilding stale z instance (z)))ÚAttributeErrorr:   r   r   r   Úqualr9   r   )r
   ÚnameÚresultr   r   r   Ú__injectedgetattr__q   s    
r@   é   c              
   C   sÚ  t   ¡ at| dƒr| jstdƒ‚|rt dt| jƒ› d�¡ ddl	m
} d|_| j}| tt|ƒ< i }i }i }i }|rFt dt| jƒ› d	�¡ | ¡ D ]@\}}	tt|	ƒtjƒrn|	j| ju rmd
||	< |rmtj d¡ tj ¡  qJt|	tƒrŠ|	j| jkrŠd
||	< |rŠtj d¡ tj ¡  qJ| |¡ | |¡ |j}
| ¡ }| ¡ }| ¡ }|r·t d¡ t dt| jƒ› d�¡ t| ƒ t ¡  |rÍt dt| jƒ› d	�¡ |D ]3}t | |jƒ|u ræt dt! "|¡› d�¡ qÏ|rótj d¡ tj ¡  d|_#|j $¡  t%|_&| j|_qÏ|�r
ddl'}|D ]0}t | |jƒ}||u �r&t d (t! "|¡¡¡ �q| )|¡D ]}t |ddƒ|u �r9||_*�q+�q|�rQt d¡ t dt| jƒ› d	�¡ d}t+j, ¡ D ]{\}}|d
 }|| k�sj|du �rl�qXt|dƒ�st�qXt|dƒ�r|�qXd}|j ¡ D ]6\}}	zt-|	ƒ W n t.�y˜   Y �qƒw |
|	ƒ�r¸|�r¬tj d¡ tj ¡  t/|	ƒ}d
}t0|||ƒ �qƒ|�rÒ|�sÒ|d dk�rÒtj d¡ tj ¡  �qXd|_|�rët d¡ t dt| jƒ› d�¡ | S )zO
    Reload a module and do as much as possible to replace its references.
    ÚALLOW_TWISTED_REBUILDzI am not allowed to be rebuilt.zRebuilding z...r   )Ú
componentsTz  (scanning z): rA   ÚfÚoÚ z  (reload   ú)z  (cleaning zWARNING: class z not replaced by reload!Úxr   Nz-WARNING: new-class {} not replaced by reload!r9   z  (fixing   Ú__file__Ú
__bundle__é
   Ú.Fz   Rebuilt )1r   r	   ÚhasattrrB   ÚRuntimeErrorr   r   Ústrr   Útwisted.pythonrC   ÚALLOW_DUPLICATESr3   r"   r#   ÚitemsÚ
issubclassr   r   r   r$   ÚlogfileÚwriteÚflushÚ
isinstancer   ÚupdateÚ__contains__Úkeysr   Ú	linecacheÚ
clearcacher   r   r=   r/   Úclearr@   Ú__getattr__ÚgcÚformatÚget_referrersr9   ÚsysÚmodulesÚhashÚ	Exceptionr   Úsetattr)r(   ÚdoLogrC   ÚdÚ
newclassesÚclassesÚ	functionsÚvaluesÚkÚvÚfromOldModuleÚclazzr_   ÚnclassÚgaÚrÚmodcountÚmkÚmodÚchangedÚnvr   r   r   Úrebuild}   sÒ   

€

€






ÿÿ€þ
ÿ

€
€
ry   )rA   )r!   r[   rb   r   r   Úimpr   r   Útypingr   rP   r   r   r	   r   r"   ÚintÚ__annotations__r   r)   re   r8   r:   r@   ry   r   r   r   r   Ú<module>   s$   %