This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFA 09/22] Remove make_cleanup_restore_current_ui


On 2016-09-27 00:08, Tom Tromey wrote:
--- a/gdb/top.h
+++ b/gdb/top.h
@@ -155,27 +155,52 @@ extern struct ui *current_ui;
 /* The list of all UIs.  */
 extern struct ui *ui_list;

-/* State for SWITCH_THRU_ALL_UIS.  Declared here because it is meant
-   to be created on the stack, but should be treated as opaque.  */
-struct switch_thru_all_uis
+/* State for SWITCH_THRU_ALL_UIS.  */
+class switch_thru_all_uis
 {
+public:
+
+  switch_thru_all_uis () : iter (nullptr), save_ui (&current_ui)

We are targetting C++98, aren't we? Or is it C++03? Either way, nullptr appeared in C++11, so I guess we can't use it.

The fact that your compiler (and mine) did not catch this begs the question, should we have one of -std=c++98/gnu++98/c++03/gnu++03 in our compilation flags, instead of relying of the compiler's default mode?

+  {
+    iter = ui_list;
+  }
+
+  ~switch_thru_all_uis ()
+  {
+  }
+
+  // If done iterating, return true; otherwise return false.
+  bool done () const
+  {
+    return iter == nullptr;
+  }
+
+  // Move to the next UI, setting current_ui if iteration is not yet
+  // complete.
+  void next ()
+  {
+    iter = iter->next;
+    if (iter != nullptr)
+      current_ui = iter;
+  }
+
+ private:
+
+  // No need for these.  They are intentionally not defined anywhere.
+  switch_thru_all_uis &operator= (const switch_thru_all_uis &);
+  switch_thru_all_uis (const switch_thru_all_uis &);
+
+  // Used to iterate through the UIs.
   struct ui *iter;
-  struct cleanup *old_chain;
-};

-/* Functions to drive SWITCH_THRU_ALL_UIS.  Though declared here by
-   necessity, these functions should not be used other than via the
-   SWITCH_THRU_ALL_UIS macro defined below.  */
-extern void switch_thru_all_uis_init (struct switch_thru_all_uis *state); -extern int switch_thru_all_uis_cond (struct switch_thru_all_uis *state); -extern void switch_thru_all_uis_next (struct switch_thru_all_uis *state);
+  // Save and restore current_ui.
+  scoped_restore<struct ui *> save_ui;
+};

   /* Traverse through all UI, and switch the current UI to the one
      being iterated.  */
 #define SWITCH_THRU_ALL_UIS(STATE)		\

You can remove STATE here. I am surprised the preprocessor doesn't care about the missing argument in macro references.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]