
    Ϫf'                         d Z ddlmZmZ ddlmZ  G d d      Z G d de      Z G d d	e      Z G d
 de      Z	 G d d      Z
 G d de      ZddlmZ  G d dee   e      Zy)z7
Utility classes for dealing with circular references.
    )logreflect)_constructMethodc                   (    e Zd Zd Zd ZdZd Zd Zy)NotKnownc                      g | _         d| _        y Nr   )
dependantsresolvedselfs    </usr/lib/python3/dist-packages/twisted/persisted/crefutil.py__init__zNotKnown.__init__   s        c                 Z    | j                   rJ | j                  j                  ||f       y N)r   r
   append)r   mutableObjectkeys      r   addDependantzNotKnown.addDependant   s&    ==  s34r   Nc                 R    d| _         || _        | j                  D ]
  \  }}|||<    y )N   )r   resolvedObjectr
   )r   	newObjectmutr   s       r   resolveDependantszNotKnown.resolveDependants   s1    ' 	!HC CH	!r   c                     J d       )Nz(I am not to be used as a dictionary key. r   s    r   __hash__zNotKnown.__hash__!   s    <<<qr   )__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r      s    5 N!=r   r   c                       e Zd ZdZd Zd Zy)
_ContainerzK
    Helper class to resolve circular references on container objects.
    c                    t         j                  |        || _        || _        t	        t        t        |                  | _        t        t        |            D ]F  }t        ||   t               s| j                  j                  |       2||   j                  | |       H | j                  s+| j                  | j                  | j                               yy)z
        @param l: The list of object which may contain some not yet referenced
        objects.

        @param containerType: A type of container objects (e.g., C{tuple} or
            C{set}).
        N)r   r   containerTypellistrangelenlocs
isinstanceremover   r   )r   r'   r&   idxs       r   r   z_Container.__init__*   s     	$*s1v'	Q= 	/Cafh/		  %###D#.		/
 yy""4#5#5dff#=> r   c                     || j                   |<   t        |t              sS| j                  j	                  |       | j                  s+| j                  | j                  | j                                yyy)z
        Change the value of one contained objects, and resolve references if
        all objects have been referenced.
        N)r'   r,   r   r+   r-   r   r&   r   nobjs      r   __setitem__z_Container.__setitem__>   s[    
 q	#x(IIQ99&&t'9'9$&&'AB  )r   N)r    r!   r"   __doc__r   r3   r   r   r   r$   r$   %   s    ?(	Cr   r$   c                       e Zd ZdZd Zy)_Tupleza
    Manage tuple containing circular references. Deprecated: use C{_Container}
    instead.
    c                 :    t         j                  | |t               y)zi
        @param l: The list of object which may contain some not yet referenced
        objects.
        N)r$   r   tuple)r   r'   s     r   r   z_Tuple.__init__P   s    
 	D!U+r   N)r    r!   r"   r4   r   r   r   r   r6   r6   J   s    
,r   r6   c                       e Zd Zd Zd Zd Zy)_InstanceMethodc                 n    t         j                  |        || _        || _        |j	                  | d       y r	   )r   r   my_classnamer   )r   im_nameim_selfim_classs       r   r   z_InstanceMethod.__init__Y   s.    $ 	T1%r   c                    dd l }t        j                  dt        j                  | j
                         d| j                          t        j                  d|d|       |j                  t        j                         J )Nr   zinstance method .zbeing called with  )file)		tracebackr   msgr   qualr<   r=   print_stacklogfile)r   argskwrE   s       r   __call__z_InstanceMethod.__call__`   se    "7<<#>"?qLM$THAbV453;;/qr   c                     |dk(  sJ d       t        |t              s3t        | j                  | j                  |      }| j                  |       y y )Nr   zonly zero index allowed)r,   r   r   r<   r=   r   )r   r1   r2   methods       r   r3   z_InstanceMethod.__setitem__h   sG    Av000v#x(%dmmTYYDF""6* )r   N)r    r!   r"   r   rL   r3   r   r   r   r:   r:   X   s    &+r   r:   c                       e Zd Zd Zd Zy)_DictKeyAndValuec                     || _         y r   )dict)r   rR   s     r   r   z_DictKeyAndValue.__init__p   s	    	r   c                     |dvrt        d      |r|| _        n|| _        t        | d      r1t        | d      r$| j                  | j                  | j                  <   y y y )N)r   r   z6DictKeyAndValue should only ever be called with 0 or 1r   value)RuntimeErrorrT   r   hasattrrR   r0   s      r   r3   z_DictKeyAndValue.__setitem__s   sW    F?WXXDJDH4GD'$:"&**DIIdhh %;r   N)r    r!   r"   r   r3   r   r   r   rP   rP   o   s    -r   rP   c                       e Zd Zd Zy)_Dereferencec                 <    t         j                  |        || _        y r   )r   r   id)r   rZ   s     r   r   z_Dereference.__init__   s    $r   N)r    r!   r"   r   r   r   r   rX   rX   ~   s    r   rX   )Deferredc                   "    e Zd Zd ZdZd Zd Zy)_Deferc                 x    t        j                  |        t        j                  |        | j                          y r   )r[   r   r   pauser   s    r   r   z_Defer.__init__   s'    $$

r   r   c                     | j                   rt        dj                  ||            d| _         | j                  |       y )Nz8setitem should only be called once, setting {!r} to {!r}r   )wassetrU   formatcallbackr0   s      r   r3   z_Defer.__setitem__   s>    ;;JQQs  DKcr   c                     t         j                  | ||       | j                          | j                  }| j	                  |       y r   )r   r   unpauseresultr   )r   depr   resovds       r   r   z_Defer.addDependant   s6     	dC-v&r   N)r    r!   r"   r   ra   r3   r   r   r   r   r]   r]      s    
 F	'r   r]   N)r4   twisted.pythonr   r   twisted.python.compatr   r   r$   r6   r:   rP   rX   twisted.internet.deferr[   objectr]   r   r   r   <module>rm      sq   
 ( 2= =*"C "CJ,Z ,+h +.- -8  ,'Xfx 'r   