diff options
author | Gareth Parker <gareth@brainnwave.com> | 2019-07-04 16:35:20 +0100 |
---|---|---|
committer | Gareth Parker <gareth@brainnwave.com> | 2019-07-04 16:35:20 +0100 |
commit | 3223b2aea1d80d5f568be5efd32023d12cbff3c5 (patch) | |
tree | 268cb04acce41f6658182ee79f848480f52064a5 /python3 | |
parent | 26347a43d8386c1154e3f191e5d271cec595096c (diff) | |
download | vdebug-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.py | 4 | ||||
-rw-r--r-- | python3/vdebug/debugger_interface.py | 10 | ||||
-rw-r--r-- | python3/vdebug/event.py | 122 |
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, |