Simpify varobj children handling for C++

Vladimir Prus ghost@cs.msu.su
Wed Jan 24 11:11:00 GMT 2007


Daniel Jacobowitz wrote:

> On Wed, Jan 17, 2007 at 09:55:53PM +0300, Vladimir Prus wrote:
>> >> @@ -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... :-)
>> 
>> Why? Because that's a bad idea or because varobj code does not
>> need to dereference rereferences? The latter is true,
>> attached version of the patch builds on the
>> "fix 'editable' attribute for references" patch I've posted earlier
>> and now 'adjust_value_for_child_access' asserts that the type
>> is not reference.
> 
> All I meant was that you added "is TYPE_CODE_PTR or is TYPE_CODE_PTR".
> I guess you meant to check TYPE_CODE_REF, but you must not have needed
> it if you didn't notice the typo.

Ah ;-)

>> +get_value_type (struct varobj *var)
>>  {
>>    struct type *type;
>>  
>> -  type = get_type (var);
>> +  if (var->value)
>> +    type = value_type (var->value);
>> +  else
>> +    type = var->type;
>>  
>> -  if (type)
>> -    {
>> -      if (TYPE_CODE (type) == TYPE_CODE_REF)
>> -    type = get_target_type (type);
>> -      if (TYPE_CODE (type) == TYPE_CODE_PTR)
>> -    type = get_target_type (type);
>> -    }
>> +  if (TYPE_CODE (type) == TYPE_CODE_REF)
>> +    type = get_target_type (type);
>> +
>> +  type = check_typedef (type);
>>  
>>    return type;
>>  }
> 
> I think that if you want to check for references, you need to call
> check_typedef first (I just checked that g++ does allow typedefs
> to reference types).  Otherwise this looks OK to commit.

The check_typedef added in "editable fix" patch, that's checked in.

The varobj children patch for C++ proper that I've just checked in as
well is attached.

> 
> It would be nice to have some tests for not stripping typedefs,
> if that's practical, but it's not really important.

It would be good, but writing comprehensive tests is not a quick task.
It's on my todo, but definitely not today.

- Volodya

 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: path_4_unify_cpp_as_committed.diff
Type: text/x-diff
Size: 16012 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/gdb-patches/attachments/20070124/f51fd410/attachment.bin>


More information about the Gdb-patches mailing list