xref: /openbsd-src/gnu/llvm/lldb/utils/lui/breakwin.py (revision 061da546b983eb767bad15e67af1174fb0bcf31c)
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