ó
¥¾Yc           @@  sa   d  Z  d d l m Z d d l Z d d l Z d d l m Z d g Z d e f d „  ƒ  YZ	 d S(   sŒ   
Partial backport of Python 3.6's weakref module:

    finalize (new in Python 3.4)

Backport modifications are marked with "XXX backport".
i    (   t   absolute_importN(   t   reft   finalizec           B@  sÌ   e  Z d  Z d Z i  Z e Z e j ƒ  Z	 e Z
 e Z d e f d „  ƒ  YZ d „  Z d d „ Z d „  Z d „  Z e d „  ƒ Z e d „  ƒ Z e j d	 „  ƒ Z d
 „  Z e d „  ƒ Z e d „  ƒ Z RS(   s  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.
    t   _Infoc           B@  s   e  Z d Z RS(   t   weakreft   funct   argst   kwargst   atexitt   index(   R   R   R   R   R   R	   (   t   __name__t
   __module__t	   __slots__(    (    (    s0   lib/python2.7/site-packages/backports/weakref.pyR   *   s   c         O@  s¥   |  j  s1 d d  l } | j |  j ƒ t t _  n  |  j ƒ  } t | |  ƒ | _ | | _	 | | _
 | pj d  | _ t | _ t |  j ƒ | _ | |  j |  <t t _ d  S(   Ni    (   t   _registered_with_atexitR   t   registert	   _exitfunct   TrueR   R   R   R   R   R   t   NoneR   t   nextt   _index_iterR	   t	   _registryt   _dirty(   t   selft   objR   R   R   R   t   info(    (    s0   lib/python2.7/site-packages/backports/weakref.pyt   __init__-   s    				c         C@  sE   |  j  j |  d ƒ } | rA |  j rA | j | j | j p= i  Ž  Sd S(   sZ   If alive then mark as dead and return func(*args, **kwargs);
        otherwise return NoneN(   R   t   popR   t	   _shutdownR   R   R   (   R   t   _R   (    (    s0   lib/python2.7/site-packages/backports/weakref.pyt   __call__>   s    c         C@  sh   |  j  j |  ƒ } | o! | j ƒ  } | d k	 rd |  j  j |  d ƒ rd | | j | j | j p` i  f Sd S(   s^   If alive then mark as dead and return (obj, func, args, kwargs);
        otherwise return NoneN(   R   t   getR   R   R   R   R   R   (   R   R   R   (    (    s0   lib/python2.7/site-packages/backports/weakref.pyt   detachE   s    !c         C@  sS   |  j  j |  ƒ } | o! | j ƒ  } | d k	 rO | | j | j | j pK i  f Sd S(   sM   If alive then return (obj, func, args, kwargs);
        otherwise return NoneN(   R   R   R   R   R   R   R   (   R   R   R   (    (    s0   lib/python2.7/site-packages/backports/weakref.pyt   peekM   s    c         C@  s   |  |  j  k S(   s   Whether finalizer is alive(   R   (   R   (    (    s0   lib/python2.7/site-packages/backports/weakref.pyt   aliveU   s    c         C@  s%   |  j  j |  ƒ } t | ƒ o$ | j S(   s*   Whether finalizer should be called at exit(   R   R   t   boolR   (   R   R   (    (    s0   lib/python2.7/site-packages/backports/weakref.pyR   Z   s    c         C@  s.   |  j  j |  ƒ } | r* t | ƒ | _ n  d  S(   N(   R   R   R"   R   (   R   t   valueR   (    (    s0   lib/python2.7/site-packages/backports/weakref.pyR   `   s    c         C@  sƒ   |  j  j |  ƒ } | o! | j ƒ  } | d  k rM d t |  ƒ j t |  ƒ f Sd t |  ƒ j t |  ƒ t | ƒ j t | ƒ f Sd  S(   Ns   <%s object at %#x; dead>s!   <%s object at %#x; for %r at %#x>(   R   R   R   R   t   typeR
   t   id(   R   R   R   (    (    s0   lib/python2.7/site-packages/backports/weakref.pyt   __repr__f   s    c         C@  sg   g  |  j  j ƒ  D]! \ } } | j r | | f ^ q } | j d d „  ƒ g  | D] \ } } | ^ qQ S(   Nt   keyc         S@  s   |  d j  S(   Ni   (   R	   (   t   item(    (    s0   lib/python2.7/site-packages/backports/weakref.pyt   <lambda>s   t    (   R   t   itemsR   t   sort(   t   clst   ft   it   L(    (    s0   lib/python2.7/site-packages/backports/weakref.pyt   _select_for_exito   s    7c         C@  s  t  } zØ |  j rÝ d d  l } | j ƒ  r= t } | j ƒ  n  d  } x— t rÙ | d  k sa t j ry |  j	 ƒ  } t  t _ n  | sƒ Pn  | j
 ƒ  } y | ƒ  Wn$ t k
 rÀ t j t j ƒ  Œ  n X| |  j k sF t ‚ qF Wn  Wd  t t _ | rý | j ƒ  n  Xd  S(   Ni    (   t   FalseR   t   gct	   isenabledR   t   disableR   R   R   R1   R   t	   Exceptiont   syst
   excepthookt   exc_infot   AssertionErrorR   t   enable(   R-   t   reenable_gcR3   t   pendingR.   (    (    s0   lib/python2.7/site-packages/backports/weakref.pyR   v   s.    		 	(    N(   R
   R   t   __doc__R   R   R2   R   t	   itertoolst   countR   R   R   t   objectR   R   R   R   R   R    t   propertyR!   R   t   setterR&   t   classmethodR1   R   (    (    (    s0   lib/python2.7/site-packages/backports/weakref.pyR      s$   					(
   R>   t
   __future__R    R?   R7   R   R   t   __all__RA   R   (    (    (    s0   lib/python2.7/site-packages/backports/weakref.pyt   <module>   s   	