eaiovnaovbqoebvqoeavibavo B YI~dM @sddlZddlZddlZddlZddlTddlmZdddddd d d d d dg eZ[ejejej e e e fZ edZddZdOdddddZdPddddZddddddddddd Zd!d"Zd#d$Zd%dZd&d'Zddd(d Zed)d*Zd+ej_d,ej_d-ej_d.ej_d/ej_d0ej _d1ej!_d2ej"_d3Z#d4Z$Gd5d d eZ%dd6d7d Z&d8d9Z'd:d;Z(dQd            )rcCs\|dkrDy tj}Wntk r0tddYnXx|jrB|j}q4Wt|jj|j|ddS)Nz no last traceback to disassemble)r) syslast_tracebackAttributeError RuntimeErrortb_nextrtb_framef_codetb_lasti)tbrrrrrOs  Z OPTIMIZEDZ NEWLOCALSZVARARGSZ VARKEYWORDSZNESTEDZ GENERATORZNOFREEZ COROUTINEZITERABLE_COROUTINEZASYNC_GENERATOR)  @icCsbg}xRtdD]8}d|>}||@r|t|t|||N}|sPqW|t|d|S)NrBr=z, )rangeappendCOMPILER_FLAG_NAMESgethexjoin)flagsnamesiflagrrr pretty_flagsisrPcCst|dr|j}t|dr"|j}n4t|dr4|j}n"t|drF|j}nt|drV|j}t|trjt|d}t|drx|St dt |j dS) Nrrrrr z r"z(don't know how to disassemble %s objects) r#rrrrr r&r.rr)r0r1)r2rrr_get_code_objectws         rQcCs tt|S)N)_format_code_inforQ)r2rrrrscCsg}|d|j|d|j|d|j|d|j|d|j|d|j|dt|j|j r|dx t |j D]}|d |qW|j r|d x t |j D]}|d |qW|j r|d x t |j D]}|d |qW|j rF|d x"t |j D]}|d |q.W|jr||dx"t |jD]}|d |qdWd|S)NzName: %szFilename: %szArgument count: %szKw-only arguments: %szNumber of locals: %szStack size: %szFlags: %sz Constants:z%4d: %rzNames:z%4d: %szVariable names:zFree variables:zCell variables: )rGco_name co_filename co_argcountco_kwonlyargcount co_nlocals co_stacksizerPco_flags co_consts enumerateco_names co_varnames co_freevars co_cellvarsrK)colinesZi_cZi_nrrrrRs:     rRcCstt||ddS)N)r)r(r)rarrrrr s _InstructionzBopname opcode arg argval argrepr offset starts_line is_jump_targetz!Human readable name for operationzNumeric code for operationz6Numeric argument to operation (if any), otherwise Nonez4Resolved arg value (if known), otherwise same as argz0Human readable description of operation argumentz1Start index of operation within bytecode sequencez4Line started by this opcode (if any), otherwise Nonez1True if other code jumps to here, otherwise Falsec@seZdZdddZdS)r Fr?cCsg}|r:|jdk r,d|}|||jn|d||rJ|dn |d|jrf|dn |d|t|j|||jt|j dk r|t|j t |j r|d|j dd | S) Nz%%%dd z-->z z>>z ()) starts_linerGis_jump_targetreproffsetrjustopnameljust _OPNAME_WIDTHarg _OPARG_WIDTHargreprrKrstrip)self lineno_widthZmark_as_current offset_widthZfieldsZ lineno_fmtrrr _disassembles&      zInstruction._disassembleN)rfFr?)r1 __module__ __qualname__ryrrrrr s) first_linecCsTt|}|j|j}tt|}|dk r4||j}nd}t|j|j|j |j |||S)Nr) rQr`r_dictr co_firstlineno_get_instructions_bytesr"r^r]r[)r2r|ra cell_names linestarts line_offsetrrrr s    cCs |}|dk r||}|t|fS)N)rl)Z const_indexZ const_listargvalrrr_get_const_infosrcCs*|}|dk r||}|}nt|}||fS)N)rl)Z name_indexZ name_listrrtrrr_get_name_infos rc csxt|}d}xdt|D]V\} } } |dk rH|| d}|dk rH||7}| |k} d} d}| dk rT| } | tkr~t| |\} }n| tkrt| |\} }n| tkr| d| } dt| }n| t krt| |\} }n| t krt | } | }nn| t krt| |\} }nV| t krTdtttf| d@t| d@f} d| d@}| drT|rL|d7}|d 7}tt| | | | || || VqWdS) Nr>zto rfr?)rr.rlasciir=z, z with format)r _unpack_opargsrIZhasconstrZhasnamerhasjrelrlZhaslocalZ hascompareZcmp_opZhasfreerr.rboolr ro)codevarnamesrM constantscellsrrlabelsrjrmoprrrkrrtrrrr-sH         rc Cs<|j|j}tt|}t|j||j|j|j|||ddS)N)r) r`r_r}r r-r"r^r]r[)ralastirrrrrrr`s  cCstt||d|dks|dkrp|dk r,|d}xB|jD]8}t|dr4t|dtd|f|dt|||dq4WdS)N)rrr=r"zDisassembly of %r:)rr)rr[r#r(r*)rarrr2rrrr*gs    r*)rrc Cs|dk } | r8t||} | dkr2tt| } qi'r?)r)r) maxvalueslenr.rrjrmr(ry)rrrrMrrrrrZ show_linenoZ maxlinenorwZ maxoffsetrxZinstrZnew_source_lineZis_current_instrrrrr-rs,       r-cKstt|df|dS)Nz)r*r)rkwargsrrrr/sr/ccshd}x^tdt|dD]J}||}|tkrP||d|B}|tkrJ|d>nd}nd}|||fVqWdS)Nrr>r=r@)rFrZ HAVE_ARGUMENTZ EXTENDED_ARG)rZ extended_argrNrrrrrrrsrcCs`g}xVt|D]J\}}}|dk r|tkr6|d|}n|tkr|}nq||kr||qW|S)Nr>)rrZhasjabsrG)rrrmrrrZlabelrrrr sccs|jddd}|jddd}d}|j}d}xPt||D]B\}}|rd||kr\||fV|}||7}|dkrt|d8}||7}q:W||kr||fVdS)Nrr>r=rDrE) co_lnotabr~zip)rZbyte_incrementsZline_incrementsZ lastlinenolinenoZaddrZ byte_incrZ line_incrrrrr s   c@sHeZdZdddddZddZddZed d Zd d Zd dZ dS)rN)r|current_offsetcCsdt||_}|dkr&|j|_d|_n||_||j|_|j|j|_tt ||_ ||_ ||_ dS)Nr) rQcodeobjr~r| _line_offsetr`r_ _cell_namesr}r _linestarts_original_objectr)rvr2r|rrarrr__init__s zBytecode.__init__c Cs*|j}t|j|j|j|j|j|j|jdS)N)r) rrr"r^r]r[rrr)rvrarrr__iter__s zBytecode.__iter__cCsd|jj|jS)Nz{}({!r}))format __class__r1r)rvrrr__repr__s zBytecode.__repr__cCs$x|jr|j}qW||jj|jdS)N)r)r8r9r:r;)clsr<rrrfrom_tracebacks zBytecode.from_tracebackcCs t|jS)N)rRr)rvrrrinfosz Bytecode.infoc Cs`|j}|jdk r|j}nd}t2}t|j|j|j|j|j |j |j ||d | SQRXdS)Nr)rrMrrrrrr) rrioStringIOr-r"r^r]r[rrrgetvalue)rvrarmoutputrrrrs   z Bytecode.dis) r1rzr{rrr classmethodrrrrrrrrs   c Csdddl}|}|jd|ddd|}|j}|}WdQRXt||jjd}t |dS)Nrinfile?-)r0nargsdefaultr) argparseArgumentParser add_argumentFileType parse_argsrreadrrr)rparserargsrrrrrr_test sr__main__)N)N)NNNNNr)r)rNNNNN)5r4types collectionsrZopcoderZ _opcodes_all MethodType FunctionTypeCodeTyper staticmethodr0r'ZopmaprrrrrHrPrQrrRr namedtuplercro__doc__rrrrtrmrjrkrqrsr r rrrrr*r-r/rrr r rrr1rrrrs|     -4  2  =