def wrap_code(self, codeobj, codeobj_id=0):
codes = []
constants = [
self.wrap_code(item, self.get_codeobj_id())
if isinstance(item, CodeType) else item
for item in codeobj.co_consts
]
update_offset = partial(self.calculate_offset, code=codeobj.co_code)
for st in dis.get_instructions(codeobj):
self.mark(codeobj_id, st)
constants.append(
lambda co_id=codeobj_id, opcode=st: self.visit(co_id, opcode)
)
codes.extend(self.make_trace(len(constants) - 1))
codes.append(st.opcode)
if st.opcode in opcode.hasjrel:
current_position = update_offset(st.offset)
taget_position = update_offset(st.argval) - self.TRACE_CODE_LEN - self.TRACE_CODE_LEN
new_delta = taget_position - current_position
codes.extend(self.make_args(new_delta - self.AGR_OP_LEN))
elif st.opcode in opcode.hasjabs:
codes.extend(self.make_args(
update_offset(st.arg) - self.TRACE_CODE_LEN - self.TRACE_CODE_LEN
))
elif st.opcode >= opcode.HAVE_ARGUMENT:
codes.extend(self.make_args(st.arg))
new_code = CodeType(
codeobj.co_argcount,
codeobj.co_kwonlyargcount,
codeobj.co_nlocals,
codeobj.co_stacksize + self.AGR_OP_LEN,
codeobj.co_flags,
bytes(codes), # codestring
tuple(constants), # constants
codeobj.co_names,
codeobj.co_varnames,
codeobj.co_filename,
codeobj.co_name,
codeobj.co_firstlineno,
codeobj.co_lnotab,
codeobj.co_freevars,
codeobj.co_cellvars,
)
return new_code
评论列表
文章目录