[RFA,11/11] Change captured_mi_execute_command to use scoped_restore

Message ID 20170912185736.20436-12-tom@tromey.com
State New, archived
Headers

Commit Message

Tom Tromey Sept. 12, 2017, 6:57 p.m. UTC
  Change captured_mi_execute_command to use a scoped_restore, removing a
cleanup.  The old code copied the current token, but I don't believe
that is necessary.

ChangeLog
2017-09-12  Tom Tromey  <tom@tromey.com>

	* mi/mi-main.c (captured_mi_execute_command): Use scope_restore.
---
 gdb/ChangeLog    | 4 ++++
 gdb/mi/mi-main.c | 9 +++------
 2 files changed, 7 insertions(+), 6 deletions(-)
  

Comments

Pedro Alves Sept. 28, 2017, 10:35 a.m. UTC | #1
On 09/12/2017 07:57 PM, Tom Tromey wrote:
> Change captured_mi_execute_command to use a scoped_restore, removing a
> cleanup.  The old code copied the current token, but I don't believe
> that is necessary.
> 

I tried to see if it was safe, and I think it is.  I wondered whether
the command to be executed could itself run an MI command with a token,
and whether that'd clobber the original token.  Like, e.g. (contrived):

 321-interpreter-exec mi "123-thread-info"

we currently get:

 123^done,threads=[]
 321^done
 (gdb)

Looks like that's OK because we create a separate parse object for each
of the commands.

> ChangeLog
> 2017-09-12  Tom Tromey  <tom@tromey.com>
> 
> 	* mi/mi-main.c (captured_mi_execute_command): Use scope_restore.

OK.

Thanks,
Pedro Alves
  

Patch

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee965c4..773f35d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,9 @@ 
 2017-09-12  Tom Tromey  <tom@tromey.com>
 
+	* mi/mi-main.c (captured_mi_execute_command): Use scope_restore.
+
+2017-09-12  Tom Tromey  <tom@tromey.com>
+
 	* mi/mi-cmd-info.c (mi_cmd_info_ada_exceptions): Update.
 	* ada-lang.h (struct ada_exc_info): Remove typedef.  Declare
 	operator< and operator==.
diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index 3d73446..3e5eca2 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -1870,20 +1870,19 @@  mi_cmd_remove_inferior (const char *command, char **argv, int argc)
    Return <0 for error; >=0 for ok.
 
    args->action will tell mi_execute_command what action
-   to perfrom after the given command has executed (display/suppress
+   to perform after the given command has executed (display/suppress
    prompt, display error).  */
 
 static void
 captured_mi_execute_command (struct ui_out *uiout, struct mi_parse *context)
 {
   struct mi_interp *mi = (struct mi_interp *) command_interp ();
-  struct cleanup *cleanup;
 
   if (do_timings)
     current_command_ts = context->cmd_start;
 
-  current_token = xstrdup (context->token);
-  cleanup = make_cleanup (free_current_contents, &current_token);
+  scoped_restore save_token = make_scoped_restore (&current_token,
+						   context->token);
 
   running_result_record_printed = 0;
   mi_proceeded = 0;
@@ -1959,8 +1958,6 @@  captured_mi_execute_command (struct ui_out *uiout, struct mi_parse *context)
 	break;
       }
     }
-
-  do_cleanups (cleanup);
 }
 
 /* Print a gdb exception to the MI output stream.  */