Fix usage of to_string() for pretty-printers with children
Commit Message
> On May 25, 2017, at 7:59 AM, Eli Zaretskii <eliz@gnu.org> wrote:
>
>> From: Peter Linss <peter@elemental.software>
>> Date: Wed, 24 May 2017 19:33:41 -0700
>>
>> diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
>> index 9fb70f6d2a..05e5b868ed 100644
>> --- a/gdb/doc/gdb.texinfo
>> +++ b/gdb/doc/gdb.texinfo
>> @@ -29444,8 +29444,9 @@ reliable for a dynamic varobj. Instead, you must examine the
>>
>> @item value
>> The varobj's scalar value. For a varobj whose type is some sort of
>> -aggregate (e.g., a @code{struct}), or for a dynamic varobj, this value
>> -will not be interesting.
>> +aggregate (e.g., a @code{struct}) this value will not be interesting.
> ^
> Please add back the comma removed here.
>
> The documentation part is approved with this gotcha fixed.
>
> Thanks.
Revised patch with comma restored (not sure if you want a new email thread for small patch revisions like this):
—
Comments
> From: Peter Linss <peter@elemental.software>
> Date: Thu, 25 May 2017 10:51:26 -0700
> Cc: gdb-patches@sourceware.org
>
> > Please add back the comma removed here.
> >
> > The documentation part is approved with this gotcha fixed.
> >
> > Thanks.
>
> Revised patch with comma restored (not sure if you want a new email thread for small patch revisions like this):
Thanks, this is OK. For the future, when I say "approved with that
fixed", there's no need to post the corrected patch, just be sure to
correct it before pushing.
@@ -29444,8 +29444,9 @@ reliable for a dynamic varobj. Instead, you must examine the
@item value
The varobj's scalar value. For a varobj whose type is some sort of
-aggregate (e.g., a @code{struct}), or for a dynamic varobj, this value
-will not be interesting.
+aggregate (e.g., a @code{struct}), this value will not be interesting.
+For a dynamic varobj, this value comes from the Python pretty-printer
+object's @code{to_string} method, if present. @xref{Pretty Printing API}.
@item type
The varobj's type. This is a string representation of the type, as
@@ -686,21 +686,6 @@ install_dynamic_child (struct varobj *var,
}
}
-#if HAVE_PYTHON
-
-static int
-dynamic_varobj_has_child_method (const struct varobj *var)
-{
- PyObject *printer = var->dynamic->pretty_printer;
-
- if (!gdb_python_initialized)
- return 0;
-
- gdbpy_enter_varobj enter_py (var);
- return PyObject_HasAttr (printer, gdbpy_children_cst);
-}
-#endif
-
/* A factory for creating dynamic varobj's iterators. Returns an
iterator object suitable for iterating over VAR's children. */
@@ -2420,11 +2405,6 @@ varobj_value_get_print_value (struct value *value,
if (value_formatter)
{
- /* First check to see if we have any children at all. If so,
- we simply return {...}. */
- if (dynamic_varobj_has_child_method (var))
- return "{...}";
-
if (PyObject_HasAttr (value_formatter, gdbpy_to_string_cst))
{
struct value *replacement;
@@ -2486,6 +2466,13 @@ varobj_value_get_print_value (struct value *value,
if (replacement)
value = replacement;
}
+ else
+ {
+ /* If we don't have to_string but we have children,
+ we simply return {...}. */
+ if (PyObject_HasAttr (value_formatter, gdbpy_children_cst))
+ return "{...}";
+ }
}
}
#endif