brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · 038afa2 Raw
94 lines · python
1##===-- breakwin.py ------------------------------------------*- Python -*-===##2##3# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4# See https://llvm.org/LICENSE.txt for license information.5# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6##7##===----------------------------------------------------------------------===##8 9import cui10import curses11import lldb12import lldbutil13import re14 15 16class BreakWin(cui.ListWin):17    def __init__(self, driver, x, y, w, h):18        super(BreakWin, self).__init__(x, y, w, h)19        self.driver = driver20        self.update()21        self.showDetails = {}22 23    def handleEvent(self, event):24        if isinstance(event, lldb.SBEvent):25            if lldb.SBBreakpoint.EventIsBreakpointEvent(event):26                self.update()27        if isinstance(event, int):28            if event == ord("d"):29                self.deleteSelected()30            if event == curses.ascii.NL or event == curses.ascii.SP:31                self.toggleSelected()32            elif event == curses.ascii.TAB:33                if self.getSelected() != -1:34                    target = self.driver.getTarget()35                    if not target.IsValid():36                        return37                    i = target.GetBreakpointAtIndex(self.getSelected()).id38                    self.showDetails[i] = not self.showDetails[i]39                    self.update()40        super(BreakWin, self).handleEvent(event)41 42    def toggleSelected(self):43        if self.getSelected() == -1:44            return45        target = self.driver.getTarget()46        if not target.IsValid():47            return48        bp = target.GetBreakpointAtIndex(self.getSelected())49        bp.SetEnabled(not bp.IsEnabled())50 51    def deleteSelected(self):52        if self.getSelected() == -1:53            return54        target = self.driver.getTarget()55        if not target.IsValid():56            return57        bp = target.GetBreakpointAtIndex(self.getSelected())58        target.BreakpointDelete(bp.id)59 60    def update(self):61        target = self.driver.getTarget()62        if not target.IsValid():63            self.win.erase()64            self.win.noutrefresh()65            return66        selected = self.getSelected()67        self.clearItems()68        for i in range(0, target.GetNumBreakpoints()):69            bp = target.GetBreakpointAtIndex(i)70            if bp.IsInternal():71                continue72            text = lldbutil.get_description(bp)73            # FIXME: Use an API for this, not parsing the description.74            match = re.search("SBBreakpoint: id = ([^,]+), (.*)", text)75            try:76                id = match.group(1)77                desc = match.group(2).strip()78                if bp.IsEnabled():79                    text = "%s: %s" % (id, desc)80                else:81                    text = "%s: (disabled) %s" % (id, desc)82            except ValueError as e:83                # bp unparsable84                pass85 86            if self.showDetails.setdefault(bp.id, False):87                for location in bp:88                    desc = lldbutil.get_description(89                        location, lldb.eDescriptionLevelFull90                    )91                    text += "\n  " + desc92            self.addItem(text)93        self.setSelected(selected)94