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rd
||	< |rtjd tj  qJ|| || |j}
| }| }| }|rtd tdt| j d t|  t  |rtdt| j d	 |D ]3}t | |j|u rtdt!"| d q|rt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 qw |
|	r|rtjd tj  t/|	}d
}t0||| q|r|s|d dkrtjd tj  qXd|_|rt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$   %