| ##===-- breakwin.py ------------------------------------------*- Python -*-===## |
| ## |
| # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| # See https://llvm.org/LICENSE.txt for license information. |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| ## |
| ##===----------------------------------------------------------------------===## |
| |
| import cui |
| import curses |
| import lldb |
| import lldbutil |
| import re |
| |
| |
| class BreakWin(cui.ListWin): |
| |
| def __init__(self, driver, x, y, w, h): |
| super(BreakWin, self).__init__(x, y, w, h) |
| self.driver = driver |
| self.update() |
| self.showDetails = {} |
| |
| def handleEvent(self, event): |
| if isinstance(event, lldb.SBEvent): |
| if lldb.SBBreakpoint.EventIsBreakpointEvent(event): |
| self.update() |
| if isinstance(event, int): |
| if event == ord('d'): |
| self.deleteSelected() |
| if event == curses.ascii.NL or event == curses.ascii.SP: |
| self.toggleSelected() |
| elif event == curses.ascii.TAB: |
| if self.getSelected() != -1: |
| target = self.driver.getTarget() |
| if not target.IsValid(): |
| return |
| i = target.GetBreakpointAtIndex(self.getSelected()).id |
| self.showDetails[i] = not self.showDetails[i] |
| self.update() |
| super(BreakWin, self).handleEvent(event) |
| |
| def toggleSelected(self): |
| if self.getSelected() == -1: |
| return |
| target = self.driver.getTarget() |
| if not target.IsValid(): |
| return |
| bp = target.GetBreakpointAtIndex(self.getSelected()) |
| bp.SetEnabled(not bp.IsEnabled()) |
| |
| def deleteSelected(self): |
| if self.getSelected() == -1: |
| return |
| target = self.driver.getTarget() |
| if not target.IsValid(): |
| return |
| bp = target.GetBreakpointAtIndex(self.getSelected()) |
| target.BreakpointDelete(bp.id) |
| |
| def update(self): |
| target = self.driver.getTarget() |
| if not target.IsValid(): |
| self.win.erase() |
| self.win.noutrefresh() |
| return |
| selected = self.getSelected() |
| self.clearItems() |
| for i in range(0, target.GetNumBreakpoints()): |
| bp = target.GetBreakpointAtIndex(i) |
| if bp.IsInternal(): |
| continue |
| text = lldbutil.get_description(bp) |
| # FIXME: Use an API for this, not parsing the description. |
| match = re.search('SBBreakpoint: id = ([^,]+), (.*)', text) |
| try: |
| id = match.group(1) |
| desc = match.group(2).strip() |
| if bp.IsEnabled(): |
| text = '%s: %s' % (id, desc) |
| else: |
| text = '%s: (disabled) %s' % (id, desc) |
| except ValueError as e: |
| # bp unparsable |
| pass |
| |
| if self.showDetails.setdefault(bp.id, False): |
| for location in bp: |
| desc = lldbutil.get_description( |
| location, lldb.eDescriptionLevelFull) |
| text += '\n ' + desc |
| self.addItem(text) |
| self.setSelected(selected) |