HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //home/arjun/projects/env/lib/python3.10/site-packages/blinker/__pycache__/_saferef.cpython-310.pyc
o

!we�#�@sTdZddlZddlZddlZddlZe�d�Ze�d�Zd	dd�ZGdd�d�Z	dS)
z-Refactored 'safe reference from dispatcher.py�N�__self__�__func__cCs�zt|�}Wnty t|�rt�||�YSt�|�YSw|dur?t|d�s7t|d�s7Jd|�d���t||d�}|SdS)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_funcrzsafe_ref target z@ has im_self, but no im_func, don't know how to create reference)�target�	on_delete)�get_self�AttributeError�callable�weakref�ref�hasattr�BoundMethodWeakref)rr�im_self�	reference�r�I/home/arjun/projects/env/lib/python3.10/site-packages/blinker/_saferef.py�safe_ref.s�
��rcsleZdZdZe��Zd�fdd�	Zddd�Ze	dd��Z
d	d
�ZeZdd�Z
d
d�Zdd�Zdd�Z�ZS)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.
    Ncsb|�|�}|j�|�}|dur|j�|�|St��|�}||j|<|j||g|�Ri|��|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.
        N)�
calculate_key�_all_instances�get�deletion_methods�append�super�__new__�__init__)�clsrr�	arguments�named�key�current�base��	__class__rrrqs

zBoundMethodWeakref.__new__cCsf|fdd�}|g|_|�|�|_t|�}t|�}t�||�|_t�||�|_t	|�|_
t	|j�|_dS)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.
        cSs�|jdd�}|jdd�=z|jj|j=Wn	tyYnw|D]8}z
t|�r,||�Wq!tyYzt��Wnt	yVt
��d}td|�d|�d|���YnwYq!wdS)z=Set self.isDead to True when method or instance is destroyed.N�zException during saferef z cleanup function z: )
rr"rr�KeyErrorr	�	Exception�	traceback�	print_excr�sys�exc_info�print)�weak�self�methods�function�errr�remove�s8���������z+BoundMethodWeakref.__init__.<locals>.removeN)
rrrr�get_funcr
r�	weak_self�	weak_func�str�	self_name�__name__�	func_name)r,rrr0rrrrrr�s
zBoundMethodWeakref.__init__cCstt|��tt|��fS)z�Calculate 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.
        )�idrr1)rrrrrr�sz BoundMethodWeakref.calculate_keycCsd�|jj|j|j�S)z-Give a friendly representation of the object.z	{}({}.{}))�formatr"r6r5r7�r,rrr�__str__�s
�zBoundMethodWeakref.__str__cCst|j|jf�S�N)�hashr5rr:rrr�__hash__�szBoundMethodWeakref.__hash__cCs
|�duS)z'Whether we are still a valid reference.Nrr:rrr�__nonzero__�s
zBoundMethodWeakref.__nonzero__cCs.t||j�st�|jt|��St�|j|j�S)zCompare with another reference.)�
isinstancer"�operator�eq�typer)r,�otherrrr�__eq__�szBoundMethodWeakref.__eq__cCs.|��}|dur|��}|dur|�|�SdS)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)r2r3�__get__)r,rr.rrr�__call__�s

zBoundMethodWeakref.__call__r<)r6�
__module__�__qualname__�__doc__r
�WeakValueDictionaryrrr�classmethodrr;�__repr__r>r?rErG�
__classcell__rrr!rr
Ms!
0
r
r<)
rJrAr(r&r
�
attrgetterrr1rr
rrrr�<module>s"