blob: 7ecb78fd1032c3e5336fbf3141431afaf2628d77 [file] [log] [blame]
Daniel Maleae33c4ba2013-10-11 17:13:07 +00001##===-- breakwin.py ------------------------------------------*- Python -*-===##
2##
Kate Stoneb9c1b512016-09-06 20:57:50 +00003# The LLVM Compiler Infrastructure
Daniel Maleae33c4ba2013-10-11 17:13:07 +00004##
Kate Stoneb9c1b512016-09-06 20:57:50 +00005# This file is distributed under the University of Illinois Open Source
6# License. See LICENSE.TXT for details.
Daniel Maleae33c4ba2013-10-11 17:13:07 +00007##
8##===----------------------------------------------------------------------===##
9
Daniel Malea4c3261d2013-10-09 22:11:30 +000010import cui
11import curses
Kate Stoneb9c1b512016-09-06 20:57:50 +000012import lldb
13import lldbutil
Ben Langmuira084b332013-10-16 02:01:41 +000014import re
Daniel Malea4c3261d2013-10-09 22:11:30 +000015
Kate Stoneb9c1b512016-09-06 20:57:50 +000016
Ben Langmuirac209912013-10-16 02:00:21 +000017class BreakWin(cui.ListWin):
Daniel Malea4c3261d2013-10-09 22:11:30 +000018
Kate Stoneb9c1b512016-09-06 20:57:50 +000019 def __init__(self, driver, x, y, w, h):
20 super(BreakWin, self).__init__(x, y, w, h)
21 self.driver = driver
Daniel Malea4c3261d2013-10-09 22:11:30 +000022 self.update()
Kate Stoneb9c1b512016-09-06 20:57:50 +000023 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:
Ben Langmuira084b332013-10-16 02:01:41 +000046 return
Kate Stoneb9c1b512016-09-06 20:57:50 +000047 target = self.driver.getTarget()
48 if not target.IsValid():
49 return
50 bp = target.GetBreakpointAtIndex(self.getSelected())
51 bp.SetEnabled(not bp.IsEnabled())
Ben Langmuirac209912013-10-16 02:00:21 +000052
Kate Stoneb9c1b512016-09-06 20:57:50 +000053 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)
Ben Langmuira084b332013-10-16 02:01:41 +000061
Kate Stoneb9c1b512016-09-06 20:57:50 +000062 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
Daniel Malea4c3261d2013-10-09 22:11:30 +000087
Kate Stoneb9c1b512016-09-06 20:57:50 +000088 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)