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:
		@@ -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:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user