aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Prus <vladimir@codesourcery.com>2008-01-30 07:17:31 +0000
committerVladimir Prus <vladimir@codesourcery.com>2008-01-30 07:17:31 +0000
commitd56d46f5c7560a45f3a1c6101893ca84969c98a9 (patch)
treef5e7fd5adec6eef7edea4c5d72c36acaab4fa2e2
parent44288b4427d328fe143009a158dcf3f8c4051aae (diff)
downloadgdb-d56d46f5c7560a45f3a1c6101893ca84969c98a9.zip
gdb-d56d46f5c7560a45f3a1c6101893ca84969c98a9.tar.gz
gdb-d56d46f5c7560a45f3a1c6101893ca84969c98a9.tar.bz2
Use vector for varobj_list_children interface.
* gdb/varobj.c (varobj_list_children): Return vector of varobjs. * gdb/varobj.h (varobj_list_children): Adjust prototype. (varobj_p): Declare. Declare vector thereof. * mi/mi-cmd-var.c (mi_cmd_var_list_children): Adjust for varobj_list_children change. * Makefile.in (varobj_h): Update dependencies.
-rw-r--r--gdb/ChangeLog12
-rw-r--r--gdb/Makefile.in2
-rw-r--r--gdb/mi/mi-cmd-var.c25
-rw-r--r--gdb/varobj.c33
-rw-r--r--gdb/varobj.h9
5 files changed, 35 insertions, 46 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 7885d11..1eecd4b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,15 @@
+2008-01-30 Vladimir Prus <vladimir@codesourcery.com>
+
+ Use vector for varobj_list_children interface.
+ * gdb/varobj.c (varobj_list_children): Return vector
+ of varobjs.
+ * gdb/varobj.h (varobj_list_children): Adjust
+ prototype.
+ (varobj_p): Declare. Declare vector thereof.
+ * mi/mi-cmd-var.c (mi_cmd_var_list_children): Adjust
+ for varobj_list_children change.
+ * Makefile.in (varobj_h): Update dependencies.
+
2008-01-30 Thiago Jung Bauermann <bauerman@br.ibm.com>
* ppc-sysv-tdep.c (ppc_sysv_abi_push_dummy_call): Add support for
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index ce5573d..b4e3a44 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -901,7 +901,7 @@ user_regs_h = user-regs.h
valprint_h = valprint.h
value_h = value.h $(doublest_h) $(frame_h) $(symtab_h) $(gdbtypes_h) \
$(expression_h)
-varobj_h = varobj.h $(symtab_h) $(gdbtypes_h)
+varobj_h = varobj.h $(symtab_h) $(gdbtypes_h) $(vec_h)
vax_tdep_h = vax-tdep.h
vec_h = vec.h $(gdb_assert_h) $(gdb_string_h)
version_h = version.h
diff --git a/gdb/mi/mi-cmd-var.c b/gdb/mi/mi-cmd-var.c
index 96d01f5..7dfa1f0 100644
--- a/gdb/mi/mi-cmd-var.c
+++ b/gdb/mi/mi-cmd-var.c
@@ -354,12 +354,13 @@ mi_print_value_p (struct type *type, enum print_values print_values)
enum mi_cmd_result
mi_cmd_var_list_children (char *command, char **argv, int argc)
{
- struct varobj *var;
- struct varobj **childlist;
- struct varobj **cc;
+ struct varobj *var;
+ VEC(varobj_p) *children;
+ struct varobj *child;
struct cleanup *cleanup_children;
int numchild;
enum print_values print_values;
+ int ix;
if (argc != 1 && argc != 2)
error (_("mi_cmd_var_list_children: Usage: [PRINT_VALUES] NAME"));
@@ -372,34 +373,28 @@ mi_cmd_var_list_children (char *command, char **argv, int argc)
if (var == NULL)
error (_("Variable object not found"));
- numchild = varobj_list_children (var, &childlist);
- ui_out_field_int (uiout, "numchild", numchild);
+ children = varobj_list_children (var);
+ ui_out_field_int (uiout, "numchild", VEC_length (varobj_p, children));
if (argc == 2)
print_values = mi_parse_values_option (argv[0]);
else
print_values = PRINT_NO_VALUES;
- if (numchild <= 0)
- {
- xfree (childlist);
- return MI_CMD_DONE;
- }
+ if (VEC_length (varobj_p, children) == 0)
+ return MI_CMD_DONE;
if (mi_version (uiout) == 1)
cleanup_children = make_cleanup_ui_out_tuple_begin_end (uiout, "children");
else
cleanup_children = make_cleanup_ui_out_list_begin_end (uiout, "children");
- cc = childlist;
- while (*cc != NULL)
+ for (ix = 0; VEC_iterate (varobj_p, children, ix, child); ++ix)
{
struct cleanup *cleanup_child;
cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, "child");
- print_varobj (*cc, print_values, 1 /* print expression */);
- cc++;
+ print_varobj (child, print_values, 1 /* print expression */);
do_cleanups (cleanup_child);
}
do_cleanups (cleanup_children);
- xfree (childlist);
return MI_CMD_DONE;
}
diff --git a/gdb/varobj.c b/gdb/varobj.c
index 3690174..468beea 100644
--- a/gdb/varobj.c
+++ b/gdb/varobj.c
@@ -83,10 +83,6 @@ struct varobj_root
struct varobj_root *next;
};
-typedef struct varobj *varobj_p;
-
-DEF_VEC_P (varobj_p);
-
/* Every variable in the system has a structure of this type defined
for it. This structure holds all information necessary to manipulate
a particular object variable. Members which must be freed are noted. */
@@ -718,42 +714,28 @@ varobj_get_num_children (struct varobj *var)
/* Creates a list of the immediate children of a variable object;
the return code is the number of such children or -1 on error */
-int
-varobj_list_children (struct varobj *var, struct varobj ***childlist)
+VEC (varobj_p)*
+varobj_list_children (struct varobj *var)
{
struct varobj *child;
char *name;
int i;
- /* sanity check: have we been passed a pointer? */
- if (childlist == NULL)
- return -1;
-
- *childlist = NULL;
-
if (var->num_children == -1)
var->num_children = number_of_children (var);
/* If that failed, give up. */
if (var->num_children == -1)
- return -1;
+ return var->children;
/* If we're called when the list of children is not yet initialized,
allocate enough elements in it. */
while (VEC_length (varobj_p, var->children) < var->num_children)
VEC_safe_push (varobj_p, var->children, NULL);
- /* List of children */
- *childlist = xmalloc ((var->num_children + 1) * sizeof (struct varobj *));
-
for (i = 0; i < var->num_children; i++)
{
- varobj_p existing;
-
- /* Mark as the end in case we bail out */
- *((*childlist) + i) = NULL;
-
- existing = VEC_index (varobj_p, var->children, i);
+ varobj_p existing = VEC_index (varobj_p, var->children, i);
if (existing == NULL)
{
@@ -764,14 +746,9 @@ varobj_list_children (struct varobj *var, struct varobj ***childlist)
existing = create_child (var, i, name);
VEC_replace (varobj_p, var->children, i, existing);
}
-
- *((*childlist) + i) = existing;
}
- /* End of list is marked by a NULL pointer */
- *((*childlist) + i) = NULL;
-
- return var->num_children;
+ return var->children;
}
/* Obtain the type of an object Variable as a string similar to the one gdb
diff --git a/gdb/varobj.h b/gdb/varobj.h
index 588eebe1..e0a5c17 100644
--- a/gdb/varobj.h
+++ b/gdb/varobj.h
@@ -20,6 +20,7 @@
#include "symtab.h"
#include "gdbtypes.h"
+#include "vec.h"
/* Enumeration for the format types */
enum varobj_display_formats
@@ -61,6 +62,9 @@ extern char *varobj_language_string[];
/* Struct thar describes a variable object instance */
struct varobj;
+typedef struct varobj *varobj_p;
+DEF_VEC_P (varobj_p);
+
/* API functions */
extern struct varobj *varobj_create (char *objname,
@@ -91,8 +95,9 @@ extern int varobj_get_frozen (struct varobj *var);
extern int varobj_get_num_children (struct varobj *var);
-extern int varobj_list_children (struct varobj *var,
- struct varobj ***childlist);
+/* Return the list of children of VAR. The returned vector
+ should not be modified in any way. */
+extern VEC (varobj_p)* varobj_list_children (struct varobj *var);
extern char *varobj_get_type (struct varobj *var);