wrapper.py 文件源码

python
阅读 29 收藏 0 点赞 0 评论 0

项目:OpTrace 作者: tsyganov-ivan 项目源码 文件源码
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
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号