diff options
author | Gareth Parker <gareth@brainnwave.com> | 2019-07-05 16:09:08 +0100 |
---|---|---|
committer | Gareth Parker <gareth@brainnwave.com> | 2019-07-05 16:09:08 +0100 |
commit | 772866f703b987c4bfe71a13c644f2952b9b2bee (patch) | |
tree | 3191c0f3cf87a7917f8ca9dd9bb3f7ef15fa88db /python3 | |
parent | c7ae718e2d8e8c2d5af7e0ae4b8931ceb40a1d9f (diff) | |
download | vdebug-772866f703b987c4bfe71a13c644f2952b9b2bee.zip |
Adding the ability to change what stack is being shown in the watch window
Diffstat (limited to 'python3')
-rw-r--r-- | python3/vdebug/dbgp.py | 4 | ||||
-rw-r--r-- | python3/vdebug/debugger_interface.py | 3 | ||||
-rw-r--r-- | python3/vdebug/event.py | 48 | ||||
-rw-r--r-- | python3/vdebug/ui/vimui.py | 2 |
4 files changed, 53 insertions, 4 deletions
diff --git a/python3/vdebug/dbgp.py b/python3/vdebug/dbgp.py index 91d5912..dcf3ca5 100644 --- a/python3/vdebug/dbgp.py +++ b/python3/vdebug/dbgp.py @@ -341,10 +341,10 @@ class Api: """ return self.send_cmd('stack_get', '', StackGetResponse) - def context_get(self, context=0): + def context_get(self, context=0, stack=0): """Get the context variables. """ - return self.send_cmd('context_get', '-c %i' % int(context), + return self.send_cmd('context_get', '-c %i -d %i' % (int(context), int(stack)), ContextGetResponse) def context_names(self): diff --git a/python3/vdebug/debugger_interface.py b/python3/vdebug/debugger_interface.py index b154291..ec72ae3 100644 --- a/python3/vdebug/debugger_interface.py +++ b/python3/vdebug/debugger_interface.py @@ -22,6 +22,9 @@ class DebuggerInterface: self.session_handler.close() self.session_handler = None + def change_stack(self, args=None): + self.session_handler.dispatch_event("change_stack", args) + @staticmethod def reload_options(): util.Environment.reload() diff --git a/python3/vdebug/event.py b/python3/vdebug/event.py index 7463f9a..fa4dddf 100644 --- a/python3/vdebug/event.py +++ b/python3/vdebug/event.py @@ -116,6 +116,11 @@ class StackWindowLineSelectEvent(Event): line = self.ui.windows.stack().line_at(lineno - 1) if line.find(" @ ") == -1: return False + + stack_number_startpos = line.find("[") + 1 + stack_number_endpos = line[stack_number_startpos:].rfind("]") + 1 + stack_number = line[stack_number_startpos:stack_number_endpos] + filename_pos = line.find(" @ ") + 3 file_and_line = line[filename_pos:] line_pos = file_and_line.rfind(":") @@ -124,6 +129,8 @@ class StackWindowLineSelectEvent(Event): self.ui.sourcewin.set_file(file) self.ui.sourcewin.set_line(lineno) + self.dispatch("change_stack", stack_number) + class WatchWindowPropertyGetEvent(Event): @@ -217,7 +224,13 @@ class WatchWindowContextChangeEvent(Event): if context_id == -1: raise error.EventError("Could not resolve context name") - self.dispatch("get_context", context_id) + + self.ui.selected_context = context_id + + if self.ui.selected_stack is None: + self.dispatch("get_context", context_id) + else: + self.dispatch("change_stack", self.ui.selected_stack) return True @staticmethod @@ -547,6 +560,8 @@ class GetContextEvent(Event): self.session.cur_lineno), self.session.context_names, context_id) self.ui.windows.watch().accept_renderer(rend) + self.ui.selected_stack = None + self.ui.selected_context = context_id self.dispatch("trace_refresh") @@ -605,6 +620,34 @@ class DetachEvent(Event): self.session.detach() +class ChangeStackEvent(Event): + + def run(self, args): + if args is None or args == "": + args = "0" + + res = self.api.stack_get() + ids = list(map(lambda s: s.get('level'), res.get_stack())) + + if args not in ids: + print("The selected stack does not exist") + return + + stack = next(s for s in res.get_stack() if s.get('level') == args) + + context_id = self.ui.selected_context + name = self.session.context_names[context_id] + log.Log("Getting %s variables" % name) + context_res = self.api.context_get(context_id, args) + rend = vimui.ContextGetResponseRenderer( + context_res, "%s at %s:%s" % (name, str(util.FilePath(stack.get('filename')).as_local()), + stack.get('lineno')), + self.session.context_names, context_id) + self.ui.selected_stack = args + self.ui.windows.watch().accept_renderer(rend) + + self.dispatch("trace_refresh") + class Dispatcher: events = { "run": RunEvent, @@ -627,7 +670,8 @@ class Dispatcher: "remove_breakpoint": RemoveBreakpointEvent, "trace": TraceEvent, "trace_refresh": TraceRefreshEvent, - "detach": DetachEvent + "detach": DetachEvent, + "change_stack": ChangeStackEvent, } def __init__(self, session_handler): diff --git a/python3/vdebug/ui/vimui.py b/python3/vdebug/ui/vimui.py index d543ad5..9d41da1 100644 --- a/python3/vdebug/ui/vimui.py +++ b/python3/vdebug/ui/vimui.py @@ -103,6 +103,8 @@ class Ui(interface.Ui): self.tabnr = None self._last_error = None self.empty_buf_num = None + self.selected_stack = None + self.selected_context = 0 def mark_window_as_closed(self, name): self.windows.window(name).mark_as_closed() |