1##===-- breakwin.py ------------------------------------------*- Python -*-===## 2## 3# The LLVM Compiler Infrastructure 4## 5# This file is distributed under the University of Illinois Open Source 6# License. See LICENSE.TXT for details. 7## 8##===----------------------------------------------------------------------===## 9 10import cui 11import curses 12import lldb 13import lldbutil 14import re 15 16 17class BreakWin(cui.ListWin): 18 19 def __init__(self, driver, x, y, w, h): 20 super(BreakWin, self).__init__(x, y, w, h) 21 self.driver = driver 22 self.update() 23 self.showDetails = {} 24 25 def handleEvent(self, event): 26 if isinstance(event, lldb.SBEvent): 27 if lldb.SBBreakpoint.EventIsBreakpointEvent(event): 28 self.update() 29 if isinstance(event, int): 30 if event == ord('d'): 31 self.deleteSelected() 32 if event == curses.ascii.NL or event == curses.ascii.SP: 33 self.toggleSelected() 34 elif event == curses.ascii.TAB: 35 if self.getSelected() != -1: 36 target = self.driver.getTarget() 37 if not target.IsValid(): 38 return 39 i = target.GetBreakpointAtIndex(self.getSelected()).id 40 self.showDetails[i] = not self.showDetails[i] 41 self.update() 42 super(BreakWin, self).handleEvent(event) 43 44 def toggleSelected(self): 45 if self.getSelected() == -1: 46 return 47 target = self.driver.getTarget() 48 if not target.IsValid(): 49 return 50 bp = target.GetBreakpointAtIndex(self.getSelected()) 51 bp.SetEnabled(not bp.IsEnabled()) 52 53 def deleteSelected(self): 54 if self.getSelected() == -1: 55 return 56 target = self.driver.getTarget() 57 if not target.IsValid(): 58 return 59 bp = target.GetBreakpointAtIndex(self.getSelected()) 60 target.BreakpointDelete(bp.id) 61 62 def update(self): 63 target = self.driver.getTarget() 64 if not target.IsValid(): 65 self.win.erase() 66 self.win.noutrefresh() 67 return 68 selected = self.getSelected() 69 self.clearItems() 70 for i in range(0, target.GetNumBreakpoints()): 71 bp = target.GetBreakpointAtIndex(i) 72 if bp.IsInternal(): 73 continue 74 text = lldbutil.get_description(bp) 75 # FIXME: Use an API for this, not parsing the description. 76 match = re.search('SBBreakpoint: id = ([^,]+), (.*)', text) 77 try: 78 id = match.group(1) 79 desc = match.group(2).strip() 80 if bp.IsEnabled(): 81 text = '%s: %s' % (id, desc) 82 else: 83 text = '%s: (disabled) %s' % (id, desc) 84 except ValueError as e: 85 # bp unparsable 86 pass 87 88 if self.showDetails.setdefault(bp.id, False): 89 for location in bp: 90 desc = lldbutil.get_description( 91 location, lldb.eDescriptionLevelFull) 92 text += '\n ' + desc 93 self.addItem(text) 94 self.setSelected(selected) 95