def print_location(proc_obj): """Show where we are. GUI's and front-end interfaces often use this to update displays. So it is helpful to make sure we give at least some place that's located in a file. """ i_stack = proc_obj.curindex if i_stack is None or proc_obj.stack is None: return False core_obj = proc_obj.core dbgr_obj = proc_obj.debugger intf_obj = dbgr_obj.intf[-1] # Evaluation routines like "exec" don't show useful location # info. In these cases, we will use the position before that in # the stack. Hence the looping below which in practices loops # once and sometimes twice. remapped_file = None source_text = None while i_stack >= 0: frame_lineno = proc_obj.stack[i_stack] i_stack -= 1 frame, lineno = frame_lineno # # Next check to see that local variable breadcrumb exists and # # has the magic dynamic value. # # If so, it's us and we don't normally show this.a # if 'breadcrumb' in frame.f_locals: # if self.run == frame.f_locals['breadcrumb']: # break filename = Mstack.frame2file(core_obj, frame, canonic=False) if '<string>' == filename and dbgr_obj.eval_string: remapped_file = filename filename = pyficache.unmap_file(filename) if '<string>' == filename: remapped = source_tempfile_remap('eval_string', dbgr_obj.eval_string) pyficache.remap_file(filename, remapped) filename = remapped lineno = pyficache.unmap_file_line(filename, lineno) pass pass elif '<string>' == filename: source_text = deparse_fn(frame.f_code) filename = "<string: '%s'>" % source_text pass else: if filename in pyficache.file2file_remap: remapped_file = pyficache.unmap_file(filename) # FIXME: a remapped_file shouldn't be the same as its unmapped version if remapped_file == filename: remapped_file = None pass pass pass opts = { 'reload_on_change' : proc_obj.settings('reload'), 'output' : proc_obj.settings('highlight') } if 'style' in proc_obj.debugger.settings: opts['style'] = proc_obj.settings('style') pyficache.update_cache(filename) line = pyficache.getline(filename, lineno, opts) if not line: if (not source_text and filename.startswith("<string: ") and proc_obj.curframe.f_code): # Deparse the code object into a temp file and remap the line from code # into the corresponding line of the tempfile co = proc_obj.curframe.f_code temp_filename, name_for_code = deparse_and_cache(co, proc_obj.errmsg) lineno = 1 # _, lineno = pyficache.unmap_file_line(temp_filename, lineno, True) if temp_filename: filename = temp_filename pass else: # FIXME: if source_text: lines = source_text.split("\n") temp_name='string-' else: # try with good ol linecache and consider fixing pyficache lines = linecache.getlines(filename) temp_name = filename if lines: # FIXME: DRY code with version in cmdproc.py print_location prefix = os.path.basename(temp_name).split('.')[0] fd = tempfile.NamedTemporaryFile(suffix='.py', prefix=prefix, delete=False) with fd: fd.write(''.join(lines)) remapped_file = fd.name pyficache.remap_file(remapped_file, filename) fd.close() pass line = linecache.getline(filename, lineno, proc_obj.curframe.f_globals) pass fn_name = frame.f_code.co_name last_i = frame.f_lasti print_source_location_info(intf_obj.msg, filename, lineno, fn_name, remapped_file = remapped_file, f_lasti = last_i) if line and len(line.strip()) != 0: if proc_obj.event: print_source_line(intf_obj.msg, lineno, line, proc_obj.event2short[proc_obj.event]) pass if '<string>' != filename: break pass if proc_obj.event in ['return', 'exception']: val = proc_obj.event_arg intf_obj.msg('R=> %s' % proc_obj._saferepr(val)) pass return True
def print_location(proc_obj): """Show where we are. GUI's and front-end interfaces often use this to update displays. So it is helpful to make sure we give at least some place that's located in a file. """ i_stack = proc_obj.curindex if i_stack is None or proc_obj.stack is None: return False core_obj = proc_obj.core dbgr_obj = proc_obj.debugger intf_obj = dbgr_obj.intf[-1] # Evaluation routines like "exec" don't show useful location # info. In these cases, we will use the position before that in # the stack. Hence the looping below which in practices loops # once and sometimes twice. remapped_file = None source_text = None while i_stack >= 0: frame_lineno = proc_obj.stack[i_stack] i_stack -= 1 frame, lineno = frame_lineno # # Next check to see that local variable breadcrumb exists and # # has the magic dynamic value. # # If so, it's us and we don't normally show this.a # if 'breadcrumb' in frame.f_locals: # if self.run == frame.f_locals['breadcrumb']: # break filename = Mstack.frame2file(core_obj, frame, canonic=False) if '<string>' == filename and dbgr_obj.eval_string: remapped_file = filename filename = pyficache.unmap_file(filename) if '<string>' == filename: remapped = cmdfns.source_tempfile_remap( 'eval_string', dbgr_obj.eval_string) pyficache.remap_file(filename, remapped) filename = remapped lineno = pyficache.unmap_file_line(filename, lineno) pass pass elif '<string>' == filename: source_text = deparse_fn(frame.f_code) filename = "<string: '%s'>" % source_text pass else: m = re.search('^<frozen (.*)>', filename) if m and m.group(1) in pyficache.file2file_remap: remapped_file = pyficache.file2file_remap[m.group(1)] pass elif filename in pyficache.file2file_remap: remapped_file = pyficache.unmap_file(filename) # FIXME: a remapped_file shouldn't be the same as its unmapped version if remapped_file == filename: remapped_file = None pass pass elif m and m.group(1) in sys.modules: remapped_file = m.group(1) pyficache.remap_file(filename, remapped_file) pass opts = { 'reload_on_change': proc_obj.settings('reload'), 'output': proc_obj.settings('highlight') } if 'style' in proc_obj.debugger.settings: opts['style'] = proc_obj.settings('style') pyficache.update_cache(filename) line = pyficache.getline(filename, lineno, opts) if not line: if (not source_text and filename.startswith("<string: ") and proc_obj.curframe.f_code): # Deparse the code object into a temp file and remap the line from code # into the corresponding line of the tempfile co = proc_obj.curframe.f_code temp_filename, name_for_code = deparse_and_cache( co, proc_obj.errmsg) lineno = 1 # _, lineno = pyficache.unmap_file_line(temp_filename, lineno, True) if temp_filename: filename = temp_filename pass else: # FIXME: if source_text: lines = source_text.split("\n") temp_name = 'string-' else: # try with good ol linecache and consider fixing pyficache lines = linecache.getlines(filename) temp_name = filename if lines: # FIXME: DRY code with version in cmdproc.py print_location prefix = os.path.basename(temp_name).split('.')[0] fd = tempfile.NamedTemporaryFile(suffix='.py', prefix=prefix, delete=False) with fd: fd.write(''.join(lines)) remapped_file = fd.name pyficache.remap_file(remapped_file, filename) fd.close() pass line = linecache.getline(filename, lineno, proc_obj.curframe.f_globals) if not line: m = re.search('^<frozen (.*)>', filename) if m and m.group(1): remapped_file = m.group(1) try_module = sys.modules.get(remapped_file) if (try_module and inspect.ismodule(try_module) and hasattr(try_module, '__file__')): remapped_file = sys.modules[remapped_file].__file__ pyficache.remap_file(filename, remapped_file) line = linecache.getline(remapped_file, lineno, proc_obj.curframe.f_globals) else: remapped_file = m.group(1) code = proc_obj.curframe.f_code filename, line = cmdfns.deparse_getline( code, remapped_file, lineno, opts) pass pass try: match, reason = Mstack.check_path_with_frame(frame, filename) if not match: if filename not in warned_file_mismatches: proc_obj.errmsg(reason) warned_file_mismatches.add(filename) except: pass fn_name = frame.f_code.co_name last_i = frame.f_lasti print_source_location_info(intf_obj.msg, filename, lineno, fn_name, remapped_file=remapped_file, f_lasti=last_i) if line and len(line.strip()) != 0: if proc_obj.event: print_source_line(intf_obj.msg, lineno, line, proc_obj.event2short[proc_obj.event]) pass if '<string>' != filename: break pass if proc_obj.event in ['return', 'exception']: val = proc_obj.event_arg intf_obj.msg('R=> %s' % proc_obj._saferepr(val)) pass return True
def print_location(proc_obj): """Show where we are. GUI's and front-end interfaces often use this to update displays. So it is helpful to make sure we give at least some place that's located in a file. """ i_stack = proc_obj.curindex if i_stack is None or proc_obj.stack is None: return False core_obj = proc_obj.core dbgr_obj = proc_obj.debugger intf_obj = dbgr_obj.intf[-1] # Evaluation routines like "exec" don't show useful location # info. In these cases, we will use the position before that in # the stack. Hence the looping below which in practices loops # once and sometimes twice. remapped_file = None source_text = None while i_stack >= 0: frame_lineno = proc_obj.stack[i_stack] i_stack -= 1 frame, lineno = frame_lineno # # Next check to see that local variable breadcrumb exists and # # has the magic dynamic value. # # If so, it's us and we don't normally show this.a # if 'breadcrumb' in frame.f_locals: # if self.run == frame.f_locals['breadcrumb']: # break filename = Mstack.frame2file(core_obj, frame, canonic=False) if "<string>" == filename and dbgr_obj.eval_string: remapped_file = filename filename = pyficache.unmap_file(filename) if "<string>" == filename: remapped = source_tempfile_remap( "eval_string", dbgr_obj.eval_string, tempdir=proc_obj.settings("tempdir")) pyficache.remap_file(filename, remapped) filename = remapped lineno = pyficache.unmap_file_line(filename, lineno) pass pass elif "<string>" == filename: source_text = deparse_fn(frame.f_code) filename = "<string: '%s'>" % source_text pass elif filename in proc_obj.file2file_remap: remapped_file = proc_obj.file2file_remap[filename] elif filename in pyficache.file2file_remap: remapped_file = pyficache.unmap_file(filename) # FIXME: a remapped_file shouldn't be the same as its unmapped version if remapped_file == filename: remapped_file = None pass pass elif pyficache.main.remap_re_hash: remapped_file = pyficache.remap_file_pat( filename, pyficache.main.remap_re_hash) opts = { "reload_on_change": proc_obj.settings("reload"), "output": proc_obj.settings("highlight"), } if "style" in proc_obj.debugger.settings: opts["style"] = proc_obj.settings("style") pyficache.update_cache(filename) line = pyficache.getline(filename, lineno, opts) if not line: if (not source_text and filename.startswith("<string: ") and proc_obj.curframe.f_code): # Deparse the code object into a temp file and remap the line from code # into the corresponding line of the tempfile co = proc_obj.curframe.f_code tempdir = proc_obj.settings("tempdir") temp_filename, name_for_code = deparse_and_cache( co, proc_obj.errmsg, tempdir=tempdir) lineno = 1 # _, lineno = pyficache.unmap_file_line(temp_filename, lineno, True) if temp_filename: filename = temp_filename pass else: # FIXME: if source_text: lines = source_text.split("\n") temp_name = "string-" else: # try with good ol linecache and consider fixing pyficache lines = linecache.getlines(filename) temp_name = filename if lines: # FIXME: DRY code with version in cmdproc.py print_location prefix = osp.basename(temp_name).split(".")[0] fd = tempfile.NamedTemporaryFile( suffix=".py", prefix=prefix, delete=False, dir=proc_obj.settings("tempdir"), ) with fd: fd.write("".join(lines)) remapped_file = fd.name pyficache.remap_file(remapped_file, filename) fd.close() pass line = linecache.getline(filename, lineno, proc_obj.curframe.f_globals) pass fn_name = frame.f_code.co_name last_i = frame.f_lasti print_source_location_info( intf_obj.msg, filename, lineno, fn_name, remapped_file=remapped_file, f_lasti=last_i, ) if line and len(line.strip()) != 0: if proc_obj.event: print_source_line(intf_obj.msg, lineno, line, proc_obj.event2short[proc_obj.event]) pass if "<string>" != filename: break pass if proc_obj.event in ["return", "exception"]: val = proc_obj.event_arg intf_obj.msg("R=> %s" % proc_obj._saferepr(val)) pass return True