diff options
Diffstat (limited to 'utils/lui/breakwin.py')
| -rw-r--r-- | utils/lui/breakwin.py | 90 | 
1 files changed, 90 insertions, 0 deletions
| diff --git a/utils/lui/breakwin.py b/utils/lui/breakwin.py new file mode 100644 index 000000000000..734f5eddba42 --- /dev/null +++ b/utils/lui/breakwin.py @@ -0,0 +1,90 @@ +##===-- breakwin.py ------------------------------------------*- Python -*-===## +## +##                     The LLVM Compiler Infrastructure +## +## This file is distributed under the University of Illinois Open Source +## License. See LICENSE.TXT for details. +## +##===----------------------------------------------------------------------===## + +import cui +import curses +import lldb, lldbutil +import re + +class BreakWin(cui.ListWin): +  def __init__(self, driver, x, y, w, h): +    super(BreakWin, self).__init__(x, y, w, h) +    self.driver = driver +    self.update() +    self.showDetails = {} + +  def handleEvent(self, event): +    if isinstance(event, lldb.SBEvent): +      if lldb.SBBreakpoint.EventIsBreakpointEvent(event): +        self.update() +    if isinstance(event, int): +      if event == ord('d'): +        self.deleteSelected() +      if event == curses.ascii.NL or event == curses.ascii.SP: +        self.toggleSelected() +      elif event == curses.ascii.TAB: +        if self.getSelected() != -1: +          target = self.driver.getTarget() +          if not target.IsValid(): +            return +          i = target.GetBreakpointAtIndex(self.getSelected()).id +          self.showDetails[i] = not self.showDetails[i] +          self.update() +    super(BreakWin, self).handleEvent(event) + +  def toggleSelected(self): +    if self.getSelected() == -1: +      return +    target = self.driver.getTarget() +    if not target.IsValid(): +      return +    bp = target.GetBreakpointAtIndex(self.getSelected()) +    bp.SetEnabled(not bp.IsEnabled()) + +  def deleteSelected(self): +    if self.getSelected() == -1: +      return +    target = self.driver.getTarget() +    if not target.IsValid(): +      return +    bp = target.GetBreakpointAtIndex(self.getSelected()) +    target.BreakpointDelete(bp.id) + +  def update(self): +    target = self.driver.getTarget() +    if not target.IsValid(): +      self.win.erase() +      self.win.noutrefresh() +      return +    selected = self.getSelected() +    self.clearItems() +    for i in range(0, target.GetNumBreakpoints()): +      bp = target.GetBreakpointAtIndex(i) +      if bp.IsInternal(): +        continue +      text = lldbutil.get_description(bp) +      # FIXME: Use an API for this, not parsing the description. +      match = re.search('SBBreakpoint: id = ([^,]+), (.*)', text) +      try: +        id = match.group(1) +        desc = match.group(2).strip() +        if bp.IsEnabled(): +          text = '%s: %s' % (id, desc) +        else: +          text = '%s: (disabled) %s' % (id, desc) +      except ValueError as e: +        # bp unparsable +        pass + +      if self.showDetails.setdefault(bp.id, False): +        for location in bp: +          desc = lldbutil.get_description(location, lldb.eDescriptionLevelFull) +          text += '\n  ' + desc +      self.addItem(text) +    self.setSelected(selected) | 
