+
+
+ def getFrameXML(self, base_frame):
+
+ self.frame_stack = []
+ frame = base_frame
+ while frame is not None:
+ if((frame.f_code.co_filename.count('DebuggerHarness.py') == 0) or _DEBUG_DEBUGGER):
+ self.frame_stack.append(frame)
+ frame = frame.f_back
+ self.frame_stack.reverse()
+ self.message_frame_dict = {}
+ 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, includeContent=False):
+ frameNode = document.createElement('frame')
+ root_element.appendChild(frameNode)
+
+ code = frame.f_code
+ filename = code.co_filename
+ frameNode.setAttribute('file', str(filename))
+ frameNode.setAttribute('line', str(frame.f_lineno))
+ message = self._adb.frame2message(frame)
+ frameNode.setAttribute('message', message)
+ self.message_frame_dict[message] = frame
+ 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))
+ except:
+ return 'Error: Could not recover value.'
+
+
+ def saferepr(self, thing):
+ try:
+ try:
+ return repr(thing)
+ except:
+ return str(type(thing))
+ except:
+ tp, val, tb = sys.exc_info()
+ #traceback.print_exception(tp, val, tb)
+ return repr(val)
+