o bF @sdZddlZddlZddlZddlmZddlmZddl m Z m Z ddl m Z GdddZGd d d eZGd d d eZGd ddeZGdddZGdddZeZeeeeeeedeeeg ZGdddZGdddZ GdddZ!GdddZ"ddZ#Gddde$Z%e&dZ'd d!Z(d"d#Z)d$d%Z*d&d'Z+d(d)Z,Gd*d+d+Z-d,d-Z.d8d.d/Z/d0d1Z0d2d3Z1d4d5Z2Gd6d7d7Z3dS)9z| AOT: Abstract Object Trees The source-code-marshallin'est abstract-object-serializin'est persister this side of Marmalade! N)generate_tokens)crefutil)logreflect)_constructMethodc@eZdZddZdS)NamedcC ||_dSNname)selfr r7/usr/lib/python3/dist-packages/twisted/persisted/aot.py__init__ zNamed.__init__N)__name__ __module__ __qualname__rrrrrr rc@r)ClasscC d|jS)Nz Class(%r)r r rrr getSource$rzClass.getSourceNrrrrrrrrr#rrc@r)FunctioncCr)Nz Function(%r)r rrrrr)rzFunction.getSourceNrrrrrr(rrc@r)ModulecCr)Nz Module(%r)r rrrrr.rzModule.getSourceNrrrrrr-rrc@eZdZddZddZdS)InstanceMethodcCs@t|tst|tst|tstd|||_||_||_dS)Nz$%s isn't an Instance, Ref, or Deref!) isinstanceRefInstanceDeref TypeErrorr klassinstance)r r r$instrrrr3s  zInstanceMethod.__init__cCsd|j|jt|jS)Nz InstanceMethod({!r}, {!r}, {}))formatr r$prettifyr%rrrrr>s zInstanceMethod.getSourceNrrrrrrrrrr2s rc@s eZdZdS) _NoStateObjN)rrrrrrrr*Fsr*c@s eZdZefddZddZdS)r!cKsDt|ts td|||_|tur||_d|_dS||_d|_dS)Nz%s isn't a string!r)rstrr#r$ NoStateObjstate stateIsDict)r className __stateObj__r.rrrrZs    zInstance.__init__cCs|jr|j}nt|jtrt|jjtr|jj}nd}|durBz d|jdt|dWStyAd|jdt |dYSwd|jdt |jdS)Nz Instance(, )) r/r.rr objdictr$dictToKWNonFormattableDictr()r stateDictrrrres  zInstance.getSourceN)rrrr-rrrrrrr!Ys  r!c@,eZdZddZddZddZddZd S) r cGs<t|dkr|d|_|d|_dS|sd|_d|_dSdS)Nrr+)lenrefnumr4)r argsrrrrvs   z Ref.__init__cC&|jrtd|d|j||_dS)NzError setting id , I already have )r< ValueErrorr numrrrsetRef z Ref.setRefcCr>)NzError setting obj r?)r4r@)r r4rrrsetObjrDz Ref.setObjcCs6|jdur td|jrd|jt|jfSt|jS)Nz7Don't try to display me before setting an object on me!z Ref(%d, %s))r4 RuntimeErrorr<r(rrrrrs  z Ref.getSourceN)rrrrrCrErrrrrr us   r c@s eZdZddZddZeZdS)r"cCr r r<rArrrrrzDeref.__init__cCr)Nz Deref(%d)rGrrrrrrzDeref.getSourceN)rrrrr__repr__rrrrr"sr"c@r)CopyregcCs||_||_dSr )loadfuncr.)r rJr.rrrrs zCopyreg.__init__cCsd|jdt|jdS)NzCopyreg(r2r3)rJr(r.rrrrrszCopyreg.getSourceNr)rrrrrIs rIcCstdt|S)zDPass me an AO, I'll return a nicely-formatted source representation.zapp = ) indentifyr()aorrrrsrc@seZdZdZdS)r7z!A dictionary was not formattable.N)rrr__doc__rrrrr7sr7z[a-zA-Z_][a-zA-Z0-9_]*$cCsxg}t|}||D](\}}t|tstd|t|s(td||d|dt |dqd |S)Nz%r ain't a stringz%r ain't an identifier =,) listitemssortrr,r7rmatchappendr(join)doutrSkvrrrr6s       r6cCs4t|dr |St|}|tvrt|S|turEdg}|D]\}}|dt|dt|dq |t |r=dp>dd |S|t urjd g}|D] }|d t|qN|t |rbd pcd d |S|t urd g}|D] }|d t|qs|t |rdpdd |St d|d|d)Nr{rNz: rPz }}rQ[z %s,z ]](z )r3zUnsupported type z when trying to prettify .)hasattrrtype_SIMPLE_BUILTINSreprr5rSrWr(r;rXrRtupler#)r4trZr[r\xrrrr(s0 "   r(c Csg}g}d|g}t|jD]0\}}\}}\}} } |dvr"||n|dvr*||dkr8|dt|q ||q d|S)NrQ)r_rar])r`r3r^z )tokenizepoprWr;rX) srZstackl tokenType tokenStringstartRow startColumnendRow endColumn logicalLinerrrrKs$   rKcC t|S)zG Pass me an Abstract Object Tree, and I'll unjelly it for you. ) AOTUnjellierunjelly)aotrrrunjellyFromAOTs r{c Csfttttttttd}t|dr| }n|}t |dd}t |||d|vr-t |dSt 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!rrrrr r"rIreadzexecappz'%s needs to define an 'app', it didn't!)r!rrrrr r"rIrcr|compileevalr{r@) stringOrFilenssourcecoderrrunjellyFromSources"     rc@sHeZdZdZddZddZddZdd Zd d Zd d Z ddZ dS)rxzWI handle the unjellying of an Abstract Object Tree. See AOTUnjellier.unjellyAO cCsi|_g|_g|_dSr ) referencesrn afterUnjellyrrrrr,s zAOTUnjellier.__init__cCst}||d||S)zUnjelly a node, later.r)r_Defer unjellyInto)r noderYrrr unjellyLater4szAOTUnjellier.unjellyLatercCs.||}|||<t|tjr||||S)zvUtility method for unjellying one object into another. This automates the handling of backreferences. ) unjellyAOrrNotKnown addDependant)r r4locrLorrrr:s   zAOTUnjellier.unjellyIntocCs:t|tjrdg}||dn|g}|j||fdS)Nr+)rrrrrrW)r callableresult listResultrrr callAfterDs zAOTUnjellier.callAftercCs||j||dS)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%attrNamerLrrrunjellyAttributeLszAOTUnjellier.unjellyAttributecCs|j|t|}|tvr|S|tur-g}|D]}|d||t|d|q|S|turUg}t}|D]}|dt||t|d|t j rPt j }q7||S|t uryi}| D]\}}t |} || d||| d|q_|S|j} | turt|jS| ttfvst| trt|jS| tur|j} t|j} ||j} | | jvr| durt| | St| t j rt | | | St| | | St d| t!urt|j}||j"}|#|}t$|dr|%|j&||S||_|S| t'ur;||j(}|j)}|j*+|}|dur||j*|<|St|t j r*|,|||j*|<|S|dur2 |St-d|||f| t.ur\|j)}|j*+|}|durZt /|}||j*|<|S|S| t0urut|j1}|2|j"3dd|}|St d |) zaUnjelly an Abstract Object and everything it contains. I return the real object. Nr+rzinstance method changed __setstate__z1Multiple references with the same ID: %s, %s, %s!cSs||Sr r)r_lrrrsz(AOTUnjellier.unjellyAO..zUnsupported AOT type: %s)4rnrWrdrerRrr;rgrrr_Tupler5rS_DictKeyAndValue __class__rr namedModuler rr issubclass namedObjectrr$rr%rgetattr_InstanceMethodrr#r!r.__new__rcrrr r4r<rgetresolveDependantsr@r" _DereferencerIrJr addCallback)r rLrhrorituple_rYr[r\kvdcim_nameim_classim_selfr$r.r&rrefkeyrefrBderrJrrrrUs                                  zAOTUnjellier.unjellyAOc Csnzdg}||d||jD] \}}||dq|dWSty6tdtdtt|jw)Nr+Error jellying object! Stacktrace follows:: ) rr BaseExceptionrmsgrXmaprfrn)r rLrofuncr\rrrrys   zAOTUnjellier.unjellyN) rrrrMrrrrrrryrrrrrx's  frxcCrw)z-Convert an object to an Abstract Object Tree.) AOTJellierjelly)r4rrr jellyToAOTs rcCs,t|}|r|t|ddSt|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. zutf-8N)rwriterencode)r4filerzrrr jellyToSourcesrcCs|jjS)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 methodObjectrrr_classOfMethods rcC|jS)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__rrrr _funcOfMethod rcCr)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} )rrrrr _selfOfMethodrrc@r9) rcCsi|_d|_g|_dS)Nr)prepared_ref_idrnrrrrrs zAOTJellier.__init__cCs||jt|<dS)zaI prepare an object for later referencing, by storing its id() and its _AORef in a cache.N)rid)r aorefobjectrrr prepareForRefszAOTJellier.prepareForRefc s t}jt|tvrnt|tjr-tt j t t tnt|tjr9tj nt|trFtt n|tjurStt ntjvr}jt}|jrk|j}t|Sjd_j}||t|Stfdd}|turfddDnk|t urt t!jn[|t"uri}#D]\}}|||<q|n<|t$j%vrt$j%|\} } t&t | | nt'dr|(nt'dr|j)nt*d|j jd =S) z+I turn an object into an AOT and return it.r+cs"ttj|dSr )rEr!rqualr jellyToAO)r.r4retvalr rr _stateFromHsz(AOTJellier.jellyToAO.._stateFromcsg|]}|qSr)r).0rrrr Psz(AOTJellier.jellyToAO.. __getstate__rzUnsupported type: %s)+rdrnrWrfrertypes MethodTyperrrrrrrr ModuleTyperr FunctionTyper fullFuncNamerrr<rrCr"r rrRrErgrr5rScopy_regdispatch_tablerIrcrrr#) r r4objTypeoldRefkeyrrYr[r\ unpickleFuncr.rrrrsb                zAOTJellier.jellyToAOcCs>z||}|WStytdtd|jw)Nrr)rrrrrXrn)r r4rLrrrrls   zAOTJellier.jellyN)rrrrrrrrrrrrs  Yrr )4rMcopyregrrerrkrtwisted.persistedrtwisted.pythonrrtwisted.python.compatrrrrrrr*r-boolbytesr,intfloatcomplexrdsliceEllipsisrer!r r"rIr Exceptionr7rrUr6r(rKr{rrxrrrrrrrrrrsZ        "'