m &UIc@sdkZdkZdkZdkZdkZdkZdklZdkl Z l Z l Z l Z dkl Z lZlZlZdklZlZlZlZdklZlZlZlZlZlZlZdklZyeidZ Wne!j o dZ nXhddfd <ddfd <ddfd <ddfd d9e=fd:YZ?d;e=fd<YZ@d=e=fd>YZAhe iBe><e iCe?<e iDe@<e iEeA|iiD]-}|ii|o|ii|qqW|iS(N(R$RCtelementsteltRBthas_elttremove(R$RG((Rt getLocalss cCsdS(N((R$tnode((Rt visitDictscCs(x!|iD]}|ii|q WdS(N(RKRBRDR$RCRE(R$RKRD((Rt visitGlobals cCs|ii|idS(N(R$RBRERKRD(R$RK((Rt visitFunctionscCsdS(N((R$RK((Rt visitLambdascCs5x.|iD]#\}}|ii|p|q WdS(N(RKRBRDtaliasR$RE(R$RKRPRD((Rt visitImports cCs5x.|iD]#\}}|ii|p|q WdS(N(RKRBRDRPR$RE(R$RKRPRD((Rt visitFroms cCs|ii|idS(N(R$RBRERKRD(R$RK((Rt visitClassscCs|ii|idS(N(R$RBRERKRD(R$RK((Rt visitAssNames( R.R/t__doc__R%RJRLRMRNRORQRRRSRT(((RR@s          cCs-t|tio|ipdSq)ndS(Nii(t isinstanceRKtasttConsttvalue(RK((Rtis_constant_falses  t CodeGeneratorcBs9tZdZdZeZeZdZdZdZ dZ dZ dZ dZ d Zd Zd Zd Zd ZdZdZedZeZeZeZdZdZdZdZddZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*d Z+d!Z,d"Z-d#Z.d$Z/d%Z0d&Z1d'Z2d(Z3d)Z4d*Z5d+Z6d,Z7d-Z8d.Z9d/Z:d0Z;d1Z<d2Z=d3Z>d4Z?d5Z@d6ZAd7ZBd8d9ZCeDd:joeCZEeCZFnd;ZEd<ZFd=ZGhd>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU|iD]3}|djo|i}n|i||qW| id|||fqW|id | |i|i|id d|id x| D]z\}}}|oG|i}|id ||i||id |i|n|id ||i|qXW|id| |id|_dS(Ns $append%dit BUILD_LISTiRt LOAD_ATTRtappendRRRRRRR(R$RRKt_CodeGenerator__list_countRRtRtstacktzipRRtqualsRtfor_RRRRtconttifstif_RutinsertRtskip_oneRvRw( R$RKRRRRRRRRR((Rt visitListComp>sD   "       cCs|i}|i}|i|i|id|i||i |dt |id||i|i|i ||fS(NRRR( R$RuRRRRKRRtRwRRR(R$RKRR((RtvisitListCompFords     cCsN|i|dt|i|i|id||i|iddS(NRRR( R$RRKRRRRttbranchRu(R$RKR((RtvisitListCompIfqs  cCst||i|i|i}t|i||i |i ||i i }|oEx|D]}|id|qeW|id||iddn!|id||idd|i|iidi|id|idddS( NRRRiRRRi(tGenExprCodeGeneratorRKR$RRyRjRR~R"RRRRRRDRtRRtiter(R$RKRDRR((Rt visitGenExprxs"   c Csp|i|g} xttt|i|iD]\}}|i |\}}d}x>|iD]3}|djo|i}n|i ||qfW| id|||fq5W|i |i|idx| D]z\}}}|oG|i}|id||i||id|i|n|id||i|qW|idddS(Nit YIELD_VALUERRRR(R$RRKRRRRRRRRRRRRRRRuRRRtRRvRw( R$RKRRRRRRRR((RtvisitGenExprInners2 "       cCs|i}|i}|io|idn|i|i|i d|i ||i |dt |i d||i |i|i ||fS(Ns[outmost-iterable]RRR(R$RuRRRKt is_outmostRRRRtRwRRR(R$RKRR((RtvisitGenExprFors      cCsN|i|dt|i|i|id||i|iddS(NRRR( R$RRKRRRRtRRu(R$RKR((RtvisitGenExprIfs  cCsdS(N((R$RK((Rt visitAssertscCs|i|d}|io|i|i|d}n|io|i|i|d}n|io|i|i|d}n|id|dS(Niit RAISE_VARARGS( R$RRKtntexpr1Rtexpr2texpr3Rt(R$RKR((Rt visitRaises    c Csh|i}|i}|i}|io|i} n|} |i||i d||i ||i i t |f|i|i|i d|i i|i d| |i|t|id} x>tt|iD]'}|i|\}}}|i||oa|i d|i||i dd|i}|i d||i |i d n|i d |o|i|n|i d |i d |i||i d||o|i |n |i |o|i d qqW|i d |io!|i | |i|in|i |dS( Nt SETUP_EXCEPTRRiRRsexception matchRRR(R$RuRthandlersRRKRtlElseRRtRwRfRRRRRvRtlastRRRttargettnext( R$RKRRRRRRRRR((RtvisitTryExceptsZ                      cCs|i}|i}|i||id||i||ii t |f|i |i|id|ii |idd|i||ii t|f|i |i|id|ii dS(Nt SETUP_FINALLYRRR(R$RuRtfinalRRKRtRwRfRRRRRR(R$RKRR((RtvisitTryFinallys        cCs.|i||i|i|iddS(NR(R$RRKRRRt(R$RK((Rt visitDiscard-s cCs|id|idS(NR(R$RtRKRY(R$RK((Rt visitConst2scCs'|id|i|i|idS(NR(R$RtRKRDRR(R$RK((Rt visitKeyword5scCsdS(N((R$RK((RRM9scCs!|i||i|idS(N(R$RRKRRD(R$RK((Rt visitName=s cCs|i|dS(N(R$RRK(R$RK((Rt visitPassAscCs|i|x|iD]\}}tdjo|iddn|id||i dd}|o|i ||i |q|i |qWdS(NiRt IMPORT_NAMEt.i( R$RRKRBRDRPtVERSIONRtRtsplitRt _resolveDotsR(R$RKRDRPR((RRQDs    cCs|i|td|i}tdjo|idt|n|id|i x|iD]\}}tdjo`|djod|_ |iddSq|id||i ||i|p|qf|id|qfW|id dS( NcCs|\}}|S(N(RDRP(t.0RDRP((RtSsiRR"t*it IMPORT_STARt IMPORT_FROMR(R$RRKtmapRBtfromlistR$RtttupletmodnameRDRPt namespaceR&R(R$RKR-RDRP((RRRQs$        cCsS|id}t|djodSnx"|dD]}|id|q5WdS(NR#iR(RDR%teltsRRGR$Rt(R$RDR1RG((RR&gs  cCs0|i|i|id|i|idS(NR(R$RRKRRtRztattrname(R$RK((Rt visitGetattrnscCs|i||i|it|id}xltt|iD]U}|i|}||jo|i dnt |t io|i|qFqFWdS(NiR(R$RRKRRRRtdupsRRRGRtRVRWtNode(R$RKR4RRG((Rt visitAssignts   cCse|idjo|i|in>|idjo!|i||i|in dG|iGHdS(Nt OP_ASSIGNt OP_DELETEtoops(RKRR$RRDRR(R$RK((RRTs  cCs|i|i|idjo |id|i|inB|idjo |id|i|indG|iGH|GHdS(NR7t STORE_ATTRR8t DELETE_ATTRswarning: unexpected flags:(R$RRKRRRtRzR2(R$RK((Rt visitAssAttrs   tUNPACK_SEQUENCEcCsUt|djo|i|t|inx|iD]}|i|q:WdS(NR8( tfindOpRKR$RtRRRRR(R$RKRR((Rt_visitAssSequences  icCs|i|ddS(Nt UNPACK_TUPLE(R$R?RK(R$RK((Rt visitAssTuplescCs|i|ddS(Nt UNPACK_LIST(R$R?RK(R$RK((Rt visitAssListscCsg|i|t|i}|i|d|i|i|i|i|i |i|ddS(Ntloadtstore( R$RRKtwrap_augtaug_nodeRRRtt_augmented_opcodeR(R$RKRG((RtvisitAugAssigns  s+=t INPLACE_ADDs-=tINPLACE_SUBTRACTs*=tINPLACE_MULTIPLYs/=tINPLACE_DIVIDEs//=tINPLACE_FLOOR_DIVIDEs%=tINPLACE_MODULOs**=t INPLACE_POWERs>>=tINPLACE_RSHIFTs<<=tINPLACE_LSHIFTs&=t INPLACE_ANDs^=t INPLACE_XORs|=t INPLACE_ORcCsF|djo|i|in"|djo|i|indS(NRDRE(RR$RRKRDR(R$RKR((Rt visitAugNames  cCs|djo=|i|i|id|id|i|in;|djo-|id|id|i|indS(NRDRRRERR:(RR$RRKRRtRzR2(R$RKR((RtvisitAugGetattrs     cCs|djo|i|dn|djod}|io|dB}n|io|dB}n|djo|idn,|djo|idn|id |id |ndS( NRDiREiiRitROT_FOURRsSTORE_SLICE+%d(RR$t visitSliceRKtslicetlowertupperRt(R$RKRRZ((Rt visitAugSlices       cCsst|idjo tdn|djo|i|dn,|djo|id|idndS(Nis-augmented assignment to tuple is not possibleRDRERt STORE_SUBSCR(RRKtsubsRRR$tvisitSubscriptRt(R$RKR((RtvisitAugSubscripts    cCs|i|i|idjo|iddn|i|i|idjo|idn|i|i|iddS(NRRt EXEC_STMT(R$RRKRReRRtRC(R$RK((Rt visitExecscCsd}d}|i||i|ixI|iD]>}|i|t|t i o|d}q3|d}q3W|i dj o|i|i n|i dj o|i|i n|i dj }|i dj }t||f}|i||d>|BdS(Niii(tpostkwR$RRKRtargstargRVRWtKeywordt star_argsRt dstar_argst have_start have_dstartcallfunc_opcode_infotopcodeRt(R$RKRnRlRdReRgRk((Rt visitCallFuncs$   cCs|i||io|i|inxn|iD]c}|io|idn|i||io|id|idq5|idq5W|io| o|idndS(NRRt PRINT_ITEM_TOt PRINT_ITEMR( R$RRKtdestRRRRttnewline(R$RKRsR((Rt visitPrints       cCs?|i|dd|io|idn|iddS(NRsitPRINT_NEWLINE_TOt PRINT_NEWLINE(R$RtRKRrRt(R$RK((Rt visitPrintnls cCs.|i||i|i|iddS(NR(R$RRKRRYRt(R$RK((Rt visitReturns cCs.|i||i|i|iddS(NR(R$RRKRRYRt(R$RK((Rt visitYield s cCsB|i|id}|io|i|i|dB}n|io|i|i|dB}n|oS|djo|idq|djo|iddq|iddn|i djo|id|nZ|i d jo|id |n5|i d jo|id |nd G|i GHdS(NiiiRitDUP_TOPXtOP_APPLYsSLICE+%dR7sSTORE_SLICE+%dR8sDELETE_SLICE+%ds weird slice( R$RRKRRZR[R\taug_flagRtR(R$RKR|RZ((RRY's,     cCs|i|ix|iD]}|i|qW|o|iddnt|idjo|idt|in|i djo|idnC|i djo|idn"|i d jo|id ndS( NRziiRR{t BINARY_SUBSCRR7R^R8t DELETE_SUBSCR( R$RRKRR_tsubR|RtRR(R$RKR|R((RR`Bs cCs1|i|i|i|i|i|dS(N(R$RRKtlefttrightRtR(R$RKR((RtbinaryOpSscCs|i|dS(Nt BINARY_ADD(R$RRK(R$RK((RtvisitAddXscCs|i|dS(NtBINARY_SUBTRACT(R$RRK(R$RK((RtvisitSub[scCs|i|dS(NtBINARY_MULTIPLY(R$RRK(R$RK((RtvisitMul^scCs|i||iS(N(R$RRKRi(R$RK((RtvisitDivascCs|i|dS(NtBINARY_FLOOR_DIVIDE(R$RRK(R$RK((Rt visitFloorDivdscCs|i|dS(Nt BINARY_MODULO(R$RRK(R$RK((RtvisitModgscCs|i|dS(Nt BINARY_POWER(R$RRK(R$RK((Rt visitPowerjscCs|i|dS(Nt BINARY_LSHIFT(R$RRK(R$RK((RtvisitLeftShiftmscCs|i|dS(Nt BINARY_RSHIFT(R$RRK(R$RK((RtvisitRightShiftpscCs!|i|i|i|dS(N(R$RRKRRtR(R$RKR((RtunaryOpuscCs|i|dS(Nt UNARY_INVERT(R$RRK(R$RK((Rt visitInvertyscCs|i|dS(NtUNARY_NEGATIVE(R$RRK(R$RK((Rt visitUnarySub|scCs|i|dS(NtUNARY_POSITIVE(R$RRK(R$RK((Rt visitUnaryAddscCs|i|dS(NR(R$RRK(R$RK((RtvisitUnaryInvertscCs|i|dS(Nt UNARY_NOT(R$RRK(R$RK((RtvisitNotscCs|i|dS(Nt UNARY_CONVERT(R$RRK(R$RK((RtvisitBackquotescCsD|i|dx,|dD] }|i||i|qWdS(Nii(R$RRRKRtR(R$RRRK((RtbitOps   cCs|i|idS(Nt BINARY_AND(R$RRKR(R$RK((Rt visitBitandscCs|i|idS(Nt BINARY_OR(R$RRKR(R$RK((Rt visitBitorscCs|i|idS(Nt BINARY_XOR(R$RRKR(R$RK((Rt visitBitxorscCs|idtdS(NR(R$RttEllipsis(R$RK((Rt visitEllipsisscCsK|i|x|iD]}|i|qW|idt|idS(NR(R$RRKRRGRRtR(R$RKRG((Rt visitTuples   cCsK|i|x|iD]}|i|qW|idt|idS(NR(R$RRKRRGRRtR(R$RKRG((Rt visitLists   cCs>x|iD]}|i|q W|idt|idS(Nt BUILD_SLICE(RKRRR$RRtR(R$RKR((Rt visitSliceobjs cCs||i||iddxX|iD]M\}}|id|i||i||id|idq'WdS(Nt BUILD_MAPiRRR^(R$RRKRttitemstktvR(R$RKRR((RRLs      (oR.R/RURRR`RyR%RaRcRhR-RzRRjRRRRRRRRR@RRRRRRNRORRSRRRRRRRRRRRRRRRR R R RRRRRRRMR R!RQRRR&R3R6RTR<R?R$RARCRIRHRVRWR]RaRcRoRtRwRxRyRYR`RRRRRRRRRRRRRRRRRRRRRRRRRRL(((RR[s                             &       2                r                                  tNestedScopeMixincBstZdZdZRS(s>Defines initClass() for nested scoping (Python 2.2-compatible)cCs(t|i_t|i_t|i_dS(N(R@R$RbRtFunctionCodeGeneratorRtClassCodeGeneratorR(R$((RRas  (R.R/RURa(((RRs R2cBs)tZeiZdZdZdZRS(NcCsEtid|i|_ti||_|i t ||dS(Ns( tpyassemt PyFlowGraphR'RR$Rmtfuturet find_futuresRkt _ModuleCodeGenerator__super_initR~(R$R'((RR%s cCs|S(N(R$(R$((RRjs(R.R/R[R%RRRRj(((RR2s  R0cBs/tZeiZdZfZdZdZRS(NcCs3tid|i|_|it||dS(Ns (RRR'RR$Rmt$_ExpressionCodeGenerator__super_initR~(R$R'((RR%s cCs|S(N(R$(R$((RRjs( R.R/R[R%RRRRkRj(((RR0s   R1cBs8tZeiZdZfZdZdZdZ RS(NcCsMtid|i|_|i|i|t|||i ddS(Ns R( RRR'RR$Rmt%_InteractiveCodeGenerator__super_initRR~Rt(R$R'((RR%s    cCs|S(N(R$(R$((RRjscCs!|i|i|iddS(Nt PRINT_EXPR(R$RRKRRt(R$RK((RRs( R.R/R[R%RRRRkRjR(((RR1s    tAbstractFunctionCodecBsGtZdZdZdZdZdZdZdZeZ RS(Niic CsW||_||_|o't} d| i}| id| _n |i}t |i \}} ti||i|dd|_||_|i| o|io|i|int|i|i|dd}|ii|i|io|iitn|io|iit n|i!|| o|i"|i ndS(Ns iRRi(#RyR$RtmoduleRRtklasst lambdaCountRDtfunctgenerateArgListtargnamesRft hasTupleArgRRRRmt super_initRRxR~R"RRReRRJtvarargsRnt CO_VARARGStkwargstCO_VARKEYWORDSRtgenerateArgUnpack( R$RRRRyRRRDRfRR((RR%s.      !   cCs|iS(N(R$R(R$((RRjscCs<|ii|ip|iddn|iddS(NRR(R$RmtstartExitBlockRRtR(R$((RRs  cCsjxctt|D]O}||}t|tijo)|i dd|d|i |qqWdS(Nt LOAD_FASTs.%di( RRRfRRgttypettypest TupleTypeR$RttunpackSequence(R$RfRRg((RR s  cCstdjo|idt|n|idt|xE|D]=}t|tijo|i |qD|i d|qDWdS(NiR=R@R( R$R$RtRttupRGRRRRR(R$RRG((RR's ( R.R/RRR%RjRRRt unpackTuple(((RRs     RcBs)tZeiZdZeiZdZRS(NcCs||_|||_|i||||||ii |ii |ii |ii |ii dj o|iitndS(N(RR$RRt"_FunctionCodeGenerator__super_initRRyRRmt setFreeVarsRt setCellVarst get_cell_varst generatorRRnt CO_GENERATOR(R$RRRRyR((RR%;s  ( R.R/R[R%RRRRR(((RR4s  RcBs)tZeiZdZeiZdZRS(NcCsu||_|||_|i||d|||ii|ii |ii |ii |ii t dS(Ni(RR$tgexpRt!_GenExprCodeGenerator__super_initRyRRmRRRRRnR(R$RRRyR((RR%Ks   ( R.R/R[R%RRRRR(((RRDs  tAbstractClassCodecBs#tZdZdZdZRS(NcCs|i|_||_ti|i|idddd|_|i t |i |i dd}|ii|i|iit|io|i|indS(NRiRiR(RRDR$RyRRRRRmRR~R"RRReRRJRnt CO_NEWLOCALSRRx(R$RRRR((RR%Us    cCs|iS(N(R$R(R$((RRjascCs+|ii|id|iddS(Nt LOAD_LOCALSR(R$RmRRt(R$((RRds  (R.R/R%RjR(((RRSs RcBs)tZeiZdZeiZdZRS(NcCs||_|||_|i||||ii|ii|ii |ii |i ||i dd|i d|io$|i d|i|i dndS(Nt LOAD_GLOBALR.R/RRU(RR$RRt_ClassCodeGenerator__super_initRRmRRRRRRtRR(R$RRR((RR%os     ( R.R/R[R%RRRRR(((RRis  cCsg}g}d}xtt|D]}||}t|t i jo|i |q%t|t i jo>|i t |d||iti||d}q%td|q%W|||fS(s&Generate an arg list marking TupleArgsiiisunexpect argument type:N(RftextratcountRRtarglistRRGRRt StringTypeRRtTupleArgtextendR(tflattenR!(RRRRRfRG((RR|s cCs#t}t||dd|iS(s5Find the op (DELETE, LOAD, STORE) in an AssTuple treeRiN(tOpFinderRR~RKR(RKR((RR>s RcBs&tZdZdZeZeZRS(NcCs d|_dS(N(RR$R(R$((RR%scCsD|idjo|i|_n!|i|ijo tdndS(Nsmixed ops in stmt(R$RRRKRR!(R$RK((RRTs(R.R/R%RTR<R`(((RRs  t DelegatorcBs tZdZdZdZRS(sBase class to support delegation for augmented assignment nodes To generator code for augmented assignments, we use the following wrapper classes. In visitAugAssign, the left-hand expression node is visited twice. The first time the visit uses the normal method for that node . The second time the visit uses a different method that generates the appropriate code to perform the assignment. These delegator classes wrap the original AST nodes in order to support the variant visit methods. cCs ||_dS(N(tobjR$(R$R((RR%scCst|i|S(N(RR$Rtattr(R$R((Rt __getattr__s(R.R/RUR%R(((RRs  t AugGetattrcBstZRS(N(R.R/(((RRstAugNamecBstZRS(N(R.R/(((RRstAugSlicecBstZRS(N(R.R/(((RRst AugSubscriptcBstZRS(N(R.R/(((RRscCst|i|S(N(twrapperRKRb(RK((RRFst__main__(KR>R7R6R;tsysRt cStringIOtStringIOtcompilerRWR&R~R*RR(RR{tcompiler.constsRRRRRRRt CO_NESTEDRRpRotcompiler.pyassemRt version_infoR$tAttributeErrorRmRRRRRRRR#R RR R@RZR[RR2R0R1RRRRRRR>RRRRRRtGetattrtNametSlicet SubscriptRRFR.targvtfile(>RR0R@RR(R~R&RR1RRRRRRRRFR;RZR>RRRRRRmRRoRpR>RRRR#RRWRRRRRRR$R*R RRRR{RRR[RR R2RRRRR7R6R((Rt?sp       1  B   +  >   6