# coding=utf-8class Block(object):def __init__(self, _type=0, target=0, level=0):self.type = _typeself.target = targetself.level = levelclass CO_FLAGS(object):CO_VARARGS = 0x4CO_VARKEYWORDS = 0x8CO_GENERATOR = 0x20class FrameObject:def __init__(self, codes=None, func=None, args=None, op_arg=None):self.locals = {}self.fast_locals = Noneif func:self.globals = func.globalscodes = func.func_codeif func.defaults:dft_cnt = len(func.defaults)arg_cnt = codes.arg_countself.fast_locals = [None for _ in range(arg_cnt)]while dft_cnt > 0:dft_cnt -= 1arg_cnt -= 1self.fast_locals[arg_cnt] = func.defaults[dft_cnt]else:self.globals = self.localsself.locals["__name__"] = "__main__"alist = None # 扩展位置参数 *argsadict = None # 扩展键参数 **kwargsif args:arg_cnt = codes.arg_countna = op_arg & 0xFFnk = op_arg >> 8if self.fast_locals is None:self.fast_locals = [None for _ in range(arg_cnt)]if arg_cnt < na:for i in range(arg_cnt):self.fast_locals[i] = args[i]alist = []for i in range(arg_cnt, na):alist.append(args[i])else:for i in range(na):self.fast_locals[i] = args[i]for i in range(nk):key = args[na + i * 2]value = args[na + i * 2 + 1]if key in codes.var_names:index = codes.var_names.index(key)self.fast_locals[index] = valueelse:if adict is None:adict = dict()adict[key] = valueif codes.flag & CO_FLAGS.CO_VARARGS:if alist is None:alist = []self.fast_locals.append(alist)if codes.flag & CO_FLAGS.CO_VARKEYWORDS:if adict is None:adict = dict()self.fast_locals.append(adict)self.stack = []self.loop_stack = []self.consts = codes.constsself.names = codes.namesself.pc = 0self._code_object = codesself.sender = Noneself.is_entry_frame = Falsedef has_more_codes(self):return self.pc < len(self._code_object.byte_codes)def get_op_code(self):op_code = ord(self._code_object.byte_codes[self.pc])self.pc += 1return op_codedef get_op_arg(self):byte1 = ord(self._code_object.byte_codes[self.pc]) & 0xFFself.pc += 1byte2 = ord(self._code_object.byte_codes[self.pc]) & 0xFFself.pc += 1op_arg = byte2 << 8 | byte1return op_argdef push(self, item):self.stack.append(item)def pop(self):return self.stack.pop()def top(self):return self.stack[-1]def get_name(self, index):return self.names[index]def get_local(self, key):return self.locals.get(key, None)def set_local(self, key, value):self.locals[key] = valuedef stack_level(self):return len(self.stack)def is_first_frame(self):return self.sender is None
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。