dis
---Python字节码反汇编程序¶
源代码: Lib/dis.py
这个 dis
模块支持对cpython的分析 bytecode 把它拆开。该模块作为输入的cpython字节码在文件中定义。 Include/opcode.h
并由编译器和解释器使用。
CPython implementation detail: 字节码是cpython解释器的一个实现细节。不保证在Python版本之间不添加、删除或更改字节码。使用此模块不应被视为跨python vms或python版本工作。
在 3.6 版更改: 每个指令使用2个字节。以前,字节数因指令而异。
示例:给定函数 myfunc()
::
def myfunc(alist):
return len(alist)
以下命令可用于显示 myfunc()
::
>>> dis.dis(myfunc)
2 0 LOAD_GLOBAL 0 (len)
2 LOAD_FAST 0 (alist)
4 CALL_FUNCTION 1
6 RETURN_VALUE
(2是行号)。
字节码分析¶
3.4 新版功能.
字节码分析API允许用 Bytecode
对象,提供对已编译代码详细信息的轻松访问。
- class dis.Bytecode(x, *, first_line=None, current_offset=None)¶
分析与函数、生成器、异步生成器、协同程序、方法、源代码字符串或代码对象(由返回)对应的字节码
compile()
)这是下面列出的许多函数的一个方便封装器,最显著的是
get_instructions()
,作为对Bytecode
实例生成字节码操作Instruction
实例。如果 first_line 不是
None
,表示反汇编代码中的第一个源行应该报告的行号。否则,源行信息(如果有的话)直接从反汇编的代码对象中获取。如果 current_offset 不是
None
,它是指反汇编代码中的指令偏移量。设置这意味着dis()
将针对指定的操作码显示“当前指令”标记。- codeobj¶
已编译的代码对象。
- first_line¶
代码对象的第一行源代码(如果可用)
- info()¶
返回带代码对象详细信息的格式化多行字符串,如
code_info()
.
在 3.7 版更改: 现在可以处理协同程序和异步生成器对象。
例子::
>>> bytecode = dis.Bytecode(myfunc)
>>> for instr in bytecode:
... print(instr.opname)
...
LOAD_GLOBAL
LOAD_FAST
CALL_FUNCTION
RETURN_VALUE
分析功能¶
这个 dis
模块还定义了以下分析函数,将输入直接转换为所需的输出。如果只执行一个操作,它们可能很有用,因此中间分析对象不有用:
- dis.code_info(x)¶
为提供的函数、生成器、异步生成器、协同程序、方法、源代码字符串或代码对象返回带详细代码对象信息的格式化多行字符串。
请注意,代码信息字符串的确切内容高度依赖于实现,它们可能会在python vms或python版本之间随意更改。
3.2 新版功能.
在 3.7 版更改: 现在可以处理协同程序和异步生成器对象。
- dis.show_code(x, *, file=None)¶
将所提供函数、方法、源代码字符串或代码对象的详细代码对象信息打印到 file (或)
sys.stdout
如果 file 未指定)。这是
print(code_info(x), file=file)
用于在口译员提示下进行交互式探索。3.2 新版功能.
在 3.4 版更改: 补充 file 参数。
- dis.dis(x=None, *, file=None, depth=None)¶
拆解 x 对象。 x 可以表示模块、类、方法、函数、生成器、异步生成器、协同程序、代码对象、源代码字符串或原始字节码的字节序列。对于一个模块,它分解所有功能。对于一个类,它分解所有方法(包括类和静态方法)。对于代码对象或原始字节码序列,每个字节码指令打印一行。它还递归地反汇编嵌套代码对象(理解代码、生成器表达式和嵌套函数,以及用于构建嵌套类的代码)。字符串首先被编译为使用
compile()
拆卸前的内置功能。如果没有提供对象,则此函数反汇编上一个回溯。反汇编作为文本写入提供的 file 参数(如果提供)和
sys.stdout
否则。递归的最大深度限制为 深度 除非它是
None
.depth=0
表示没有递归。在 3.4 版更改: 补充 file 参数。
在 3.7 版更改: 实现了递归反汇编和添加 深度 参数。
在 3.7 版更改: 现在可以处理协同程序和异步生成器对象。
- dis.distb(tb=None, *, file=None)¶
反汇编回溯的堆栈顶部函数,如果没有传递,则使用最后一个回溯。指示导致异常的指令。
反汇编作为文本写入提供的 file 参数(如果提供)和
sys.stdout
否则。在 3.4 版更改: 补充 file 参数。
- dis.disassemble(code, lasti=- 1, *, file=None)¶
- dis.disco(code, lasti=- 1, *, file=None)¶
反汇编代码对象,指示最后一条指令如果 拉斯蒂 提供。输出分为以下几列:
每行的第一条指令的行号
当前指令,表示为
-->
,带有标签的指令,用
>>
,指令的地址,
操作代码名称,
操作参数,以及
括号中参数的解释。
参数解释识别本地和全局变量名、常量值、分支目标和比较运算符。
反汇编作为文本写入提供的 file 参数(如果提供)和
sys.stdout
否则。在 3.4 版更改: 补充 file 参数。
- dis.get_instructions(x, *, first_line=None)¶
通过所提供的函数、方法、源代码字符串或代码对象中的指令返回迭代器。
迭代器生成一系列
Instruction
提供所提供代码中每个操作的详细信息的命名元组。如果 first_line 不是
None
,表示反汇编代码中的第一个源行应该报告的行号。否则,源行信息(如果有的话)直接从反汇编的代码对象中获取。3.4 新版功能.
- dis.findlinestarts(code)¶
此生成器函数使用
co_firstlineno
和co_lnotab
代码对象的属性 code 查找源代码中行首的偏移量。它们生成为(offset, lineno)
对。见 Objects/lnotab_notes.txt 对于co_lnotab
格式和解码方法。在 3.6 版更改: 行数可以减少。以前,它们总是在增加。
- dis.findlabels(code)¶
检测原始编译字节码字符串中的所有偏移量 code 它们是跳跃目标,并返回这些偏移的列表。
- dis.stack_effect(opcode, oparg=None, *, jump=None)¶
计算的堆栈效果 操作码 带着论证 奥帕格 .
如果代码有跳转目标并且 jump 是
True
,stack_effect()
将返回跳跃的叠加效果。如果 jump 是False
,将返回不跳跃的叠加效果。如果 jump 是None
(默认),它将返回两种情况下的最大堆栈效果。3.4 新版功能.
在 3.8 版更改: 补充 jump 参数。
python字节码指令¶
这个 get_instructions()
功能和 Bytecode
类提供字节码指令的详细信息 Instruction
实例:
- class dis.Instruction¶
字节码操作的详细信息
- opname¶
操作的可读名称
- arg¶
操作的数值参数(如果有),否则
None
- argval¶
解析的arg值(如果已知),否则与arg相同
- argrepr¶
操作参数的人类可读描述
- offset¶
字节码序列内操作的开始索引
- starts_line¶
此操作码开始的行(如果有),否则
None
- is_jump_target¶
True
if other code jumps to here, otherwiseFalse
3.4 新版功能.
python编译器当前生成以下字节码指令。
一般说明
- NOP¶
不执行任何代码。用作字节码优化器的占位符。
- POP_TOP¶
删除堆栈顶部(TOS)项。
- ROT_TWO¶
交换两个最上面的堆栈项。
- ROT_THREE¶
将第二个和第三个堆栈项向上引发一个位置,从上向下移动到第三个位置。
- ROT_FOUR¶
将第二个、第三个和第四个堆栈项向上引发一个位置,然后从上向下移动到第四个位置。
3.8 新版功能.
- DUP_TOP¶
复制堆栈顶部的引用。
3.2 新版功能.
- DUP_TOP_TWO¶
复制堆栈顶部的两个引用,使它们保持相同的顺序。
3.2 新版功能.
一元运算
一元运算取栈顶,应用该运算,并将结果推回到栈上。
- UNARY_POSITIVE¶
器具
TOS = +TOS
.
- UNARY_NEGATIVE¶
器具
TOS = -TOS
.
- UNARY_NOT¶
器具
TOS = not TOS
.
- UNARY_INVERT¶
器具
TOS = ~TOS
.
- GET_ITER¶
器具
TOS = iter(TOS)
.
- GET_YIELD_FROM_ITER¶
如果
TOS
是一个 generator iterator 或 coroutine 对象保持原样。否则,机具TOS = iter(TOS)
.3.5 新版功能.
二元运算
二进制操作从堆栈中删除堆栈顶部(TOS)和第二个最上面的堆栈项(TOS1)。它们执行操作,并将结果放回堆栈。
- BINARY_POWER¶
器具
TOS = TOS1 ** TOS
.
- BINARY_MULTIPLY¶
器具
TOS = TOS1 * TOS
.
- BINARY_MATRIX_MULTIPLY¶
器具
TOS = TOS1 @ TOS
.3.5 新版功能.
- BINARY_FLOOR_DIVIDE¶
器具
TOS = TOS1 // TOS
.
- BINARY_TRUE_DIVIDE¶
器具
TOS = TOS1 / TOS
.
- BINARY_MODULO¶
器具
TOS = TOS1 % TOS
.
- BINARY_ADD¶
器具
TOS = TOS1 + TOS
.
- BINARY_SUBTRACT¶
器具
TOS = TOS1 - TOS
.
- BINARY_SUBSCR¶
器具
TOS = TOS1[TOS]
.
- BINARY_LSHIFT¶
器具
TOS = TOS1 << TOS
.
- BINARY_RSHIFT¶
器具
TOS = TOS1 >> TOS
.
- BINARY_AND¶
器具
TOS = TOS1 & TOS
.
- BINARY_XOR¶
器具
TOS = TOS1 ^ TOS
.
- BINARY_OR¶
器具
TOS = TOS1 | TOS
.
In-place operations
就地操作类似于二进制操作,因为它们删除了TOS和TOS1,并将结果推回到堆栈上,但是当TOS1支持时,操作就就地完成了,并且结果TOS可能(但不必是)原始TOS1。
- INPLACE_POWER¶
工具到位
TOS = TOS1 ** TOS
.
- INPLACE_MULTIPLY¶
工具到位
TOS = TOS1 * TOS
.
- INPLACE_MATRIX_MULTIPLY¶
工具到位
TOS = TOS1 @ TOS
.3.5 新版功能.
- INPLACE_FLOOR_DIVIDE¶
工具到位
TOS = TOS1 // TOS
.
- INPLACE_TRUE_DIVIDE¶
工具到位
TOS = TOS1 / TOS
.
- INPLACE_MODULO¶
工具到位
TOS = TOS1 % TOS
.
- INPLACE_ADD¶
工具到位
TOS = TOS1 + TOS
.
- INPLACE_SUBTRACT¶
工具到位
TOS = TOS1 - TOS
.
- INPLACE_LSHIFT¶
工具到位
TOS = TOS1 << TOS
.
- INPLACE_RSHIFT¶
工具到位
TOS = TOS1 >> TOS
.
- INPLACE_AND¶
工具到位
TOS = TOS1 & TOS
.
- INPLACE_XOR¶
工具到位
TOS = TOS1 ^ TOS
.
- INPLACE_OR¶
工具到位
TOS = TOS1 | TOS
.
- STORE_SUBSCR¶
器具
TOS1[TOS] = TOS2
.
- DELETE_SUBSCR¶
器具
del TOS1[TOS]
.
协同程序操作码
- GET_AWAITABLE¶
器具
TOS = get_awaitable(TOS)
在哪里get_awaitable(o)
返回o
如果o
是一个协程对象或带有协程标志的生成器对象,或解析o.__await__
.3.5 新版功能.
- GET_AITER¶
器具
TOS = TOS.__aiter__()
.3.5 新版功能.
在 3.7 版更改: 从返回可等待对象
__aiter__
不再支持。
- GET_ANEXT¶
器具
PUSH(get_awaitable(TOS.__anext__()))
. 见GET_AWAITABLE
有关的详细信息get_awaitable
3.5 新版功能.
- END_ASYNC_FOR¶
终止
async for
循环。处理在等待下一项时引发的异常。如果TOS是StopAsyncIteration
从堆栈中弹出7个值,并使用其中的第二个值恢复异常状态。否则,使用堆栈中的三个值重新引发异常。异常处理程序块将从块堆栈中移除。3.8 新版功能.
- BEFORE_ASYNC_WITH¶
解决
__aenter__
和__aexit__
从堆栈顶部的对象。推__aexit__
结果__aenter__()
到堆栈。3.5 新版功能.
- SETUP_ASYNC_WITH¶
创建新的框架对象。
3.5 新版功能.
其他操作码
- SET_ADD(i)¶
调用
set.add(TOS1[-i], TOS)
.用于实现集合理解。
- LIST_APPEND(i)¶
调用
list.append(TOS1[-i], TOS)
.用于实现列表理解。
- MAP_ADD(i)¶
调用
dict.__setitem__(TOS1[-i], TOS1, TOS)
. 用于实现听写理解。3.1 新版功能.
在 3.8 版更改: 映射值为TOS,映射键为TOS1。以前,这些都是颠倒的。
对于所有的 SET_ADD
, LIST_APPEND
和 MAP_ADD
指令,当附加值或键/值对弹出时,容器对象仍保留在堆栈上,以便它可用于循环的进一步迭代。
- RETURN_VALUE¶
用TOS返回给函数的调用方。
- SETUP_ANNOTATIONS¶
检查是否
__annotations__
定义在locals()
,如果不是,则设置为空dict
. 只有当类或模块体包含 variable annotations 静态地。3.6 新版功能.
- IMPORT_STAR¶
加载不以开头的所有符号
'_'
直接从模块TOS到本地命名空间。加载所有名称后弹出模块。此操作码实现from module import *
.
- POP_EXCEPT¶
从块堆栈中删除一个块。弹出的块必须是异常处理程序块,正如在输入异常处理程序时隐式创建的那样。除了从帧堆栈中弹出无关值之外,最后三个弹出值还用于恢复异常状态。
- RERAISE¶
重新引发当前位于堆栈顶部的异常。如果oparg非零,则还原
f_lasti
设置为引发异常时的当前帧的值。3.9 新版功能.
- WITH_EXCEPT_START¶
调用堆栈上位置7的函数,并将堆栈上的前三项作为参数。用于实现调用
context_manager.__exit__(*exc_info())
当with
语句。3.9 新版功能.
- LOAD_ASSERTION_ERROR¶
推动
AssertionError
在堆栈上。由assert
语句。3.9 新版功能.
- LOAD_BUILD_CLASS¶
推动
builtins.__build_class__()
在烟囱上。后来调用给CALL_FUNCTION
构造一个类。
- SETUP_WITH(delta)¶
此操作码在开始使用挡路之前执行几个操作。首先,它加载
__exit__()
,并将其推送到堆栈上以供以后使用。WITH_EXCEPT_START
。然后,__enter__()
被调用,最后一个挡路指向 德尔塔 是被推下来的。最后,调用__enter__()
方法被推送到堆栈上。下一个操作码将忽略它 (POP_TOP
),或将其存储在(A)个变量中 (STORE_FAST
,STORE_NAME
,或UNPACK_SEQUENCE
)。3.2 新版功能.
以下所有操作码都使用它们的参数。
- STORE_NAME(namei)¶
器具
name = TOS
. 纳美 是指标 name 在属性中co_names
代码对象的。编译器试图使用STORE_FAST
或STORE_GLOBAL
如果可能的话。
- DELETE_NAME(namei)¶
器具
del name
在哪里 纳美 索引是否为co_names
代码对象的属性。
- UNPACK_SEQUENCE(count)¶
将TOS解包到 计数 单个值,从右向左放入堆栈。
- UNPACK_EX(counts)¶
使用带星号的目标实现赋值:将TOS中的ITerable解包为单个值,其中值的总数可以小于ITerable中的项数:新值之一将是所有剩余项的列表。
低字节 计数 是列表值之前的值数,是 计数 后面的值的数目。结果值从右到左放在堆栈上。
- STORE_ATTR(namei)¶
器具
TOS.name = TOS1
在哪里 纳美 名称索引是否在co_names
.
- DELETE_ATTR(namei)¶
器具
del TOS.name
使用 纳美 作为指标co_names
.
- STORE_GLOBAL(namei)¶
作品作为
STORE_NAME
,但将名称存储为全局名称。
- DELETE_GLOBAL(namei)¶
作品作为
DELETE_NAME
,但删除全局名称。
- LOAD_CONST(consti)¶
推动
co_consts[consti]
在堆栈上。
- LOAD_NAME(namei)¶
推送与
co_names[namei]
在堆栈上。
- BUILD_TUPLE(count)¶
创建使用元组 计数 来自堆栈的项,并将生成的元组推送到堆栈上。
- BUILD_LIST(count)¶
作品作为
BUILD_TUPLE
,但创建一个列表。
- BUILD_SET(count)¶
作品作为
BUILD_TUPLE
,但创建一个集合。
- BUILD_MAP(count)¶
将新字典对象推送到堆栈上。持久性有机污染物
2 * count
使字典保存的项 计数 条目:{{..., TOS3: TOS2, TOS1: TOS}}
.在 3.5 版更改: 字典是从堆栈项创建的,而不是创建一个预先调整大小以容纳的空字典。 计数 项目。
- BUILD_CONST_KEY_MAP(count)¶
版本
BUILD_MAP
专用于固定键。弹出堆栈中包含一个键元组的顶部元素,然后从TOS1
,流行音乐 计数 在生成的字典中形成值的值。3.6 新版功能.
- BUILD_STRING(count)¶
级联的 计数 来自堆栈的字符串,并将生成的字符串推送到堆栈上。
3.6 新版功能.
- LIST_TO_TUPLE¶
从堆栈中弹出一个列表并推送包含相同值的元组。
3.9 新版功能.
- LIST_EXTEND(i)¶
调用
list.extend(TOS1[-i], TOS)
. 用于生成列表。3.9 新版功能.
- SET_UPDATE(i)¶
调用
set.update(TOS1[-i], TOS)
. 用于生成集合。3.9 新版功能.
- DICT_UPDATE(i)¶
调用
dict.update(TOS1[-i], TOS)
. 用于生成指令。3.9 新版功能.
- DICT_MERGE¶
喜欢
DICT_UPDATE
但对重复的密钥提出了一个例外。3.9 新版功能.
- LOAD_ATTR(namei)¶
用替换TOS
getattr(TOS, co_names[namei])
.
- COMPARE_OP(opname)¶
执行布尔运算。操作名称可以在中找到
cmp_op[opname]
.
- IS_OP(invert)¶
表演
is
比较,或is not
如果invert
是1。3.9 新版功能.
- CONTAINS_OP(invert)¶
表演
in
比较,或not in
如果invert
是1。3.9 新版功能.
- IMPORT_NAME(namei)¶
导入模块
co_names[namei]
. TOS和TOS1弹出并提供 来自列表 和 level 参数__import__()
. 模块对象被推到堆栈上。当前命名空间不受影响:对于正确的import语句,STORE_FAST
指令修改命名空间。
- IMPORT_FROM(namei)¶
加载属性
co_names[namei]
从TOS中找到的模块。结果对象被推到堆栈上,随后由STORE_FAST
指令。
- JUMP_FORWARD(delta)¶
字节码计数器递增 三角洲 .
- POP_JUMP_IF_TRUE(target)¶
如果TOS为真,则将字节码计数器设置为 目标 . TOS被弹出。
3.1 新版功能.
- POP_JUMP_IF_FALSE(target)¶
如果TOS为假,则将字节码计数器设置为 目标 . TOS被弹出。
3.1 新版功能.
- JUMP_IF_NOT_EXC_MATCH(target)¶
测试堆栈上的第二个值是否是与TOS匹配的异常,如果不是,则跳转。从堆栈中弹出两个值。
3.9 新版功能.
- JUMP_IF_TRUE_OR_POP(target)¶
如果TOS为真,则将字节码计数器设置为 目标 把TOS留在烟囱上。否则(TOS为假),弹出TOS。
3.1 新版功能.
- JUMP_IF_FALSE_OR_POP(target)¶
如果TOS为假,则将字节码计数器设置为 目标 把TOS留在烟囱上。否则(TOS为真),弹出TOS。
3.1 新版功能.
- JUMP_ABSOLUTE(target)¶
将字节码计数器设置为 目标 .
- FOR_ITER(delta)¶
TOS是一个 iterator . 调用它的
__next__()
方法。如果这产生一个新值,则将其推送到堆栈上(将迭代器留在堆栈下面)。如果迭代器指示已用尽,则弹出TOS,字节码计数器递增 三角洲 .
- LOAD_GLOBAL(namei)¶
加载名为的全局
co_names[namei]
在堆栈上。
- SETUP_FINALLY(delta)¶
将try块从try finally或try except子句推送到块堆栈上。 三角洲 指向finally块或第一个except块。
- LOAD_FAST(var_num)¶
将引用推送到本地
co_varnames[var_num]
在堆栈上。
- STORE_FAST(var_num)¶
将TOS存储到本地
co_varnames[var_num]
.
- DELETE_FAST(var_num)¶
删除本地
co_varnames[var_num]
.
- LOAD_CLOSURE(i)¶
将引用推送到槽中包含的单元 i 电池和自由变量存储。变量的名称是
co_cellvars[i]
如果 i 小于的长度 co_cellvars . 否则就是co_freevars[i - len(co_cellvars)]
.
- LOAD_DEREF(i)¶
加载槽中包含的单元 i 电池和自由变量存储。将引用推送到单元格在堆栈中包含的对象。
- LOAD_CLASSDEREF(i)¶
很像
LOAD_DEREF
但在咨询手机前,先查一下当地人的字典。这用于在类体中加载自由变量。3.4 新版功能.
- STORE_DEREF(i)¶
将TOS存储到插槽中包含的单元中 i 电池和自由变量存储。
- RAISE_VARARGS(argc)¶
使用
raise
语句,取决于 argc :0:
raise
(重新引发上一个异常)1:
raise TOS
(在处引发异常实例或类型TOS
)2:
raise TOS1 from TOS
(在处引发异常实例或类型TOS1
具有__cause__
设置为TOS
)
- CALL_FUNCTION(argc)¶
使用位置参数调用可调用对象。 argc 指示位置参数的数目。堆栈顶部包含位置参数,最右边的参数位于顶部。参数下面是一个可调用的对象。
CALL_FUNCTION
从堆栈中弹出所有参数和可调用对象,用这些参数调用可调用对象,并推送可调用对象返回的返回值。在 3.6 版更改: 此操作码仅用于具有位置参数的调用。
- CALL_FUNCTION_KW(argc)¶
使用位置(如果有)和关键字参数调用可调用对象。 argc 指示位置参数和关键字参数的总数。堆栈的顶部元素包含一个元组,该元组的关键字参数的名称必须是字符串。下面是关键字参数的值,其顺序与元组对应。下面是位置参数,最右边的参数在上面。参数下面是要调用的可调用对象。
CALL_FUNCTION_KW
从堆栈中弹出所有参数和可调用对象,用这些参数调用可调用对象,并推送可调用对象返回的返回值。在 3.6 版更改: 关键字参数打包在元组中而不是字典中, argc 指示参数总数。
- CALL_FUNCTION_EX(flags)¶
使用位置参数和关键字参数的变量集调用可调用对象。如果 旗帜 如果已设置,则堆栈顶部包含包含其他关键字参数的映射对象。在调用callable之前,映射对象和iterable对象分别是“unpacted”的,它们的内容分别作为关键字和位置参数传入。
CALL_FUNCTION_EX
从堆栈中弹出所有参数和可调用对象,用这些参数调用可调用对象,并推送可调用对象返回的返回值。3.6 新版功能.
- LOAD_METHOD(namei)¶
加载名为的方法
co_names[namei]
从TOS对象。TOS被弹出。这个字节码区分两种情况:如果TOS有一个名称正确的方法,字节码将推送unbound方法和TOS。TOS将用作第一个参数 (self
通过CALL_METHOD
调用未绑定方法时。否则,NULL
并推送属性查找返回的对象。3.7 新版功能.
- CALL_METHOD(argc)¶
调用方法。 argc 是位置参数的数目。不支持关键字参数。此操作码设计用于
LOAD_METHOD
. 位置参数位于堆栈的顶部。下面是LOAD_METHOD
在堆栈上(或者self
以及未绑定的方法对象或NULL
以及任意调用)。全部弹出并推送返回值。3.7 新版功能.
- MAKE_FUNCTION(flags)¶
将新的函数对象推送到堆栈上。如果参数带有指定的标志值,则从下到上使用的堆栈必须包含值。
0x01
按位置顺序排列的位置参数和位置参数或关键字参数的默认值的元组。0x02
仅关键字参数的默认值字典0x04
包含参数批注的字符串元组0x08
包含用于自由变量的单元格的元组,使与函数关联的代码(在TOS1处)
这个 qualified name 功能(AT TOS)
在 3.10 版更改: 标志值
0x04
是字符串元组,而不是字典
- BUILD_SLICE(argc)¶
将切片对象推送到堆栈上。 argc 必须是2或3。如果是2,
slice(TOS1, TOS)
被推;如果是3,slice(TOS2, TOS1, TOS)
被推。见slice()
有关详细信息,请参阅内置函数。
- EXTENDED_ARG(ext)¶
在任何操作码前面加上一个参数,该参数太大,无法放入默认的一个字节。 ext 保留一个在参数中充当高位的附加字节。对于每个操作码,最多三个前缀
EXTENDED_ARG
允许,从两个字节到四个字节形成一个参数。
- FORMAT_VALUE(flags)¶
用于实现格式化的文本字符串(F字符串)。弹出一个可选的 fmt_spec 从堆栈,然后是必需的 value . flags 解释如下:
(flags & 0x03) == 0x00
: value 按原样格式化。(flags & 0x03) == 0x01
调用str()
在 value 在格式化它之前。(flags & 0x03) == 0x02
调用repr()
在 value 在格式化它之前。(flags & 0x03) == 0x03
调用ascii()
在 value 在格式化它之前。(flags & 0x04) == 0x04
poplib fmt_spec 从堆栈中使用它,否则使用空的 fmt_spec .
格式化是使用
PyObject_Format()
. 结果被推送到堆栈上。3.6 新版功能.
- HAVE_ARGUMENT¶
这不是真正的操作码。它标识了不使用参数的操作码和使用参数的操作码之间的分界线。 (
< HAVE_ARGUMENT
和>= HAVE_ARGUMENT
,分别)。在 3.6 版更改: 现在每个指令都有一个参数,但是操作码
< HAVE_ARGUMENT
忽略它。以前,只有操作码>= HAVE_ARGUMENT
发生了争执。
操作码集合¶
这些集合用于自动反省字节码指令:
- dis.opname¶
操作名的序列,可使用字节码进行索引。
- dis.opmap¶
将操作名称映射到字节码的字典。
- dis.cmp_op¶
所有比较操作名称的序列。
- dis.hasconst¶
访问常量的字节码序列。
- dis.hasfree¶
访问自由变量的字节码序列(请注意,此上下文中的“free”指当前作用域中由内部作用域引用的名称,或指从该作用域引用的外部作用域中的名称)。它确实 not 包括对全局或内置范围的引用)。
- dis.hasname¶
按名称访问属性的字节码序列。
- dis.hasjrel¶
具有相对跳转目标的字节码序列。
- dis.hasjabs¶
具有绝对跳转目标的字节码序列。
- dis.haslocal¶
访问局部变量的字节码序列。
- dis.hascompare¶
布尔运算的字节码序列。