Change type of encoding argument to gdbpy_extract_lazy_string
authorTom Tromey <tom@tromey.com>
Sat, 12 Nov 2016 18:48:48 +0000 (11:48 -0700)
committerTom Tromey <tom@tromey.com>
Wed, 11 Jan 2017 02:13:55 +0000 (19:13 -0700)
This changes gdbpy_extract_lazy_string's "encoding" argument to be a
unique_xmalloc_ptr.  I chose this rather than std::string because it
can sometimes be NULL.

2017-01-10  Tom Tromey  <tom@tromey.com>

* python/py-prettyprint.c (print_string_repr, print_children):
Update.
* python/py-lazy-string.c (gdbpy_extract_lazy_string): Change type
of "encoding".
* varobj.c (varobj_value_get_print_value): Update.
* python/python-internal.h (gdbpy_extract_lazy_string): Update.

gdb/ChangeLog
gdb/python/py-lazy-string.c
gdb/python/py-prettyprint.c
gdb/python/python-internal.h
gdb/varobj.c

index 4cb6ac6..8eb4390 100644 (file)
@@ -1,5 +1,14 @@
 2017-01-10  Tom Tromey  <tom@tromey.com>
 
+       * python/py-prettyprint.c (print_string_repr, print_children):
+       Update.
+       * python/py-lazy-string.c (gdbpy_extract_lazy_string): Change type
+       of "encoding".
+       * varobj.c (varobj_value_get_print_value): Update.
+       * python/python-internal.h (gdbpy_extract_lazy_string): Update.
+
+2017-01-10  Tom Tromey  <tom@tromey.com>
+
        * varobj.c (varobj_get_display_hint)
        (dynamic_varobj_has_child_method, install_new_value_visualizer)
        (varobj_set_visualizer, free_variable): Use
index 14575bf..4af4566 100644 (file)
@@ -180,14 +180,13 @@ gdbpy_is_lazy_string (PyObject *result)
 }
 
 /* Extract the parameters from the lazy string object STRING.
-   ENCODING will either be set to NULL, or will be allocated with
-   xmalloc, in which case the callers is responsible for freeing
-   it.  */
+   ENCODING may be set to NULL, if no encoding is found.  */
 
 void
 gdbpy_extract_lazy_string (PyObject *string, CORE_ADDR *addr,
                           struct type **str_type,
-                          long *length, char **encoding)
+                          long *length,
+                          gdb::unique_xmalloc_ptr<char> *encoding)
 {
   lazy_string_object *lazy;
 
@@ -198,7 +197,7 @@ gdbpy_extract_lazy_string (PyObject *string, CORE_ADDR *addr,
   *addr = lazy->address;
   *str_type = lazy->type;
   *length = lazy->length;
-  *encoding = lazy->encoding ? xstrdup (lazy->encoding) : NULL;
+  encoding->reset (lazy->encoding ? xstrdup (lazy->encoding) : NULL);
 }
 
 \f
index a4bdf87..fb3d9b1 100644 (file)
@@ -301,15 +301,14 @@ print_string_repr (PyObject *printer, const char *hint,
          CORE_ADDR addr;
          long length;
          struct type *type;
-         char *encoding = NULL;
+         gdb::unique_xmalloc_ptr<char> encoding;
          struct value_print_options local_opts = *options;
 
-         make_cleanup (free_current_contents, &encoding);
          gdbpy_extract_lazy_string (py_str, &addr, &type,
                                     &length, &encoding);
 
          local_opts.addressprint = 0;
-         val_print_string (type, encoding, addr, (int) length,
+         val_print_string (type, encoding.get (), addr, (int) length,
                            stream, &local_opts);
        }
       else
@@ -610,14 +609,13 @@ print_children (PyObject *printer, const char *hint,
          CORE_ADDR addr;
          struct type *type;
          long length;
-         char *encoding = NULL;
+         gdb::unique_xmalloc_ptr<char> encoding;
          struct value_print_options local_opts = *options;
 
-         make_cleanup (free_current_contents, &encoding);
          gdbpy_extract_lazy_string (py_v, &addr, &type, &length, &encoding);
 
          local_opts.addressprint = 0;
-         val_print_string (type, encoding, addr, (int) length, stream,
+         val_print_string (type, encoding.get (), addr, (int) length, stream,
                            &local_opts);
        }
       else if (gdbpy_is_string (py_v))
index 41275bb..f231486 100644 (file)
@@ -583,7 +583,8 @@ gdb::unique_xmalloc_ptr<char> gdbpy_exception_to_string (PyObject *ptype,
 int gdbpy_is_lazy_string (PyObject *result);
 void gdbpy_extract_lazy_string (PyObject *string, CORE_ADDR *addr,
                                struct type **str_type,
-                               long *length, char **encoding);
+                               long *length,
+                               gdb::unique_xmalloc_ptr<char> *encoding);
 
 int gdbpy_is_value_object (PyObject *obj);
 
index 43acc31..d75c9b8 100644 (file)
@@ -2413,7 +2413,7 @@ varobj_value_get_print_value (struct value *value,
   struct value_print_options opts;
   struct type *type = NULL;
   long len = 0;
-  char *encoding = NULL;
+  gdb::unique_xmalloc_ptr<char> encoding;
   /* Initialize it just to avoid a GCC false warning.  */
   CORE_ADDR str_addr = 0;
   int string_print = 0;
@@ -2464,7 +2464,6 @@ varobj_value_get_print_value (struct value *value,
                    {
                      gdbpy_extract_lazy_string (output, &str_addr, &type,
                                                 &len, &encoding);
-                     make_cleanup (free_current_contents, &encoding);
                      string_print = 1;
                    }
                  else
@@ -2520,11 +2519,11 @@ varobj_value_get_print_value (struct value *value,
   /* If the THEVALUE has contents, it is a regular string.  */
   if (!thevalue.empty ())
     LA_PRINT_STRING (stb, type, (gdb_byte *) thevalue.c_str (),
-                    len, encoding, 0, &opts);
+                    len, encoding.get (), 0, &opts);
   else if (string_print)
     /* Otherwise, if string_print is set, and it is not a regular
        string, it is a lazy string.  */
-    val_print_string (type, encoding, str_addr, len, stb, &opts);
+    val_print_string (type, encoding.get (), str_addr, len, stb, &opts);
   else
     /* All other cases.  */
     common_val_print (value, stb, 0, &opts, current_language);