706 lines · 21.2 KB · TeX
RawDownload
\section{\module{dis} ---         Disassembler for Python byte code} \declaremodule{standard}{dis}\modulesynopsis{Disassembler for Python byte code.}  The \module{dis} module supports the analysis of Python byte code bydisassembling it.  Since there is no Python assembler, this moduledefines the Python assembly language.  The Python byte code whichthis module takes as an input is defined in the file \file{Include/opcode.h} and used by the compiler and the interpreter. Example: Given the function \function{myfunc}: \begin{verbatim}def myfunc(alist):    return len(alist)\end{verbatim} the following command can be used to get the disassembly of\function{myfunc()}: \begin{verbatim}>>> dis.dis(myfunc)  2           0 LOAD_GLOBAL              0 (len)              3 LOAD_FAST                0 (alist)              6 CALL_FUNCTION            1              9 RETURN_VALUE\end{verbatim} (The ``2'' is a line number). The \module{dis} module defines the following functions and constants: \begin{funcdesc}{dis}{\optional{bytesource}}Disassemble the \var{bytesource} object. \var{bytesource} can denoteeither a module, a class, a method, a function, or a code object.  For a module, it disassembles all functions.  For a class,it disassembles all methods.  For a single code sequence, it printsone line per byte code instruction.  If no object is provided, itdisassembles the last traceback.\end{funcdesc} \begin{funcdesc}{distb}{\optional{tb}}Disassembles the top-of-stack function of a traceback, using the lasttraceback if none was passed.  The instruction causing the exceptionis indicated.\end{funcdesc} \begin{funcdesc}{disassemble}{code\optional{, lasti}}Disassembles a code object, indicating the last instruction if \var{lasti}was provided.  The output is divided in the following columns: \begin{enumerate}\item the line number, for the first instruction of each line\item the current instruction, indicated as \samp{-->},\item a labelled instruction, indicated with \samp{>>},\item the address of the instruction,\item the operation code name,\item operation parameters, and\item interpretation of the parameters in parentheses.\end{enumerate} The parameter interpretation recognizes local and globalvariable names, constant values, branch targets, and compareoperators.\end{funcdesc} \begin{funcdesc}{disco}{code\optional{, lasti}}A synonym for disassemble.  It is more convenient to type, and keptfor compatibility with earlier Python releases.\end{funcdesc} \begin{datadesc}{opname}Sequence of operation names, indexable using the byte code.\end{datadesc} \begin{datadesc}{opmap}Dictionary mapping byte codes to operation names.\end{datadesc} \begin{datadesc}{cmp_op}Sequence of all compare operation names.\end{datadesc} \begin{datadesc}{hasconst}Sequence of byte codes that have a constant parameter.\end{datadesc} \begin{datadesc}{hasfree}Sequence of byte codes that access a free variable.\end{datadesc} \begin{datadesc}{hasname}Sequence of byte codes that access an attribute by name.\end{datadesc} \begin{datadesc}{hasjrel}Sequence of byte codes that have a relative jump target.\end{datadesc} \begin{datadesc}{hasjabs}Sequence of byte codes that have an absolute jump target.\end{datadesc} \begin{datadesc}{haslocal}Sequence of byte codes that access a local variable.\end{datadesc} \begin{datadesc}{hascompare}Sequence of byte codes of Boolean operations.\end{datadesc} \subsection{Python Byte Code Instructions}\label{bytecodes} The Python compiler currently generates the following byte codeinstructions. \setindexsubitem{(byte code insns)} \begin{opcodedesc}{STOP_CODE}{}Indicates end-of-code to the compiler, not used by the interpreter.\end{opcodedesc} \begin{opcodedesc}{NOP}{}Do nothing code.  Used as a placeholder by the bytecode optimizer.\end{opcodedesc} \begin{opcodedesc}{POP_TOP}{}Removes the top-of-stack (TOS) item.\end{opcodedesc} \begin{opcodedesc}{ROT_TWO}{}Swaps the two top-most stack items.\end{opcodedesc} \begin{opcodedesc}{ROT_THREE}{}Lifts second and third stack item one position up, moves top downto position three.\end{opcodedesc} \begin{opcodedesc}{ROT_FOUR}{}Lifts second, third and forth stack item one position up, moves top down toposition four.\end{opcodedesc} \begin{opcodedesc}{DUP_TOP}{}Duplicates the reference on top of the stack.\end{opcodedesc} Unary Operations take the top of the stack, apply the operation, andpush the result back on the stack. \begin{opcodedesc}{UNARY_POSITIVE}{}Implements \code{TOS = +TOS}.\end{opcodedesc} \begin{opcodedesc}{UNARY_NEGATIVE}{}Implements \code{TOS = -TOS}.\end{opcodedesc} \begin{opcodedesc}{UNARY_NOT}{}Implements \code{TOS = not TOS}.\end{opcodedesc} \begin{opcodedesc}{UNARY_CONVERT}{}Implements \code{TOS = `TOS`}.\end{opcodedesc} \begin{opcodedesc}{UNARY_INVERT}{}Implements \code{TOS = \~{}TOS}.\end{opcodedesc} \begin{opcodedesc}{GET_ITER}{}Implements \code{TOS = iter(TOS)}.\end{opcodedesc} Binary operations remove the top of the stack (TOS) and the second top-moststack item (TOS1) from the stack.  They perform the operation, and put theresult back on the stack. \begin{opcodedesc}{BINARY_POWER}{}Implements \code{TOS = TOS1 ** TOS}.\end{opcodedesc} \begin{opcodedesc}{BINARY_MULTIPLY}{}Implements \code{TOS = TOS1 * TOS}.\end{opcodedesc} \begin{opcodedesc}{BINARY_DIVIDE}{}Implements \code{TOS = TOS1 / TOS} when\code{from __future__ import division} is not in effect.\end{opcodedesc} \begin{opcodedesc}{BINARY_FLOOR_DIVIDE}{}Implements \code{TOS = TOS1 // TOS}.\end{opcodedesc} \begin{opcodedesc}{BINARY_TRUE_DIVIDE}{}Implements \code{TOS = TOS1 / TOS} when\code{from __future__ import division} is in effect.\end{opcodedesc} \begin{opcodedesc}{BINARY_MODULO}{}Implements \code{TOS = TOS1 \%{} TOS}.\end{opcodedesc} \begin{opcodedesc}{BINARY_ADD}{}Implements \code{TOS = TOS1 + TOS}.\end{opcodedesc} \begin{opcodedesc}{BINARY_SUBTRACT}{}Implements \code{TOS = TOS1 - TOS}.\end{opcodedesc} \begin{opcodedesc}{BINARY_SUBSCR}{}Implements \code{TOS = TOS1[TOS]}.\end{opcodedesc} \begin{opcodedesc}{BINARY_LSHIFT}{}Implements \code{TOS = TOS1 <\code{}< TOS}.\end{opcodedesc} \begin{opcodedesc}{BINARY_RSHIFT}{}Implements \code{TOS = TOS1 >\code{}> TOS}.\end{opcodedesc} \begin{opcodedesc}{BINARY_AND}{}Implements \code{TOS = TOS1 \&\ TOS}.\end{opcodedesc} \begin{opcodedesc}{BINARY_XOR}{}Implements \code{TOS = TOS1 \^\ TOS}.\end{opcodedesc} \begin{opcodedesc}{BINARY_OR}{}Implements \code{TOS = TOS1 | TOS}.\end{opcodedesc} In-place operations are like binary operations, in that they remove TOS andTOS1, and push the result back on the stack, but the operation is donein-place when TOS1 supports it, and the resulting TOS may be (but does nothave to be) the original TOS1. \begin{opcodedesc}{INPLACE_POWER}{}Implements in-place \code{TOS = TOS1 ** TOS}.\end{opcodedesc} \begin{opcodedesc}{INPLACE_MULTIPLY}{}Implements in-place \code{TOS = TOS1 * TOS}.\end{opcodedesc} \begin{opcodedesc}{INPLACE_DIVIDE}{}Implements in-place \code{TOS = TOS1 / TOS} when\code{from __future__ import division} is not in effect.\end{opcodedesc} \begin{opcodedesc}{INPLACE_FLOOR_DIVIDE}{}Implements in-place \code{TOS = TOS1 // TOS}.\end{opcodedesc} \begin{opcodedesc}{INPLACE_TRUE_DIVIDE}{}Implements in-place \code{TOS = TOS1 / TOS} when\code{from __future__ import division} is in effect.\end{opcodedesc} \begin{opcodedesc}{INPLACE_MODULO}{}Implements in-place \code{TOS = TOS1 \%{} TOS}.\end{opcodedesc} \begin{opcodedesc}{INPLACE_ADD}{}Implements in-place \code{TOS = TOS1 + TOS}.\end{opcodedesc} \begin{opcodedesc}{INPLACE_SUBTRACT}{}Implements in-place \code{TOS = TOS1 - TOS}.\end{opcodedesc} \begin{opcodedesc}{INPLACE_LSHIFT}{}Implements in-place \code{TOS = TOS1 <\code{}< TOS}.\end{opcodedesc} \begin{opcodedesc}{INPLACE_RSHIFT}{}Implements in-place \code{TOS = TOS1 >\code{}> TOS}.\end{opcodedesc} \begin{opcodedesc}{INPLACE_AND}{}Implements in-place \code{TOS = TOS1 \&\ TOS}.\end{opcodedesc} \begin{opcodedesc}{INPLACE_XOR}{}Implements in-place \code{TOS = TOS1 \^\ TOS}.\end{opcodedesc} \begin{opcodedesc}{INPLACE_OR}{}Implements in-place \code{TOS = TOS1 | TOS}.\end{opcodedesc} The slice opcodes take up to three parameters. \begin{opcodedesc}{SLICE+0}{}Implements \code{TOS = TOS[:]}.\end{opcodedesc} \begin{opcodedesc}{SLICE+1}{}Implements \code{TOS = TOS1[TOS:]}.\end{opcodedesc} \begin{opcodedesc}{SLICE+2}{}Implements \code{TOS = TOS1[:TOS]}.\end{opcodedesc} \begin{opcodedesc}{SLICE+3}{}Implements \code{TOS = TOS2[TOS1:TOS]}.\end{opcodedesc} Slice assignment needs even an additional parameter.  As any statement,they put nothing on the stack. \begin{opcodedesc}{STORE_SLICE+0}{}Implements \code{TOS[:] = TOS1}.\end{opcodedesc} \begin{opcodedesc}{STORE_SLICE+1}{}Implements \code{TOS1[TOS:] = TOS2}.\end{opcodedesc} \begin{opcodedesc}{STORE_SLICE+2}{}Implements \code{TOS1[:TOS] = TOS2}.\end{opcodedesc} \begin{opcodedesc}{STORE_SLICE+3}{}Implements \code{TOS2[TOS1:TOS] = TOS3}.\end{opcodedesc} \begin{opcodedesc}{DELETE_SLICE+0}{}Implements \code{del TOS[:]}.\end{opcodedesc} \begin{opcodedesc}{DELETE_SLICE+1}{}Implements \code{del TOS1[TOS:]}.\end{opcodedesc} \begin{opcodedesc}{DELETE_SLICE+2}{}Implements \code{del TOS1[:TOS]}.\end{opcodedesc} \begin{opcodedesc}{DELETE_SLICE+3}{}Implements \code{del TOS2[TOS1:TOS]}.\end{opcodedesc} \begin{opcodedesc}{STORE_SUBSCR}{}Implements \code{TOS1[TOS] = TOS2}.\end{opcodedesc} \begin{opcodedesc}{DELETE_SUBSCR}{}Implements \code{del TOS1[TOS]}.\end{opcodedesc} Miscellaneous opcodes. \begin{opcodedesc}{PRINT_EXPR}{}Implements the expression statement for the interactive mode.  TOS isremoved from the stack and printed.  In non-interactive mode, anexpression statement is terminated with \code{POP_STACK}.\end{opcodedesc} \begin{opcodedesc}{PRINT_ITEM}{}Prints TOS to the file-like object bound to \code{sys.stdout}.  Thereis one such instruction for each item in the \keyword{print} statement.\end{opcodedesc} \begin{opcodedesc}{PRINT_ITEM_TO}{}Like \code{PRINT_ITEM}, but prints the item second from TOS to thefile-like object at TOS.  This is used by the extended print statement.\end{opcodedesc} \begin{opcodedesc}{PRINT_NEWLINE}{}Prints a new line on \code{sys.stdout}.  This is generated as thelast operation of a \keyword{print} statement, unless the statementends with a comma.\end{opcodedesc} \begin{opcodedesc}{PRINT_NEWLINE_TO}{}Like \code{PRINT_NEWLINE}, but prints the new line on the file-likeobject on the TOS.  This is used by the extended print statement.\end{opcodedesc} \begin{opcodedesc}{BREAK_LOOP}{}Terminates a loop due to a \keyword{break} statement.\end{opcodedesc} \begin{opcodedesc}{CONTINUE_LOOP}{target}Continues a loop due to a \keyword{continue} statement.  \var{target}is the address to jump to (which should be a \code{FOR_ITER}instruction).\end{opcodedesc} \begin{opcodedesc}{LIST_APPEND}{}Calls \code{list.append(TOS1, TOS)}.  Used to implement list comprehensions.\end{opcodedesc} \begin{opcodedesc}{LOAD_LOCALS}{}Pushes a reference to the locals of the current scope on the stack.This is used in the code for a class definition: After the class bodyis evaluated, the locals are passed to the class definition.\end{opcodedesc} \begin{opcodedesc}{RETURN_VALUE}{}Returns with TOS to the caller of the function.\end{opcodedesc} \begin{opcodedesc}{YIELD_VALUE}{}Pops \code{TOS} and yields it from a generator.\end{opcodedesc} \begin{opcodedesc}{IMPORT_STAR}{}Loads all symbols not starting with \character{_} directly from the module TOSto the local namespace. The module is popped after loading all names.This opcode implements \code{from module import *}.\end{opcodedesc} \begin{opcodedesc}{EXEC_STMT}{}Implements \code{exec TOS2,TOS1,TOS}.  The compiler fillsmissing optional parameters with \code{None}.\end{opcodedesc} \begin{opcodedesc}{POP_BLOCK}{}Removes one block from the block stack.  Per frame, there is a stack of blocks, denoting nested loops, try statements, and such.\end{opcodedesc} \begin{opcodedesc}{END_FINALLY}{}Terminates a \keyword{finally} clause.  The interpreter recallswhether the exception has to be re-raised, or whether the functionreturns, and continues with the outer-next block.\end{opcodedesc} \begin{opcodedesc}{BUILD_CLASS}{}Creates a new class object.  TOS is the methods dictionary, TOS1the tuple of the names of the base classes, and TOS2 the class name.\end{opcodedesc} All of the following opcodes expect arguments.  An argument is twobytes, with the more significant byte last. \begin{opcodedesc}{STORE_NAME}{namei}Implements \code{name = TOS}. \var{namei} is the index of \var{name}in the attribute \member{co_names} of the code object.The compiler tries to use \code{STORE_LOCAL} or \code{STORE_GLOBAL}if possible.\end{opcodedesc} \begin{opcodedesc}{DELETE_NAME}{namei}Implements \code{del name}, where \var{namei} is the index into\member{co_names} attribute of the code object.\end{opcodedesc} \begin{opcodedesc}{UNPACK_SEQUENCE}{count}Unpacks TOS into \var{count} individual values, which are put ontothe stack right-to-left.\end{opcodedesc} %\begin{opcodedesc}{UNPACK_LIST}{count}%This opcode is obsolete.%\end{opcodedesc} %\begin{opcodedesc}{UNPACK_ARG}{count}%This opcode is obsolete.%\end{opcodedesc} \begin{opcodedesc}{DUP_TOPX}{count}Duplicate \var{count} items, keeping them in the same order. Due toimplementation limits, \var{count} should be between 1 and 5 inclusive.\end{opcodedesc} \begin{opcodedesc}{STORE_ATTR}{namei}Implements \code{TOS.name = TOS1}, where \var{namei} is the indexof name in \member{co_names}.\end{opcodedesc} \begin{opcodedesc}{DELETE_ATTR}{namei}Implements \code{del TOS.name}, using \var{namei} as index into\member{co_names}.\end{opcodedesc} \begin{opcodedesc}{STORE_GLOBAL}{namei}Works as \code{STORE_NAME}, but stores the name as a global.\end{opcodedesc} \begin{opcodedesc}{DELETE_GLOBAL}{namei}Works as \code{DELETE_NAME}, but deletes a global name.\end{opcodedesc} %\begin{opcodedesc}{UNPACK_VARARG}{argc}%This opcode is obsolete.%\end{opcodedesc} 

Lines 1–500 of 706.