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