##===-- 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)