本文整理汇总了Python中dis.HAVE_ARGUMENT属性的典型用法代码示例。如果您正苦于以下问题:Python dis.HAVE_ARGUMENT属性的具体用法?Python dis.HAVE_ARGUMENT怎么用?Python dis.HAVE_ARGUMENT使用的例子?那么, 这里精选的属性代码示例或许可以为您提供帮助。您也可以进一步了解该属性所在类dis
的用法示例。
在下文中一共展示了dis.HAVE_ARGUMENT属性的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: _walk_global_ops
# 需要导入模块: import dis [as 别名]
# 或者: from dis import HAVE_ARGUMENT [as 别名]
def _walk_global_ops(code):
"""
Yield (opcode, argument number) tuples for all
global-referencing instructions in *code*.
"""
code = getattr(code, 'co_code', b'')
if PY2: # pragma: no branch
code = map(ord, code)
n = len(code)
i = 0
extended_arg = 0
while i < n:
op = code[i]
i += 1
if op >= HAVE_ARGUMENT:
oparg = code[i] + code[i + 1] * 256 + extended_arg
extended_arg = 0
i += 2
if op == EXTENDED_ARG:
extended_arg = oparg * 65536
if op in GLOBAL_OPS:
yield op, oparg
示例2: build_op
# 需要导入模块: import dis [as 别名]
# 或者: from dis import HAVE_ARGUMENT [as 别名]
def build_op(self, op, arg=None):
"""Return a byte representation of a Python instruction."""
if isinstance(op, str):
op = dis.opmap[op]
if arg is None and op >= dis.HAVE_ARGUMENT:
raise ValueError("Operation requires an argument: %s" % dis.opname[op])
if arg is not None and op < dis.HAVE_ARGUMENT:
raise ValueError("Operation takes no argument: %s" % dis.opname[op])
if arg is None:
arg = 0
# Python 3.6 changed the argument to an 8-bit integer, so this
# could be a practical consideration
if arg >= self.OPARG_SIZE:
return self.build_op(
"EXTENDED_ARG", arg // self.OPARG_SIZE
) + self.build_op(op, arg % self.OPARG_SIZE)
if not self.OPARG_VARI:
return bytearray((op, arg))
elif op >= dis.HAVE_ARGUMENT:
return bytearray((op, arg % 256, arg // 256))
else:
return bytearray((op,))
示例3: scan_opcodes
# 需要导入模块: import dis [as 别名]
# 或者: from dis import HAVE_ARGUMENT [as 别名]
def scan_opcodes(self, co,
unpack = struct.unpack):
# Scan the code, and yield 'interesting' opcode combinations
# Version for Python 2.4 and older
code = co.co_code
names = co.co_names
consts = co.co_consts
while code:
c = code[0]
if c in STORE_OPS:
oparg, = unpack('<H', code[1:3])
yield "store", (names[oparg],)
code = code[3:]
continue
if c == LOAD_CONST and code[3] == IMPORT_NAME:
oparg_1, oparg_2 = unpack('<xHxH', code[:6])
yield "import", (consts[oparg_1], names[oparg_2])
code = code[6:]
continue
if c >= HAVE_ARGUMENT:
code = code[3:]
else:
code = code[1:]
示例4: _unpack_opargs
# 需要导入模块: import dis [as 别名]
# 或者: from dis import HAVE_ARGUMENT [as 别名]
def _unpack_opargs(code):
# enumerate() is not an option, since we sometimes process
# multiple elements on a single pass through the loop
extended_arg = 0
n = len(code)
i = 0
while i < n:
op = ord(code[i])
offset = i
i = i+1
arg = None
if op >= HAVE_ARGUMENT:
arg = ord(code[i]) + ord(code[i+1])*256 + extended_arg
extended_arg = 0
i = i+2
if op == EXTENDED_ARG:
extended_arg = arg*65536
yield (offset, op, arg)
# Modulefinder does a good job at simulating Python's, but it can not
# handle __path__ modifications packages make at runtime. Therefore there
# is a mechanism whereby you can register extra paths in this map for a
# package, and it will be honored.
# Note this is a mapping is lists of paths.
示例5: _unpack_opargs
# 需要导入模块: import dis [as 别名]
# 或者: from dis import HAVE_ARGUMENT [as 别名]
def _unpack_opargs(code, inserted_code_list, current_index):
"""
Modified version of `_unpack_opargs` function from module `dis`.
We have to use it, because sometimes code can be in an inconsistent state: if EXTENDED_ARG
operator was introduced into the code, but it hasn't been inserted into `code_list` yet.
In this case we can't use standard `_unpack_opargs` and we should check whether there are
some new operators in `inserted_code_list`.
"""
extended_arg = 0
for i in range(0, len(code), 2):
op = code[i]
if op >= HAVE_ARGUMENT:
if not extended_arg:
# in case if we added EXTENDED_ARG, but haven't inserted it to the source code yet.
for code_index in range(current_index, len(inserted_code_list)):
inserted_offset, inserted_code = inserted_code_list[code_index]
if inserted_offset == i and inserted_code[0] == EXTENDED_ARG:
extended_arg = inserted_code[1] << 8
arg = code[i + 1] | extended_arg
extended_arg = (arg << 8) if op == EXTENDED_ARG else 0
else:
arg = None
yield (i, op, arg)
示例6: scan_opcodes
# 需要导入模块: import dis [as 别名]
# 或者: from dis import HAVE_ARGUMENT [as 别名]
def scan_opcodes(self, co,
unpack=struct.unpack): # pragma: nocover
# Scan the code, and yield 'interesting' opcode combinations
# Version for Python 2.4 and older
code = co.co_code
names = co.co_names
consts = co.co_consts
while code:
c = code[0]
if c in STORE_OPS:
oparg, = unpack('<H', code[1:3])
yield "store", (names[oparg],)
code = code[3:]
continue
if c == LOAD_CONST and code[3] == IMPORT_NAME:
oparg_1, oparg_2 = unpack('<xHxH', code[:6])
yield "import", (consts[oparg_1], names[oparg_2])
code = code[6:]
continue
if c >= HAVE_ARGUMENT:
code = code[3:]
else:
code = code[1:]
示例7: __iter__
# 需要导入模块: import dis [as 别名]
# 或者: from dis import HAVE_ARGUMENT [as 别名]
def __iter__(self):
i = 0
extended_arg = 0
code = self.co_code
n = len(code)
while i < n:
op = code[i]
if op >= HAVE_ARGUMENT:
oparg = code[i + 1] + code[i + 2] * 256 + extended_arg
extended_arg = 0
if op == EXTENDED_ARG:
extended_arg = oparg * 65536
i += 3
continue
yield i, op, oparg
i += 3
else:
yield i, op, None
i += 1
示例8: _walk_global_ops
# 需要导入模块: import dis [as 别名]
# 或者: from dis import HAVE_ARGUMENT [as 别名]
def _walk_global_ops(code):
"""
Yield (opcode, argument number) tuples for all
global-referencing instructions in *code*.
"""
code = getattr(code, 'co_code', b'')
if not PY3:
code = map(ord, code)
n = len(code)
i = 0
extended_arg = 0
while i < n:
op = code[i]
i += 1
if op >= HAVE_ARGUMENT:
oparg = code[i] + code[i + 1] * 256 + extended_arg
extended_arg = 0
i += 2
if op == EXTENDED_ARG:
extended_arg = oparg * 65536
if op in GLOBAL_OPS:
yield op, oparg
示例9: find_globals
# 需要导入模块: import dis [as 别名]
# 或者: from dis import HAVE_ARGUMENT [as 别名]
def find_globals(code):
"""walks the byte code to find the variables which are actually globals"""
cur_byte = 0
byte_code = code.co_code
names = set()
while cur_byte < len(byte_code):
op = ord(byte_code[cur_byte])
if op >= dis.HAVE_ARGUMENT:
if op == _LOAD_GLOBAL:
oparg = ord(byte_code[cur_byte + 1]) + (ord(byte_code[cur_byte + 2]) << 8)
name = code.co_names[oparg]
names.add(name)
cur_byte += 2
cur_byte += 1
return names
示例10: __init__
# 需要导入模块: import dis [as 别名]
# 或者: from dis import HAVE_ARGUMENT [as 别名]
def __init__(self):
code = (lambda: x if x else y).__code__.co_code
opcode, oparg = struct.unpack_from('BB', code, 2)
# Starting with Python 3.6, the bytecode format has changed, using
# 16-bit words (8-bit opcode + 8-bit argument) for each instruction,
# as opposed to previously 24 bit (8-bit opcode + 16-bit argument)
# for instructions that expect an argument and otherwise 8 bit.
# https://bugs.python.org/issue26647
if dis.opname[opcode] == 'POP_JUMP_IF_FALSE':
self.argument = struct.Struct('B')
self.have_argument = 0
# As of Python 3.6, jump targets are still addressed by their
# byte unit. This is matter to change, so that jump targets,
# in the future might refer to code units (address in bytes / 2).
# https://bugs.python.org/issue26647
self.jump_unit = 8 // oparg
else:
self.argument = struct.Struct('<H')
self.have_argument = dis.HAVE_ARGUMENT
self.jump_unit = 1
示例11: get_instructions
# 需要导入模块: import dis [as 别名]
# 或者: from dis import HAVE_ARGUMENT [as 别名]
def get_instructions(co):
code = co.co_code
n = len(code)
i = 0
extended_arg = 0
while i < n:
offset = i
c = code[i]
op = ord(c)
argval = None
i = i + 1
if op >= HAVE_ARGUMENT:
oparg = ord(code[i]) + ord(code[i + 1]) * 256 + extended_arg
extended_arg = 0
i = i + 2
if op == EXTENDED_ARG:
extended_arg = oparg * 65536
if op in hasconst:
argval = co.co_consts[oparg]
yield Instruction(offset, argval, opname[op])
示例12: _get_instructions
# 需要导入模块: import dis [as 别名]
# 或者: from dis import HAVE_ARGUMENT [as 别名]
def _get_instructions(co):
code = co.co_code
linestarts = dict(findlinestarts(co))
n = len(code)
i = 0
extended_arg = 0
while i < n:
offset = i
c = code[i]
op = ord(c)
lineno = linestarts.get(i)
argval = None
i = i + 1
if op >= HAVE_ARGUMENT:
oparg = ord(code[i]) + ord(code[i + 1]) * 256 + extended_arg
extended_arg = 0
i = i + 2
if op == EXTENDED_ARG:
extended_arg = oparg * 65536
if op in hasconst:
argval = co.co_consts[oparg]
yield Instruction(offset, argval, opname[op], lineno)
示例13: patch_opargs
# 需要导入模块: import dis [as 别名]
# 或者: from dis import HAVE_ARGUMENT [as 别名]
def patch_opargs(self, start=None):
'''
Updates branch instructions to correct offsets after adding or
deleting bytecode
'''
for current in self.nodes(start):
# No argument, skip to next
if current.opcode < dis.HAVE_ARGUMENT:
continue
# Patch relative offsets
if current.opcode in dis.hasjrel:
current.oparg = current.target.addr - \
(current.addr+current.len())
# Patch absolute offsets
elif current.opcode in dis.hasjabs:
current.oparg = current.target.addr
示例14: _iter_code
# 需要导入模块: import dis [as 别名]
# 或者: from dis import HAVE_ARGUMENT [as 别名]
def _iter_code(code):
"""Yield '(op,arg)' pair for each operation in code object 'code'"""
from array import array
from dis import HAVE_ARGUMENT, EXTENDED_ARG
bytes = array('b',code.co_code)
eof = len(code.co_code)
ptr = 0
extended_arg = 0
while ptr<eof:
op = bytes[ptr]
if op>=HAVE_ARGUMENT:
arg = bytes[ptr+1] + bytes[ptr+2]*256 + extended_arg
ptr += 3
if op==EXTENDED_ARG:
long_type = six.integer_types[-1]
extended_arg = arg * long_type(65536)
continue
else:
arg = None
ptr += 1
yield op,arg
示例15: __iter__
# 需要导入模块: import dis [as 别名]
# 或者: from dis import HAVE_ARGUMENT [as 别名]
def __iter__(self):
"""Yield '(op,arg)' pair for each operation in code object 'code'"""
bytes = array.array('b', self.code.co_code)
eof = len(self.code.co_code)
ptr = 0
extended_arg = 0
while ptr < eof:
op = bytes[ptr]
if op >= dis.HAVE_ARGUMENT:
arg = bytes[ptr + 1] + bytes[ptr + 2] * 256 + extended_arg
ptr += 3
if op == dis.EXTENDED_ARG:
long_type = six.integer_types[-1]
extended_arg = arg * long_type(65536)
continue
else:
arg = None
ptr += 1
yield OpArg(op, arg)