diff options
author | Ike Devolder <ike.devolder@gmail.com> | 2019-07-07 11:01:14 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-07 11:01:14 +0200 |
commit | 662be63ba06cad2253cba69a9011217b0f304c9a (patch) | |
tree | 558c08adf7aa598c2177c9d0e2a5f6d7f05041b9 /python3 | |
parent | e1d555bdcb675d7f4330736ed25a5b95f0481246 (diff) | |
parent | a9e84894fa97faea1958865b3496c8d709f19199 (diff) | |
download | vdebug-662be63ba06cad2253cba69a9011217b0f304c9a.zip |
Merge pull request #413 from Garethp/stack-changing
Adding the ability to change stacks
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 dc4c62c..0a8530d 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 abda356..a352234 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 @@ -566,6 +579,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") @@ -624,6 +639,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, @@ -646,7 +689,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() |