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