00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 import os.path
00028 import base
00029 import gtk
00030 from disasm import Disasm
00031 from source import Source
00032
00033
00034 class Listings(base.Composite):
00035 """
00036 Display a collection of source code, disassembly, and mixed listing
00037 """
00038 def __init__(self, book):
00039 base.Composite.__init__(self)
00040 self.__current_view = None
00041 assert book
00042 self.__book = book
00043
00044
00045 def add(self, v, filename):
00046 super(Listings, self).add(v)
00047 w = v.widget()
00048 book = self.__book
00049 shortFileName = os.path.basename(filename)
00050 try:
00051 book.append_page(w)
00052 book.set_tab_label_text(w, shortFileName)
00053 except:
00054
00055 book.append_page(w, gtk.Label(shortFileName))
00056 w.show_all()
00057 book.set_current_page(book.page_num(w))
00058
00059
00060 def show(self, thread, addr, sym):
00061 if sym:
00062 filename = sym.filename()
00063 line = sym.line()
00064 self.__show(thread, addr, sym, filename, line)
00065 try:
00066 self.__show(thread, addr, sym, filename, line)
00067 except:
00068
00069 line = 0
00070
00071 self.__show(thread, addr, sym, filename, line)
00072
00073
00074 def __show(self, thread, addr, sym, filename, line):
00075 assert(sym)
00076 view = None
00077
00078 for v in self._Composite__views:
00079 if v.filename() == filename:
00080 view = v
00081 book = self.__book
00082 book.set_current_page(book.page_num(v.widget()))
00083 break
00084
00085 if not view:
00086 w = self.__book
00087 if line:
00088 view = Source(w)
00089 view.read(thread, addr, sym)
00090 else:
00091 view = Disasm(w)
00092 self.add(view, filename)
00093 assert view
00094 view.show(thread, addr, sym)
00095 self.__current_view = view
00096
00097
00098 def show_frame(self, stackView, thread, frame):
00099 self.show(thread, frame.program_count(), frame.function())
00100
00101
00102 def update(self, event):
00103 w = self.__book.get_nth_page(0)
00104 if w and w.get_name() == "placeholder":
00105 self.__book.remove_page(0)
00106 thread = event.thread()
00107 pc = thread.program_count()
00108 sym = thread.symbols().lookup(pc)
00109 self.show(thread, pc, sym)
00110
00111
00112 def clear(self):
00113 try:
00114 while self.__book.get_n_pages():
00115 self.__book.remove_page(0)
00116 except:
00117 while len(self.__book.get_children()):
00118 self.__book.remove_page(0)
00119 w = gtk.Frame()
00120 w.set_name("placeholder")
00121 w.set_shadow_type(gtk.SHADOW_ETCHED_IN)
00122 w.show()
00123 self.__book.add(w)
00124 self.__book.set_tab_label_text(w, "main.cpp")
00125 self._Composite__views = []