Re: Simpify varobj children handling for C++

Daniel Jacobowitz
2007-01-03T22:32:16Z

On Mon, Dec 25, 2006 at 11:16:15AM +0300, Vladimir Prus wrote:
> * value.c (value_as_address): Use coerce_array_proper
> instead of coerce_array so that not fail for references.
> (coerce_array_proper): New function.
> (coerce_array): Use the above.

I definitely need more information on this. What fails beforehand,
and how did you get there?

> @@ -950,7 +950,8 @@ value_ind (struct value *arg1)
> if (TYPE_CODE (base_type) == TYPE_CODE_INT)
> return value_at_lazy (builtin_type_int,
> (CORE_ADDR) value_as_long (arg1));
> - else if (TYPE_CODE (base_type) == TYPE_CODE_PTR)
> + else if (TYPE_CODE (base_type) == TYPE_CODE_PTR
> + || TYPE_CODE (base_type) == TYPE_CODE_PTR)
> {
> struct type *enc_type;
> /* We may be pointing to something embedded in a larger object */

Something tells me you didn't actually need value_ind to handle
references... :-)

> +/* Given a value and a type of a variable object,

"the value and the type of a variable object", because
the value is the property of some specific variable object.

> + adjust those value and type to those necessary

"adjust the"

> + for getting childrens of the variable object.

"children"

> + This includes dereferencing top-level reference
> + to all types and dereferencing pointers to
> + structures.

"references" to match "all types"

> +static void
> +adjust_value_for_children_access (struct value **value,
> + struct type **type)

"adjust_value_for_child_access", also.

> +{
> + gdb_assert (type && *type);
> +
> + *type = check_typedef (*type);
> +
> + /* If the parent is reference, we always strip the
> + reference when getting children, since in C++,
> + reference is basically undistinguishable in
> + usage from a plain variable. */

"is a reference", "in C++, a reference".

> + /* The 'get_target_type' function call check_typedef on

"calls"

> @@ -1876,6 +1886,10 @@ c_describe_child (struct varobj *parent,
> if (cvalue && value)
> gdb_value_ind (value, cvalue);
>
> + /* The get_target_type function calls check_typedef
> + on the result. I'm not sure if showing check_typedefed
> + type for the child as opposed to the declared type is
> + right. */
> if (ctype)
> *ctype = get_target_type (type);
>

It'd be nice if we didn't do that. We go to some effort to show
typedefs in the CLI for ptype.

> + /* This is baseclass. */

"is a"

--
Daniel Jacobowitz
CodeSourcery