本文整理汇总了Python中dis.hasjrel方法的典型用法代码示例。如果您正苦于以下问题:Python dis.hasjrel方法的具体用法?Python dis.hasjrel怎么用?Python dis.hasjrel使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类dis
的用法示例。
在下文中一共展示了dis.hasjrel方法的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: apply_labels
# 需要导入模块: import dis [as 别名]
# 或者: from dis import hasjrel [as 别名]
def apply_labels(self, start=None):
'''
Find all JMP REL and ABS bytecode sequences and update the target
within branch instruction and add xref to the destination.
'''
for current in self.nodes(start):
current.xrefs = []
current.target = None
for current in self.nodes(start):
label = -1
if current.opcode >= dis.HAVE_ARGUMENT:
if current.opcode in dis.hasjrel:
label = current.addr+current.oparg+current.len()
elif current.opcode in dis.hasjabs:
label = current.oparg
if label >= 0:
if current not in self.bytecodes[label].xrefs:
self.bytecodes[label].xrefs.append(current)
current.target = self.bytecodes[label]
current = current.next
return
示例2: patch_opargs
# 需要导入模块: import dis [as 别名]
# 或者: from dis import hasjrel [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
示例3: get_followers
# 需要导入模块: import dis [as 别名]
# 或者: from dis import hasjrel [as 别名]
def get_followers(self):
"""Get the whole list of followers, including the next block."""
followers = set(self.next)
# Blocks that must be emitted *after* this one, because of
# bytecode offsets (e.g. relative jumps) pointing to them.
for inst in self.insts:
if inst[0] in PyFlowGraph.hasjrel:
followers.add(inst[1])
return followers
示例4: flattenGraph
# 需要导入模块: import dis [as 别名]
# 或者: from dis import hasjrel [as 别名]
def flattenGraph(self):
"""Arrange the blocks in order and resolve jumps"""
assert self.stage == RAW
self.insts = insts = []
pc = 0
begin = {}
end = {}
for b in self.getBlocksInOrder():
begin[b] = pc
for inst in b.getInstructions():
insts.append(inst)
if len(inst) == 1:
pc = pc + 1
elif inst[0] != "SET_LINENO":
# arg takes 2 bytes
pc = pc + 3
end[b] = pc
pc = 0
for i in range(len(insts)):
inst = insts[i]
if len(inst) == 1:
pc = pc + 1
elif inst[0] != "SET_LINENO":
pc = pc + 3
opname = inst[0]
if opname in self.hasjrel:
oparg = inst[1]
offset = begin[oparg] - pc
insts[i] = opname, offset
elif opname in self.hasjabs:
insts[i] = opname, begin[inst[1]]
self.stage = FLAT
示例5: jump
# 需要导入模块: import dis [as 别名]
# 或者: from dis import hasjrel [as 别名]
def jump(self):
opcode = self.opcode
if opcode in dis.hasjrel:
return self[1] + self.arg
elif opcode in dis.hasjabs:
return self.code.address(self.arg)
示例6: get_target_addr
# 需要导入模块: import dis [as 别名]
# 或者: from dis import hasjrel [as 别名]
def get_target_addr(self):
'''
Returns the target address for the current instruction based on the
current address.
'''
rvalue = None
if self.opcode in dis.hasjrel:
rvalue = self.addr + self.oparg + self.len()
if self.opcode in dis.hasjabs:
rvalue = self.oparg
return rvalue
示例7: flattenGraph
# 需要导入模块: import dis [as 别名]
# 或者: from dis import hasjrel [as 别名]
def flattenGraph(self):
"""Arrange the blocks in order and resolve jumps"""
assert self.stage == RAW
self.insts = insts = []
pc = 0
begin = {}
end = {}
for b in self.getBlocksInOrder():
begin[b] = pc
for inst in b.getInstructions():
insts.append(inst)
if len(inst) == 1:
pc = pc + 1
elif inst[0] != "SET_LINENO":
# arg takes 2 bytes
pc = pc + 3
end[b] = pc
pc = 0
for i in range(len(insts)):
inst = insts[i]
if len(inst) == 1:
pc = pc + 1
elif inst[0] != "SET_LINENO":
pc = pc + 3
opname = inst[0]
if self.hasjrel.has_elt(opname):
oparg = inst[1]
offset = begin[oparg] - pc
insts[i] = opname, offset
elif self.hasjabs.has_elt(opname):
insts[i] = opname, begin[inst[1]]
self.stage = FLAT
示例8: _update_label_offsets
# 需要导入模块: import dis [as 别名]
# 或者: from dis import hasjrel [as 别名]
def _update_label_offsets(code_obj, breakpoint_offset, breakpoint_code_list):
"""
Update labels for the relative and absolute jump targets
:param code_obj: code to modify
:param breakpoint_offset: offset for the inserted code
:param breakpoint_code_list: size of the inserted code
:return: bytes sequence with modified labels; list of tuples (resulting offset, list of code instructions) with
information about all inserted pieces of code
"""
inserted_code = list()
# the list with all inserted pieces of code
inserted_code.append((breakpoint_offset, breakpoint_code_list))
code_list = list(code_obj)
j = 0
while j < len(inserted_code):
current_offset, current_code_list = inserted_code[j]
offsets_for_modification = []
for offset, op, arg in _unpack_opargs(code_list, inserted_code, j):
if arg is not None:
if op in dis.hasjrel:
# has relative jump target
label = offset + 2 + arg
if offset < current_offset < label:
# change labels for relative jump targets if code was inserted inside
offsets_for_modification.append(offset)
elif op in dis.hasjabs:
# change label for absolute jump if code was inserted before it
if current_offset < arg:
offsets_for_modification.append(offset)
for i in range(0, len(code_list), 2):
op = code_list[i]
if i in offsets_for_modification and op >= dis.HAVE_ARGUMENT:
new_arg = code_list[i + 1] + len(current_code_list)
if new_arg <= MAX_BYTE:
code_list[i + 1] = new_arg
else:
# handle bytes overflow
if i - 2 > 0 and code_list[i - 2] == EXTENDED_ARG and code_list[i - 1] < MAX_BYTE:
# if new argument > 255 and EXTENDED_ARG already exists we need to increase it's argument
code_list[i - 1] += 1
else:
# if there isn't EXTENDED_ARG operator yet we have to insert the new operator
extended_arg_code = [EXTENDED_ARG, new_arg >> 8]
inserted_code.append((i, extended_arg_code))
code_list[i + 1] = new_arg & MAX_BYTE
code_list = code_list[:current_offset] + current_code_list + code_list[current_offset:]
for k in range(len(inserted_code)):
offset, inserted_code_list = inserted_code[k]
if current_offset < offset:
inserted_code[k] = (offset + len(current_code_list), inserted_code_list)
j += 1
return bytes(code_list), inserted_code