[RFA,1/2] Remove cleanups from gdb_readline_wrapper

Message ID 20180323033843.29577-2-tom@tromey.com
State New
Headers show
Series
  • two simple cleanup removals
Related show

Commit Message

Tom Tromey March 23, 2018, 3:38 a.m.
This removes some cleanups from gdb_readline_wrapper by changing the
existing gdb_readline_wrapper_cleanup struct to have a constructor and
destructor, and then changing gdb_readline_wrapper to simply
instantiate it on the stack.

gdb/ChangeLog
2018-03-22  Tom Tromey  <tom@tromey.com>

	* top.c (struct gdb_readline_wrapper_cleanup): Add constructor,
	destructor.
	(gdb_readline_wrapper_cleanup): Remove function.
	(gdb_readline_wrapper): Remove cleanups.
---
 gdb/ChangeLog |  7 +++++
 gdb/top.c     | 91 ++++++++++++++++++++++++++---------------------------------
 2 files changed, 47 insertions(+), 51 deletions(-)

-- 
2.13.6

Comments

Pedro Alves March 24, 2018, 11:19 a.m. | #1
Hi Tom,

On 03/23/2018 03:38 AM, Tom Tromey wrote:

>  char *

>  gdb_readline_wrapper (const char *prompt)

>  {

>    struct ui *ui = current_ui;

> -  struct cleanup *back_to;

> -  struct gdb_readline_wrapper_cleanup *cleanup;

> -  char *retval;

> -

> -  cleanup = XNEW (struct gdb_readline_wrapper_cleanup);

> -  cleanup->handler_orig = ui->input_handler;

> -  ui->input_handler = gdb_readline_wrapper_line;

> -

> -  if (ui->command_editing)

> -    cleanup->already_prompted_orig = rl_already_prompted;

> -  else

> -    cleanup->already_prompted_orig = 0;

> -

> -  cleanup->target_is_async_orig = target_is_async_p ();

>  

> -  ui->secondary_prompt_depth++;

> -  back_to = make_cleanup (gdb_readline_wrapper_cleanup, cleanup);

> +  gdb_readline_wrapper_cleanup cleanup (ui);

>  

>    /* Processing events may change the current UI.  */

>    scoped_restore save_ui = make_scoped_restore (&current_ui);

>  

> -  if (cleanup->target_is_async_orig)

> +  if (cleanup.target_is_async_orig)

>      target_async (0);


I think we can move these to the ctor too, and then all the fields
of the structure can be made private.  Something like the patch
below.  (Tested on x86-64 GNU/Linux.)

While at it, since we're touching most of the structure, we might as
well reindent it to have open { at column 0.  (Not done below to keep
the patch readable.)

WDYT?

From a98b9bc98522351f757e3835b22bdfa9ecf2f997 Mon Sep 17 00:00:00 2001
From: Pedro Alves <palves@redhat.com>

Date: Sat, 24 Mar 2018 10:55:31 +0000
Subject: [PATCH] gdb_readline_wrapper_cleanup

---
 gdb/top.c | 50 +++++++++++++++++++++++++++-----------------------
 1 file changed, 27 insertions(+), 23 deletions(-)

diff --git a/gdb/top.c b/gdb/top.c
index 02d23cca667..523530ffbae 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -917,15 +917,21 @@ gdb_readline_wrapper_line (char *line)
     gdb_rl_callback_handler_remove ();
 }
 
-struct gdb_readline_wrapper_cleanup
+class gdb_readline_wrapper_cleanup
   {
-    explicit gdb_readline_wrapper_cleanup (struct ui *ui)
-      : handler_orig (ui->input_handler),
-	already_prompted_orig (ui->command_editing ? rl_already_prompted : 0),
-	target_is_async_orig (target_is_async_p ())
+  public:
+    explicit gdb_readline_wrapper_cleanup ()
+      : m_handler_orig (current_ui->input_handler),
+	m_already_prompted_orig (current_ui->command_editing
+				 ? rl_already_prompted : 0),
+	m_target_is_async_orig (target_is_async_p ()),
+	m_save_ui (&current_ui)
     {
-      ui->input_handler = gdb_readline_wrapper_line;
-      ui->secondary_prompt_depth++;
+      current_ui->input_handler = gdb_readline_wrapper_line;
+      current_ui->secondary_prompt_depth++;
+
+      if (m_target_is_async_orig)
+	target_async (0);
     }
 
     ~gdb_readline_wrapper_cleanup ()
@@ -933,10 +939,10 @@ struct gdb_readline_wrapper_cleanup
       struct ui *ui = current_ui;
 
       if (ui->command_editing)
-	rl_already_prompted = already_prompted_orig;
+	rl_already_prompted = m_already_prompted_orig;
 
       gdb_assert (ui->input_handler == gdb_readline_wrapper_line);
-      ui->input_handler = handler_orig;
+      ui->input_handler = m_handler_orig;
 
       /* Don't restore our input handler in readline yet.  That would make
 	 readline prep the terminal (putting it in raw mode), while the
@@ -953,38 +959,36 @@ struct gdb_readline_wrapper_cleanup
       after_char_processing_hook = saved_after_char_processing_hook;
       saved_after_char_processing_hook = NULL;
 
-      if (target_is_async_orig)
+      if (m_target_is_async_orig)
 	target_async (1);
     }
 
     DISABLE_COPY_AND_ASSIGN (gdb_readline_wrapper_cleanup);
 
-    void (*handler_orig) (char *);
-    int already_prompted_orig;
+  private:
+    void (*m_handler_orig) (char *);
+    int m_already_prompted_orig;
 
     /* Whether the target was async.  */
-    int target_is_async_orig;
+    bool m_target_is_async_orig;
+
+    /* Processing events may change the current UI.  */
+    scoped_restore_tmpl<struct ui *> m_save_ui;
   };
 
 char *
 gdb_readline_wrapper (const char *prompt)
 {
-  struct ui *ui = current_ui;
-
-  gdb_readline_wrapper_cleanup cleanup (ui);
-
-  /* Processing events may change the current UI.  */
-  scoped_restore save_ui = make_scoped_restore (&current_ui);
-
-  if (cleanup.target_is_async_orig)
-    target_async (0);
+  /* This saves/restores global readline/gdb state around event
+     processing.  */
+  gdb_readline_wrapper_cleanup cleanup;
 
   /* Display our prompt and prevent double prompt display.  Don't pass
      down a NULL prompt, since that has special meaning for
      display_gdb_prompt -- it indicates a request to print the primary
      prompt, while we want a secondary prompt here.  */
   display_gdb_prompt (prompt != NULL ? prompt : "");
-  if (ui->command_editing)
+  if (current_ui->command_editing)
     rl_already_prompted = 1;
 
   if (after_char_processing_hook)
-- 
2.14.3
Tom Tromey March 25, 2018, 4:19 p.m. | #2
>>>>> "Pedro" == Pedro Alves <palves@redhat.com> writes:


Pedro> I think we can move these to the ctor too, and then all the fields
Pedro> of the structure can be made private.  Something like the patch
Pedro> below.  (Tested on x86-64 GNU/Linux.)

Seems like a good idea to me.

Pedro> While at it, since we're touching most of the structure, we might as
Pedro> well reindent it to have open { at column 0.  (Not done below to keep
Pedro> the patch readable.)

I added this and did the reindentation.
Also I removed the "explicit" from the constructor.

Tom

Patch

diff --git a/gdb/top.c b/gdb/top.c
index 14387b9f1a..02d23cca66 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -919,73 +919,64 @@  gdb_readline_wrapper_line (char *line)
 
 struct gdb_readline_wrapper_cleanup
   {
-    void (*handler_orig) (char *);
-    int already_prompted_orig;
+    explicit gdb_readline_wrapper_cleanup (struct ui *ui)
+      : handler_orig (ui->input_handler),
+	already_prompted_orig (ui->command_editing ? rl_already_prompted : 0),
+	target_is_async_orig (target_is_async_p ())
+    {
+      ui->input_handler = gdb_readline_wrapper_line;
+      ui->secondary_prompt_depth++;
+    }
 
-    /* Whether the target was async.  */
-    int target_is_async_orig;
-  };
+    ~gdb_readline_wrapper_cleanup ()
+    {
+      struct ui *ui = current_ui;
 
-static void
-gdb_readline_wrapper_cleanup (void *arg)
-{
-  struct ui *ui = current_ui;
-  struct gdb_readline_wrapper_cleanup *cleanup
-    = (struct gdb_readline_wrapper_cleanup *) arg;
+      if (ui->command_editing)
+	rl_already_prompted = already_prompted_orig;
 
-  if (ui->command_editing)
-    rl_already_prompted = cleanup->already_prompted_orig;
+      gdb_assert (ui->input_handler == gdb_readline_wrapper_line);
+      ui->input_handler = handler_orig;
 
-  gdb_assert (ui->input_handler == gdb_readline_wrapper_line);
-  ui->input_handler = cleanup->handler_orig;
+      /* Don't restore our input handler in readline yet.  That would make
+	 readline prep the terminal (putting it in raw mode), while the
+	 line we just read may trigger execution of a command that expects
+	 the terminal in the default cooked/canonical mode, such as e.g.,
+	 running Python's interactive online help utility.  See
+	 gdb_readline_wrapper_line for when we'll reinstall it.  */
 
-  /* Don't restore our input handler in readline yet.  That would make
-     readline prep the terminal (putting it in raw mode), while the
-     line we just read may trigger execution of a command that expects
-     the terminal in the default cooked/canonical mode, such as e.g.,
-     running Python's interactive online help utility.  See
-     gdb_readline_wrapper_line for when we'll reinstall it.  */
+      gdb_readline_wrapper_result = NULL;
+      gdb_readline_wrapper_done = 0;
+      ui->secondary_prompt_depth--;
+      gdb_assert (ui->secondary_prompt_depth >= 0);
 
-  gdb_readline_wrapper_result = NULL;
-  gdb_readline_wrapper_done = 0;
-  ui->secondary_prompt_depth--;
-  gdb_assert (ui->secondary_prompt_depth >= 0);
+      after_char_processing_hook = saved_after_char_processing_hook;
+      saved_after_char_processing_hook = NULL;
 
-  after_char_processing_hook = saved_after_char_processing_hook;
-  saved_after_char_processing_hook = NULL;
+      if (target_is_async_orig)
+	target_async (1);
+    }
 
-  if (cleanup->target_is_async_orig)
-    target_async (1);
+    DISABLE_COPY_AND_ASSIGN (gdb_readline_wrapper_cleanup);
 
-  xfree (cleanup);
-}
+    void (*handler_orig) (char *);
+    int already_prompted_orig;
+
+    /* Whether the target was async.  */
+    int target_is_async_orig;
+  };
 
 char *
 gdb_readline_wrapper (const char *prompt)
 {
   struct ui *ui = current_ui;
-  struct cleanup *back_to;
-  struct gdb_readline_wrapper_cleanup *cleanup;
-  char *retval;
-
-  cleanup = XNEW (struct gdb_readline_wrapper_cleanup);
-  cleanup->handler_orig = ui->input_handler;
-  ui->input_handler = gdb_readline_wrapper_line;
-
-  if (ui->command_editing)
-    cleanup->already_prompted_orig = rl_already_prompted;
-  else
-    cleanup->already_prompted_orig = 0;
-
-  cleanup->target_is_async_orig = target_is_async_p ();
 
-  ui->secondary_prompt_depth++;
-  back_to = make_cleanup (gdb_readline_wrapper_cleanup, cleanup);
+  gdb_readline_wrapper_cleanup cleanup (ui);
 
   /* Processing events may change the current UI.  */
   scoped_restore save_ui = make_scoped_restore (&current_ui);
 
-  if (cleanup->target_is_async_orig)
+  if (cleanup.target_is_async_orig)
     target_async (0);
 
   /* Display our prompt and prevent double prompt display.  Don't pass
@@ -1004,9 +995,7 @@  gdb_readline_wrapper (const char *prompt)
     if (gdb_readline_wrapper_done)
       break;
 
-  retval = gdb_readline_wrapper_result;
-  do_cleanups (back_to);
-  return retval;
+  return gdb_readline_wrapper_result;
 }