Use 'struct varobj_item' to represent name and value pair

Hi,
name and value pair is widely used in varobj.c.  This patch is to add
a new struct varobj_item to represent them, so that the number of
function arguments can be reduced.  Finally, the iteration is done on
'struct varobj_item' instead of PyObject after this patch series.

 V2:
 - Fix changelog entry.
 - Fix one grammatical mistake.

gdb:

2014-06-12  Yao Qi  <yao@codesourcery.com>

	* varobj.c (struct varobj_item): New structure.
	(create_child_with_value): Update declaration.
	(varobj_add_child): Replace arguments 'name' and 'value' with
	'item'.  All callers updated.
	(install_dynamic_child): Likewise.
	(update_dynamic_varobj_children): Likewise.
	(varobj_add_child): Likewise.
	(create_child_with_value): Likewise.
This commit is contained in:
Yao Qi 2013-09-10 08:58:23 +08:00
parent c151b1c645
commit 5a2e0d6e89
2 changed files with 51 additions and 25 deletions

View File

@ -1,3 +1,14 @@
2014-06-12 Yao Qi <yao@codesourcery.com>
* varobj.c (struct varobj_item): New structure.
(create_child_with_value): Update declaration.
(varobj_add_child): Replace arguments 'name' and 'value' with
'item'. All callers updated.
(install_dynamic_child): Likewise.
(update_dynamic_varobj_children): Likewise.
(varobj_add_child): Likewise.
(create_child_with_value): Likewise.
2014-06-11 Joel Brobecker <brobecker@adacore.com> 2014-06-11 Joel Brobecker <brobecker@adacore.com>
* NEWS: Create a new section for the next release branch. * NEWS: Create a new section for the next release branch.

View File

@ -108,6 +108,17 @@ struct varobj_root
struct varobj_root *next; struct varobj_root *next;
}; };
/* A node or item of varobj, composed of the name and the value. */
struct varobj_item
{
/* Name of this item. */
char *name;
/* Value of this item. */
struct value *value;
};
/* Dynamic part of varobj. */ /* Dynamic part of varobj. */
struct varobj_dynamic struct varobj_dynamic
@ -169,8 +180,8 @@ static void uninstall_variable (struct varobj *);
static struct varobj *create_child (struct varobj *, int, char *); static struct varobj *create_child (struct varobj *, int, char *);
static struct varobj * static struct varobj *
create_child_with_value (struct varobj *parent, int index, char *name, create_child_with_value (struct varobj *parent, int index,
struct value *value); struct varobj_item *item);
/* Utility routines */ /* Utility routines */
@ -214,8 +225,7 @@ static int is_root_p (struct varobj *var);
#if HAVE_PYTHON #if HAVE_PYTHON
static struct varobj *varobj_add_child (struct varobj *var, static struct varobj *varobj_add_child (struct varobj *var,
char *name, struct varobj_item *item);
struct value *value);
#endif /* HAVE_PYTHON */ #endif /* HAVE_PYTHON */
@ -714,13 +724,12 @@ install_dynamic_child (struct varobj *var,
VEC (varobj_p) **unchanged, VEC (varobj_p) **unchanged,
int *cchanged, int *cchanged,
int index, int index,
char *name, struct varobj_item *item)
struct value *value)
{ {
if (VEC_length (varobj_p, var->children) < index + 1) if (VEC_length (varobj_p, var->children) < index + 1)
{ {
/* There's no child yet. */ /* There's no child yet. */
struct varobj *child = varobj_add_child (var, name, value); struct varobj *child = varobj_add_child (var, item);
if (new) if (new)
{ {
@ -731,14 +740,14 @@ install_dynamic_child (struct varobj *var,
else else
{ {
varobj_p existing = VEC_index (varobj_p, var->children, index); varobj_p existing = VEC_index (varobj_p, var->children, index);
int type_updated = update_type_if_necessary (existing, value); int type_updated = update_type_if_necessary (existing, item->value);
if (type_updated) if (type_updated)
{ {
if (type_changed) if (type_changed)
VEC_safe_push (varobj_p, *type_changed, existing); VEC_safe_push (varobj_p, *type_changed, existing);
} }
if (install_new_value (existing, value, 0)) if (install_new_value (existing, item->value, 0))
{ {
if (!type_updated && changed) if (!type_updated && changed)
VEC_safe_push (varobj_p, *changed, existing); VEC_safe_push (varobj_p, *changed, existing);
@ -889,7 +898,7 @@ update_dynamic_varobj_children (struct varobj *var,
{ {
PyObject *py_v; PyObject *py_v;
const char *name; const char *name;
struct value *v; struct varobj_item varobj_item;
struct cleanup *inner; struct cleanup *inner;
int can_mention = from < 0 || i >= from; int can_mention = from < 0 || i >= from;
@ -901,15 +910,17 @@ update_dynamic_varobj_children (struct varobj *var,
error (_("Invalid item from the child list")); error (_("Invalid item from the child list"));
} }
v = convert_value_from_python (py_v); varobj_item.value = convert_value_from_python (py_v);
if (v == NULL) if (varobj_item.value == NULL)
gdbpy_print_stack (); gdbpy_print_stack ();
varobj_item.name = xstrdup (name);
install_dynamic_child (var, can_mention ? changed : NULL, install_dynamic_child (var, can_mention ? changed : NULL,
can_mention ? type_changed : NULL, can_mention ? type_changed : NULL,
can_mention ? new : NULL, can_mention ? new : NULL,
can_mention ? unchanged : NULL, can_mention ? unchanged : NULL,
can_mention ? cchanged : NULL, i, can_mention ? cchanged : NULL, i,
xstrdup (name), v); &varobj_item);
do_cleanups (inner); do_cleanups (inner);
} }
else else
@ -1028,11 +1039,11 @@ varobj_list_children (struct varobj *var, int *from, int *to)
#if HAVE_PYTHON #if HAVE_PYTHON
static struct varobj * static struct varobj *
varobj_add_child (struct varobj *var, char *name, struct value *value) varobj_add_child (struct varobj *var, struct varobj_item *item)
{ {
varobj_p v = create_child_with_value (var, varobj_p v = create_child_with_value (var,
VEC_length (varobj_p, var->children), VEC_length (varobj_p, var->children),
name, value); item);
VEC_safe_push (varobj_p, var->children, v); VEC_safe_push (varobj_p, var->children, v);
return v; return v;
@ -2107,13 +2118,17 @@ uninstall_variable (struct varobj *var)
static struct varobj * static struct varobj *
create_child (struct varobj *parent, int index, char *name) create_child (struct varobj *parent, int index, char *name)
{ {
return create_child_with_value (parent, index, name, struct varobj_item item;
value_of_child (parent, index));
item.name = name;
item.value = value_of_child (parent, index);
return create_child_with_value (parent, index, &item);
} }
static struct varobj * static struct varobj *
create_child_with_value (struct varobj *parent, int index, char *name, create_child_with_value (struct varobj *parent, int index,
struct value *value) struct varobj_item *item)
{ {
struct varobj *child; struct varobj *child;
char *childs_name; char *childs_name;
@ -2121,7 +2136,7 @@ create_child_with_value (struct varobj *parent, int index, char *name,
child = new_variable (); child = new_variable ();
/* NAME is allocated by caller. */ /* NAME is allocated by caller. */
child->name = name; child->name = item->name;
child->index = index; child->index = index;
child->parent = parent; child->parent = parent;
child->root = parent->root; child->root = parent->root;
@ -2129,22 +2144,22 @@ create_child_with_value (struct varobj *parent, int index, char *name,
if (varobj_is_anonymous_child (child)) if (varobj_is_anonymous_child (child))
childs_name = xstrprintf ("%s.%d_anonymous", parent->obj_name, index); childs_name = xstrprintf ("%s.%d_anonymous", parent->obj_name, index);
else else
childs_name = xstrprintf ("%s.%s", parent->obj_name, name); childs_name = xstrprintf ("%s.%s", parent->obj_name, item->name);
child->obj_name = childs_name; child->obj_name = childs_name;
install_variable (child); install_variable (child);
/* Compute the type of the child. Must do this before /* Compute the type of the child. Must do this before
calling install_new_value. */ calling install_new_value. */
if (value != NULL) if (item->value != NULL)
/* If the child had no evaluation errors, var->value /* If the child had no evaluation errors, var->value
will be non-NULL and contain a valid type. */ will be non-NULL and contain a valid type. */
child->type = value_actual_type (value, 0, NULL); child->type = value_actual_type (item->value, 0, NULL);
else else
/* Otherwise, we must compute the type. */ /* Otherwise, we must compute the type. */
child->type = (*child->root->lang_ops->type_of_child) (child->parent, child->type = (*child->root->lang_ops->type_of_child) (child->parent,
child->index); child->index);
install_new_value (child, value, 1); install_new_value (child, item->value, 1);
return child; return child;
} }