ϪfG dZddlZddlZddlZddlmZddlmZm Z ddl m Z ddl m ZGdd ZGd d eZGd d eZGddeZGddZGddZeZeeeeeeedeeeg ZGddZ GddZ!GddZ"GddZ#dZ$Gdde%Z&ejNdZ(d Z)d!Z*d"Z+d#Z,d$Z-Gd%d&Z.d'Z/d.d(Z0d)Z1d*Z2d+Z3Gd,d-Z4y)/z| AOT: Abstract Object Trees The source-code-marshallin'est abstract-object-serializin'est persister this side of Marmalade! N)crefutil)logreflect)_constructMethod)generate_tokensceZdZdZy)Namedc||_yNname)selfrs 7/usr/lib/python3/dist-packages/twisted/persisted/aot.py__init__zNamed.__init__"s  N)__name__ __module__ __qualname__rrrr r !srr ceZdZdZy)Classc d|jzS)Nz Class(%r)r rs r getSourcezClass.getSource'sTYY&&rNrrrrrrrrr&s'rrceZdZdZy)Functionc d|jzS)Nz Function(%r)r rs rrzFunction.getSource,s ))rNrrrrrr+s*rrceZdZdZy)Modulec d|jzS)Nz Module(%r)r rs rrzModule.getSource1sdii''rNrrrrr!r!0s(rr!ceZdZdZdZy)InstanceMethodct|ts.t|tst|tst d|z||_||_||_y)Nz$%s isn't an Instance, Ref, or Deref!) isinstanceRefInstanceDeref TypeErrorrklassinstance)rrr+insts rrzInstanceMethod.__init__6sF tS !$)$&BTIJ J   rcvdj|j|jt|jS)Nz InstanceMethod({!r}, {!r}, {}))formatrr+prettifyr,rs rrzInstanceMethod.getSourceAs/3:: II JJ T]] #  rNrrrrrrrrr$r$5s   rr$c eZdZy) _NoStateObjN)rrrrrrr3r3Isrr3ceZdZefdZdZy)r(c t|tstd|z||_|tur||_d|_y||_d|_y)Nz%s isn't a string!rr)r&strr*r+ NoStateObjstate stateIsDict)r className __stateObj__r8s rrzInstance.__init__]sJ)S)09<= = z )%DJ D DJ D rc|jr |j}nWt|jtr;t|jjt r|jj}nd}| d|j dt|dSd|j dt|jdS#t$rd|j dt|dcYSwxYw)Nz Instance(, )) r9r8r&r'objdictr+dictToKWNonFormattableDictr0)r stateDicts rrzInstance.getSourcehs    I  C (Z -M II   J"4::.8I3F2GqII4::.8DJJ+?*@BB& J"4::.8I3F2GqII Js4B66%CCN)rrrr7rrrrrr(r(\s/9 ! Crr(c$eZdZdZdZdZdZy)r'clt|dk(r|d|_|d|_y|sd|_d|_yy)Nrr)lenrefnumr?)rargss rrz Ref.__init__ys9 t9>q'DKAwDHDKDHrc`|jrtd|d|j||_y)NzError setting id , I already have )rH ValueErrorrnums rsetRefz Ref.setRefs. ;;05Ft{{mTU U rc`|jrtd|d|j||_y)NzError setting obj rK)r?rL)rr?s rsetObjz Ref.setObjs. 881#6GzRS Src|j td|jr$d|jt|jfzSt|jS)Nz7Don't try to display me before setting an object on me!z Ref(%d, %s))r? RuntimeErrorrHr0rs rrz Ref.getSourcesQ 88 I  ;;$ Xdhh5G'HH H!!rN)rrrrrOrQrrrrr'r'xs  "rr'ceZdZdZdZeZy)r)c||_yr rHrMs rrzDeref.__init__s  rc d|jzS)Nz Deref(%d)rVrs rrzDeref.getSourcesT[[((rN)rrrrr__repr__rrrr)r)s)Hrr)ceZdZdZdZy)Copyregc ||_||_yr )loadfuncr8)rr\r8s rrzCopyreg.__init__s   rcNd|jdt|jdS)NzCopyreg(r=r>)r\r0r8rs rrzCopyreg.getSources&$--*"Xdjj-A,B!DDrNr1rrrrZrZs ErrZc0tdt|zS)zDPass me an AO, I'll return a nicely-formatted source representation.zapp = ) indentifyr0)aos rrrs X , --rceZdZdZy)rBz!A dictionary was not formattable.N)rrr__doc__rrrrBrBs+rrBz[a-zA-Z_][a-zA-Z0-9_]*$c Rg}t|j}|j|D]g\}}t|tst d|zt j|st d|z|jd|dt|didj|S)Nz%r ain't a stringz%r ain't an identifier =,) listitemssortr&r6rBrmatchappendr0join)doutrikvs rrArAs C OE JJL.1!S!$%81%<= =wwqz$%=%AB B T!Ahqk]!,- . 773<rc "t|dr|jSt|}|tvr t |S|t urxdg}|j D]/\}}|jdt|dt|d1|jt|xrdxsddj|S|turZd g}|D]}|jd t|z!|jt|xrd xsd dj|S|turZd g}|D]}|jd t|z!|jt|xrdxsddj|Std|d|d)Nr{rdz: rfz }}rg[z %s,z ]](z )r>zUnsupported type z when trying to prettify .)hasattrrtype_SIMPLE_BUILTINSreprr@rirmr0rGrnrhtupler*)r?trprqrrxs rr0r0s{sK }} I  9  $Y%C  A1 T(1+b! Q?@ A JJs3x+G2s 3773<  $Y%C 4 9x{23 4 JJs3x+G2s 3773<  %Z%C 4 9x{23 4 JJs3x+G2s 3773< /s2KC5PQRS Src<g}g}d|g}t|jD]l\}}\}}\}} } |dvr|j|n|dvr|j|dk(r|jdt|z\|j|ndj |S)Nrg)rvrxrt)rwr>ruz )tokenizepoprmrGrn) srpstackl tokenType tokenStringstartRow startColumnendRow endColumn logicalLines rr_r_s C E QA !%% $ ; / ) LL % O + IIK $  JJtc%j( ) JJ{ #$ 773<rc4tj|S)zG Pass me an Abstract Object Tree, and I'll unjelly it for you. ) AOTUnjellierunjelly)aots runjellyFromAOTrs > ! !# &&rc  tttttt t td}t|dr|j}n|}t|dd}t|||d|vrt|dStd|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$rrr!r'r)rZreadzexecappz'%s needs to define an 'app', it didn't!)r(r$rrr!r'r)rZrzrcompileevalrrL) stringOrFilenssourcecodes runjellyFromSourcer s( B|V$""$ 6:v .Dr2 {bi((B\QRRrc:eZdZdZdZdZdZdZdZdZ dZ y ) rzWI handle the unjellying of an Abstract Object Tree. See AOTUnjellier.unjellyAO c.i|_g|_g|_yr ) referencesr afterUnjellyrs rrzAOTUnjellier.__init__/s rcTtj}|j|d||S)zUnjelly a node, later.r)r_Defer unjellyInto)rnoderos r unjellyLaterzAOTUnjellier.unjellyLater7s% OO  At$rc|j|}|||<t|tjr|j |||S)zvUtility method for unjellying one object into another. This automates the handling of backreferences. ) unjellyAOr&rNotKnown addDependant)rr?locr`os rrzAOTUnjellier.unjellyInto=s> NN2 C a** + NN3 $rct|tjrdg}|j|dn|g}|jj ||fy)Nr)r&rrrrrm)rcallableresult listResults r callAfterzAOTUnjellier.callAfterGsI fh// 0J    A . J   (J!78rc>|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__)rr,attrNamer`s runjellyAttributezAOTUnjellier.unjellyAttributeOs **Hb9rc  |jj|t|}|tvr|S|tur;g}|D]2}|jd|j |t |dz |4|S|turpg}t}|D][}|jdt|j |t |dz |tjsLtj}]||S|turWi}|jD]@\}}tj|} |j | d||j | d|B|S|j} | t urt#j$|j&S| t(t*fvst-| trt#j.|j&S| t0ur|j&} t#j.|j2} |j5|j6} | | j8vrL| t;| | St| tjrtj<| | | St?| | | StAd| tBurt#j.|j2}|j5|jD}|jG|}tI|dr|jK|jL||St|tr ||_|S|jO|_|S| tPur|j5|jR}|jT}|jVjY|}|||jV|<|St|tjr"|j[|||jV|<|S| |St]d|d|d|d| t^urQ|jT}|jVjY|}|&tj`|}||jV|<|S|S| tburMt#j.|jd}|jg|jDjid |}|StAd |z) zaUnjelly an Abstract Object and everything it contains. I return the real object. Nrrzinstance method changed __setstate__z&Multiple references with the same ID: r=!c ||Sr r)r_ls rz(AOTUnjellier.unjellyAO..s r6{rzUnsupported AOT type: %s)5rrmr{r|rhrrGr~r&rr_Tupler@ri_DictKeyAndValue __class__r!r namedModulerrr issubclass namedObjectr$r+rr,rgetattr_InstanceMethodrr*r(r8__new__rzrr __getstate__r'r?rHrgetresolveDependantsrLr) _DereferencerZr\r addCallback)rr`rrrtuple_rorqrrkvdcim_nameim_classim_selfr+r8r-rrefkeyrefrNderr\s rrzAOTUnjellier.unjellyAOXs " H  I $YA 3  CFQJ2 3H %ZAF -d..q#a&1*a@(BSBST%__F -!9  $YA  ,1//2  a+  a+ ,H AF{**27733uh'':a+>**27733n$''"..rxx8..5h///&x99#GX->->?'77(SS/'7KK#$=>>h++BHH5rxx0}}U+5.1NN4#4#4e<   t,$)DM %*$6$6$8DM cNN266*oo))&1;./DOOF+ X%6%67))!,./DOOF+^  %, eiioo))#.;"//4C+.DOOC(J g"..r{{;%%bhh/;;2H :Q >??rc 6 dg}|j|d||jD]\}}||d|dS#t$rStjdtjdj t t|jwxYw)Nr+Error jellying object! Stacktrace follows:: ) rr BaseExceptionrmsgrnmapr}r)rr`rfuncrrs rrzAOTUnjellier.unjellys A   Q2 &,, aQqT  Q4K  GGA B GGDIIc$ 34 5  s 9<ABN) rrrrbrrrrrrrrrrrr*s- 9:f@P rrc4tj|S)z-Convert an object to an Abstract Object Tree.) AOTJellierjelly)r?s r jellyToAOTrs <  c ""rct|}|r*|jt|jdyt|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)r?filers r jellyToSourcers5 S/C  9S>((12~rc.|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 methodObjects r_classOfMethodrs  * **rc|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__rs r _funcOfMethodr   rc|jS)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} )rrs r _selfOfMethodrrrc$eZdZdZdZdZdZy)rc.i|_d|_g|_y)Nr)prepared_ref_idrrs rrzAOTJellier.__init__ s   rc4||jt|<y)zaI prepare an object for later referencing, by storing its id() and its _AORef in a cache.N)rid)raorefobjects r prepareForRefzAOTJellier.prepareForRefs%* bj!rc & t}jjt|tvr n@t |t jrVttjtjtjt nt |t j rt#j nt |tr t%tj no|t j&ur t)tj* n=t-j.vrwj.t-}|j0r|j0}t7|Sj2dz_j2}|j5|t7|St9  fd}j; |t<ur0 j?Dcgc]}j|c}nT|t@ur0 j?tAtCjn|tDurOi}jGD](\}} j| |j|<* j?|n|tHjJvrYtIjJ|\} } j?tMtj*| j| nZtOdr|jQn7tOdr|jRntUd|jzjd= Scc}w)z+I turn an object into an AOT and return it.rcjttjjj |yr )rQr(rqualr jellyToAO)r8r?retvalrs r _stateFromz(AOTJellier.jellyToAO.._stateFromLs/ W\\#--8$..:OPrrrzUnsupported type: %s)+r{rrmr}r|rtypes MethodTyper$rrrrrrr ModuleTyper!r FunctionTyper fullFuncNamerrrHrrOr)r'rrhrQr~rr@ricopy_regdispatch_tablerZrzrrr*) rr?objTypeoldRefkeyrrrorqrr unpickleFuncr8rs `` @rrzAOTJellier.jellyToAOss) $s)$ & &F !1!1 2$c"++ ^C01}S12F !1!1 2CLL)F  &7<<,-F ** *g22378F#w$--'r#w/== --C Sz!$(<Qt~~a0>?E! eC$<=>DIIK=DAq+/>>!+u@UVn-3++-.j)3<<( 69I9I IJJ JJrN 5?s Nc |j|}|S#t$rEtjdtjdj |j wxYw)Nrr)rrrrrnr)rr?r`s rrzAOTJellier.jellypsR $BI  GGA B GGDIIdjj) *  s AA#N)rrrrrrrrrrrr s * Vprrr )5rbcopyregrrertwisted.persistedrtwisted.pythonrrtwisted.python.compatr _tokenizerrr rrr!r$r3r7boolbytesr6intfloatcomplexr{sliceEllipsisr|r(r'r)rZr ExceptionrBrrkrAr0r_rrrrrrrrrrrrrs9  &'23 'E' *u* (U(   (  ]     J N CC8""<EE. ,,BJJ() TD6'S>``P#  + ! !kkr