
    m                     L    S r SSKJr  SSKrSSKrSSKJr  S/r " S S\5      r	g)z
backports.finalize
~~~~~~~~~~~~~~~~~~

Backports the Python 3 ``weakref.finalize`` method. Copied with few
modifications from the CPython implementation:
https://github.com/python/cpython/blob/main/Lib/weakref.py.
    )absolute_importN)refbackport_finalizec                       \ rS rSrSrSr0 rSr\R                  " 5       r
SrSr " S S\5      rS rSS	 jrS
 rS r\S 5       r\S 5       r\R,                  S 5       rS r\S 5       r\S 5       rSrg)r      a  Class for finalization of weakrefable objects
finalize(obj, func, *args, **kwargs) returns a callable finalizer
object which will be called when obj is garbage collected. The
first time the finalizer is called it evaluates func(*arg, **kwargs)
and returns the result. After this the finalizer is dead, and
calling it just returns None.
When the program exits any remaining finalizers for which the
atexit attribute is true will be run in reverse order of creation.
By default atexit is true.
 Fc                       \ rS rSrSrSrg)backport_finalize._Info+   )weakreffuncargskwargsatexitindexr   N)__name__
__module____qualname____firstlineno__	__slots____static_attributes__r       >platform/bq/third_party/urllib3/packages/backports/finalize.py_Infor
   +   s    L	r   r   c                 f   U R                   (       d*  SS KnUR                  U R                  5        S[        l         U R                  5       n[        X5      Ul        X&l        X6l	        U=(       d    S Ul
        SUl        [        U R                  5      Ul        X`R                  U '   S[        l        g )Nr   T)_registered_with_atexitr   register	_exitfuncr   r   r   r   r   r   r   next_index_iterr   	_registry_dirty)selfobjr   r   r   r   infos          r   __init__backport_finalize.__init__.   s    ++ OODNN+8<5zz|3~		n$**+
#t#' r   Nc                     U R                   R                  U S5      nU(       aA  U R                  (       d/  UR                  " UR                  0 UR
                  =(       d    0 D6$ gg)zRIf alive then mark as dead and return func(*args, **kwargs);
otherwise return NoneN)r!   pop	_shutdownr   r   r   )r#   _r%   s      r   __call__backport_finalize.__call__?   sK     ~~!!$-99dii?DKK,=2?? '4r   c                    U R                   R                  U 5      nU=(       a    UR                  5       nUbN  U R                   R                  U S5      (       a,  X!R                  UR
                  UR                  =(       d    0 4$ gg)zVIf alive then mark as dead and return (obj, func, args, kwargs);
otherwise return NoneN)r!   getr   r)   r   r   r   r#   r%   r$   s      r   detachbackport_finalize.detachF   sh     ~~!!$'%t||~?t~~11$==DIIt{{/@bAA  >?r   c                     U R                   R                  U 5      nU=(       a    UR                  5       nUb,  X!R                  UR                  UR
                  =(       d    0 4$ g)zEIf alive then return (obj, func, args, kwargs);
otherwise return NoneN)r!   r/   r   r   r   r   r0   s      r   peekbackport_finalize.peekN   sP     ~~!!$'%t||~?DIIt{{/@bAA r   c                     X R                   ;   $ )zWhether finalizer is alive)r!   )r#   s    r   alivebackport_finalize.aliveV   s     ~~%%r   c                 t    U R                   R                  U 5      n[        U5      =(       a    UR                  $ )z*Whether finalizer should be called at exitr!   r/   boolr   )r#   r%   s     r   r   backport_finalize.atexit[   s+     ~~!!$'Dz)dkk)r   c                 j    U R                   R                  U 5      nU(       a  [        U5      Ul        g g Nr:   )r#   valuer%   s      r   r   r<   a   s)    ~~!!$'u+DK r   c                 8   U R                   R                  U 5      nU=(       a    UR                  5       nUc#  S[        U 5      R                  [        U 5      4-  $ S[        U 5      R                  [        U 5      [        U5      R                  [        U5      4-  $ )Nz<%s object at %#x; dead>z!<%s object at %#x; for %r at %#x>)r!   r/   r   typer   idr0   s      r   __repr__backport_finalize.__repr__g   s    ~~!!$'%t||~;-d1D1Dbh0OOO6T
##4S	""3	:  r   c                     U R                   R                  5        VVs/ s H  u  pUR                  (       d  M  X4PM     nnnUR                  S S9  U VVs/ s H  u  pUPM	     snn$ s  snnf s  snnf )Nc                      U S   R                   $ )N   )r   )items    r   <lambda>4backport_finalize._select_for_exit.<locals>.<lambda>x   s    Qr   )key)r!   itemsr   sort)clsfiLs       r   _select_for_exit"backport_finalize._select_for_exitt   sb     #&--"5"5"7D"7188VaV"7D	-. !"fq"" E"s   A*A*A0c                 V   Sn U R                   (       a  SS KnUR                  5       (       a  SnUR                  5         S n Ub  [        R
                  (       a  U R                  5       nS[        l        U(       d  O+UR                  5       n U" 5         X@R                   ;  d   eMf  S[        l        U(       a  WR                  5         g g ! [         a)    [        R                  " [        R                  " 5       6    Nif = f! S[        l        U(       a  WR                  5         f f = f)NFr   T)r!   gc	isenableddisabler   r"   rR   r)   	Exceptionsys
excepthookexc_infor*   enable)rN   reenable_gcrU   pendingrO   s        r   r   backport_finalize._exitfunc{   s    
 	}}<<>>"&KJJL*;*B*B"%"6"6"838)0"A8
  MM111 $ +/'		  % 878
 +/'		 s0   B
D C D 0D =D ?D  D %D(r>   )r   r   r   r   __doc__r   r!   r*   	itertoolscountr    r"   r   objectr   r&   r,   r1   r4   propertyr7   r   setterrC   classmethodrR   r   r   r   r   r   r   r      s    	 III//#KF#M M("@BB & & * *
 ]]& &
 # #    r   )
r`   
__future__r   ra   rY   r   r   __all__rc   r   r   r   r   <module>ri      s.    '  
 
H Hr   