From d56d46f5c7560a45f3a1c6101893ca84969c98a9 Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Wed, 30 Jan 2008 07:17:31 +0000 Subject: [PATCH] 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. --- gdb/ChangeLog | 12 ++++++++++++ gdb/Makefile.in | 2 +- gdb/mi/mi-cmd-var.c | 25 ++++++++++--------------- gdb/varobj.c | 33 +++++---------------------------- gdb/varobj.h | 9 +++++++-- 5 files changed, 35 insertions(+), 46 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7885d1154d8..1eecd4bdc8e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2008-01-30 Vladimir Prus + + 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 * ppc-sysv-tdep.c (ppc_sysv_abi_push_dummy_call): Add support for diff --git a/gdb/Makefile.in b/gdb/Makefile.in index ce5573d8c31..b4e3a4478a4 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 96d01f59461..7dfa1f0af64 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 36901744904..468beea734a 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 588eebe1720..e0a5c170fbe 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); -- 2.30.2