a DOgZP @sddlZddlZddlZddlZddlTddlmZgdeZ[ejejej e e e fZ edZdedfedfed ffZed Zd Zd d ZdUdddddZdVddddZddddddddddd Zdd Zd!d"Zd#d$Zd%d&Zddd'd(Zed)d*Z d+e j!_"d,e j_"d-e j#_"d.e j$_"d/e j%_"d0e j&_"d1e j'_"d2e j(_"d3Z)d4Z*Gd5d6d6e Z+dd7d8d9Z,d:d;Z-dd?Z/dXdddAdBZ0ddddCdDZ1dYdddEdFdGZ2dHdIZ3e0Z4dJdKZ5dLdMZ6dNdOZ7GdPdQdQZ8dRdSZ9e:dTkre9dS)ZN)*)__all__) code_infodis disassembledistbdiscofindlinestarts findlabels show_codeget_instructions InstructionBytecode FORMAT_VALUE)Nstrreprascii MAKE_FUNCTION)defaults kwdefaults annotationsZclosurecCs4zt||d}Wnty.t||d}Yn0|S)Nevalexec)compile SyntaxError)sourcenamecr(/opt/alt/python39/lib64/python3.9/dis.py _try_compiles  r!filedepthc Csj|durt|ddSt|dr&|j}t|dr8|j}n4t|drJ|j}n"t|dr\|j}nt|drl|j}t|drt|j }|D]r\}}t |t rt d||dzt |||d Wn2ty}zt d ||dWYd}~n d}~00t |dqnht|d rt|||d nLt |ttfr8t||dn.t |trTt|||d ntd t|jdS) Nr#__func____code__gi_codeag_codecr_code__dict__zDisassembly of %s:r"zSorry:co_code(don't know how to disassemble %s objects)rhasattrr&r'r(r)r*sortedr+items isinstance _have_codeprintr TypeError_disassemble_recursivebytes bytearray_disassemble_bytesr_disassemble_strtype__name__)xr#r$r0rZx1msgrrr r+s@          $  rr%cCsV|dur>z tj}Wnty.tddYn0|jr>|j}q0t|jj|j|ddS)Nz no last traceback to disassembler%) syslast_tracebackAttributeError RuntimeErrortb_nextrtb_framef_codetb_lasti)tbr#rrr rXs  rZ OPTIMIZEDZ NEWLOCALSZVARARGSZ VARKEYWORDSZNESTEDZ GENERATORZNOFREEZ COROUTINEZITERABLE_COROUTINEZASYNC_GENERATOR)  @icCs`g}tdD]:}d|>}||@r |t|t|||N}|s qVq |t|d|S)NrLrG, )rangeappendCOMPILER_FLAG_NAMESgethexjoin)flagsnamesiflagrrr pretty_flagsrs r[cCst|dr|j}t|dr"|j}n4t|dr4|j}n"t|drF|j}nt|drV|j}t|trjt|d}t|drx|St dt |j dS) Nr&r'r(r)r*z r,r-) r.r&r'r(r)r*r1rr!r4r:r;r<rrr _get_code_objects"        r]cCs tt|SN)_format_code_infor]r\rrr rsrcCsg}|d|j|d|j|d|j|d|j|d|j|d|j|d|j|dt|j |j r|d t |j D]}|d |q|j r|d t |j D]}|d |q|j r|d t |j D]}|d |q|jrH|dt |jD]}|d |q2|jrz|dt |jD]}|d |qdd|S)NzName: %szFilename: %szArgument count: %szPositional-only arguments: %szKw-only arguments: %szNumber of locals: %szStack size: %szFlags: %sz Constants:z%4d: %rzNames:z%4d: %szVariable names:zFree variables:zCell variables: )rRco_name co_filename co_argcountco_posonlyargcountco_kwonlyargcount co_nlocals co_stacksizer[co_flags co_consts enumerateco_names co_varnames co_freevars co_cellvarsrV)colinesZi_cZi_nrrr r_s<     r_cCstt||ddSNr%)r3r)ror#rrr r sr _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 FrIcCsg}|r:|jdur,d|}|||jn|d||rJ|dn |d|jrf|dn |d|t|j|||jt|j dur|t|j t |j r|d|j dd | S) Nz%%%dd z-->z z>>z ()) starts_linerRis_jump_targetroffsetrjustopnameljust _OPNAME_WIDTHarg _OPARG_WIDTHargreprrVrstrip)self lineno_widthZmark_as_current offset_widthfieldsZ lineno_fmtrrr _disassembles&      zInstruction._disassembleN)ruFrI)r; __module__ __qualname__rrrrr r sr ) first_linecCsTt|}|j|j}tt|}|dur4||j}nd}t|j|j|j |j |||SNr) r]rnrmdictr co_firstlineno_get_instructions_bytesr,rlrkri)r<rro cell_names linestarts line_offsetrrr r s    r cCs |}|dur||}|t|fSr^r)Z const_indexZ const_listargvalrrr _get_const_infosrcCs*|}|dur||}|}nt|}||fSr^r)Z name_indexZ name_listrrrrr _get_name_info's rc #st|}d}t|D]r\} } |durD|| d}|durD||7}| |v} d} d} durl} | tvrzt|\} } n| tvrt|\} } n| tvr| d} dt| } n| t vrt|\} } n| t vrt } | } n| t vrt|\} } nr| t krFtd@\} } | td@f} | drl| r<| d7} | d7} n&| tkrldfd d ttD} tt| | | | | || VqdS) NrrHzto rurIrGrPz with formatc3s"|]\}}d|>@r|VqdS)rGNr).0rYsrrr gs  z*_get_instructions_bytes..)r _unpack_opargsrTZhasconstrZhasnamerhasjrelrZhaslocalZ hascompareZcmp_opZhasfreerFORMAT_VALUE_CONVERTERSboolrrVrjMAKE_FUNCTION_FLAGSr r})codevarnamesrX constantscellsrrlabelsryr{oprzrrrrr r7sN         rc Cs<|j|j}tt|}t|j||j|j|j|||ddSrq) rnrmrr r8r,rlrkri)rolastir#rrrrr rms    rcCspt||d|dus|dkrl|dur,|d}|jD]8}t|dr2t|dtd|f|dt|||dq2dS)Nr%rrGr,zDisassembly of %r:r")rrir.r3r5)ror#r$r<rrr r5ts    r5)r#rc Cs|du} | r8t||} | dkr2tt| } q)r5r!)rkwargsrrr r9sr9ccsdd}tdt|dD]J}||}|tkrN||d|B}|tkrH|d>nd}nd}|||fVqdS)NrrHrGrJ)rQrZ HAVE_ARGUMENTZ EXTENDED_ARG)rZ extended_argrYrrrrr rsrcCs\g}t|D]J\}}}|dur |tvr4|d|}n|tvr |}nq ||vr ||q |S)NrH)rrZhasjabsrR)rrr{rrZlabelrrr r s r c cs|jddd}|jddd}t|j}d}|j}d}t||D]P\}}|rz||krd||fV|}||7}||krzdS|dkr|d8}||7}qB||kr||fVdS)NrrHrGrNrO) co_lnotabrr,rzip) rZbyte_incrementsZline_incrementsZ bytecode_lenZ lastlinenolinenoZaddrZ byte_incrZ line_incrrrr r s&   r c@sHeZdZdddddZddZddZed d Zd d Zd dZ dS)rN)rcurrent_offsetcCsdt||_}|dur&|j|_d|_n||_||j|_|j|j|_tt ||_ ||_ ||_ dSr) r]codeobjrr _line_offsetrnrm _cell_namesrr _linestarts_original_objectr)rr<rrrorrr __init__s zBytecode.__init__c Cs*|j}t|j|j|j|j|j|j|jdS)Nr) rrr,rlrkrirrr)rrorrr __iter__s zBytecode.__iter__cCsd|jj|jS)Nz{}({!r}))format __class__r;rrrrr __repr__s zBytecode.__repr__cCs |jr|j}q||jj|jdS)N)r)rBrCrDrE)clsrFrrr from_tracebackszBytecode.from_tracebackcCs t|jSr^)r_rrrrr infosz Bytecode.infoc Csx|j}|jdur|j}nd}t@}t|j|j|j|j|j |j |j ||d | WdS1sj0YdS)Nr)rrXrrrrr#r) rrioStringIOr8r,rlrkrirrrgetvalue)rror{outputrrr r s   z Bytecode.dis) r;rrrrr classmethodrrrrrrr rs  rcCszddl}|}|jd|dddd|}|j}|}Wdn1sT0Yt||jjd}t |dS)Nrinfilerb?-)r:nargsdefaultr) argparseArgumentParser add_argumentZFileType parse_argsrreadrrr)rparserargsrrrrrr _tests&r__main__)N)N)NNNNNr)r)rNNNNN);r>types collectionsrZopcoderZ _opcodes_all MethodType FunctionTypeCodeTyper staticmethodr:r2Zopmaprrrrrrrr!rrrSr[r]rr_r namedtuplerrr}__doc__rrrr{ryrzrrr r rrrrr5r8r9rrr r rrr;rrrr s   -  4  6   =