zfc@sdZddlmZdddddgZiZddZd Zye Wne k ranXd Z ee e e d Z dZ dZdZdZiZiZiZdZdZdZdS(sHelper to provide extensibility for pickle/cPickle. This is only useful to add pickle support for extension types defined in C, not for instances of user-defined classes. i(t ClassTypetpicklet constructort add_extensiontremove_extensiontclear_extension_cachecCsft|tkr!tdnt|ds?tdn|t|<|dk rbt|ndS(Ns-copy_reg is not intended for use with classest__call__s$reduction functions must be callable(ttypet _ClassTypet TypeErrorthasattrtdispatch_tabletNoneR(tob_typetpickle_functiontconstructor_ob((s /usr/lib64/python2.7/copy_reg.pyRs  cCs"t|dstdndS(NRsconstructors must be callable(R R (tobject((s /usr/lib64/python2.7/copy_reg.pyRscCst|j|jffS(N(tcomplextrealtimag(tc((s /usr/lib64/python2.7/copy_reg.pytpickle_complex'scCsY|tkrtj|}n7|j||}|jtjkrU|j||n|S(N(Rt__new__t__init__(tclstbasetstatetobj((s /usr/lib64/python2.7/copy_reg.pyt_reconstructor.s  ii cCs8|dkstx;|jjD]'}t|dr|jt@ rPqqWt}|tkred}n.||jkrtd|j n||}|j||f}y |j }WnYt k r t |ddrtdny |j }Wqt k r d}qXn X|}|r*t||fSt|fSdS(Nit __flags__scan't pickle %s objectst __slots__sNa class that defines __slots__ without defining __getstate__ cannot be pickled(tAssertionErrort __class__t__mro__R Rt _HEAPTYPERR R t__name__t __getstate__tAttributeErrortgetattrt__dict__R(tselftprotoRRtargstgetstatetdict((s /usr/lib64/python2.7/copy_reg.pyt _reduce_ex;s0         cGs|j||S(N(R(RR*((s /usr/lib64/python2.7/copy_reg.pyt __newobj__\scCs4|jjd}|dk r"|Sg}t|ds:nx|jD]}d|jkrD|jd}t|tr|f}nx|D]}|d krqq|jdr|jd r|j j d}|r|j d||fq|j |q|j |qWqDqDWy ||_ WnnX|S( sReturn a list of slot names for a given class. This needs to find slots defined by the class and its bases, so we can't simply return the __slots__ attribute. We must walk down the Method Resolution Order and concatenate the __slots__ of each class found there. (This assumes classes don't modify their __slots__ attribute to misrepresent their slots after the class is defined.) t __slotnames__RR't __weakref__t__t_s_%s%sN(R'R0( R'tgetR R R!t isinstancet basestringt startswithtendswithR#tlstriptappendR/(RtnamesRtslotstnametstripped((s /usr/lib64/python2.7/copy_reg.pyt _slotnames_s2       cCst|}d|ko#dkns4tdn||f}tj||krntj||krndS|tkrtd|t|fn|tkrtd|t|fn|t|<|t|RARBRFRRR(((s /usr/lib64/python2.7/copy_reg.pyts.     !  <