reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
##===-- breakwin.py ------------------------------------------*- Python -*-===##
##
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
##
##===----------------------------------------------------------------------===##

import cui
import curses
import lldb
import 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)