mirror of
https://github.com/python/cpython.git
synced 2025-08-31 14:07:50 +00:00
GvR's rpc patch
This commit is contained in:
parent
38d53451b7
commit
5d2af63cc3
7 changed files with 1208 additions and 94 deletions
|
@ -1,5 +1,6 @@
|
|||
import os
|
||||
import bdb
|
||||
import types
|
||||
import traceback
|
||||
from Tkinter import *
|
||||
from WindowList import ListedToplevel
|
||||
|
@ -7,20 +8,66 @@ from WindowList import ListedToplevel
|
|||
import StackViewer
|
||||
|
||||
|
||||
class Debugger(bdb.Bdb):
|
||||
class Idb(bdb.Bdb):
|
||||
|
||||
def __init__(self, gui):
|
||||
self.gui = gui
|
||||
bdb.Bdb.__init__(self)
|
||||
|
||||
def user_line(self, frame):
|
||||
# get the currently executing function
|
||||
co_filename = frame.f_code.co_filename
|
||||
co_name = frame.f_code.co_name
|
||||
try:
|
||||
func = frame.f_locals[co_name]
|
||||
if getattr(func, "DebuggerStepThrough", 0):
|
||||
print "XXXX DEBUGGER STEPPING THROUGH"
|
||||
self.set_step()
|
||||
return
|
||||
except:
|
||||
pass
|
||||
if co_filename in ('rpc.py', '<string>'):
|
||||
self.set_step()
|
||||
return
|
||||
if co_filename.endswith('threading.py'):
|
||||
self.set_step()
|
||||
return
|
||||
message = self.__frame2message(frame)
|
||||
self.gui.interaction(message, frame)
|
||||
|
||||
def user_exception(self, frame, info):
|
||||
message = self.__frame2message(frame)
|
||||
self.gui.interaction(message, frame, info)
|
||||
|
||||
def __frame2message(self, frame):
|
||||
code = frame.f_code
|
||||
filename = code.co_filename
|
||||
lineno = frame.f_lineno
|
||||
basename = os.path.basename(filename)
|
||||
message = "%s:%s" % (basename, lineno)
|
||||
if code.co_name != "?":
|
||||
message = "%s: %s()" % (message, code.co_name)
|
||||
return message
|
||||
|
||||
|
||||
class Debugger:
|
||||
|
||||
interacting = 0
|
||||
|
||||
vstack = vsource = vlocals = vglobals = None
|
||||
|
||||
def __init__(self, pyshell):
|
||||
bdb.Bdb.__init__(self)
|
||||
def __init__(self, pyshell, idb=None):
|
||||
if idb is None:
|
||||
idb = Idb(self)
|
||||
self.pyshell = pyshell
|
||||
self.idb = idb
|
||||
self.make_gui()
|
||||
|
||||
def canonic(self, filename):
|
||||
# Canonicalize filename -- called by Bdb
|
||||
return os.path.normcase(os.path.abspath(filename))
|
||||
def run(self, *args):
|
||||
try:
|
||||
self.interacting = 1
|
||||
return self.idb.run(*args)
|
||||
finally:
|
||||
self.interacting = 0
|
||||
|
||||
def close(self, event=None):
|
||||
if self.interacting:
|
||||
|
@ -31,24 +78,6 @@ class Debugger(bdb.Bdb):
|
|||
self.pyshell.close_debugger()
|
||||
self.top.destroy()
|
||||
|
||||
def run(self, *args):
|
||||
try:
|
||||
self.interacting = 1
|
||||
return apply(bdb.Bdb.run, (self,) + args)
|
||||
finally:
|
||||
self.interacting = 0
|
||||
|
||||
def user_line(self, frame):
|
||||
self.interaction(frame)
|
||||
|
||||
def user_return(self, frame, rv):
|
||||
# XXX show rv?
|
||||
##self.interaction(frame)
|
||||
pass
|
||||
|
||||
def user_exception(self, frame, info):
|
||||
self.interaction(frame, info)
|
||||
|
||||
def make_gui(self):
|
||||
pyshell = self.pyshell
|
||||
self.flist = pyshell.flist
|
||||
|
@ -128,16 +157,8 @@ class Debugger(bdb.Bdb):
|
|||
|
||||
frame = None
|
||||
|
||||
def interaction(self, frame, info=None):
|
||||
def interaction(self, message, frame, info=None):
|
||||
self.frame = frame
|
||||
code = frame.f_code
|
||||
file = code.co_filename
|
||||
base = os.path.basename(file)
|
||||
lineno = frame.f_lineno
|
||||
#
|
||||
message = "%s:%s" % (base, lineno)
|
||||
if code.co_name != "?":
|
||||
message = "%s: %s()" % (message, code.co_name)
|
||||
self.status.configure(text=message)
|
||||
#
|
||||
if info:
|
||||
|
@ -160,7 +181,7 @@ class Debugger(bdb.Bdb):
|
|||
#
|
||||
sv = self.stackviewer
|
||||
if sv:
|
||||
stack, i = self.get_stack(self.frame, tb)
|
||||
stack, i = self.idb.get_stack(self.frame, tb)
|
||||
sv.load_stack(stack, i)
|
||||
#
|
||||
self.show_variables(1)
|
||||
|
@ -184,32 +205,34 @@ class Debugger(bdb.Bdb):
|
|||
frame = self.frame
|
||||
if not frame:
|
||||
return
|
||||
filename, lineno = self.__frame2fileline(frame)
|
||||
if filename[:1] + filename[-1:] != "<>" and os.path.exists(filename):
|
||||
self.flist.gotofileline(filename, lineno)
|
||||
|
||||
def __frame2fileline(self, frame):
|
||||
code = frame.f_code
|
||||
file = code.co_filename
|
||||
filename = code.co_filename
|
||||
lineno = frame.f_lineno
|
||||
if file[:1] + file[-1:] != "<>" and os.path.exists(file):
|
||||
edit = self.flist.open(file)
|
||||
if edit:
|
||||
edit.gotoline(lineno)
|
||||
return filename, lineno
|
||||
|
||||
def cont(self):
|
||||
self.set_continue()
|
||||
self.idb.set_continue()
|
||||
self.root.quit()
|
||||
|
||||
def step(self):
|
||||
self.set_step()
|
||||
self.idb.set_step()
|
||||
self.root.quit()
|
||||
|
||||
def next(self):
|
||||
self.set_next(self.frame)
|
||||
self.idb.set_next(self.frame)
|
||||
self.root.quit()
|
||||
|
||||
def ret(self):
|
||||
self.set_return(self.frame)
|
||||
self.idb.set_return(self.frame)
|
||||
self.root.quit()
|
||||
|
||||
def quit(self):
|
||||
self.set_quit()
|
||||
self.idb.set_quit()
|
||||
self.root.quit()
|
||||
|
||||
stackviewer = None
|
||||
|
@ -219,7 +242,7 @@ class Debugger(bdb.Bdb):
|
|||
self.stackviewer = sv = StackViewer.StackViewer(
|
||||
self.fstack, self.flist, self)
|
||||
if self.frame:
|
||||
stack, i = self.get_stack(self.frame, None)
|
||||
stack, i = self.idb.get_stack(self.frame, None)
|
||||
sv.load_stack(stack, i)
|
||||
else:
|
||||
sv = self.stackviewer
|
||||
|
@ -233,6 +256,7 @@ class Debugger(bdb.Bdb):
|
|||
self.sync_source_line()
|
||||
|
||||
def show_frame(self, (frame, lineno)):
|
||||
# Called from OldStackViewer
|
||||
self.frame = frame
|
||||
self.show_variables()
|
||||
|
||||
|
@ -295,15 +319,15 @@ class Debugger(bdb.Bdb):
|
|||
text.tag_add("BREAK", "insert linestart", "insert lineend +1char")
|
||||
|
||||
# A literal copy of Bdb.set_break() without the print statement at the end
|
||||
def set_break(self, filename, lineno, temporary=0, cond = None):
|
||||
import linecache # Import as late as possible
|
||||
filename = self.canonic(filename)
|
||||
line = linecache.getline(filename, lineno)
|
||||
if not line:
|
||||
return 'That line does not exist!'
|
||||
if not self.breaks.has_key(filename):
|
||||
self.breaks[filename] = []
|
||||
list = self.breaks[filename]
|
||||
if not lineno in list:
|
||||
list.append(lineno)
|
||||
bp = bdb.Breakpoint(filename, lineno, temporary, cond)
|
||||
#def set_break(self, filename, lineno, temporary=0, cond = None):
|
||||
# import linecache # Import as late as possible
|
||||
# filename = self.canonic(filename)
|
||||
# line = linecache.getline(filename, lineno)
|
||||
# if not line:
|
||||
# return 'That line does not exist!'
|
||||
# if not self.breaks.has_key(filename):
|
||||
# self.breaks[filename] = []
|
||||
# list = self.breaks[filename]
|
||||
# if not lineno in list:
|
||||
# list.append(lineno)
|
||||
# bp = bdb.Breakpoint(filename, lineno, temporary, cond)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue