
    Eg#                         d Z ddlZddlZddlZddlZ ej        d          Z ej        d          ZddZ G d d          Z	dS )	z-Refactored 'safe reference from dispatcher.py    N__self____func__c                 @   	 t          |           }|At          | d          st          | d          sJ d| d            t          | |          }|S dS # t          $ r= t	          |          rt          j        | |          cY S t          j        |           cY S w xY w)a  Return a *safe* weak reference to a callable target.

    - ``target``: The object to be weakly referenced, if it's a bound
      method reference, will create a BoundMethodWeakref, otherwise
      creates a simple weakref.

    - ``on_delete``: If provided, will have a hard reference stored to
      the callable to be called after the safe reference goes out of
      scope with the reference object, (either a weakref or a
      BoundMethodWeakref) as argument.
    Nim_funcr   zsafe_ref target z@ has im_self, but no im_func, don't know how to create reference)target	on_delete)get_selfhasattrBoundMethodWeakrefAttributeErrorcallableweakrefref)r   r   im_self	references       E/var/www/sysmax/venv/lib/python3.11/site-packages/blinker/_saferef.pysafe_refr   .   s    6""  69-- 1L1L  56 5 5 5   +&INNNI   ' ' 'I 	';vy11111;v&&&&&	's   A .BBBc                        e Zd ZdZ ej                    Zd fd	ZddZe	d             Z
d ZeZd Zd Zd	 Zd
 Z xZS )r   a  'Safe' and reusable weak references to instance methods.

    BoundMethodWeakref objects provide a mechanism for referencing a
    bound method without requiring that the method object itself
    (which is normally a transient object) is kept alive.  Instead,
    the BoundMethodWeakref object keeps weak references to both the
    object and the function which together define the instance method.

    Attributes:

    - ``key``: The identity key for the reference, calculated by the
      class's calculate_key method applied to the target instance method.

    - ``deletion_methods``: Sequence of callable objects taking single
      argument, a reference to this object which will be called when
      *either* the target object or target function is garbage
      collected (i.e. when this object becomes invalid).  These are
      specified as the on_delete parameters of safe_ref calls.

    - ``weak_self``: Weak reference to the target object.

    - ``weak_func``: Weak reference to the target function.

    Class Attributes:

    - ``_all_instances``: Class attribute pointing to all live
      BoundMethodWeakref objects indexed by the class's
      calculate_key(target) method applied to the target objects.
      This weak value dictionary is used to short-circuit creation so
      that multiple references to the same (object, function) pair
      produce the same BoundMethodWeakref instance.
    Nc                    |                      |          }| j                            |          }||j                            |           |S t                                          |           }|| j        |<    |j        ||g|R i | |S )a  Create new instance or return current instance.

        Basically this method of construction allows us to
        short-circuit creation of references to already-referenced
        instance methods.  The key corresponding to the target is
        calculated, and if there is already an existing reference,
        that is returned, with its deletion_methods attribute updated.
        Otherwise the new instance is created and registered in the
        table of already-referenced methods.
        )calculate_key_all_instancesgetdeletion_methodsappendsuper__new____init__)	clsr   r   	argumentsnamedkeycurrentbase	__class__s	           r   r   zBoundMethodWeakref.__new__q   s     ''$((--$++I666N77??3''D&*Cs#DM&)AiAAA5AAAK    c                 R   | fd}|g| _         |                     |          | _        t          |          }t	          |          }t          j        ||          | _        t          j        ||          | _        t          |          | _
        t          |j                  | _        dS )a  Return a weak-reference-like instance for a bound method.

        - ``target``: The instance-method target for the weak reference,
          must have im_self and im_func attributes and be
          reconstructable via the following, which is true of built-in
          instance methods::

            target.im_func.__get__( target.im_self )

        - ``on_delete``: Optional callback which will be called when
          this weak reference ceases to be valid (i.e. either the
          object or the function is garbage collected).  Should take a
          single argument, which will be passed a pointer to this
          object.
        c                    |j         dd         }|j         dd= 	 |j        j        |j        = n# t          $ r Y nw xY w|D ]}	 t          |          r ||           # t          $ rY 	 t          j                     nA# t          $ r4 t          j                    d         }t          d| d| d|            Y nw xY wY w xY wdS )z=Set self.isDead to True when method or instance is destroyed.N   zException during saferef z cleanup function z: )r   r$   r   r!   KeyErrorr   	Exception	traceback	print_excr   sysexc_infoprint)weakselfmethodsfunctiones        r   removez+BoundMethodWeakref.__init__.<locals>.remove   sB   +AAA.G%aaa(N1$(;;   #  )) '     !+----)   LNN1-@ @ @08@ @<=@ @    	 sB   . 
;;A
C)A=<C=;B;8C:B;;C CN)r   r   r!   r	   get_funcr   r   	weak_self	weak_funcstr	self_name__name__	func_name)r1   r   r   r5   r   r   s         r   r   zBoundMethodWeakref.__init__   s    " # 	 	 	 	, "+%%f--6""6"" Wf55 Wf55WW-..r%   c                 r    t          t          |                    t          t          |                    fS )zCalculate the reference key for this reference.

        Currently this is a two-tuple of the id()'s of the target
        object and the target function respectively.
        )idr	   r6   )r   r   s     r   r   z BoundMethodWeakref.calculate_key   s/     8F##$$b&)9)9&:&:;;r%   c                 X    d                     | j        j        | j        | j                  S )z-Give a friendly representation of the object.z	{}({}.{}))formatr$   r;   r:   r<   r1   s    r   __str__zBoundMethodWeakref.__str__   s,    !!N#NN
 
 	
r%   c                 8    t          | j        | j        f          S N)hashr:   r!   rA   s    r   __hash__zBoundMethodWeakref.__hash__   s    T^TX.///r%   c                      |             duS )z'Whether we are still a valid reference.N rA   s    r   __nonzero__zBoundMethodWeakref.__nonzero__   s    tvvT!!r%   c                     t          || j                  s't          j        | j        t	          |                    S t          j        | j        |j                  S )zCompare with another reference.)
isinstancer$   operatoreqtyper!   )r1   others     r   __eq__zBoundMethodWeakref.__eq__   sF    %00 	<;t~tE{{;;;{48UY///r%   c                     |                                  }|+|                                 }||                    |          S dS )a?  Return a strong reference to the bound method.

        If the target cannot be retrieved, then will return None,
        otherwise returns a bound instance method for our object and
        function.

        Note: You may call this method any number of times, as it does
        not invalidate the reference.
        N)r7   r8   __get__)r1   r   r3   s      r   __call__zBoundMethodWeakref.__call__   sG     !!~~''H#''///tr%   rD   )r;   
__module____qualname____doc__r   WeakValueDictionaryr   r   r   classmethodr   rB   __repr__rF   rI   rP   rS   __classcell__)r$   s   @r   r   r   M   s         B 1W022N     ,./ ./ ./ ./` < < [<
 
 
 H0 0 0" " "0 0 0      r%   r   rD   )
rV   rL   r-   r+   r   
attrgetterr	   r6   r   r   rH   r%   r   <module>r\      s   F 4 3  



      8z**8z**   >Y Y Y Y Y Y Y Y Y Yr%   