
    \dF                     b   d Z ddlZddlZddlZddlmZ ddlmZ ddl	m
Z
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j&        d          Z'd Z(d  Z)d! Z*d" Z+d# Z, G d$ d%          Z-d& Z.d-d'Z/d( Z0d) Z1d* Z2 G d+ d,          Z3dS ).z|
AOT: Abstract Object Trees
The source-code-marshallin'est abstract-object-serializin'est persister
this side of Marmalade!
    N)generate_tokens)crefutil)logreflect)_constructMethodc                       e Zd Zd ZdS )Namedc                     || _         d S Nname)selfr   s     5lib/python3.11/site-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dS )Classc                     d| j         z  S )Nz	Class(%r)r   r   s    r   	getSourcezClass.getSource$   s    TY&&r   Nr   r   r   r   r   r   r   r   r   #   s#        ' ' ' ' 'r   r   c                       e Zd Zd ZdS )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dS )Modulec                     d| j         z  S )Nz
Module(%r)r   r   s    r   r   zModule.getSource.   s    di''r   Nr   r   r   r   r    r    -   s#        ( ( ( ( (r   r    c                       e Zd Zd Zd ZdS )InstanceMethodc                     t          |t                    s<t          |t                    s't          |t                    st	          d|z            || _        || _        || _        d S )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__3   sl    tS!!	K$))	K $&&	K
 BTIJJJ	
r   c                 h    d                     | j        | j        t          | j                            S )Nz InstanceMethod({!r}, {!r}, 
 {}))formatr   r*   prettifyr+   r   s    r   r   zInstanceMethod.getSource>   s1    3::IJT]##
 
 	
r   Nr   r   r   r   r   r   r   r   r#   r#   2   s2        	 	 	
 
 
 
 
r   r#   c                       e Zd ZdS )_NoStateObjN)r   r   r   r   r   r   r2   r2   F   s        Dr   r2   c                       e Zd ZefdZd ZdS )r'   c                     t          |t                    st          d|z            || _        |t          ur|| _        d| _        d S || _        d| _        d S )Nz%s isn't a string!r      )r%   strr)   r*   
NoStateObjstatestateIsDict)r   	className__stateObj__r8   s       r   r   zInstance.__init__Z   sd    )S)) 	>09<===
z))%DJ DDJ Dr   c                    | j         r| j        }nHt          | j        t                    r,t          | j        j        t
                    r| j        j        }nd }|G	 d| j        dt          |           dS # t          $ r d| j        dt          |           dcY S w xY wd| j        dt          | j                   dS )Nz	Instance(, ))
r9   r8   r%   r&   objdictr*   dictToKWNonFormattableDictr/   )r   	stateDicts     r   r   zInstance.getSourcee   s     	
II
C(( 	Z
-M-M 	
III JI4:II8I3F3FIIII% J J JI4:II8I3F3FIIIIIIJB4:BB8DJ+?+?BBBBs   A6 6%BBN)r   r   r   r7   r   r   r   r   r   r'   r'   Y   s?        /9 	! 	! 	! 	!C C C C Cr   r'   c                   &    e Zd Zd Zd Zd Zd ZdS )r&   c                     t          |          dk    r|d         | _        |d         | _        d S |sd | _        d | _        d S d S )N   r   r5   )lenrefnumr?   )r   argss     r   r   zRef.__init__v   sO    t99>>q'DKAwDHHH 	DKDHHH	 	r   c                 V    | j         rt          d| d| j                    || _         d S )NzError setting id , I already have )rH   
ValueErrorr   nums     r   setRefz
Ref.setRef   s9    ; 	VTTTt{TTUUUr   c                 V    | j         rt          d| d| j                    || _         d S )NzError setting obj rK   )r?   rL   )r   r?   s     r   setObjz
Ref.setObj   s9    8 	TR#RRRRS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   r/   r   s    r   r   zRef.getSource   sX    8I   ; 	I$Xdh5G5G'HHH!!!r   N)r   r   r   r   rO   rQ   r   r   r   r   r&   r&   u   sP            
  
" " " " "r   r&   c                       e Zd Zd Zd ZeZdS )r(   c                     || _         d S 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(      s3          ) ) ) HHHr   r(   c                       e Zd Zd Zd ZdS )Copyregc                 "    || _         || _        d S r   )loadfuncr8   )r   r\   r8   s      r   r   zCopyreg.__init__   s     


r   c                 B    d| j         dt          | j                   dS )NzCopyreg(r=   r>   )r\   r/   r8   r   s    r   r   zCopyreg.getSource   s'    D$-DDXdj-A-ADDDDr   Nr0   r   r   r   rZ   rZ      s7          E E E E Er   rZ   c                 @    t          dt          |           z             S )zDPass me an AO, I'll return a nicely-formatted source representation.zapp = )	indentifyr/   )aos    r   r   r      s    X,---r   c                       e Zd ZdZdS )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           	         g }t          |                                           }|                                 |D ]\  }}t          |t                    st          d|z            t                              |          st          d|z            |                    d| dt          |           d           d
                    |          S )Nz%r ain't a stringz%r ain't an identifier
 =, )listitemssortr%   r6   rB   rmatchappendr/   join)doutri   kvs        r   rA   rA      s    
COOE	JJLLL . .1!S!! 	>$%81%<===wwqzz 	C$%=%ABBB

,!,,hqkk,,,----773<<r   c           	         t          | d          r|                                 S t          |           }|t          v rt	          |           S |t
          u rdg}|                                 D ];\  }}|                    dt          |           dt          |           d           <|                    t          |           rdpd           d
                    |          S |t          u rhd	g}| D ]'}|                    d
t          |          z             (|                    t          |           rdpd           d
                    |          S |t          u rhdg}| D ]'}|                    d
t          |          z             (|                    t          |           rdpd           d
                    |          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   r/   rG   rn   rh   tupler)   )r?   trp   rq   rr   xs         r   r/   r/      s   sK   T}} II   99$YY%C		 A A1

?(1++??!???@@@@JJs3xx+G2s333773<<$YY%C 4 4

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

9x{{23333JJs3xx+G2s333773<<RRRCRRRSSSr   c                 h   g }g }d| g}t          |j                  D ]\  }}\  }}\  }}	}
|dv r|                    |           n|dv r|                                 |dk    r&|                    dt          |          z             l|                    |           d                    |          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++IIKKK$JJtc%jj())))JJ{####773<<r   c                 D    t                                          |           S )zG
    Pass me an Abstract Object Tree, and I'll unjelly it for you.
    )AOTUnjellierunjelly)aots    r   unjellyFromAOTr     s     >>!!#&&&r   c           	      P   t           t          t          t          t          t
          t          t          d}t          | d          r| 	                                }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RRr   c                   <    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	S )
r   zWI handle the unjellying of an Abstract Object Tree.
    See AOTUnjellier.unjellyAO
    c                 0    i | _         g | _        g | _        d S r   )
referencesr   afterUnjellyr   s    r   r   zAOTUnjellier.__init__,  s    
r   c                 Z    t          j                    }|                     |d|           |S )zUnjelly a node, later.r   )r   _DeferunjellyInto)r   nodero   s      r   unjellyLaterzAOTUnjellier.unjellyLater4  s,    OAt$$$r   c                     |                      |          }|||<   t          |t          j                  r|                    ||           |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:  sL     NN2Ca*++ 	%NN3$$$r   c                     t          |t          j                  rd g}|                    |d           n|g}| j                            ||f           d S )Nr5   )r%   r   r   r   r   rm   )r   callableresult
listResults       r   	callAfterzAOTUnjellier.callAfterD  s`    fh/00 	"J
A.... J  (J!788888r   c                 >    |                      |j        ||           dS )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.unjellyAttributeL  s%     	*Hb99999r   c           	         | j                             |           t          |          }|t          v r|S |t          u rEg }|D ]>}|                    d           |                     |t          |          dz
  |           ?|S |t          u ryg }t          }|D ]b}|                    d           t          |                     |t          |          dz
  |          t          j
                  rt          j        }c ||          S |t          u r`i }|                                D ]G\  }}t          j        |          }	|                     |	d|           |                     |	d|           H|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        |j                  }|                     |j                  }||j        v rS|t;          ||          S t          |t          j
                  rt          j        |||          S t?          |||          S tA          d          |
tB          u r}t#          j        |j                  }|                     |j"                  }|#                    |          }tI          |d          r| %                    |j&        |           n||_        |S |
tN          u r|                     |j(                  }|j)        }| j*        +                    |          }||| j*        |<   nVt          |t          j
                  r |,                    |           || j*        |<   n|nt[          d|d|d|d          |S |
t\          u rE|j)        }| j*        +                    |          }| t          j/        |          }|| j*        |<   |S |S |
t`          u rJt#          j        |j1                  }| 2                    |j"                  3                    d	 |          }|S tA          d
|z            )zaUnjelly an Abstract Object and everything it contains.
        I return the real object.
        Nr5   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    rr6{ r   zUnsupported AOT type: %s)4r   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   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.unjellyAOU  s[    	
"HH   I$YYA 3 3  CFFQJ2222H%ZZAF - -d..q#a&&1*a@@(BSTT -%_F6!99$YYA

 , ,1/22  a+++  a++++H AF{{*27333uh''':a+>+>'*27333n$$'".rx88..55h///&x999#GX->?? L'7(SSS/'7KKK#$=>>>h+BH55rx00}}U++5.11 *NN4#4e<<<<$)DMcNN26**o))&11;./DOF++X%677 
))!,,,./DOF++^$*33,   eio))#..;"/44C+.DOC(J
g".r{;;%%bh//;;22H   :Q >???r   c           	      H   	 d g}|                      |d|           | j        D ]\  }} ||d                    |d         S # t          $ rU t          j        d           t          j        d                    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 	 	 	GABBBGDIIc$
3344555	s   ?A AB!N)r   r   r   rb   r   r   r   r   r   r   r   r   r   r   r   r   '  s               9 9 9: : :d@ d@ d@L
 
 
 
 
r   r   c                 D    t                                          |           S )z-Convert an object to an Abstract Object Tree.)
AOTJellierjelly)r?   s    r   
jellyToAOTr     s    <<c"""r   c                     t          |           }|r7|                    t          |                              d                     dS 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     sO     S//C 

9S>>((112222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dS )r   c                 0    i | _         d| _        g | _        d S )Nr   )prepared_ref_idr   r   s    r   r   zAOTJellier.__init__  s    


r   c                 4    || j         t          |          <   dS )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jj!!!r   c           	      p    t                    } j                            t                               |t          v rngt          |t          j                  rdt          t                    j
        t          j        t                                                   t                                        nt          |t          j                  rt#          j
                  nt          |t                     r#t%          t          j                            n|t          j        u r#t)          t          j                            nPt-                     j        v rc j        t-                             }|j        r|j        }n+ j        dz    _         j        }|                    |           t7          |          S t9                       fd}                                |t<          u r#                     fdD                        n|t@          u r7                    tA          tC           j                                       n@|tD          u r]i }#                                D ]0\  }}                     |          |                     |          <   1                    |           n|tH          j%        v rftI          j%        |                   \  }	}
                    tM          t          j        |	                               |
                               nftO          d          r |(                                           n8tO          d          r |j)                   ntU          d|j
        z             j        d= S )z+I turn an object into an AOT and return it.r5   c                                          t          t          j        j                                      |                                d S r   )rQ   r'   r   qualr   	jellyToAO)r8   r?   retvalr   s    r   
_stateFromz(AOTJellier.jellyToAO.<locals>._stateFromH  sH    W\#-88$..:O:OPP    r   c                 :    g | ]}                     |          S r   )r   ).0r   r   s     r   
<listcomp>z(AOTJellier.jellyToAO.<locals>.<listcomp>P  s%    >>>Qt~~a00>>>r   __getstate__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   ro   rq   rr   unpickleFuncr8   r   s   ``         @r   r   zAOTJellier.jellyToAO  s   s))
$s))$$$ &&&FF!122 K	K $c""+^C0011}S1122 FF !122 A	KCL))FF&& >	K7<,,--FF***g237788FF #ww$-''r#ww/= ' -CC $(<!#3DL,CMM#&&&Szz!UUF      
 vs+++$>>>>#>>>????E!!eC$<$<==>>>>DIIKK = =DAq+/>>!+<+<AdnnQ''((a    H333&.&=g&Fs&K&K#eG0>>u@U@UVV    n-- K
3++--....j)) K
3<(((( 69I IJJJJrNr   c                     	 |                      |          }|S # t          $ rB t          j        d           t          j        d                    | j                              w xY w)Nr   r   )r   r   r   r   rn   r   )r   r?   r`   s      r   r   zAOTJellier.jellyl  sj    	$$BI 	 	 	GABBBGDIIdj))***	s
    AA%N)r   r   r   r   r   r   r   r   r   r   r   r     sT          * * *
W W Wr    r   r   r   )4rb   copyregr  rer  r   r   twisted.persistedr   twisted.pythonr   r   twisted.python.compatr   r	   r   r   r    r#   r2   r7   boolbytesr6   intfloatcomplexr{   sliceEllipsisr|   r'   r&   r(   rZ   r   	ExceptionrB   r   rk   rA   r/   r_   r   r   r   r   r   r   r   r   r   r   r   r   <module>r     s        				  0 0 0 0 0 0 & & & & & & ' ' ' ' ' ' ' ' 2 2 2 2 2 2       
' ' ' ' 'E ' ' '
* * * * *u * * *
( ( ( ( (U ( ( (

 
 
 
 
 
 
 
(	 	 	 	 	 	 	 	 []]
 			DJJ	DNN
 C C C C C C C C8" " " " " " " "<       E E E E E E E E. . .
, , , , , , , , BJ())
 
 
T T TD  6' ' 'S S S>^ ^ ^ ^ ^ ^ ^ ^L# # #
   
+ 
+ 
+
! 
! 
!
! 
! 
!l l l l l l l l l lr   