From 6208b47d6c2552d1dd81d85b8b8ce350ea9fd09e Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Sun, 23 Mar 2008 09:53:52 +0000 Subject: * thread.c (make_cleanup_restore_current_thread): Make it globally visible. * gdbthread.h (make_cleanup_restore_current_thread): Declare. * varobj.c (varobj_update): Don't save/restore frame. (c_value_of_root): Save/restore thread and frame here, using make_cleanup_restore_current_thread. * Makefile.in: Update dependecies. --- gdb/ChangeLog | 10 ++++++++++ gdb/Makefile.in | 3 ++- gdb/gdbthread.h | 4 ++++ gdb/thread.c | 4 +--- gdb/varobj.c | 19 ++++++++----------- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index acb7ff4..42c4ea0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,15 @@ 2008-03-23 Vladimir Prus + * thread.c (make_cleanup_restore_current_thread): Make it + globally visible. + * gdbthread.h (make_cleanup_restore_current_thread): Declare. + * varobj.c (varobj_update): Don't save/restore frame. + (c_value_of_root): Save/restore thread and frame here, + using make_cleanup_restore_current_thread. + * Makefile.in: Update dependecies. + +2008-03-23 Vladimir Prus + * varobj.c (struct varobj_root): Clarify comment on the frame field. (varobj_create): Don't set frame if we have no diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 6b63d79..72910d3 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -2940,7 +2940,8 @@ value.o: value.c $(defs_h) $(gdb_string_h) $(symtab_h) $(gdbtypes_h) \ $(gdb_assert_h) $(regcache_h) $(block_h) $(dfp_h) varobj.o: varobj.c $(defs_h) $(exceptions_h) $(value_h) $(expression_h) \ $(frame_h) $(language_h) $(wrapper_h) $(gdbcmd_h) $(block_h) \ - $(gdb_assert_h) $(gdb_string_h) $(varobj_h) $(vec_h) + $(gdb_assert_h) $(gdb_string_h) $(varobj_h) $(vec_h) $(gdbthread_h) \ + $(inferior_h) vaxbsd-nat.o: vaxbsd-nat.c $(defs_h) $(inferior_h) $(regcache_h) $(target_h) \ $(vax_tdep_h) $(inf_ptrace_h) $(bsd_kvm_h) vax-nat.o: vax-nat.c $(defs_h) $(inferior_h) $(gdb_assert_h) $(vax_tdep_h) \ diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h index f0568e0..e8bfde4 100644 --- a/gdb/gdbthread.h +++ b/gdb/gdbthread.h @@ -158,4 +158,8 @@ extern int print_thread_events; extern void print_thread_info (struct ui_out *uiout, int thread); +extern struct cleanup *make_cleanup_restore_current_thread (ptid_t, + struct frame_id); + + #endif /* GDBTHREAD_H */ diff --git a/gdb/thread.c b/gdb/thread.c index e2ec2cd..e9d6609 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -61,8 +61,6 @@ static void info_threads_command (char *, int); static void thread_apply_command (char *, int); static void restore_current_thread (ptid_t); static void prune_threads (void); -static struct cleanup *make_cleanup_restore_current_thread (ptid_t, - struct frame_id); void delete_step_resume_breakpoint (void *arg) @@ -570,7 +568,7 @@ do_restore_current_thread_cleanup (void *arg) xfree (old); } -static struct cleanup * +struct cleanup * make_cleanup_restore_current_thread (ptid_t inferior_ptid, struct frame_id a_frame_id) { diff --git a/gdb/varobj.c b/gdb/varobj.c index c5df325..3f08dfc 100644 --- a/gdb/varobj.c +++ b/gdb/varobj.c @@ -31,6 +31,8 @@ #include "varobj.h" #include "vec.h" +#include "gdbthread.h" +#include "inferior.h" /* Non-zero if we want to see trace of varobj level stuff. */ @@ -1111,7 +1113,6 @@ varobj_update (struct varobj **varp, struct varobj ***changelist, struct value *new; VEC (varobj_p) *stack = NULL; VEC (varobj_p) *result = NULL; - struct frame_id old_fid; struct frame_info *fi; /* sanity check: have we been passed a pointer? */ @@ -1130,10 +1131,6 @@ varobj_update (struct varobj **varp, struct varobj ***changelist, if ((*varp)->root->rootvar == *varp) { - /* Save the selected stack frame, since we will need to change it - in order to evaluate expressions. */ - old_fid = get_frame_id (deprecated_safe_get_selected_frame ()); - /* Update the root variable. value_of_root can return NULL if the variable is no longer around, i.e. we stepped out of the frame in which a local existed. We are letting the @@ -1141,11 +1138,6 @@ varobj_update (struct varobj **varp, struct varobj ***changelist, has changed. */ type_changed = 1; new = value_of_root (varp, &type_changed); - - /* Restore selected frame. */ - fi = frame_find_by_id (old_fid); - if (fi) - select_frame (fi); /* If this is a "use_selected_frame" varobj, and its type has changed, them note that it's changed. */ @@ -2153,12 +2145,15 @@ c_value_of_root (struct varobj **var_handle) struct varobj *var = *var_handle; struct frame_info *fi; int within_scope; - + struct cleanup *back_to; + /* Only root variables can be updated... */ if (!is_root_p (var)) /* Not a root var */ return NULL; + back_to = make_cleanup_restore_current_thread ( + inferior_ptid, get_frame_id (deprecated_safe_get_selected_frame ())); /* Determine whether the variable is still around. */ if (var->root->valid_block == NULL || var->root->use_selected_frame) @@ -2187,6 +2182,8 @@ c_value_of_root (struct varobj **var_handle) return new_val; } + do_cleanups (back_to); + return NULL; } -- cgit v1.1