DocView patches from Morgen Hua: bug fixes, and additional SVN

commands, also added a default template that uses the text editor for
any unknown file type.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@34473 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2005-05-31 21:41:11 +00:00
parent b81383bbd9
commit 26ee3a06e2
22 changed files with 1191 additions and 316 deletions

View File

@@ -22,6 +22,8 @@ import inspect
from xml.dom.minidom import getDOMImplementation
import atexit
import pickle
import cStringIO
import bz2
if sys.platform.startswith("win"):
import win32api
@@ -107,7 +109,7 @@ class Adb(bdb.Bdb):
exc_type_name = exc_type
else:
exc_type_name = exc_type.__name__
message = "Exception occurred: " + repr(exc_type_name) + " See locals.__exception__ for details."
message = "Exception occured: " + repr(exc_type_name) + " See locals.__exception__ for details."
traceback.print_exception(exc_type, exc_value, exc_traceback)
self._harness.interaction(message, frame, message)
@@ -189,8 +191,7 @@ class Adb(bdb.Bdb):
return ""
def stop_here(self, frame):
if( self._userBreak ):
self._userBreak = False
if self._userBreak:
return True
@@ -270,6 +271,7 @@ class BreakListenerThread(threading.Thread):
if _VERBOSE: print "Before calling server close on breakpoint server"
self._server.server_close()
if _VERBOSE: print "Calling server close on breakpoint server"
self._server = None
class DebuggerHarness(object):
@@ -312,8 +314,11 @@ class DebuggerHarness(object):
self._server.register_function(self.clear_breakpoint)
self._server.register_function(self.set_all_breakpoints)
self._server.register_function(self.attempt_introspection)
self._server.register_function(self.execute_in_frame)
self._server.register_function(self.add_watch)
self._server.register_function(self.request_frame_document)
self.frame_stack = []
self.message_frame_dict = {}
self.introspection_list = []
atexit.register(self.do_exit)
@@ -364,7 +369,28 @@ class DebuggerHarness(object):
tp, val, tb = sys.exc_info()
return self.get_exception_document(tp, val, tb)
return ""
def execute_in_frame(self, frame_message, command):
frame = self.message_frame_dict[frame_message]
output = cStringIO.StringIO()
out = sys.stdout
err = sys.stderr
sys.stdout = output
sys.stderr = output
try:
exec command in frame.f_globals, frame.f_locals
return output.getvalue()
sys.stdout = out
sys.stderr = err
except:
sys.stdout = out
sys.stderr = err
tp, val, tb = sys.exc_info()
output = cStringIO.StringIO()
traceback.print_exception(tp, val, tb, file=output)
return output.getvalue()
def attempt_introspection(self, frame_message, chain):
try:
frame = self.message_frame_dict[frame_message]
@@ -608,22 +634,27 @@ class DebuggerHarness(object):
def getFrameXML(self, base_frame):
doc = getDOMImplementation().createDocument(None, "stack", None)
top_element = doc.documentElement
stack = []
self.frame_stack = []
frame = base_frame
while frame is not None:
if((frame.f_code.co_filename.count('DebuggerHarness.py') == 0) or _DEBUG_DEBUGGER):
stack.append(frame)
self.frame_stack.append(frame)
frame = frame.f_back
stack.reverse()
self.frame_stack.reverse()
self.message_frame_dict = {}
for f in stack:
self.addFrame(f,top_element, doc)
doc = getDOMImplementation().createDocument(None, "stack", None)
top_element = doc.documentElement
numberFrames = len(self.frame_stack)
for index in range(numberFrames):
frame = self.frame_stack[index]
message = self._adb.frame2message(frame)
# We include globals and locals only for the last frame as an optimization for cases
# where there are a lot of frames.
self.addFrame(frame, top_element, doc, includeContent=(index == numberFrames - 1))
return doc.toxml()
def addFrame(self, frame, root_element, document):
def addFrame(self, frame, root_element, document, includeContent=False):
frameNode = document.createElement('frame')
root_element.appendChild(frameNode)
@@ -633,11 +664,19 @@ class DebuggerHarness(object):
frameNode.setAttribute('line', str(frame.f_lineno))
message = self._adb.frame2message(frame)
frameNode.setAttribute('message', message)
#print "Frame: %s %s %s" %(message, frame.f_lineno, filename)
self.message_frame_dict[message] = frame
self.addDict(frameNode, "locals", frame.f_locals, document, 2)
self.addNode(frameNode, "globals", frame.f_globals, document)
if includeContent:
self.addDict(frameNode, "locals", frame.f_locals, document, 2)
self.addNode(frameNode, "globals", frame.f_globals, document)
def request_frame_document(self, message):
frame = self.message_frame_dict[message]
doc = getDOMImplementation().createDocument(None, "stack", None)
top_element = doc.documentElement
if frame:
self.addFrame(frame, top_element, doc, includeContent=True)
return xmlrpclib.Binary(bz2.compress(doc.toxml()))
def getRepr(self, varName, globals, locals):
try:
return repr(eval(varName, globals, locals))
@@ -647,23 +686,25 @@ class DebuggerHarness(object):
def saferepr(self, thing):
try:
return repr(thing)
try:
return repr(thing)
except:
return str(type(thing))
except:
tp, val, tb = sys.exc_info()
traceback.print_exception(tp, val, tb)
#traceback.print_exception(tp, val, tb)
return repr(val)
# The debugger calls this method when it reaches a breakpoint.
def interaction(self, message, frame, info):
if _VERBOSE:
print 'hit debug side interaction'
self._userBreak = False
self._adb._userBreak = False
self._currentFrame = frame
done = False
while not done:
try:
import bz2
xml = self.getFrameXML(frame)
arg = xmlrpclib.Binary(bz2.compress(xml))
if _VERBOSE: