
    ϪfG                        d Z ddlZddlZddlZddlmZ ddlmZm	Z	 ddl
mZ ddlmZ  G d d	      Z G d
 de      Z G d de      Z G d de      Z G d d      Z G d d      Z e       Zeeeeee ed      e ee      g	Z G d d      Z  G d d      Z! G d d      Z" G d d      Z#d Z$ G d de%      Z& ejN                  d      Z(d  Z)d! Z*d" Z+d# Z,d$ Z- G d% d&      Z.d' Z/d.d(Z0d) Z1d* Z2d+ Z3 G d, d-      Z4y)/z|
AOT: Abstract Object Trees
The source-code-marshallin'est abstract-object-serializin'est persister
this side of Marmalade!
    N)crefutil)logreflect)_constructMethod   )generate_tokensc                       e Zd Zd Zy)Namedc                     || _         y Nname)selfr   s     7/usr/lib/python3/dist-packages/twisted/persisted/aot.py__init__zNamed.__init__"   s	    	    N)__name__
__module____qualname__r    r   r   r
   r
   !   s    r   r
   c                       e Zd Zd Zy)Classc                      d| j                   z  S )Nz	Class(%r)r   r   s    r   	getSourcezClass.getSource'   s    TYY&&r   Nr   r   r   r   r   r   r   r   r   &   s    'r   r   c                       e Zd Zd Zy)Functionc                      d| j                   z  S )NzFunction(%r)r   r   s    r   r   zFunction.getSource,   s    		))r   Nr   r   r   r   r   r   +   s    *r   r   c                       e Zd Zd Zy)Modulec                      d| j                   z  S )Nz
Module(%r)r   r   s    r   r   zModule.getSource1   s    dii''r   Nr   r   r   r   r!   r!   0   s    (r   r!   c                       e Zd Zd Zd Zy)InstanceMethodc                     t        |t              s.t        |t              st        |t              st	        d|z        || _        || _        || _        y )Nz$%s isn't an Instance, Ref, or Deref!)
isinstanceRefInstanceDeref	TypeErrorr   klassinstance)r   r   r+   insts       r   r   zInstanceMethod.__init__6   sF    tS!$)$&BTIJJ	
r   c                 v    dj                  | j                  | j                  t        | j                              S )Nz InstanceMethod({!r}, {!r}, 
 {}))formatr   r+   prettifyr,   r   s    r   r   zInstanceMethod.getSourceA   s/    3::IIJJT]]#
 	
r   Nr   r   r   r   r   r   r   r   r$   r$   5   s    	
r   r$   c                       e Zd Zy)_NoStateObjN)r   r   r   r   r   r   r3   r3   I   s    r   r3   c                       e Zd ZefdZd Zy)r(   c                     t        |t              st        d|z        || _        |t        ur|| _        d| _        y || _        d| _        y )Nz%s isn't a string!r   r   )r&   strr*   r+   
NoStateObjstatestateIsDict)r   	className__stateObj__r8   s       r   r   zInstance.__init__]   sJ    )S)09<==
z)%DJ DDJ Dr   c                    | j                   r| j                  }nWt        | j                  t              r;t        | j                  j                  t
              r| j                  j                  }nd }|	 d| j                  dt        |       dS d| j                  dt        | j                         dS # t        $ r d| j                  dt        |       dcY S w xY w)Nz	Instance(, ))
r9   r8   r&   r'   objdictr+   dictToKWNonFormattableDictr0   )r   	stateDicts     r   r   zInstance.getSourceh   s    

I

C(Z

-M

II J"4::.8I3F2GqII 4::.8DJJ+?*@BB & J"4::.8I3F2GqIIJs   4B6 6%CCN)r   r   r   r7   r   r   r   r   r   r(   r(   \   s    /9 	!Cr   r(   c                   $    e Zd Zd Zd Zd Zd Zy)r'   c                 l    t        |      dk(  r|d   | _        |d   | _        y |sd | _        d | _        y y )N   r   r   )lenrefnumr?   )r   argss     r   r   zRef.__init__y   s9    t9>q'DKAwDHDKDH r   c                 `    | j                   rt        d| d| j                          || _         y )NzError setting id , I already have )rH   
ValueErrorr   nums     r   setRefz
Ref.setRef   s.    ;;05Ft{{mTUUr   c                 `    | j                   rt        d| d| j                          || _         y )NzError setting obj rK   )r?   rL   )r   r?   s     r   setObjz
Ref.setObj   s.    881#6GzRSSr   c                     | j                   t        d      | j                  r$d| j                  t        | j                         fz  S t        | j                         S )Nz7Don't try to display me before setting an object on me!zRef(%d, 
 %s))r?   RuntimeErrorrH   r0   r   s    r   r   zRef.getSource   sQ    88I  ;;$Xdhh5G'HHH!!r   N)r   r   r   r   rO   rQ   r   r   r   r   r'   r'   x   s    

"r   r'   c                       e Zd Zd Zd ZeZy)r)   c                     || _         y r   rH   rM   s     r   r   zDeref.__init__   s	    r   c                      d| j                   z  S )Nz	Deref(%d)rV   r   s    r   r   zDeref.getSource   s    T[[((r   N)r   r   r   r   r   __repr__r   r   r   r)   r)      s    ) Hr   r)   c                       e Zd Zd Zd Zy)Copyregc                      || _         || _        y r   )loadfuncr8   )r   r\   r8   s      r   r   zCopyreg.__init__   s     
r   c                 N    d| j                   dt        | j                         dS )NzCopyreg(r=   r>   )r\   r0   r8   r   s    r   r   zCopyreg.getSource   s&    $--*"Xdjj-A,B!DDr   Nr1   r   r   r   rZ   rZ      s    Er   rZ   c                 0    t        dt        |       z         S )zDPass me an AO, I'll return a nicely-formatted source representation.zapp = )	indentifyr0   )aos    r   r   r      s    X,--r   c                       e Zd ZdZy)rB   z!A dictionary was not formattable.N)r   r   r   __doc__r   r   r   rB   rB      s    +r   rB   z[a-zA-Z_][a-zA-Z0-9_]*$c           	      R   g }t        | j                               }|j                          |D ]g  \  }}t        |t              st        d|z        t        j                  |      st        d|z        |j                  d| dt        |       d       i dj                  |      S )Nz%r ain't a stringz%r ain't an identifier
 =, )listitemssortr&   r6   rB   rmatchappendr0   join)doutri   kvs        r   rA   rA      s    
COE	JJL .1!S!$%81%<==wwqz$%=%ABB

T!Ahqk]!,-. 773<r   c           	      "   t        | d      r| j                         S t        |       }|t        v rt	        |       S |t
        u rxdg}| j                         D ]/  \  }}|j                  dt        |       dt        |       d       1 |j                  t        |       xr dxs d       dj                  |      S |t        u rZd	g}| D ]  }|j                  d
t        |      z         ! |j                  t        |       xr dxs d       dj                  |      S |t        u rZdg}| D ]  }|j                  d
t        |      z         ! |j                  t        |       xr dxs d       dj                  |      S t        d| d|  d      )Nr   {rd   z: rf   z
 }}rg   [z
 %s,z
 ]](z
 )r>   zUnsupported type z when trying to prettify .)hasattrr   type_SIMPLE_BUILTINSreprr@   ri   rm   r0   rG   rn   rh   tupler*   )r?   trp   rq   rr   xs         r   r0   r0      s{   sK }} I  9$Y%C		 A1

T(1+b!Q?@AJJs3x+G2s3773<$Y%C 4

9x{234JJs3x+G2s3773<%Z%C 4

9x{234JJs3x+G2s3773</s2KC5PQRSSr   c                 <   g }g }d| g}t        |j                        D ]l  \  }}\  }}\  }}	}
|dv r|j                  |       n|dv r|j                          |dk(  r|j                  dt        |      z         \|j                  |       n dj	                  |      S )Nrg   )rv   rx   rt   )rw   r>   ru    z  )tokenizepoprm   rG   rn   )srp   stackl	tokenTypetokenStringstartRowstartColumnendRow	endColumnlogicalLines              r   r_   r_      s    
CE	QA 
!%%$ 	;/)LL%O+IIK$JJtc%j()JJ{#$ 773<r   c                 4    t               j                  |       S )zG
    Pass me an Abstract Object Tree, and I'll unjelly it for you.
    )AOTUnjellierunjelly)aots    r   unjellyFromAOTr     s     >!!#&&r   c           	      
   t         t        t        t        t        t
        t        t        d}t        | d      r| j                         }n| }t        |dd      }t        |||       d|v rt        |d         S t        d| z        )z
    Pass me a string of code or a filename that defines an 'app' variable (in
    terms of Abstract Objects!), and I'll execute it and unjelly the resulting
    AOT for you, returning a newly unpersisted Application object!
    )r(   r$   r   r   r!   r'   r)   rZ   readz<source>execappz'%s needs to define an 'app', it didn't!)r(   r$   r   r   r!   r'   r)   rZ   rz   r   compileevalr   rL   )stringOrFilenssourcecodes       r   unjellyFromSourcer     s     (	
B |V$""$6:v.Dr2{bi((B\QRRr   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
r   zWI handle the unjellying of an Abstract Object Tree.
    See AOTUnjellier.unjellyAO
    c                 .    i | _         g | _        g | _        y r   )
referencesr   afterUnjellyr   s    r   r   zAOTUnjellier.__init__/  s    
r   c                 T    t        j                         }| j                  |d|       |S )zUnjelly a node, later.r   )r   _DeferunjellyInto)r   nodero   s      r   unjellyLaterzAOTUnjellier.unjellyLater7  s%    OOAt$r   c                     | j                  |      }|||<   t        |t        j                        r|j	                  ||       |S )zvUtility method for unjellying one object into another.
        This automates the handling of backreferences.
        )	unjellyAOr&   r   NotKnownaddDependant)r   r?   locr`   os        r   r   zAOTUnjellier.unjellyInto=  s>     NN2Ca**+NN3$r   c                     t        |t        j                        rd g}|j                  |d       n|g}| j                  j                  ||f       y )Nr   )r&   r   r   r   r   rm   )r   callableresult
listResults       r   	callAfterzAOTUnjellier.callAfterG  sI    fh//0J
A. J  (J!78r   c                 >    | j                  |j                  ||       y)zUtility method for unjellying into instances of attributes.

        Use this rather than unjellyAO unless you like surprising bugs!
        Alternatively, you can use unjellyInto on your instance's __dict__.
        N)r   __dict__)r   r,   attrNamer`   s       r   unjellyAttributezAOTUnjellier.unjellyAttributeO  s     	**Hb9r   c           	      	   | j                   j                  |       t        |      }|t        v r|S |t        u r;g }|D ]2  }|j                  d       | j                  |t        |      dz
  |       4 |S |t        u rpg }t        }|D ][  }|j                  d       t        | j                  |t        |      dz
  |      t        j                        sLt        j                  }]  ||      S |t        u rWi }|j                         D ]@  \  }}t        j                  |      }	| j                  |	d|       | j                  |	d|       B |S |j                  }
|
t         u rt#        j$                  |j&                        S |
t(        t*        fv st-        |
t              rt#        j.                  |j&                        S |
t0        u r|j&                  }t#        j.                  |j2                        }| j5                  |j6                        }||j8                  v rL|t;        ||      S t        |t        j                        rt        j<                  |||      S t?        |||      S tA        d      |
tB        u rt#        j.                  |j2                        }| j5                  |jD                        }|jG                  |      }tI        |d      r| jK                  |jL                  |       |S t        |t              r	||_        |S |jO                         |_        |S |
tP        u r| j5                  |jR                        }|jT                  }| jV                  jY                  |      }||| jV                  |<   |S t        |t        j                        r"|j[                  |       || jV                  |<   |S |	 |S t]        d|d|d|d      |
t^        u rQ|jT                  }| jV                  jY                  |      }|&t        j`                  |      }|| jV                  |<   |S |S |
tb        u rMt#        j.                  |jd                        }| jg                  |jD                        ji                  d	 |      }|S tA        d
|z        )zaUnjelly an Abstract Object and everything it contains.
        I return the real object.
        Nr   r   zinstance method changed__setstate__z&Multiple references with the same ID: r=   !c                      ||  S r   r   )r   _ls     r   <lambda>z(AOTUnjellier.unjellyAO.<locals>.<lambda>  s
    r6{ r   zUnsupported AOT type: %s)5r   rm   r{   r|   rh   r   rG   r~   r&   r   r   _Tupler@   ri   _DictKeyAndValue	__class__r!   r   namedModuler   r   r   
issubclassnamedObjectr$   r+   r   r,   r   getattr_InstanceMethodr   r*   r(   r8   __new__rz   r   r   __getstate__r'   r?   rH   r   getresolveDependantsrL   r)   _DereferencerZ   r\   r   addCallback)r   r`   r   r   r   tuple_ro   rq   rr   kvdcim_nameim_classim_selfr+   r8   r-   r   refkeyrefrN   derr\   s                          r   r   zAOTUnjellier.unjellyAOX  s    	

"H  I$YA 3  CFQJ23 H%ZAF -d..q#a&1*a@(BSBST%__F- !9$YA
 ,1//2  a+  a+, H AF{**27733uh'':a+>**27733n$''"..rxx8..5h///&x99#GX->->?'77(SS/'7KK#$=>>h++BHH5rxx0}}U+5.1NN4#4#4e<
 	  t,$)DM  %*$6$6$8DMcNN266*oo))&1;./DOOF+   X%6%67))!,./DOOF+  ^ 	 %,  eiioo))#.;"//4C+.DOOC(J
g"..r{{;%%bhh/;;2H  :Q >??r   c           	      6   	 d g}| j                  |d|       | j                  D ]  \  }} ||d           |d   S # t        $ rS t        j                  d       t        j                  dj                  t        t        | j                                      w xY w)Nr   +Error jellying object! Stacktrace follows::
)	r   r   BaseExceptionr   msgrn   mapr}   r   )r   r`   r   funcrr   s        r   r   zAOTUnjellier.unjelly  s    		AQ2&,, aQqT
Q4K 	GGABGGDIIc$

345	s
   9< ABN)r   r   r   rb   r   r   r   r   r   r   r   r   r   r   r   r   *  s-    9:f@P
r   r   c                 4    t               j                  |       S )z-Convert an object to an Abstract Object Tree.)
AOTJellierjelly)r?   s    r   
jellyToAOTr     s    <c""r   c                     t        |       }|r*|j                  t        |      j                  d             yt        |      S )z
    Pass me an object and, optionally, a file object.
    I'll convert the object to an AOT either return it (if no file was
    specified) or write it to the file.
    zutf-8N)r   writer   encode)r?   filer   s      r   jellyToSourcer     s5     S/C

9S>((12~r   c                 .    | j                   j                  S )z
    Get the associated class of the given method object.

    @param methodObject: a bound method
    @type methodObject: L{types.MethodType}

    @return: a class
    @rtype: L{type}
    )__self__r   methodObjects    r   _classOfMethodr     s       ***r   c                     | j                   S )z
    Get the associated function of the given method object.

    @param methodObject: a bound method
    @type methodObject: L{types.MethodType}

    @return: the function implementing C{methodObject}
    @rtype: L{types.FunctionType}
    )__func__r   s    r   _funcOfMethodr             r   c                     | j                   S )z
    Get the object that a bound method is bound to.

    @param methodObject: a bound method
    @type methodObject: L{types.MethodType}

    @return: the C{self} passed to C{methodObject}
    @rtype: L{object}
    )r   r   s    r   _selfOfMethodr     r   r   c                   $    e Zd Zd Zd Zd Zd Zy)r   c                 .    i | _         d| _        g | _        y )Nr   )prepared_ref_idr   r   s    r   r   zAOTJellier.__init__  s    
r   c                 4    || j                   t        |      <   y)zaI prepare an object for later referencing, by storing its id()
        and its _AORef in a cache.N)r   id)r   aorefobjects      r   prepareForRefzAOTJellier.prepareForRef  s     %*bj!r   c           	      &    t              } j                  j                  t                     |t        v rn@t        |t        j                        rVt        t              j                  t        j                  t                     j                  t                          nt        |t        j                         rt#        j                        nt        |t               r t%        t        j                              no|t        j&                  u r t)        t        j*                              n=t-               j.                  v rw j.                  t-                 }|j0                  r|j0                  }t7        |      S  j2                  dz    _         j2                  }|j5                  |       t7        |      S t9                fd} j;                         |t<        u r0j?                  D cg c]  } j                  |       c}       nT|t@        u r0j?                  tA        tC         j                                     n|tD        u rOi }jG                         D ](  \  }}	 j                  |	      | j                  |      <   * j?                  |       n|tH        jJ                  v rYtI        jJ                  |         \  }
}j?                  tM        t        j*                  |
       j                  |                   nZtO        d      r |jQ                                n7tO        d      r |jR                         ntU        d|j                  z         j                  d= S c c}w )z+I turn an object into an AOT and return it.r   c                     j                  t        t        j                  j                        j                  |                    y r   )rQ   r(   r   qualr   	jellyToAO)r8   r?   retvalr   s    r   
_stateFromz(AOTJellier.jellyToAO.<locals>._stateFromL  s/    W\\#--8$..:OPr   r   r   zUnsupported type: %s)+r{   r   rm   r}   r|   r   types
MethodTyper$   r   r   r   r   r   r   r   
ModuleTyper!   r   FunctionTyper   fullFuncNamer   r   rH   r   rO   r)   r'   r   rh   rQ   r~   r   r@   ri   copy_regdispatch_tablerZ   rz   r   r   r*   )r   r?   objTypeoldRefkeyr   r   ro   rq   rr   unpickleFuncr8   r   s   ``          @r   r   zAOTJellier.jellyToAO  s   s)

$s)$ &&F!1!12 $c"++^C01}S12F !1!12CLL)F&7<<,-F***g22378F #w$--'r#w/== --C Sz! $(<<!#3DL,,CMM#&Sz!UF
 vs+$#>Qt~~a0>?E!eC$<=>DIIK =DAq+/>>!+<AdnnQ'(=a H333&.&=&=g&Fs&K#eG00>u@UV n-3++-.j)3<<( 69I9I IJJJJrN5 ?s   
Nc                     	 | j                  |      }|S # t        $ rE t        j                  d       t        j                  dj	                  | j
                                w xY w)Nr   r   )r   r   r   r   rn   r   )r   r?   r`   s      r   r   zAOTJellier.jellyp  sR    	$BI 	GGABGGDIIdjj)*	s
    AA#N)r   r   r   r   r   r   r   r   r   r   r   r     s    *
Vpr   r   r   )5rb   copyregr  rer   twisted.persistedr   twisted.pythonr   r   twisted.python.compatr   	_tokenizer   r   r
   r   r   r!   r$   r3   r7   boolbytesr6   intfloatcomplexr{   sliceEllipsisr|   r(   r'   r)   rZ   r   	ExceptionrB   r   rk   rA   r0   r_   r   r   r   r   r   r   r   r   r   r   r   r   <module>r     s9    	  & ' 2 3 
'E '
*u *
(U (

 
(	 	 ]
 			J	N
 C C8" "< E E.
, , BJJ()
TD6'S>` `P#

+
!
!k kr   