2010-01-13 Phil Muldoon <pmuldoon@redhat.com>

PR python/10705

	* python/python-internal.h: Add lazy_string_object_type
	definition.
	(create_lazy_string_object, gdbpy_initialize_lazy_string)
	(gdbpy_is_lazystring, gdbpy_extract_lazy_string): Define.
	* python/py-value.c (valpy_lazy_string): New function.
	(convert_value_from_python): Add lazy string conversion.
	* python/py-prettyprint.c (pretty_print_one_value): Check if
	return is also a lazy string.
	(print_string_repr): Add lazy string printing branch.
	(print_children): Likewise.
	* python/py-lazy-string.c: New file. Implement lazy strings.
	* python/python.c (_initialize_python): Call
	gdbpy_initialize_lazy_string.
	* varobj.c (value_get_print_value): Add lazy string printing
	branch.  Account for encoding.
	* c-lang.c (c_printstr): Account for new encoding argument.  If
	encoding is NULL, find encoding suited for type, otherwise use
	user encoding.
	* language.h (language_defn): Add encoding argument.
	(LA_PRINT_STRING): Likewise.
	* language.c (unk_lang_printstr): Update to reflect new encoding
	argument to language_defn.
	* ada-lang.h (ada_printstr): Likewise.
	* c-lang.h (c_printstr): Likewise.
	* p-lang.h (pascal_printstr);
	* f-lang.c (f_printstr): Likewise.
	* m2-lang.c (m2_printstr): Likewise.
	* objc-lang.c (objc_printstr): Likewise.
	* p-lang.c (pascal_printstr): Likewise.
	* scm-lang.c (scm_printstr): Likewise.
	* c-valprint.c (c_val_print): Update LA_PRINT_STRING call for
	encoding argument.
	* ada-valprint.c (ada_printstr): Likewise.
	* f-valprint.c (f_val_print): Likewise
	* m2-valprint.c (m2_val_print): Likewise.
	* p-valprint.c (pascal_val_print): Likewise.
	* expprint.c (print_subexp_standard): Likewise.
	* valprint.c (val_print_string): Likewise.
	* Makefile.in (SUBDIR_PYTHON_OBS): Add py-lazy-string.
	(SUBDIR_PYTHON_SRCS): Likewise.
	(py-lazy-string.o): New rule.

2010-01-13  Phil Muldoon  <pmuldoon@redhat.com>

	* gdb.texinfo (Values From Inferior): Document lazy_string value
	method.
	(Python API): Add Lazy strings menu item.
	(Lazy Strings In Python): New node.

2010-01-13  Phil Muldoon  <pmuldoon@redhat.com>

	* gdb.python/py-value.exp (test_lazy_strings): Add lazy string test.
	* gdb.python/py-prettyprint.py (pp_ls): New printer.
	* gdb.python/py-prettyprint.exp (run_lang_tests): Add lazy string
	test.
	* gdb.python/py-prettyprint.c: Define lazystring test structure.
	* gdb.python/py-mi.exp: Add lazy string test.
This commit is contained in:
Phil Muldoon 2010-01-14 08:03:37 +00:00
parent 009f105539
commit be759fcf73
35 changed files with 647 additions and 51 deletions

View file

@ -121,6 +121,8 @@ find_pretty_printer (PyObject *value)
return function;
}
/* Pretty-print a single value, via the printer object PRINTER.
If the function returns a string, a PyObject containing the string
is returned. Otherwise, if the function returns a value,
@ -138,7 +140,7 @@ pretty_print_one_value (PyObject *printer, struct value **out_value)
result = PyObject_CallMethodObjArgs (printer, gdbpy_to_string_cst, NULL);
if (result)
{
if (! gdbpy_is_string (result))
if (! gdbpy_is_string (result) && ! gdbpy_is_lazy_string (result))
{
*out_value = convert_value_from_python (result);
if (PyErr_Occurred ())
@ -191,21 +193,47 @@ print_string_repr (PyObject *printer, const char *hint,
py_str = pretty_print_one_value (printer, &replacement);
if (py_str)
{
PyObject *string = python_string_to_target_python_string (py_str);
if (string)
gdb_byte *output = NULL;
long length;
struct type *type;
char *encoding = NULL;
PyObject *string = NULL;
int is_lazy;
is_lazy = gdbpy_is_lazy_string (py_str);
if (is_lazy)
output = gdbpy_extract_lazy_string (py_str, &type, &length, &encoding);
else
{
gdb_byte *output = PyString_AsString (string);
int len = PyString_Size (string);
string = python_string_to_target_python_string (py_str);
if (string)
{
output = PyString_AsString (string);
length = PyString_Size (string);
type = builtin_type (gdbarch)->builtin_char;
}
else
gdbpy_print_stack ();
if (hint && !strcmp (hint, "string"))
LA_PRINT_STRING (stream, builtin_type (gdbarch)->builtin_char,
output, len, 0, options);
}
if (output)
{
if (is_lazy || (hint && !strcmp (hint, "string")))
LA_PRINT_STRING (stream, type, output, length, encoding,
0, options);
else
fputs_filtered (output, stream);
Py_DECREF (string);
}
else
gdbpy_print_stack ();
if (string)
Py_DECREF (string);
else
xfree (output);
xfree (encoding);
Py_DECREF (py_str);
}
else if (replacement)
@ -422,15 +450,30 @@ print_children (PyObject *printer, const char *hint,
fputs_filtered (" = ", stream);
}
if (gdbpy_is_string (py_v))
if (gdbpy_is_lazy_string (py_v) || gdbpy_is_string (py_v))
{
char *text = python_string_to_host_string (py_v);
if (! text)
gdbpy_print_stack ();
gdb_byte *output = NULL;
if (gdbpy_is_lazy_string (py_v))
{
struct type *type;
long length;
char *encoding = NULL;
output = gdbpy_extract_lazy_string (py_v, &type,
&length, &encoding);
if (!output)
gdbpy_print_stack ();
LA_PRINT_STRING (stream, type, output, length, encoding,
0, options);
xfree (encoding);
xfree (output);
}
else
{
fputs_filtered (text, stream);
xfree (text);
output = python_string_to_host_string (py_v);
fputs_filtered (output, stream);
xfree (output);
}
}
else