summaryrefslogtreecommitdiff
path: root/python3
diff options
context:
space:
mode:
authorGareth Parker <gareth@brainnwave.com>2019-07-04 16:35:20 +0100
committerGareth Parker <gareth@brainnwave.com>2019-07-04 16:35:20 +0100
commit3223b2aea1d80d5f568be5efd32023d12cbff3c5 (patch)
tree268cb04acce41f6658182ee79f848480f52064a5 /python3
parent26347a43d8386c1154e3f191e5d271cec595096c (diff)
downloadvdebug-3223b2aea1d80d5f568be5efd32023d12cbff3c5.zip
Adding a breakpoint status as well as as a tri-state breakpoint cycling
Diffstat (limited to 'python3')
-rw-r--r--python3/vdebug/breakpoint.py4
-rw-r--r--python3/vdebug/debugger_interface.py10
-rw-r--r--python3/vdebug/event.py122
3 files changed, 115 insertions, 21 deletions
diff --git a/python3/vdebug/breakpoint.py b/python3/vdebug/breakpoint.py
index 8db45fe..48b529d 100644
--- a/python3/vdebug/breakpoint.py
+++ b/python3/vdebug/breakpoint.py
@@ -91,6 +91,10 @@ class Store:
self.breakpoints = {}
def get_breakpoint_by_id(self, id):
+ id = str(id)
+ if id not in list(self.breakpoints.keys()):
+ return None
+
return self.breakpoints[id]
def find_breakpoint(self, file, line):
diff --git a/python3/vdebug/debugger_interface.py b/python3/vdebug/debugger_interface.py
index 484806d..b154291 100644
--- a/python3/vdebug/debugger_interface.py
+++ b/python3/vdebug/debugger_interface.py
@@ -114,6 +114,11 @@ class DebuggerInterface:
"""
self.session_handler.dispatch_event("set_breakpoint", args)
+ def cycle_breakpoint(self, args=None):
+ """Cycle a breakpoint between Enabled, Disabled and Removed
+ """
+ self.session_handler.dispatch_event("cycle_breakpoint", args)
+
def toggle_breakpoint(self, args=None):
"""Toggle a breakpoint, specified by args
"""
@@ -129,6 +134,11 @@ class DebuggerInterface:
"""
self.session_handler.dispatch_event("disable_breakpoint", args)
+ def breakpoint_status(self, args=None):
+ """Either gets the status of a breakpoint or changes it
+ """
+ self.session_handler.dispatch_event("breakpoint_status", args)
+
def remove_breakpoint(self, args=None):
"""Remove one or more breakpoints, specified by args.
"""
diff --git a/python3/vdebug/event.py b/python3/vdebug/event.py
index 7c9815c..7463f9a 100644
--- a/python3/vdebug/event.py
+++ b/python3/vdebug/event.py
@@ -401,37 +401,115 @@ class SetBreakpointEvent(Event):
self.session_handler.breakpoints().add_breakpoint(bp)
-class ToggleBreakpointEvent(Event):
+class BreakpointStatusEvent(Event):
+ def parseArgs(self, args):
+ if args is None:
+ args = ""
+ args = args.strip()
+
+ arg_parts = args.split(' ')
+ first_param = arg_parts.pop(0)
+ if first_param == "":
+ return { "id": None, "action": None }
+
+ if first_param in ("toggle", "enable", "disable"):
+ return { "id": None, "action": first_param }
+
+ if len(arg_parts) == 0:
+ return { "id": first_param , "action": None }
+
+ second_param = arg_parts.pop(0)
+ return { "id": first_param, "action": second_param }
+
+ def get_breakpoint(self, id):
+ if id is not None:
+ return self.session_handler.breakpoints().get_breakpoint_by_id(id)
+
+ """ Line breakpoint """
+ try:
+ file = self.ui.get_current_file()
+ line = self.ui.get_current_row()
+ id = self.session_handler.breakpoints().find_breakpoint(file, line)
+ if id is None:
+ return None
+
+ return self.session_handler.breakpoints().get_breakpoint_by_id(id)
+ except error.FilePathError:
+ raise error.BreakpointError('No file, cannot set breakpoint')
def run(self, args):
- bp = breakpoint.Breakpoint.parse(self.ui, args)
- if bp.type == "line":
- id = self.session_handler.breakpoints().find_breakpoint(
- bp.get_file(), bp.get_line())
- if id is not None:
- self.session_handler.breakpoints().toggle_breakpoint_by_id(id)
+ parsed_args = self.parseArgs(args)
+ id = parsed_args["id"]
+ action = parsed_args["action"]
+ bp = self.get_breakpoint(id)
+
+ if bp is None:
+ print("No breakpoint found")
+ return
+ if action is None:
+ print("enabled" if bp.enabled else "disabled")
+ return
+
+ if action == "enable":
+ return self.dispatch("enable_breakpoint", str(bp.id))
+
+ if action == "disable":
+ return self.dispatch("disable_breakpoint", str(bp.id))
-class EnableBreakpointEvent(Event):
+ if action == "toggle":
+ return self.dispatch("toggle_breakpoint", str(bp.id))
+
+
+class CycleBreakpointStatusEvent(BreakpointStatusEvent):
def run(self, args):
- bp = breakpoint.Breakpoint.parse(self.ui, args)
- if bp.type == "line":
- id = self.session_handler.breakpoints().find_breakpoint(
- bp.get_file(), bp.get_line())
- if id is not None:
- self.session_handler.breakpoints().enable_breakpoint_by_id(id)
+ parsed_args = self.parseArgs(args)
+ id = parsed_args["id"]
+ bp = self.get_breakpoint(id)
+
+ if bp is None:
+ self.dispatch("set_breakpoint", args)
+ return
+
+ if bp is not None:
+ if bp.enabled:
+ self.session_handler.breakpoints().disable_breakpoint_by_id(bp.id)
+ else:
+ self.session_handler.breakpoints().remove_breakpoint_by_id(bp.id)
-class DisableBreakpointEvent(Event):
+class ToggleBreakpointEvent(BreakpointStatusEvent):
def run(self, args):
- bp = breakpoint.Breakpoint.parse(self.ui, args)
- if bp.type == "line":
- id = self.session_handler.breakpoints().find_breakpoint(
- bp.get_file(), bp.get_line())
- if id is not None:
- self.session_handler.breakpoints().disable_breakpoint_by_id(id)
+ parsed_args = self.parseArgs(args)
+ id = parsed_args["id"]
+ bp = self.get_breakpoint(id)
+
+ if bp is not None and bp.type == "line":
+ self.session_handler.breakpoints().toggle_breakpoint_by_id(bp.id)
+
+
+class EnableBreakpointEvent(BreakpointStatusEvent):
+
+ def run(self, args):
+ parsed_args = self.parseArgs(args)
+ id = parsed_args["id"]
+ bp = self.get_breakpoint(id)
+
+ if bp is not None and bp.type == "line":
+ self.session_handler.breakpoints().enable_breakpoint_by_id(id)
+
+
+class DisableBreakpointEvent(BreakpointStatusEvent):
+
+ def run(self, args):
+ parsed_args = self.parseArgs(args)
+ id = parsed_args["id"]
+ bp = self.get_breakpoint(id)
+
+ if bp is not None and bp.type == "line":
+ self.session_handler.breakpoints().disable_breakpoint_by_id(id)
class RemoveBreakpointEvent(Event):
@@ -539,9 +617,11 @@ class Dispatcher:
"eval": EvalEvent,
"set_eval_expression": SetEvalExpressionEvent,
"set_breakpoint": SetBreakpointEvent,
+ "cycle_breakpoint": CycleBreakpointStatusEvent,
"toggle_breakpoint": ToggleBreakpointEvent,
"enable_breakpoint": EnableBreakpointEvent,
"disable_breakpoint": DisableBreakpointEvent,
+ "breakpoint_status": BreakpointStatusEvent,
"get_context": GetContextEvent,
"reload_keymappings": ReloadKeymappingsEvent,
"remove_breakpoint": RemoveBreakpointEvent,