xref: /llvm-project/lldb/utils/lui/breakwin.py (revision 602e47c5f9fd2e14c7bfb6111e6558fa0d27c87f)
193f50594SJonas Devlieghere##===-- breakwin.py ------------------------------------------*- Python -*-===##
293f50594SJonas Devlieghere##
393f50594SJonas Devlieghere# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
493f50594SJonas Devlieghere# See https://llvm.org/LICENSE.txt for license information.
593f50594SJonas Devlieghere# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
693f50594SJonas Devlieghere##
793f50594SJonas Devlieghere##===----------------------------------------------------------------------===##
893f50594SJonas Devlieghere
993f50594SJonas Devlieghereimport cui
1093f50594SJonas Devlieghereimport curses
1193f50594SJonas Devlieghereimport lldb
1293f50594SJonas Devlieghereimport lldbutil
1393f50594SJonas Devlieghereimport re
1493f50594SJonas Devlieghere
1593f50594SJonas Devlieghere
1693f50594SJonas Devlieghereclass BreakWin(cui.ListWin):
1793f50594SJonas Devlieghere    def __init__(self, driver, x, y, w, h):
1893f50594SJonas Devlieghere        super(BreakWin, self).__init__(x, y, w, h)
1993f50594SJonas Devlieghere        self.driver = driver
2093f50594SJonas Devlieghere        self.update()
2193f50594SJonas Devlieghere        self.showDetails = {}
2293f50594SJonas Devlieghere
2393f50594SJonas Devlieghere    def handleEvent(self, event):
2493f50594SJonas Devlieghere        if isinstance(event, lldb.SBEvent):
2593f50594SJonas Devlieghere            if lldb.SBBreakpoint.EventIsBreakpointEvent(event):
2693f50594SJonas Devlieghere                self.update()
2793f50594SJonas Devlieghere        if isinstance(event, int):
28*602e47c5SDavid Spickett            if event == ord("d"):
2993f50594SJonas Devlieghere                self.deleteSelected()
3093f50594SJonas Devlieghere            if event == curses.ascii.NL or event == curses.ascii.SP:
3193f50594SJonas Devlieghere                self.toggleSelected()
3293f50594SJonas Devlieghere            elif event == curses.ascii.TAB:
3393f50594SJonas Devlieghere                if self.getSelected() != -1:
3493f50594SJonas Devlieghere                    target = self.driver.getTarget()
3593f50594SJonas Devlieghere                    if not target.IsValid():
3693f50594SJonas Devlieghere                        return
3793f50594SJonas Devlieghere                    i = target.GetBreakpointAtIndex(self.getSelected()).id
3893f50594SJonas Devlieghere                    self.showDetails[i] = not self.showDetails[i]
3993f50594SJonas Devlieghere                    self.update()
4093f50594SJonas Devlieghere        super(BreakWin, self).handleEvent(event)
4193f50594SJonas Devlieghere
4293f50594SJonas Devlieghere    def toggleSelected(self):
4393f50594SJonas Devlieghere        if self.getSelected() == -1:
4493f50594SJonas Devlieghere            return
4593f50594SJonas Devlieghere        target = self.driver.getTarget()
4693f50594SJonas Devlieghere        if not target.IsValid():
4793f50594SJonas Devlieghere            return
4893f50594SJonas Devlieghere        bp = target.GetBreakpointAtIndex(self.getSelected())
4993f50594SJonas Devlieghere        bp.SetEnabled(not bp.IsEnabled())
5093f50594SJonas Devlieghere
5193f50594SJonas Devlieghere    def deleteSelected(self):
5293f50594SJonas Devlieghere        if self.getSelected() == -1:
5393f50594SJonas Devlieghere            return
5493f50594SJonas Devlieghere        target = self.driver.getTarget()
5593f50594SJonas Devlieghere        if not target.IsValid():
5693f50594SJonas Devlieghere            return
5793f50594SJonas Devlieghere        bp = target.GetBreakpointAtIndex(self.getSelected())
5893f50594SJonas Devlieghere        target.BreakpointDelete(bp.id)
5993f50594SJonas Devlieghere
6093f50594SJonas Devlieghere    def update(self):
6193f50594SJonas Devlieghere        target = self.driver.getTarget()
6293f50594SJonas Devlieghere        if not target.IsValid():
6393f50594SJonas Devlieghere            self.win.erase()
6493f50594SJonas Devlieghere            self.win.noutrefresh()
6593f50594SJonas Devlieghere            return
6693f50594SJonas Devlieghere        selected = self.getSelected()
6793f50594SJonas Devlieghere        self.clearItems()
6893f50594SJonas Devlieghere        for i in range(0, target.GetNumBreakpoints()):
6993f50594SJonas Devlieghere            bp = target.GetBreakpointAtIndex(i)
7093f50594SJonas Devlieghere            if bp.IsInternal():
7193f50594SJonas Devlieghere                continue
7293f50594SJonas Devlieghere            text = lldbutil.get_description(bp)
7393f50594SJonas Devlieghere            # FIXME: Use an API for this, not parsing the description.
74*602e47c5SDavid Spickett            match = re.search("SBBreakpoint: id = ([^,]+), (.*)", text)
7593f50594SJonas Devlieghere            try:
7693f50594SJonas Devlieghere                id = match.group(1)
7793f50594SJonas Devlieghere                desc = match.group(2).strip()
7893f50594SJonas Devlieghere                if bp.IsEnabled():
79*602e47c5SDavid Spickett                    text = "%s: %s" % (id, desc)
8093f50594SJonas Devlieghere                else:
81*602e47c5SDavid Spickett                    text = "%s: (disabled) %s" % (id, desc)
8293f50594SJonas Devlieghere            except ValueError as e:
8393f50594SJonas Devlieghere                # bp unparsable
8493f50594SJonas Devlieghere                pass
8593f50594SJonas Devlieghere
8693f50594SJonas Devlieghere            if self.showDetails.setdefault(bp.id, False):
8793f50594SJonas Devlieghere                for location in bp:
8893f50594SJonas Devlieghere                    desc = lldbutil.get_description(
89*602e47c5SDavid Spickett                        location, lldb.eDescriptionLevelFull
90*602e47c5SDavid Spickett                    )
91*602e47c5SDavid Spickett                    text += "\n  " + desc
9293f50594SJonas Devlieghere            self.addItem(text)
9393f50594SJonas Devlieghere        self.setSelected(selected)
94