Daniel Malea | e33c4ba | 2013-10-11 17:13:07 +0000 | [diff] [blame] | 1 | ##===-- breakwin.py ------------------------------------------*- Python -*-===## |
| 2 | ## |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 3 | # The LLVM Compiler Infrastructure |
Daniel Malea | e33c4ba | 2013-10-11 17:13:07 +0000 | [diff] [blame] | 4 | ## |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 5 | # This file is distributed under the University of Illinois Open Source |
| 6 | # License. See LICENSE.TXT for details. |
Daniel Malea | e33c4ba | 2013-10-11 17:13:07 +0000 | [diff] [blame] | 7 | ## |
| 8 | ##===----------------------------------------------------------------------===## |
| 9 | |
Daniel Malea | 4c3261d | 2013-10-09 22:11:30 +0000 | [diff] [blame] | 10 | import cui |
| 11 | import curses |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 12 | import lldb |
| 13 | import lldbutil |
Ben Langmuir | a084b33 | 2013-10-16 02:01:41 +0000 | [diff] [blame] | 14 | import re |
Daniel Malea | 4c3261d | 2013-10-09 22:11:30 +0000 | [diff] [blame] | 15 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 16 | |
Ben Langmuir | ac20991 | 2013-10-16 02:00:21 +0000 | [diff] [blame] | 17 | class BreakWin(cui.ListWin): |
Daniel Malea | 4c3261d | 2013-10-09 22:11:30 +0000 | [diff] [blame] | 18 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 19 | def __init__(self, driver, x, y, w, h): |
| 20 | super(BreakWin, self).__init__(x, y, w, h) |
| 21 | self.driver = driver |
Daniel Malea | 4c3261d | 2013-10-09 22:11:30 +0000 | [diff] [blame] | 22 | self.update() |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 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: |
Ben Langmuir | a084b33 | 2013-10-16 02:01:41 +0000 | [diff] [blame] | 46 | return |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 47 | target = self.driver.getTarget() |
| 48 | if not target.IsValid(): |
| 49 | return |
| 50 | bp = target.GetBreakpointAtIndex(self.getSelected()) |
| 51 | bp.SetEnabled(not bp.IsEnabled()) |
Ben Langmuir | ac20991 | 2013-10-16 02:00:21 +0000 | [diff] [blame] | 52 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 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) |
Ben Langmuir | a084b33 | 2013-10-16 02:01:41 +0000 | [diff] [blame] | 61 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 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 |
Daniel Malea | 4c3261d | 2013-10-09 22:11:30 +0000 | [diff] [blame] | 87 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 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) |