Change type of encoding argument to gdbpy_extract_lazy_string

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.
This commit is contained in:
Tom Tromey
2016-11-12 11:48:48 -07:00
parent bde7b3e3a0
commit 1eba63835e
5 changed files with 22 additions and 16 deletions

View File

@@ -1,3 +1,12 @@
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> 2017-01-10 Tom Tromey <tom@tromey.com>
* varobj.c (varobj_get_display_hint) * varobj.c (varobj_get_display_hint)

View File

@@ -180,14 +180,13 @@ gdbpy_is_lazy_string (PyObject *result)
} }
/* Extract the parameters from the lazy string object STRING. /* Extract the parameters from the lazy string object STRING.
ENCODING will either be set to NULL, or will be allocated with ENCODING may be set to NULL, if no encoding is found. */
xmalloc, in which case the callers is responsible for freeing
it. */
void void
gdbpy_extract_lazy_string (PyObject *string, CORE_ADDR *addr, gdbpy_extract_lazy_string (PyObject *string, CORE_ADDR *addr,
struct type **str_type, struct type **str_type,
long *length, char **encoding) long *length,
gdb::unique_xmalloc_ptr<char> *encoding)
{ {
lazy_string_object *lazy; lazy_string_object *lazy;
@@ -198,7 +197,7 @@ gdbpy_extract_lazy_string (PyObject *string, CORE_ADDR *addr,
*addr = lazy->address; *addr = lazy->address;
*str_type = lazy->type; *str_type = lazy->type;
*length = lazy->length; *length = lazy->length;
*encoding = lazy->encoding ? xstrdup (lazy->encoding) : NULL; encoding->reset (lazy->encoding ? xstrdup (lazy->encoding) : NULL);
} }

View File

@@ -301,15 +301,14 @@ print_string_repr (PyObject *printer, const char *hint,
CORE_ADDR addr; CORE_ADDR addr;
long length; long length;
struct type *type; struct type *type;
char *encoding = NULL; gdb::unique_xmalloc_ptr<char> encoding;
struct value_print_options local_opts = *options; struct value_print_options local_opts = *options;
make_cleanup (free_current_contents, &encoding);
gdbpy_extract_lazy_string (py_str, &addr, &type, gdbpy_extract_lazy_string (py_str, &addr, &type,
&length, &encoding); &length, &encoding);
local_opts.addressprint = 0; local_opts.addressprint = 0;
val_print_string (type, encoding, addr, (int) length, val_print_string (type, encoding.get (), addr, (int) length,
stream, &local_opts); stream, &local_opts);
} }
else else
@@ -610,14 +609,13 @@ print_children (PyObject *printer, const char *hint,
CORE_ADDR addr; CORE_ADDR addr;
struct type *type; struct type *type;
long length; long length;
char *encoding = NULL; gdb::unique_xmalloc_ptr<char> encoding;
struct value_print_options local_opts = *options; struct value_print_options local_opts = *options;
make_cleanup (free_current_contents, &encoding);
gdbpy_extract_lazy_string (py_v, &addr, &type, &length, &encoding); gdbpy_extract_lazy_string (py_v, &addr, &type, &length, &encoding);
local_opts.addressprint = 0; 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); &local_opts);
} }
else if (gdbpy_is_string (py_v)) else if (gdbpy_is_string (py_v))

View File

@@ -583,7 +583,8 @@ gdb::unique_xmalloc_ptr<char> gdbpy_exception_to_string (PyObject *ptype,
int gdbpy_is_lazy_string (PyObject *result); int gdbpy_is_lazy_string (PyObject *result);
void gdbpy_extract_lazy_string (PyObject *string, CORE_ADDR *addr, void gdbpy_extract_lazy_string (PyObject *string, CORE_ADDR *addr,
struct type **str_type, struct type **str_type,
long *length, char **encoding); long *length,
gdb::unique_xmalloc_ptr<char> *encoding);
int gdbpy_is_value_object (PyObject *obj); int gdbpy_is_value_object (PyObject *obj);

View File

@@ -2413,7 +2413,7 @@ varobj_value_get_print_value (struct value *value,
struct value_print_options opts; struct value_print_options opts;
struct type *type = NULL; struct type *type = NULL;
long len = 0; long len = 0;
char *encoding = NULL; gdb::unique_xmalloc_ptr<char> encoding;
/* Initialize it just to avoid a GCC false warning. */ /* Initialize it just to avoid a GCC false warning. */
CORE_ADDR str_addr = 0; CORE_ADDR str_addr = 0;
int string_print = 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, gdbpy_extract_lazy_string (output, &str_addr, &type,
&len, &encoding); &len, &encoding);
make_cleanup (free_current_contents, &encoding);
string_print = 1; string_print = 1;
} }
else else
@@ -2520,11 +2519,11 @@ varobj_value_get_print_value (struct value *value,
/* If the THEVALUE has contents, it is a regular string. */ /* If the THEVALUE has contents, it is a regular string. */
if (!thevalue.empty ()) if (!thevalue.empty ())
LA_PRINT_STRING (stb, type, (gdb_byte *) thevalue.c_str (), LA_PRINT_STRING (stb, type, (gdb_byte *) thevalue.c_str (),
len, encoding, 0, &opts); len, encoding.get (), 0, &opts);
else if (string_print) else if (string_print)
/* Otherwise, if string_print is set, and it is not a regular /* Otherwise, if string_print is set, and it is not a regular
string, it is a lazy string. */ 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 else
/* All other cases. */ /* All other cases. */
common_val_print (value, stb, 0, &opts, current_language); common_val_print (value, stb, 0, &opts, current_language);