def print_stack_entry(proc_obj, i_stack, color="plain", opts={}): frame_lineno = proc_obj.stack[len(proc_obj.stack) - i_stack - 1] frame, lineno = frame_lineno intf = proc_obj.intf[-1] if frame is proc_obj.curframe: intf.msg_nocr(format_token(Mformat.Arrow, "->", highlight=color)) else: intf.msg_nocr("##") intf.msg( "%d %s" % (i_stack, format_stack_entry(proc_obj.debugger, frame_lineno, color=color))) if opts.get("source", False): filename = frame2file(proc_obj.core, frame) line = linecache.getline(filename, lineno, frame.f_globals) intf.msg(line) pass if opts.get("deparse", False): name = frame.f_code.co_name if frame.f_lasti == -1: last_i = 0 else: last_i = frame.f_lasti deparsed, nodeInfo = deparse_offset(frame.f_code, name, last_i, None) if name == "<module>": name == "module" if nodeInfo: extractInfo = deparsed.extract_node_info(nodeInfo) intf.msg(extractInfo.selectedLine) intf.msg(extractInfo.markerLine) pass if opts.get("full", False): names = list(frame.f_locals.keys()) for name in sorted(names): if _with_local_varname.match(name): val = frame.f_locals[name] else: val = proc_obj.getval(name, frame.f_locals) pass width = opts.get("width", 80) Mpp.pp(val, width, intf.msg_nocr, intf.msg, prefix="%s =" % name) pass deparsed, nodeInfo = deparse_offset(frame.f_code, name, frame.f_lasti, None) if name == "<module>": name == "module" if nodeInfo: extractInfo = deparsed.extract_node_info(nodeInfo) intf.msg(extractInfo.selectedLine) intf.msg(extractInfo.markerLine) pass
def run(self, args): co = self.proc.curframe.f_code name = co.co_name try: opts, args = getopt(args[1:], "hpPAto:O", [ "help", "parent", "pretty", "AST", 'tree', "offset=", "offsets" ]) except GetoptError as err: # print help information and exit: print(str( err)) # will print something like "option -a not recognized" return show_parent = False show_ast = False offset = None show_offsets = False for o, a in opts: if o in ("-h", "--help"): self.proc.commands['help'].run(['help', 'deparse']) return elif o in ("-O", "--offsets"): show_offsets = True elif o in ("-p", "--parent"): show_parent = True elif o in ("-A", "--tree", '--AST'): show_ast = True elif o in ("-o", '--offset'): offset = a else: self.errmsg("unhandled option '%s'" % o) pass pass nodeInfo = None if len(args) >= 1 and args[0] == '.': temp_filename, name_for_code = deparse_and_cache(co, self.errmsg) if not temp_filename: return self.print_text(''.join(getlines(temp_filename))) return elif show_offsets: deparsed = code_deparse(co) self.section("Offsets known:") m = self.columnize_commands( list(sorted(deparsed.offsets.keys(), key=lambda x: str(x[0])))) self.msg_nocr(m) return elif offset is not None: mess = ("The 'deparse' command when given an argument requires an" " instruction offset. Got: '%s'" % offset) last_i = self.proc.get_an_int(offset, mess) if last_i is None: return else: last_i = self.proc.curframe.f_lasti if last_i == -1: last_i = 0 deparsed, nodeInfo = deparse_offset(co, name, last_i, self.errmsg) if not deparsed: return if nodeInfo: extractInfo = deparsed.extract_node_info(nodeInfo) parentInfo = None # print extractInfo if show_ast: p = deparsed.ast if show_parent: parentInfo, p = deparsed.extract_parent_info(nodeInfo.node) self.msg(p) if extractInfo: self.rst_msg("*instruction:* %s" % (nodeInfo.node)) self.print_text(extractInfo.selectedLine) self.msg(extractInfo.markerLine) if show_parent: if not parentInfo: parentInfo, p = deparsed.extract_parent_info( nodeInfo.node) if parentInfo: self.section("Contained in...") self.rst_msg("\t*Grammar Symbol:* %s" % p.kind) self.print_text(parentInfo.selectedLine) self.msg(parentInfo.markerLine) pass pass pass elif last_i == -1: if name: self.msg("At beginning of %s " % name) elif self.core.filename(None): self.msg("At beginning of program %s" % self.core.filename(None)) else: self.msg("At beginning") else: self.errmsg( "haven't recorded info for offset %d. Offsets I know are:" % last_i) m = self.columnize_commands( list(sorted(deparsed.offsets.keys(), key=lambda x: str(x[0])))) self.msg_nocr(m) return