/* varobj support for C and C++.
- Copyright (C) 1999-2017 Free Software Foundation, Inc.
+ Copyright (C) 1999-2023 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#define ANONYMOUS_UNION_NAME _("<anonymous union>")
/* Does CHILD represent a child with no name? This happens when
- the child is an anonmous struct or union and it has no field name
+ the child is an anonymous struct or union and it has no field name
in its parent variable.
This has already been determined by *_describe_child. The easiest
/* Pointers to structures are treated just like
structures when accessing children. Don't
- dererences pointers to other types. */
- if (TYPE_CODE (*type) == TYPE_CODE_PTR)
+ dereference pointers to other types. */
+ if ((*type)->code () == TYPE_CODE_PTR)
{
struct type *target_type = get_target_type (*type);
- if (TYPE_CODE (target_type) == TYPE_CODE_STRUCT
- || TYPE_CODE (target_type) == TYPE_CODE_UNION)
+ if (target_type->code () == TYPE_CODE_STRUCT
+ || target_type->code () == TYPE_CODE_UNION)
{
if (value && *value)
{
- TRY
+ try
{
*value = value_ind (*value);
}
- CATCH (except, RETURN_MASK_ERROR)
+ catch (const gdb_exception_error &except)
{
*value = NULL;
}
- END_CATCH
}
*type = target_type;
if (was_ptr)
enclosing_type = value_actual_type (*value, 1, &real_type_found);
if (real_type_found)
- {
- *type = enclosing_type;
- *value = value_cast (enclosing_type, *value);
- }
+ {
+ *type = enclosing_type;
+ *value = value_cast (enclosing_type, *value);
+ }
}
}
type = varobj_get_gdb_type (var);
/* Anonymous unions and structs are also not path_expr parents. */
- if ((TYPE_CODE (type) == TYPE_CODE_STRUCT
- || TYPE_CODE (type) == TYPE_CODE_UNION)
- && TYPE_NAME (type) == NULL
- && TYPE_TAG_NAME (type) == NULL)
+ if ((type->code () == TYPE_CODE_STRUCT
+ || type->code () == TYPE_CODE_UNION)
+ && type->name () == NULL)
{
const struct varobj *parent = var->parent;
parent_type = varobj_get_value_type (parent);
adjust_value_for_child_access (NULL, &parent_type, &was_ptr, 0);
- if (TYPE_CODE (parent_type) == TYPE_CODE_STRUCT
- || TYPE_CODE (parent_type) == TYPE_CODE_UNION)
+ if (parent_type->code () == TYPE_CODE_STRUCT
+ || parent_type->code () == TYPE_CODE_UNION)
{
const char *field_name;
- gdb_assert (var->index < TYPE_NFIELDS (parent_type));
- field_name = TYPE_FIELD_NAME (parent_type, var->index);
+ gdb_assert (var->index < parent_type->num_fields ());
+ field_name = parent_type->field (var->index).name ();
return !(field_name == NULL || *field_name == '\0');
}
}
adjust_value_for_child_access (NULL, &type, NULL, 0);
target = get_target_type (type);
- switch (TYPE_CODE (type))
+ switch (type->code ())
{
case TYPE_CODE_ARRAY:
- if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (target) > 0
- && !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
- children = TYPE_LENGTH (type) / TYPE_LENGTH (target);
+ if (type->length () > 0 && target->length () > 0
+ && (type->bounds ()->high.kind () != PROP_UNDEFINED))
+ children = type->length () / target->length ();
else
/* If we don't know how many elements there are, don't display
any. */
case TYPE_CODE_STRUCT:
case TYPE_CODE_UNION:
- children = TYPE_NFIELDS (type);
+ children = type->num_fields ();
break;
case TYPE_CODE_PTR:
have one child, except for function ptrs, which have no children,
and except for void*, as we don't know what to show.
- We can show char* so we allow it to be dereferenced. If you decide
- to test for it, please mind that a little magic is necessary to
- properly identify it: char* has TYPE_CODE == TYPE_CODE_INT and
- TYPE_NAME == "char". */
- if (TYPE_CODE (target) == TYPE_CODE_FUNC
- || TYPE_CODE (target) == TYPE_CODE_VOID)
+ We can show char* so we allow it to be dereferenced. If you decide
+ to test for it, please mind that a little magic is necessary to
+ properly identify it: char* has TYPE_CODE == TYPE_CODE_INT and
+ TYPE_NAME == "char". */
+ if (target->code () == TYPE_CODE_FUNC
+ || target->code () == TYPE_CODE_VOID)
children = 0;
else
children = 1;
value_struct_element_index (struct value *value, int type_index)
{
struct value *result = NULL;
- struct type *type = value_type (value);
+ struct type *type = value->type ();
type = check_typedef (type);
- gdb_assert (TYPE_CODE (type) == TYPE_CODE_STRUCT
- || TYPE_CODE (type) == TYPE_CODE_UNION);
+ gdb_assert (type->code () == TYPE_CODE_STRUCT
+ || type->code () == TYPE_CODE_UNION);
- TRY
+ try
{
- if (field_is_static (&TYPE_FIELD (type, type_index)))
+ if (field_is_static (&type->field (type_index)))
result = value_static_field (type, type_index);
else
- result = value_primitive_field (value, 0, type_index, type);
+ result = value->primitive_field (0, type_index, type);
}
- CATCH (e, RETURN_MASK_ERROR)
+ catch (const gdb_exception_error &e)
{
return NULL;
}
- END_CATCH
return result;
}
std::string *cname, struct value **cvalue,
struct type **ctype, std::string *cfull_expression)
{
- struct value *value = parent->value;
+ struct value *value = parent->value.get ();
struct type *type = varobj_get_value_type (parent);
std::string parent_expression;
int was_ptr;
}
adjust_value_for_child_access (&value, &type, &was_ptr, 0);
- switch (TYPE_CODE (type))
+ switch (type->code ())
{
case TYPE_CODE_ARRAY:
if (cname)
- *cname = int_string (index
- + TYPE_LOW_BOUND (TYPE_INDEX_TYPE (type)),
+ *cname = int_string (index + type->bounds ()->low.const_val (),
10, 1, 0, 0);
if (cvalue && value)
{
- int real_index = index + TYPE_LOW_BOUND (TYPE_INDEX_TYPE (type));
+ int real_index
+ = index + type->bounds ()->low.const_val ();
- TRY
+ try
{
*cvalue = value_subscript (value, real_index);
}
- CATCH (except, RETURN_MASK_ERROR)
+ catch (const gdb_exception_error &except)
{
}
- END_CATCH
}
if (ctype)
*ctype = get_target_type (type);
if (cfull_expression)
- *cfull_expression =
- string_printf ("(%s)[%s]", parent_expression.c_str (),
- int_string (index
- + TYPE_LOW_BOUND (TYPE_INDEX_TYPE (type)),
- 10, 1, 0, 0));
-
+ *cfull_expression = string_printf
+ ("(%s)[%s]", parent_expression.c_str (),
+ int_string (index + type->bounds ()->low.const_val (),
+ 10, 1, 0, 0));
break;
/* If the type is anonymous and the field has no name,
set an appropriate name. */
- field_name = TYPE_FIELD_NAME (type, index);
+ field_name = type->field (index).name ();
if (field_name == NULL || *field_name == '\0')
{
if (cname)
{
- if (TYPE_CODE (TYPE_FIELD_TYPE (type, index))
+ if (type->field (index).type ()->code ()
== TYPE_CODE_STRUCT)
*cname = ANONYMOUS_STRUCT_NAME;
else
}
if (ctype)
- *ctype = TYPE_FIELD_TYPE (type, index);
+ *ctype = type->field (index).type ();
}
break;
if (cvalue && value)
{
- TRY
+ try
{
*cvalue = value_ind (value);
}
- CATCH (except, RETURN_MASK_ERROR)
+ catch (const gdb_exception_error &except)
{
*cvalue = NULL;
}
- END_CATCH
}
/* Don't use get_target_type because it calls
check_typedef and here, we want to show the true
declared type of the variable. */
if (ctype)
- *ctype = TYPE_TARGET_TYPE (type);
+ *ctype = type->target_type ();
if (cfull_expression)
*cfull_expression = string_printf ("*(%s)", parent_expression.c_str ());
/* Strip top-level references. */
while (TYPE_IS_REFERENCE (type))
- type = check_typedef (TYPE_TARGET_TYPE (type));
+ type = check_typedef (type->target_type ());
- switch (TYPE_CODE (type))
+ switch (type->code ())
{
case TYPE_CODE_STRUCT:
case TYPE_CODE_UNION:
}
else
{
- if (var->not_fetched && value_lazy (var->value))
+ if (var->not_fetched && var->value->lazy ())
/* Frozen variable and no value yet. We don't
implicitly fetch the value. MI response will
use empty string for the value, which is OK. */
return std::string ();
gdb_assert (varobj_value_is_changeable_p (var));
- gdb_assert (!value_lazy (var->value));
+ gdb_assert (!var->value->lazy ());
/* If the specified format is the current one,
we can reuse print_value. */
if (format == var->format)
return var->print_value;
else
- return varobj_value_get_print_value (var->value, format, var);
+ return varobj_value_get_print_value (var->value.get (), format,
+ var);
}
}
}
/* It is necessary to access a real type (via RTTI). */
if (opts.objectprint)
- {
- value = var->value;
- lookup_actual_type = (TYPE_IS_REFERENCE (var->type)
- || TYPE_CODE (var->type) == TYPE_CODE_PTR);
- }
+ {
+ value = var->value.get ();
+ lookup_actual_type = var->type->is_pointer_or_reference ();
+ }
adjust_value_for_child_access (&value, &type, NULL, lookup_actual_type);
- if (((TYPE_CODE (type)) == TYPE_CODE_STRUCT)
- || ((TYPE_CODE (type)) == TYPE_CODE_UNION))
+ if (((type->code ()) == TYPE_CODE_STRUCT)
+ || ((type->code ()) == TYPE_CODE_UNION))
{
int kids[3];
/* It is necessary to access a real type (via RTTI). */
if (opts.objectprint)
- {
+ {
const struct varobj *parent = var->parent;
- value = parent->value;
- lookup_actual_type = (TYPE_IS_REFERENCE (parent->type)
- || TYPE_CODE (parent->type) == TYPE_CODE_PTR);
- }
+ value = parent->value.get ();
+ lookup_actual_type = parent->type->is_pointer_or_reference ();
+ }
adjust_value_for_child_access (&value, &type, NULL, lookup_actual_type);
cplus_class_num_children (type, kids);
children[v_protected] = 0;
vptr_fieldno = get_vptr_fieldno (type, &basetype);
- for (i = TYPE_N_BASECLASSES (type); i < TYPE_NFIELDS (type); i++)
+ for (i = TYPE_N_BASECLASSES (type); i < type->num_fields (); i++)
{
/* If we have a virtual table pointer, omit it. Even if virtual
table pointers are not specifically marked in the debug info,
var = (CPLUS_FAKE_CHILD (parent)) ? parent->parent : parent;
if (opts.objectprint)
- lookup_actual_type = (TYPE_IS_REFERENCE (var->type)
- || TYPE_CODE (var->type) == TYPE_CODE_PTR);
- value = var->value;
+ lookup_actual_type = var->type->is_pointer_or_reference ();
+ value = var->value.get ();
type = varobj_get_value_type (var);
if (cfull_expression)
parent_expression
adjust_value_for_child_access (&value, &type, &was_ptr, lookup_actual_type);
- if (TYPE_CODE (type) == TYPE_CODE_STRUCT
- || TYPE_CODE (type) == TYPE_CODE_UNION)
+ if (type->code () == TYPE_CODE_STRUCT
+ || type->code () == TYPE_CODE_UNION)
{
const char *join = was_ptr ? "->" : ".";
--type_index;
/* If the type is anonymous and the field has no name,
- set an appopriate name. */
- field_name = TYPE_FIELD_NAME (type, type_index);
+ set an appropriate name. */
+ field_name = type->field (type_index).name ();
if (field_name == NULL || *field_name == '\0')
{
if (cname)
{
- if (TYPE_CODE (TYPE_FIELD_TYPE (type, type_index))
+ if (type->field (type_index).type ()->code ()
== TYPE_CODE_STRUCT)
*cname = ANONYMOUS_STRUCT_NAME;
- else if (TYPE_CODE (TYPE_FIELD_TYPE (type, type_index))
+ else if (type->field (type_index).type ()->code ()
== TYPE_CODE_UNION)
*cname = ANONYMOUS_UNION_NAME;
}
else
{
if (cname)
- *cname = TYPE_FIELD_NAME (type, type_index);
+ *cname = type->field (type_index).name ();
if (cfull_expression)
*cfull_expression
*cvalue = value_struct_element_index (value, type_index);
if (ctype)
- *ctype = TYPE_FIELD_TYPE (type, type_index);
+ *ctype = type->field (type_index).type ();
}
else if (index < TYPE_N_BASECLASSES (type))
{
/* This is a baseclass. */
if (cname)
- *cname = TYPE_FIELD_NAME (type, index);
+ *cname = type->field (index).name ();
if (cvalue && value)
- *cvalue = value_cast (TYPE_FIELD_TYPE (type, index), value);
+ *cvalue = value_cast (type->field (index).type (), value);
if (ctype)
{
- *ctype = TYPE_FIELD_TYPE (type, index);
+ *ctype = type->field (index).type ();
}
if (cfull_expression)
/* Cast the parent to the base' type. Note that in gdb,
expression like
- (Base1)d
+ (Base1)d
will create an lvalue, for all appearences, so we don't
need to use more fancy:
- *(Base1*)(&d)
+ *(Base1*)(&d)
construct.
When we are in the scope of the base class or of one
'class' keyword. See PR mi/11912 */
*cfull_expression = string_printf ("(%s(class %s%s) %s)",
ptr,
- TYPE_FIELD_NAME (type, index),
+ type->field (index).name (),
ptr,
parent_expression);
}