Change gdbscm_exception_message_to_string to return a unique_xmalloc_ptr
authorTom Tromey <tom@tromey.com>
Sun, 27 May 2018 05:21:23 +0000 (23:21 -0600)
committerTom Tromey <tom@tromey.com>
Tue, 17 Jul 2018 19:21:47 +0000 (13:21 -0600)
This changes gdbscm_exception_message_to_string to return a
unique_xmalloc_ptr, allowing for the removal of some cleanups.
unique_xmalloc_ptr was chosen because at the root of the call chains
is a function from Guile that returns a malloc'd string.

gdb/ChangeLog
2018-07-17  Tom Tromey  <tom@tromey.com>

* guile/scm-param.c (pascm_signal_setshow_error): Update.
* guile/guile-internal.h (gdbscm_exception_message_to_string):
Update.
* guile/scm-cmd.c (cmdscm_function): Update.
* guile/scm-pretty-print.c
(ppscm_print_exception_unless_memory_error): Update.
* guile/scm-exception.c (gdbscm_exception_message_to_string):
Return unique_xmalloc_ptr.

gdb/ChangeLog
gdb/guile/guile-internal.h
gdb/guile/scm-cmd.c
gdb/guile/scm-exception.c
gdb/guile/scm-param.c
gdb/guile/scm-pretty-print.c

index 584ea6f0b719888d2959ca1708d4857d888542c2..1956f78b2be9e53979f33f3c4587a535d68aa549 100644 (file)
@@ -1,3 +1,14 @@
+2018-07-17  Tom Tromey  <tom@tromey.com>
+
+       * guile/scm-param.c (pascm_signal_setshow_error): Update.
+       * guile/guile-internal.h (gdbscm_exception_message_to_string):
+       Update.
+       * guile/scm-cmd.c (cmdscm_function): Update.
+       * guile/scm-pretty-print.c
+       (ppscm_print_exception_unless_memory_error): Update.
+       * guile/scm-exception.c (gdbscm_exception_message_to_string):
+       Return unique_xmalloc_ptr.
+
 2018-07-17  Tom Tromey  <tom@tromey.com>
 
        * guile/scm-pretty-print.c (ppscm_make_pp_type_error_exception):
index 6bce58e15018e838c9df352472d4e09366199832..20e2c70e160175aa5e4b49e818946f3e5e0f0edb 100644 (file)
@@ -362,7 +362,8 @@ extern void gdbscm_print_exception_with_stack (SCM port, SCM stack,
 
 extern void gdbscm_print_gdb_exception (SCM port, SCM exception);
 
-extern char *gdbscm_exception_message_to_string (SCM exception);
+extern gdb::unique_xmalloc_ptr<char> gdbscm_exception_message_to_string
+    (SCM exception);
 
 extern excp_matcher_func gdbscm_memory_error_p;
 
index 64243d1ba2e55f78b8c42164b39aad11babafd82..8bb46622a989ee002b3da4cca6b26ca3d3ebb181 100644 (file)
@@ -316,10 +316,10 @@ cmdscm_function (struct cmd_list_element *command,
         itself.  */
       if (gdbscm_user_error_p (gdbscm_exception_key (result)))
        {
-         char *msg = gdbscm_exception_message_to_string (result);
+         gdb::unique_xmalloc_ptr<char> msg
+           = gdbscm_exception_message_to_string (result);
 
-         make_cleanup (xfree, msg);
-         error ("%s", msg);
+         error ("%s", msg.get ());
        }
       else
        {
index e4b81a1fd182b35e422665384028480b4c370e9c..f0bcdcd49ef136641eca85a8f9dd5d6e75592861 100644 (file)
@@ -575,16 +575,13 @@ gdbscm_print_gdb_exception (SCM port, SCM exception)
 
 /* Return a string description of <gdb:exception> EXCEPTION.
    If EXCEPTION is a gdb:with-stack exception, unwrap it, a backtrace
-   is never returned as part of the result.
+   is never returned as part of the result.  */
 
-   Space for the result is malloc'd, the caller must free.  */
-
-char *
+gdb::unique_xmalloc_ptr<char>
 gdbscm_exception_message_to_string (SCM exception)
 {
   SCM port = scm_open_output_string ();
   SCM key, args;
-  char *result;
 
   gdb_assert (gdbscm_is_exception (exception));
 
@@ -601,9 +598,9 @@ gdbscm_exception_message_to_string (SCM exception)
     }
 
   gdbscm_print_exception_message (port, SCM_BOOL_F, key, args);
-  result = gdbscm_scm_to_c_string (scm_get_output_string (port));
+  gdb::unique_xmalloc_ptr<char> result
+    (gdbscm_scm_to_c_string (scm_get_output_string (port)));
   scm_close_port (port);
-
   return result;
 }
 
index d48f14e55c999cd7f79309c6bf59f8ab49051ba7..7ff4af950119b75d5bdb7920daf61081303e8961 100644 (file)
@@ -251,10 +251,10 @@ pascm_signal_setshow_error (SCM exception, const char *msg)
      itself.  */
   if (gdbscm_user_error_p (gdbscm_exception_key (exception)))
     {
-      char *excp_text = gdbscm_exception_message_to_string (exception);
+      gdb::unique_xmalloc_ptr<char> excp_text
+       = gdbscm_exception_message_to_string (exception);
 
-      make_cleanup (xfree, excp_text);
-      error ("%s", excp_text);
+      error ("%s", excp_text.get ());
     }
   else
     {
index 5e8a2a998d21e20d20ceb59eb56e8706f2c678e9..eea524b104b0de74fffd12235ee9d6aac8e36371 100644 (file)
@@ -614,25 +614,24 @@ ppscm_print_exception_unless_memory_error (SCM exception,
 {
   if (gdbscm_memory_error_p (gdbscm_exception_key (exception)))
     {
-      char *msg = gdbscm_exception_message_to_string (exception);
-      struct cleanup *cleanup = make_cleanup (xfree, msg);
+      gdb::unique_xmalloc_ptr<char> msg
+       = gdbscm_exception_message_to_string (exception);
 
       /* This "shouldn't happen", but play it safe.  */
-      if (msg == NULL || *msg == '\0')
+      if (msg == NULL || msg.get ()[0] == '\0')
        fprintf_filtered (stream, _("<error reading variable>"));
       else
        {
          /* Remove the trailing newline.  We could instead call a special
             routine for printing memory error messages, but this is easy
             enough for now.  */
-         size_t len = strlen (msg);
+         char *msg_text = msg.get ();
+         size_t len = strlen (msg_text);
 
-         if (msg[len - 1] == '\n')
-           msg[len - 1] = '\0';
-         fprintf_filtered (stream, _("<error reading variable: %s>"), msg);
+         if (msg_text[len - 1] == '\n')
+           msg_text[len - 1] = '\0';
+         fprintf_filtered (stream, _("<error reading variable: %s>"), msg_text);
        }
-
-      do_cleanups (cleanup);
     }
   else
     gdbscm_print_gdb_exception (SCM_BOOL_F, exception);