mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-24 10:35:12 +08:00
* 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.
This commit is contained in:
parent
44a67aa79a
commit
6208b47d6c
@ -1,3 +1,13 @@
|
||||
2008-03-23 Vladimir Prus <vladimir@codesourcery.com>
|
||||
|
||||
* 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 <vladimir@codesourcery.com>
|
||||
|
||||
* varobj.c (struct varobj_root): Clarify
|
||||
|
@ -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) \
|
||||
|
@ -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 */
|
||||
|
@ -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)
|
||||
{
|
||||
|
19
gdb/varobj.c
19
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user