/* varobj support for C and C++.
- Copyright (C) 1999-2017 Free Software Foundation, Inc.
+ Copyright (C) 1999-2019 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
thing to do is to compare the child's name with ANONYMOUS_*_NAME. */
-int
+bool
varobj_is_anonymous_child (const struct varobj *child)
{
return (child->name == ANONYMOUS_STRUCT_NAME
to us, is already supposed to be
reference-stripped. */
- gdb_assert (TYPE_CODE (*type) != TYPE_CODE_REF);
+ gdb_assert (!TYPE_IS_REFERENCE (*type));
/* Pointers to structures are treated just like
structures when accessing children. Don't
- dererences pointers to other types. */
+ dereference pointers to other types. */
if (TYPE_CODE (*type) == TYPE_CODE_PTR)
{
struct type *target_type = get_target_type (*type);
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)
/* Is VAR a path expression parent, i.e., can it be used to construct
a valid path expression? */
-static int
+static bool
c_is_path_expr_parent (const struct varobj *var)
{
struct type *type;
/* "Fake" children are not path_expr parents. */
if (CPLUS_FAKE_CHILD (var))
- return 0;
+ return false;
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)
+ && TYPE_NAME (type) == NULL)
{
const struct varobj *parent = var->parent;
}
}
- return 0;
+ return false;
}
- return 1;
+ return true;
}
/* C */
gdb_assert (TYPE_CODE (type) == TYPE_CODE_STRUCT
|| TYPE_CODE (type) == TYPE_CODE_UNION);
- TRY
+ try
{
if (field_is_static (&TYPE_FIELD (type, type_index)))
result = value_static_field (type, type_index);
else
result = value_primitive_field (value, 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;
{
int real_index = index + TYPE_LOW_BOUND (TYPE_INDEX_TYPE (type));
- TRY
+ try
{
*cvalue = value_subscript (value, real_index);
}
- CATCH (except, RETURN_MASK_ERROR)
+ catch (const gdb_exception_error &except)
{
}
- END_CATCH
}
if (ctype)
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
struct type *type = get_type (var);
/* Strip top-level references. */
- while (TYPE_CODE (type) == TYPE_CODE_REF)
+ while (TYPE_IS_REFERENCE (type))
type = check_typedef (TYPE_TARGET_TYPE (type));
switch (TYPE_CODE (type))
}
else
{
- if (var->not_fetched && value_lazy (var->value))
+ if (var->not_fetched && value_lazy (var->value.get ()))
/* 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 (!value_lazy (var->value.get ()));
/* 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_CODE (var->type) == TYPE_CODE_REF
+ value = var->value.get ();
+ lookup_actual_type = (TYPE_IS_REFERENCE (var->type)
|| TYPE_CODE (var->type) == TYPE_CODE_PTR);
}
adjust_value_for_child_access (&value, &type, NULL, lookup_actual_type);
{
const struct varobj *parent = var->parent;
- value = parent->value;
- lookup_actual_type = (TYPE_CODE (parent->type) == TYPE_CODE_REF
+ value = parent->value.get ();
+ lookup_actual_type = (TYPE_IS_REFERENCE (parent->type)
|| TYPE_CODE (parent->type) == TYPE_CODE_PTR);
}
adjust_value_for_child_access (&value, &type, NULL, lookup_actual_type);
var = (CPLUS_FAKE_CHILD (parent)) ? parent->parent : parent;
if (opts.objectprint)
- lookup_actual_type = (TYPE_CODE (var->type) == TYPE_CODE_REF
+ lookup_actual_type = (TYPE_IS_REFERENCE (var->type)
|| TYPE_CODE (var->type) == TYPE_CODE_PTR);
- value = var->value;
+ value = var->value.get ();
type = varobj_get_value_type (var);
if (cfull_expression)
parent_expression
--type_index;
/* If the type is anonymous and the field has no name,
- set an appopriate name. */
+ set an appropriate name. */
field_name = TYPE_FIELD_NAME (type, type_index);
if (field_name == NULL || *field_name == '\0')
{
}
else
{
- char *access = NULL;
+ const char *access = NULL;
int children[3];
cplus_class_num_children (type, children);