summaryrefslogtreecommitdiff
path: root/python3
diff options
context:
space:
mode:
authorGareth Parker <gareth@brainnwave.com>2019-07-05 16:09:08 +0100
committerGareth Parker <gareth@brainnwave.com>2019-07-05 16:09:08 +0100
commit772866f703b987c4bfe71a13c644f2952b9b2bee (patch)
tree3191c0f3cf87a7917f8ca9dd9bb3f7ef15fa88db /python3
parentc7ae718e2d8e8c2d5af7e0ae4b8931ceb40a1d9f (diff)
downloadvdebug-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.py4
-rw-r--r--python3/vdebug/debugger_interface.py3
-rw-r--r--python3/vdebug/event.py48
-rw-r--r--python3/vdebug/ui/vimui.py2
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()