diff options
author | Tom Tromey <tom@tromey.com> | 2018-03-07 15:55:01 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2018-03-08 21:57:14 -0700 |
commit | fdf07f3aeba5906fec462fba33801c173862f241 (patch) | |
tree | fd68e3d0ab16ad5ce80e87f998f4f5db71d8d845 /gdb/gdbthread.h | |
parent | 0089daceaba4338046932e65a1b5882065416633 (diff) | |
download | gdb-fdf07f3aeba5906fec462fba33801c173862f241.zip gdb-fdf07f3aeba5906fec462fba33801c173862f241.tar.gz gdb-fdf07f3aeba5906fec462fba33801c173862f241.tar.bz2 |
Change enable_thread_stack_temporaries to an RAII class
This started as a patch to change enable_thread_stack_temporaries to
be an RAII class, but then I noticed that this code used a VEC, so I
went ahead and did a bit more C++-ification, changing
stack_temporaries_enabled to a bool and changing stack_temporaries to
a std::vector.
Regression tested by the buildbot.
gdb/ChangeLog
2018-03-08 Tom Tromey <tom@tromey.com>
* infcall.c (struct call_return_meta_info)
<stack_temporaries_enabled>: Remove.
(get_call_return_value, call_function_by_hand_dummy): Update.
* thread.c (disable_thread_stack_temporaries): Remove.
(enable_thread_stack_temporaries): Remove.
(thread_stack_temporaries_enabled_p): Return bool.
(push_thread_stack_temporary, value_in_thread_stack_temporaries)
(get_last_thread_stack_temporary): Update.
* eval.c (evaluate_subexp): Update.
* gdbthread.h (class enable_thread_stack_temporaries): Now a
class, not a function.
(value_ptr, value_vec): Remove typedefs.
(class thread_info) <stack_temporaries_enabled>: Now bool.
<stack_temporaries>: Now a std::vector.
(thread_stack_temporaries_enabled_p)
(value_in_thread_stack_temporaries): Return bool.
Diffstat (limited to 'gdb/gdbthread.h')
-rw-r--r-- | gdb/gdbthread.h | 47 |
1 files changed, 38 insertions, 9 deletions
diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h index cffdfb9..9b468db 100644 --- a/gdb/gdbthread.h +++ b/gdb/gdbthread.h @@ -175,10 +175,6 @@ struct thread_suspend_state CORE_ADDR stop_pc; }; -typedef struct value *value_ptr; -DEF_VEC_P (value_ptr); -typedef VEC (value_ptr) value_vec; - /* Base class for target-specific thread data. */ struct private_thread_info { @@ -358,11 +354,11 @@ public: /* Flag which indicates that the stack temporaries should be stored while evaluating expressions. */ - int stack_temporaries_enabled = 0; + bool stack_temporaries_enabled = false; /* Values that are stored as temporaries on stack while evaluating expressions. */ - value_vec *stack_temporaries = NULL; + std::vector<struct value *> stack_temporaries; /* Step-over chain. A thread is in the step-over queue if these are non-NULL. If only a single thread is in the chain, then these @@ -634,15 +630,48 @@ extern void delete_exited_threads (void); int pc_in_thread_step_range (CORE_ADDR pc, struct thread_info *thread); -extern struct cleanup *enable_thread_stack_temporaries (ptid_t ptid); +/* Enable storing stack temporaries for thread with id PTID and + disable and clear the stack temporaries on destruction. */ + +class enable_thread_stack_temporaries +{ +public: + + explicit enable_thread_stack_temporaries (ptid_t ptid) + : m_ptid (ptid) + { + struct thread_info *tp = find_thread_ptid (ptid); + + gdb_assert (tp != NULL); + tp->stack_temporaries_enabled = true; + tp->stack_temporaries.clear (); + } + + ~enable_thread_stack_temporaries () + { + struct thread_info *tp = find_thread_ptid (m_ptid); + + if (tp != NULL) + { + tp->stack_temporaries_enabled = false; + tp->stack_temporaries.clear (); + } + } + + DISABLE_COPY_AND_ASSIGN (enable_thread_stack_temporaries); + +private: + + ptid_t m_ptid; +}; -extern int thread_stack_temporaries_enabled_p (ptid_t ptid); +extern bool thread_stack_temporaries_enabled_p (ptid_t ptid); extern void push_thread_stack_temporary (ptid_t ptid, struct value *v); extern struct value *get_last_thread_stack_temporary (ptid_t); -extern int value_in_thread_stack_temporaries (struct value *, ptid_t); +extern bool value_in_thread_stack_temporaries (struct value *, ptid_t); /* Add TP to the end of its inferior's pending step-over chain. */ |