o
    ¯búF  ã                
   @   sš  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„ dƒZG d	d
„ d
eƒZG dd„ deƒZG dd„ deƒZG dd„ dƒZG dd„ dƒZeƒ Zeeeeeeedƒeeeƒg	ZG dd„ dƒZG dd„ dƒZ G dd„ dƒZ!G dd„ dƒZ"dd„ Z#G dd„ de$ƒZ%e &d¡Z'd d!„ Z(d"d#„ Z)d$d%„ Z*d&d'„ Z+d(d)„ Z,G d*d+„ d+ƒZ-d,d-„ Z.d8d.d/„Z/d0d1„ Z0d2d3„ Z1d4d5„ Z2G d6d7„ d7ƒZ3dS )9z|
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d„ ZdS )ÚNamedc                 C   ó
   || _ d S ©N©Úname)Úselfr   © r   ú7/usr/lib/python3/dist-packages/twisted/persisted/aot.pyÚ__init__   ó   
zNamed.__init__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      ó    r   c                   @   r   )ÚClassc                 C   ó
   d| j  S )Nz	Class(%r)r   ©r   r   r   r   Ú	getSource$   r   zClass.getSourceN©r   r   r   r   r   r   r   r   r   #   r   r   c                   @   r   )ÚFunctionc                 C   r   )NzFunction(%r)r   r   r   r   r   r   )   r   zFunction.getSourceNr   r   r   r   r   r   (   r   r   c                   @   r   )ÚModulec                 C   r   )Nz
Module(%r)r   r   r   r   r   r   .   r   zModule.getSourceNr   r   r   r   r   r   -   r   r   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚInstanceMethodc                 C   s@   t |tƒst |tƒst |tƒstd| ƒ‚|| _|| _|| _d S )Nz$%s isn't an Instance, Ref, or Deref!)Ú
isinstanceÚRefÚInstanceÚDerefÚ	TypeErrorr   ÚklassÚinstance)r   r   r$   Úinstr   r   r   r   3   s   ÿþý
zInstanceMethod.__init__c                 C   s   d  | j| jt| jƒ¡S )Nz InstanceMethod({!r}, {!r}, 
 {}))Úformatr   r$   Úprettifyr%   r   r   r   r   r   >   s
   ýzInstanceMethod.getSourceN©r   r   r   r   r   r   r   r   r   r   2   s    r   c                   @   s   e Zd ZdS )Ú_NoStateObjN)r   r   r   r   r   r   r   r*   F   s    r*   c                   @   s    e Zd Zefdd„Zdd„ ZdS )r!   c                 K   sD   t |tƒstd| ƒ‚|| _|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__r.   r   r   r   r   Z   s   


zInstance.__init__c                 C   sž   | j r| j}nt| jtƒrt| jjtƒr| jj}nd }|d urBzd| j›dt|ƒ› d�W S  tyA   d| j›dt	|ƒ› d� Y S w d| j›dt	| jƒ› d�S )Nz	Instance(ú, ú))
r/   r.   r   r    ÚobjÚdictr$   ÚdictToKWÚNonFormattableDictr(   )r   Ú	stateDictr   r   r   r   e   s   
ÿzInstance.getSourceN)r   r   r   r-   r   r   r   r   r   r   r!   Y   s    r!   c                   @   ó,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
r    c                 G   s<   t |ƒdkr|d | _|d | _d S |sd | _d | _d S d S )Né   r   r+   )ÚlenÚrefnumr4   )r   Úargsr   r   r   r   v   s   

þzRef.__init__c                 C   ó&   | j rtd|› d| j › �ƒ‚|| _ d S )NzError setting id ú, I already have )r<   Ú
ValueError©r   Únumr   r   r   ÚsetRef   ó   
z
Ref.setRefc                 C   r>   )NzError setting obj r?   )r4   r@   )r   r4   r   r   r   ÚsetObj„   rD   z
Ref.setObjc                 C   s6   | j d u r	tdƒ‚| jrd| jt| j ƒf S t| j ƒS )Nz7Don't try to display me before setting an object on me!zRef(%d, 
 %s))r4   ÚRuntimeErrorr<   r(   r   r   r   r   r   ‰   s   
ÿ
zRef.getSourceN)r   r   r   r   rC   rE   r   r   r   r   r   r    u   s
    	r    c                   @   s    e Zd Zdd„ Zdd„ ZeZdS )r"   c                 C   r	   r
   ©r<   rA   r   r   r   r   ”   r   zDeref.__init__c                 C   r   )Nz	Deref(%d)rG   r   r   r   r   r   —   r   zDeref.getSourceN)r   r   r   r   r   Ú__repr__r   r   r   r   r"   “   s    r"   c                   @   r   )ÚCopyregc                 C   s   || _ || _d S r
   )Úloadfuncr.   )r   rJ   r.   r   r   r   r   ž   s   
zCopyreg.__init__c                 C   s   d| j ›dt| jƒ› d�S )NzCopyreg(r2   r3   )rJ   r(   r.   r   r   r   r   r   ¢   s   zCopyreg.getSourceNr)   r   r   r   r   rI   �   s    rI   c                 C   s   t dt| ƒ ƒS )zDPass me an AO, I'll return a nicely-formatted source representation.zapp = )Ú	indentifyr(   )Úaor   r   r   r   «   s   r   c                   @   s   e Zd ZdZdS )r7   z!A dictionary was not formattable.N)r   r   r   Ú__doc__r   r   r   r   r7   °   s    r7   z[a-zA-Z_][a-zA-Z0-9_]*$c                 C   sx   g }t |  ¡ ƒ}| ¡  |D ](\}}t|tƒstd| ƒ‚t |¡s(td| ƒ‚| d|› dt	|ƒ› d�¡ qd 
|¡S )Nz%r ain't a stringz%r ain't an identifierú
 ú=ú,Ú )ÚlistÚitemsÚsortr   r,   r7   ÚrÚmatchÚappendr(   Újoin)ÚdÚoutrS   ÚkÚvr   r   r   r6   ·   s   


r6   c                 C   s4  t | dƒr	|  ¡ S t| ƒ}|tv rt| ƒS |tu rEdg}|  ¡ D ]\}}| dt|ƒ› dt|ƒ› d�¡ q | t	| ƒr=dp>d¡ d 
|¡S |tu rjd	g}| D ]}| d
t|ƒ ¡ qN| t	| ƒrbdpcd¡ d 
|¡S |tu r�dg}| D ]}| d
t|ƒ ¡ qs| t	| ƒr‡dpˆd¡ d 
|¡S td|› d| › d�ƒ‚)Nr   ú{rN   z: rP   z
 }ú}rQ   ú[z
 %s,z
 ]ú]ú(z
 )r3   zUnsupported type z when trying to prettify Ú.)Úhasattrr   ÚtypeÚ_SIMPLE_BUILTINSÚreprr5   rS   rW   r(   r;   rX   rR   Útupler#   )r4   ÚtrZ   r[   r\   Úxr   r   r   r(   Ä   s0   
"


r(   c                 C   s†   g }g }d| g}t |jƒD ]0\}}\}}\}}	}
|dv r"| |¡ n|dv r*| ¡  |dkr8| dt|ƒ ¡ q| |¡ qd |¡S )NrQ   )r_   ra   r]   )r`   r3   r^   ú z  )ÚtokenizeÚpoprW   r;   rX   )ÚsrZ   ÚstackÚlÚ	tokenTypeÚtokenStringÚstartRowÚstartColumnÚendRowÚ	endColumnÚlogicalLiner   r   r   rK   æ   s$   ú
rK   c                 C   ó   t ƒ  | ¡S )zG
    Pass me an Abstract Object Tree, and I'll unjelly it for you.
    )ÚAOTUnjellierÚunjelly)Úaotr   r   r   ÚunjellyFromAOT  s   r{   c              	   C   sf   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å
    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"   rI   Úreadz<source>ÚexecÚappz'%s needs to define an 'app', it didn't!)r!   r   r   r   r   r    r"   rI   rc   r|   ÚcompileÚevalr{   r@   )ÚstringOrFileÚnsÚsourceÚcoder   r   r   ÚunjellyFromSource  s"   ø

r…   c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )rx   zWI handle the unjellying of an Abstract Object Tree.
    See AOTUnjellier.unjellyAO
    c                 C   s   i | _ g | _g | _d S r
   )Ú
referencesrn   ÚafterUnjellyr   r   r   r   r   ,  s   
zAOTUnjellier.__init__c                 C   s   t  ¡ }|  |d|¡ |S )zUnjelly a node, later.r   )r   Ú_DeferÚunjellyInto)r   ÚnoderY   r   r   r   ÚunjellyLater4  s   zAOTUnjellier.unjellyLaterc                 C   s.   |   |¡}|||< t|tjƒr| ||¡ |S )zvUtility method for unjellying one object into another.
        This automates the handling of backreferences.
        )Ú	unjellyAOr   r   ÚNotKnownÚaddDependant)r   r4   ÚlocrL   Úor   r   r   r‰   :  s
   
zAOTUnjellier.unjellyIntoc                 C   s:   t |tjƒrd g}| |d¡ n|g}| j ||f¡ d S )Nr+   )r   r   r�   rŽ   r‡   rW   )r   ÚcallableÚresultÚ
listResultr   r   r   Ú	callAfterD  s
   zAOTUnjellier.callAfterc                 C   s   |   |j||¡ dS )zÙUtility 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%   ÚattrNamerL   r   r   r   ÚunjellyAttributeL  s   zAOTUnjellier.unjellyAttributec                 C   sö  | j  |¡ t|ƒ}|tv r|S |tu r-g }|D ]}| d¡ |  |t|ƒd |¡ q|S |tu rUg }t}|D ]}| d¡ t|  |t|ƒd |¡t	j
ƒrPt	j}q7||ƒS |tu ryi }| ¡ D ]\}}t	 |¡}	|  |	d|¡ |  |	d|¡ q_|S |j}
|
tu r†t |j¡S |
ttfv s‘t|
tƒr—t |j¡S |
tu rÏ|j}t |j¡}|  |j¡}||jv rË|du r¸t||ƒS t|t	j
ƒrÅt	 |||¡S t|||ƒS t dƒ‚|
t!u r÷t |j¡}|  |j"¡}| #|¡}t$|dƒrò|  %|j&|¡ |S ||_|S |
t'u �r;|  |j(¡}|j)}| j* +|¡}|du �r|| j*|< |S t|t	j
ƒ�r*| ,|¡ || j*|< |S |du �r2	 |S t-d|||f ƒ‚|
t.u �r\|j)}| j* +|¡}|du �rZt	 /|¡}|| j*|< |S |S |
t0u �rut |j1¡}|  2|j"¡ 3dd„ |¡}|S t d	| ƒ‚)
zaUnjelly an Abstract Object and everything it contains.
        I return the real object.
        Nr+   r   zinstance method changedÚ__setstate__z1Multiple references with the same ID: %s, %s, %s!c                 S   s   || Ž S r
   r   )r’   Ú_lr   r   r   Ú<lambda>µ  s    z(AOTUnjellier.unjellyAO.<locals>.<lambda>zUnsupported AOT type: %s)4rn   rW   rd   re   rR   r‰   r;   rg   r   r   r�   Ú_Tupler5   rS   Ú_DictKeyAndValueÚ	__class__r   r   ÚnamedModuler   r   r   Ú
issubclassÚnamedObjectr   r$   rŒ   r%   r•   ÚgetattrÚ_InstanceMethodr   r#   r!   r.   Ú__new__rc   r”   r˜   r    r4   r<   r†   ÚgetÚresolveDependantsr@   r"   Ú_DereferencerI   rJ   r‹   ÚaddCallback)r   rL   rh   ro   ri   Útuple_rY   r[   r\   ÚkvdÚcÚim_nameÚim_classÚim_selfr$   r.   r&   r�   ÚrefkeyÚrefrB   ÚderrJ   r   r   r   rŒ   U  sª   

€




ÿ


õ

	
øüÿÿ




ÿzAOTUnjellier.unjellyAOc              
   C   sn   zd g}|   |d|¡ | jD ]
\}}||d ƒ q|d W S  ty6   t d¡ t d tt| jƒ¡¡ ‚ w )Nr   ú+Error jellying object! Stacktrace follows::Ú
)	r‰   r‡   ÚBaseExceptionr   ÚmsgrX   Úmaprf   rn   )r   rL   ro   Úfuncr\   r   r   r   ry   »  s   

ýzAOTUnjellier.unjellyN)r   r   r   rM   r   r‹   r‰   r”   r—   rŒ   ry   r   r   r   r   rx   '  s    
	frx   c                 C   rw   )z-Convert an object to an Abstract Object Tree.)Ú
AOTJellierÚjelly)r4   r   r   r   Ú
jellyToAOTÍ  s   r¹   c                 C   s,   t | ƒ}|r| 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)r4   Úfilerz   r   r   r   ÚjellyToSourceÒ  s   r½   c                 C   s   | 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�   ©ÚmethodObjectr   r   r   Ú_classOfMethodà  s   
rÁ   c                 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¿   r   r   r   Ú_funcOfMethodí  ó   
rÄ   c                 C   rÂ   )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¿   r   r   r   Ú_selfOfMethodú  rÅ   rÆ   c                   @   r9   )
r·   c                 C   s   i | _ d| _g | _d S )Nr   )ÚpreparedÚ_ref_idrn   r   r   r   r   r     s   
zAOTJellier.__init__c                 C   s   || 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Úobjectr   r   r   ÚprepareForRef  s   zAOTJellier.prepareForRefc                    s   t ˆ ƒ}ˆj tˆ ƒ¡ |tv rˆ ‰n÷t|tjƒr-tt	ˆ ƒj
t tˆ ƒ¡ˆ tˆ ƒ¡ƒ‰nÝt|tjƒr9tˆ j
ƒ‰nÑt|t ƒrFtt ˆ ¡ƒ‰nÄ|tju rStt ˆ ¡ƒ‰n·tˆ ƒˆjv r}ˆjtˆ ƒ }|jrk|j}t|ƒS ˆjd ˆ_ˆj}| |¡ t|ƒS tƒ ‰‡ ‡‡fdd„}ˆ ˆˆ ¡ |tu rŸˆ ‡fdd„ˆ D ƒ¡ nk|t u r¯ˆ t t!ˆjˆ ƒƒ¡ n[|t"u rÎi }ˆ  #¡ D ]\}}ˆ |¡|ˆ |¡< q¹ˆ |¡ n<|t$j%v rët$j%| ˆ ƒ\}	}
ˆ t&t |	¡ˆ |
¡ƒ¡ nt'ˆ dƒr÷|ˆ  (¡ ƒ nt'ˆ dƒ�r|ˆ j)ƒ nt*d|j
 ƒ‚ˆjd	= ˆS )
z+I turn an object into an AOT and return it.r+   c                    s"   ˆ  tt ˆ j¡ˆ | ¡ƒ¡ d S r
   )rE   r!   r   Úqualr�   Ú	jellyToAO)r.   ©r4   Úretvalr   r   r   Ú
_stateFromH  s   ÿz(AOTJellier.jellyToAO.<locals>._stateFromc                    s   g | ]}ˆ   |¡‘qS r   )rÎ   )Ú.0r�   r   r   r   Ú
<listcomp>P  s    z(AOTJellier.jellyToAO.<locals>.<listcomp>Ú__getstate__r•   zUnsupported type: %séÿÿÿÿ)+rd   rn   rW   rf   re   rŸ   ÚtypesÚ
MethodTyper   rÄ   r   r   rÍ   rÁ   rÎ   rÆ   Ú
ModuleTyper   r   ÚFunctionTyper   ÚfullFuncNamerÉ   rÇ   r<   rÈ   rC   r"   r    rÌ   rR   rE   rg   rµ   r5   rS   Úcopy_regÚdispatch_tablerI   rc   rÔ   r•   r#   )r   r4   ÚobjTypeÚoldRefÚkeyrÑ   rY   r[   r\   ÚunpickleFuncr.   r   rÏ   r   rÎ     sb   ý

ý

ÿ
zAOTJellier.jellyToAOc                 C   s>   z|   |¡}|W S  ty   t d¡ t d | j¡¡ ‚ w )Nr±   r²   )rÎ   r³   r   r´   rX   rn   )r   r4   rL   r   r   r   r¸   l  s   

ýzAOTJellier.jellyN)r   r   r   r   rÌ   rÎ   r¸   r   r   r   r   r·     s
    Yr·   r
   )4rM   ÚcopyregrÛ   ÚrerÖ   rk   r   Útwisted.persistedr   Útwisted.pythonr   r   Útwisted.python.compatr   r   r   r   r   r   r*   r-   ÚboolÚbytesr,   ÚintÚfloatÚcomplexrd   ÚsliceÚEllipsisre   r!   r    r"   rI   r   Ú	Exceptionr7   r   rU   r6   r(   rK   r{   r…   rx   r¹   r½   rÁ   rÄ   rÆ   r·   r   r   r   r   Ú<module>   sZ   
÷

" '
