X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fvarobj.c;h=d47bdc2acd1d8354f01840b8d163b23eea04f4c1;hb=8465445732dc04c3fb6cf954274e12d06b274f08;hp=02cce5ae44ec1a4ef274be1ea6e68d9057278c93;hpb=e525021603958709381fc4dc296cc2586aaa5dd7;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/varobj.c b/gdb/varobj.c index 02cce5ae44..d47bdc2acd 100644 --- a/gdb/varobj.c +++ b/gdb/varobj.c @@ -1,6 +1,6 @@ /* Implementation of the GDB variable objects API. - Copyright (C) 1999-2014 Free Software Foundation, Inc. + Copyright (C) 1999-2016 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 @@ -16,7 +16,6 @@ along with this program. If not, see . */ #include "defs.h" -#include "exceptions.h" #include "value.h" #include "expression.h" #include "frame.h" @@ -24,15 +23,13 @@ #include "gdbcmd.h" #include "block.h" #include "valprint.h" - -#include "gdb_assert.h" -#include #include "gdb_regex.h" #include "varobj.h" #include "vec.h" #include "gdbthread.h" #include "inferior.h" +#include "varobj-iter.h" #if HAVE_PYTHON #include "python/python.h" @@ -41,8 +38,6 @@ typedef int PyObject; #endif -#include "varobj-iter.h" - /* Non-zero if we want to see trace of varobj level stuff. */ unsigned int varobjdebug = 0; @@ -55,7 +50,7 @@ show_varobjdebug (struct ui_file *file, int from_tty, /* String representations of gdb's format codes. */ char *varobj_format_string[] = - { "natural", "binary", "decimal", "hexadecimal", "octal" }; + { "natural", "binary", "decimal", "hexadecimal", "octal", "zero-hexadecimal" }; /* True if we want to allow Python-based pretty-printing. */ static int pretty_printing = 0; @@ -110,17 +105,6 @@ struct varobj_root 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. */ struct varobj_dynamic @@ -209,32 +193,28 @@ static int install_new_value (struct varobj *var, struct value *value, /* Language-specific routines. */ -static int number_of_children (struct varobj *); +static int number_of_children (const struct varobj *); -static char *name_of_variable (struct varobj *); +static char *name_of_variable (const struct varobj *); static char *name_of_child (struct varobj *, int); static struct value *value_of_root (struct varobj **var_handle, int *); -static struct value *value_of_child (struct varobj *parent, int index); +static struct value *value_of_child (const struct varobj *parent, int index); static char *my_value_of_variable (struct varobj *var, enum varobj_display_formats format); -static int is_root_p (struct varobj *var); - -#if HAVE_PYTHON +static int is_root_p (const struct varobj *var); static struct varobj *varobj_add_child (struct varobj *var, struct varobj_item *item); -#endif /* HAVE_PYTHON */ - /* Private data */ /* Mappings of varobj_display_formats enums to gdb's format codes. */ -static int format_code[] = { 0, 't', 'd', 'x', 'o' }; +static int format_code[] = { 0, 't', 'd', 'x', 'o', 'z' }; /* Header of the list of root variable objects. */ static struct varobj_root *rootlist; @@ -250,7 +230,7 @@ static struct vlist **varobj_table; /* API Implementation */ static int -is_root_p (struct varobj *var) +is_root_p (const struct varobj *var) { return (var->root->rootvar == var); } @@ -259,7 +239,7 @@ is_root_p (struct varobj *var) /* Helper function to install a Python environment suitable for use during operations on VAR. */ struct cleanup * -varobj_ensure_python_env (struct varobj *var) +varobj_ensure_python_env (const struct varobj *var) { return ensure_python_env (var->root->exp->gdbarch, var->root->exp->language_defn); @@ -315,10 +295,9 @@ varobj_create (char *objname, { struct frame_info *fi; struct frame_id old_id = null_frame_id; - struct block *block; + const struct block *block; const char *p; struct value *value = NULL; - volatile struct gdb_exception except; CORE_ADDR pc; /* Parse and evaluate the expression, filling in as much of the @@ -358,16 +337,17 @@ varobj_create (char *objname, innermost_block = NULL; /* Wrap the call to parse expression, so we can return a sensible error. */ - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { var->root->exp = parse_exp_1 (&p, pc, block, 0); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { do_cleanups (old_chain); return NULL; } + END_CATCH /* Don't allow variables to be created for types. */ if (var->root->exp->elts[0].opcode == OP_TYPE @@ -408,12 +388,11 @@ varobj_create (char *objname, /* We definitely need to catch errors here. If evaluate_expression succeeds we got the value we wanted. But if it fails, we still go on with a call to evaluate_type(). */ - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { value = evaluate_expression (var->root->exp); } - - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { /* Error getting the value. Try to at least get the right type. */ @@ -421,14 +400,16 @@ varobj_create (char *objname, var->type = value_type (type_only_value); } - else - { - int real_type_found = 0; + END_CATCH - var->type = value_actual_type (value, 0, &real_type_found); - if (real_type_found) - value = value_cast (var->type, value); - } + if (value != NULL) + { + int real_type_found = 0; + + var->type = value_actual_type (value, 0, &real_type_found); + if (real_type_found) + value = value_cast (var->type, value); + } /* Set language info */ var->root->lang_ops = var->root->exp->language_defn->la_varobj_ops; @@ -507,23 +488,25 @@ varobj_get_handle (char *objname) /* Given the handle, return the name of the object. */ char * -varobj_get_objname (struct varobj *var) +varobj_get_objname (const struct varobj *var) { return var->obj_name; } -/* Given the handle, return the expression represented by the object. */ +/* Given the handle, return the expression represented by the object. The + result must be freed by the caller. */ char * -varobj_get_expression (struct varobj *var) +varobj_get_expression (const struct varobj *var) { return name_of_variable (var); } /* Deletes a varobj and all its children if only_children == 0, - otherwise deletes only the children; returns a malloc'ed list of - all the (malloc'ed) names of the variables that have been deleted - (NULL terminated). */ + otherwise deletes only the children. If DELLIST is non-NULL, it is + assigned a malloc'ed list of all the (malloc'ed) names of the variables + that have been deleted (NULL terminated). Returns the number of deleted + variables. */ int varobj_delete (struct varobj *var, char ***dellist, int only_children) @@ -546,7 +529,7 @@ varobj_delete (struct varobj *var, char ***dellist, int only_children) /* We may have been asked to return a list of what has been deleted. */ if (dellist != NULL) { - *dellist = xmalloc ((delcount + 1) * sizeof (char *)); + *dellist = XNEWVEC (char *, delcount + 1); cp = *dellist; mycount = delcount; @@ -600,6 +583,7 @@ varobj_set_display_format (struct varobj *var, case FORMAT_DECIMAL: case FORMAT_HEXADECIMAL: case FORMAT_OCTAL: + case FORMAT_ZHEXADECIMAL: var->format = format; break; @@ -619,13 +603,13 @@ varobj_set_display_format (struct varobj *var, } enum varobj_display_formats -varobj_get_display_format (struct varobj *var) +varobj_get_display_format (const struct varobj *var) { return var->format; } char * -varobj_get_display_hint (struct varobj *var) +varobj_get_display_hint (const struct varobj *var) { char *result = NULL; @@ -649,7 +633,7 @@ varobj_get_display_hint (struct varobj *var) /* Return true if the varobj has items after TO, false otherwise. */ int -varobj_has_more (struct varobj *var, int to) +varobj_has_more (const struct varobj *var, int to) { if (VEC_length (varobj_p, var->children) > to) return 1; @@ -662,7 +646,7 @@ varobj_has_more (struct varobj *var, int to) inside that thread, returns GDB id of the thread -- which is always positive. Otherwise, returns -1. */ int -varobj_get_thread_id (struct varobj *var) +varobj_get_thread_id (const struct varobj *var) { if (var->root->valid_block && var->root->thread_id > 0) return var->root->thread_id; @@ -684,7 +668,7 @@ varobj_set_frozen (struct varobj *var, int frozen) } int -varobj_get_frozen (struct varobj *var) +varobj_get_frozen (const struct varobj *var) { return var->frozen; } @@ -713,8 +697,6 @@ varobj_restrict_range (VEC (varobj_p) *children, int *from, int *to) } } -#if HAVE_PYTHON - /* A helper for update_dynamic_varobj_children that installs a new child when needed. */ @@ -722,7 +704,7 @@ static void install_dynamic_child (struct varobj *var, VEC (varobj_p) **changed, VEC (varobj_p) **type_changed, - VEC (varobj_p) **new, + VEC (varobj_p) **newobj, VEC (varobj_p) **unchanged, int *cchanged, int index, @@ -733,9 +715,9 @@ install_dynamic_child (struct varobj *var, /* There's no child yet. */ struct varobj *child = varobj_add_child (var, item); - if (new) + if (newobj) { - VEC_safe_push (varobj_p, *new, child); + VEC_safe_push (varobj_p, *newobj, child); *cchanged = 1; } } @@ -759,8 +741,10 @@ install_dynamic_child (struct varobj *var, } } +#if HAVE_PYTHON + static int -dynamic_varobj_has_child_method (struct varobj *var) +dynamic_varobj_has_child_method (const struct varobj *var) { struct cleanup *back_to; PyObject *printer = var->dynamic->pretty_printer; @@ -774,6 +758,7 @@ dynamic_varobj_has_child_method (struct varobj *var) do_cleanups (back_to); return result; } +#endif /* A factory for creating dynamic varobj's iterators. Returns an iterator object suitable for iterating over VAR's children. */ @@ -781,35 +766,41 @@ dynamic_varobj_has_child_method (struct varobj *var) static struct varobj_iter * varobj_get_iterator (struct varobj *var) { +#if HAVE_PYTHON if (var->dynamic->pretty_printer) return py_varobj_get_iterator (var, var->dynamic->pretty_printer); +#endif gdb_assert_not_reached (_("\ requested an iterator from a non-dynamic varobj")); } -#endif +/* Release and clear VAR's saved item, if any. */ + +static void +varobj_clear_saved_item (struct varobj_dynamic *var) +{ + if (var->saved_item != NULL) + { + value_free (var->saved_item->value); + xfree (var->saved_item); + var->saved_item = NULL; + } +} static int update_dynamic_varobj_children (struct varobj *var, VEC (varobj_p) **changed, VEC (varobj_p) **type_changed, - VEC (varobj_p) **new, + VEC (varobj_p) **newobj, VEC (varobj_p) **unchanged, int *cchanged, int update_children, int from, int to) { -#if HAVE_PYTHON - struct cleanup *back_to; int i; - if (!gdb_python_initialized) - return 0; - - back_to = varobj_ensure_python_env (var); - *cchanged = 0; if (update_children || var->dynamic->child_iter == NULL) @@ -817,16 +808,12 @@ update_dynamic_varobj_children (struct varobj *var, varobj_iter_delete (var->dynamic->child_iter); var->dynamic->child_iter = varobj_get_iterator (var); - Py_XDECREF (var->dynamic->saved_item); - var->dynamic->saved_item = NULL; + varobj_clear_saved_item (var->dynamic); i = 0; if (var->dynamic->child_iter == NULL) - { - do_cleanups (back_to); - return 0; - } + return 0; } else i = VEC_length (varobj_p, var->children); @@ -835,10 +822,10 @@ update_dynamic_varobj_children (struct varobj *var, are more children. */ for (; to < 0 || i < to + 1; ++i) { - PyObject *item; + varobj_item *item; /* See if there was a leftover from last time. */ - if (var->dynamic->saved_item) + if (var->dynamic->saved_item != NULL) { item = var->dynamic->saved_item; var->dynamic->saved_item = NULL; @@ -846,6 +833,10 @@ update_dynamic_varobj_children (struct varobj *var, else { item = varobj_iter_next (var->dynamic->child_iter); + /* Release vitem->value so its lifetime is not bound to the + execution of a command. */ + if (item != NULL && item->value != NULL) + release_value_or_incref (item->value); } if (item == NULL) @@ -858,36 +849,19 @@ update_dynamic_varobj_children (struct varobj *var, /* We don't want to push the extra child on any report list. */ if (to < 0 || i < to) { - PyObject *py_v; - const char *name; - struct varobj_item varobj_item; - struct cleanup *inner; int can_mention = from < 0 || i >= from; - inner = make_cleanup_py_decref (item); - - if (!PyArg_ParseTuple (item, "sO", &name, &py_v)) - { - gdbpy_print_stack (); - error (_("Invalid item from the child list")); - } - - varobj_item.value = convert_value_from_python (py_v); - if (varobj_item.value == NULL) - gdbpy_print_stack (); - varobj_item.name = xstrdup (name); - install_dynamic_child (var, can_mention ? changed : NULL, can_mention ? type_changed : NULL, - can_mention ? new : NULL, + can_mention ? newobj : NULL, can_mention ? unchanged : NULL, can_mention ? cchanged : NULL, i, - &varobj_item); - do_cleanups (inner); + item); + + xfree (item); } else { - Py_XDECREF (var->dynamic->saved_item); var->dynamic->saved_item = item; /* We want to truncate the child list just before this @@ -913,11 +887,7 @@ update_dynamic_varobj_children (struct varobj *var, var->num_children = VEC_length (varobj_p, var->children); - do_cleanups (back_to); return 1; -#else - gdb_assert_not_reached ("should never be called if Python is not enabled"); -#endif } int @@ -925,7 +895,7 @@ varobj_get_num_children (struct varobj *var) { if (var->num_children == -1) { - if (var->dynamic->pretty_printer != NULL) + if (varobj_is_dynamic_p (var)) { int dummy; @@ -952,7 +922,7 @@ varobj_list_children (struct varobj *var, int *from, int *to) var->dynamic->children_requested = 1; - if (var->dynamic->pretty_printer != NULL) + if (varobj_is_dynamic_p (var)) { /* This, in theory, can result in the number of children changing without frontend noticing. But well, calling -var-list-children on the same @@ -994,8 +964,6 @@ varobj_list_children (struct varobj *var, int *from, int *to) return var->children; } -#if HAVE_PYTHON - static struct varobj * varobj_add_child (struct varobj *var, struct varobj_item *item) { @@ -1007,10 +975,9 @@ varobj_add_child (struct varobj *var, struct varobj_item *item) return v; } -#endif /* HAVE_PYTHON */ - /* Obtain the type of an object Variable as a string similar to the one gdb - prints on the console. */ + prints on the console. The caller is responsible for freeing the string. + */ char * varobj_get_type (struct varobj *var) @@ -1027,7 +994,7 @@ varobj_get_type (struct varobj *var) /* Obtain the type of an object variable. */ struct type * -varobj_get_gdb_type (struct varobj *var) +varobj_get_gdb_type (const struct varobj *var) { return var->type; } @@ -1036,28 +1003,28 @@ varobj_get_gdb_type (struct varobj *var) a valid path expression? */ static int -is_path_expr_parent (struct varobj *var) +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; + gdb_assert (var->root->lang_ops->is_path_expr_parent != NULL); + return var->root->lang_ops->is_path_expr_parent (var); +} - type = varobj_get_value_type (var); +/* Is VAR a path expression parent, i.e., can it be used to construct + a valid path expression? By default we assume any VAR can be a path + parent. */ - /* Anonymous unions and structs are also not path_expr parents. */ - return !((TYPE_CODE (type) == TYPE_CODE_STRUCT - || TYPE_CODE (type) == TYPE_CODE_UNION) - && TYPE_NAME (type) == NULL); +int +varobj_default_is_path_expr_parent (const struct varobj *var) +{ + return 1; } /* Return the path expression parent for VAR. */ -struct varobj * -varobj_get_path_expr_parent (struct varobj *var) +const struct varobj * +varobj_get_path_expr_parent (const struct varobj *var) { - struct varobj *parent = var; + const struct varobj *parent = var; while (!is_root_p (parent) && !is_path_expr_parent (parent)) parent = parent->parent; @@ -1068,28 +1035,30 @@ varobj_get_path_expr_parent (struct varobj *var) /* Return a pointer to the full rooted expression of varobj VAR. If it has not been computed yet, compute it. */ char * -varobj_get_path_expr (struct varobj *var) +varobj_get_path_expr (const struct varobj *var) { - if (var->path_expr != NULL) - return var->path_expr; - else + if (var->path_expr == NULL) { /* For root varobjs, we initialize path_expr when creating varobj, so here it should be child varobj. */ + struct varobj *mutable_var = (struct varobj *) var; gdb_assert (!is_root_p (var)); - return (*var->root->lang_ops->path_expr_of_child) (var); + + mutable_var->path_expr = (*var->root->lang_ops->path_expr_of_child) (var); } + + return var->path_expr; } const struct language_defn * -varobj_get_language (struct varobj *var) +varobj_get_language (const struct varobj *var) { return var->root->exp->language_defn; } int -varobj_get_attributes (struct varobj *var) +varobj_get_attributes (const struct varobj *var) { int attributes = 0; @@ -1100,8 +1069,10 @@ varobj_get_attributes (struct varobj *var) return attributes; } +/* Return true if VAR is a dynamic varobj. */ + int -varobj_pretty_printed_p (struct varobj *var) +varobj_is_dynamic_p (const struct varobj *var) { return var->dynamic->pretty_printer != NULL; } @@ -1134,23 +1105,23 @@ varobj_set_value (struct varobj *var, char *expression) struct value *value = NULL; /* Initialize to keep gcc happy. */ int saved_input_radix = input_radix; const char *s = expression; - volatile struct gdb_exception except; gdb_assert (varobj_editable_p (var)); input_radix = 10; /* ALWAYS reset to decimal temporarily. */ exp = parse_exp_1 (&s, 0, 0, 0); - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { value = evaluate_expression (exp); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { /* We cannot proceed without a valid expression. */ xfree (exp); return 0; } + END_CATCH /* All types that are editable must also be changeable. */ gdb_assert (varobj_value_is_changeable_p (var)); @@ -1169,13 +1140,16 @@ varobj_set_value (struct varobj *var, char *expression) /* The new value may be lazy. value_assign, or rather value_contents, will take care of this. */ - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { val = value_assign (var->value, value); } - if (except.reason < 0) - return 0; + CATCH (except, RETURN_MASK_ERROR) + { + return 0; + } + END_CATCH /* If the value has changed, record it, so that next -var-update can report this change. If a variable had a value of '1', we've set it @@ -1325,11 +1299,16 @@ update_type_if_necessary (struct varobj *var, struct value *new_value) { struct type *new_type; char *curr_type_str, *new_type_str; + int type_name_changed; new_type = value_actual_type (new_value, 0, 0); new_type_str = type_to_string (new_type); curr_type_str = varobj_get_type (var); - if (strcmp (curr_type_str, new_type_str) != 0) + type_name_changed = strcmp (curr_type_str, new_type_str) != 0; + xfree (curr_type_str); + xfree (new_type_str); + + if (type_name_changed) { var->type = new_type; @@ -1405,7 +1384,7 @@ install_new_value (struct varobj *var, struct value *value, int initial) will be lazy, which means we've lost that old value. */ if (need_to_fetch && value && value_lazy (value)) { - struct varobj *parent = var->parent; + const struct varobj *parent = var->parent; int frozen = var->frozen; for (; !frozen && parent; parent = parent->parent) @@ -1421,20 +1400,20 @@ install_new_value (struct varobj *var, struct value *value, int initial) } else { - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { value_fetch_lazy (value); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { /* Set the value to NULL, so that for the next -var-update, we don't try to compare the new value with this value, that we couldn't even read. */ value = NULL; } + END_CATCH } } @@ -1545,7 +1524,7 @@ install_new_value (struct varobj *var, struct value *value, int initial) selected sub-range of VAR. If no range was selected using -var-set-update-range, then both will be -1. */ void -varobj_get_child_range (struct varobj *var, int *from, int *to) +varobj_get_child_range (const struct varobj *var, int *from, int *to) { *from = var->from; *to = var->to; @@ -1607,7 +1586,7 @@ varobj_set_visualizer (struct varobj *var, const char *visualizer) NEW_VALUE may be NULL, if the varobj is now out of scope. */ static int -varobj_value_has_mutated (struct varobj *var, struct value *new_value, +varobj_value_has_mutated (const struct varobj *var, struct value *new_value, struct type *new_type) { /* If we haven't previously computed the number of children in var, @@ -1648,11 +1627,11 @@ varobj_value_has_mutated (struct varobj *var, struct value *new_value, to point to the new varobj. */ VEC(varobj_update_result) * -varobj_update (struct varobj **varp, int explicit) +varobj_update (struct varobj **varp, int is_explicit) { int type_changed = 0; int i; - struct value *new; + struct value *newobj; VEC (varobj_update_result) *stack = NULL; VEC (varobj_update_result) *result = NULL; @@ -1661,7 +1640,7 @@ varobj_update (struct varobj **varp, int explicit) changing type. One use case for frozen varobjs is retaining previously evaluated expressions, and we don't want them to be reevaluated at all. */ - if (!explicit && (*varp)->frozen) + if (!is_explicit && (*varp)->frozen) return result; if (!(*varp)->root->is_valid) @@ -1686,15 +1665,15 @@ varobj_update (struct varobj **varp, int explicit) the frame in which a local existed. We are letting the value_of_root variable dispose of the varobj if the type has changed. */ - new = value_of_root (varp, &type_changed); - if (update_type_if_necessary(*varp, new)) + newobj = value_of_root (varp, &type_changed); + if (update_type_if_necessary(*varp, newobj)) type_changed = 1; r.varobj = *varp; r.type_changed = type_changed; - if (install_new_value ((*varp), new, type_changed)) + if (install_new_value ((*varp), newobj, type_changed)) r.changed = 1; - if (new == NULL) + if (newobj == NULL) r.status = VAROBJ_NOT_IN_SCOPE; r.value_installed = 1; @@ -1729,15 +1708,15 @@ varobj_update (struct varobj **varp, int explicit) { struct type *new_type; - new = value_of_child (v->parent, v->index); - if (update_type_if_necessary(v, new)) + newobj = value_of_child (v->parent, v->index); + if (update_type_if_necessary(v, newobj)) r.type_changed = 1; - if (new) - new_type = value_type (new); + if (newobj) + new_type = value_type (newobj); else new_type = v->root->lang_ops->type_of_child (v->parent, v->index); - if (varobj_value_has_mutated (v, new, new_type)) + if (varobj_value_has_mutated (v, newobj, new_type)) { /* The children are no longer valid; delete them now. Report the fact that its type changed as well. */ @@ -1749,20 +1728,19 @@ varobj_update (struct varobj **varp, int explicit) r.type_changed = 1; } - if (install_new_value (v, new, r.type_changed)) + if (install_new_value (v, newobj, r.type_changed)) { r.changed = 1; v->updated = 0; } } - /* We probably should not get children of a varobj that has a - pretty-printer, but for which -var-list-children was never - invoked. */ - if (v->dynamic->pretty_printer != NULL) + /* We probably should not get children of a dynamic varobj, but + for which -var-list-children was never invoked. */ + if (varobj_is_dynamic_p (v)) { VEC (varobj_p) *changed = 0, *type_changed = 0, *unchanged = 0; - VEC (varobj_p) *new = 0; + VEC (varobj_p) *newobj = 0; int i, children_changed = 0; if (v->frozen) @@ -1794,14 +1772,14 @@ varobj_update (struct varobj **varp, int explicit) /* If update_dynamic_varobj_children returns 0, then we have a non-conforming pretty-printer, so we skip it. */ - if (update_dynamic_varobj_children (v, &changed, &type_changed, &new, + if (update_dynamic_varobj_children (v, &changed, &type_changed, &newobj, &unchanged, &children_changed, 1, v->from, v->to)) { - if (children_changed || new) + if (children_changed || newobj) { r.children_changed = 1; - r.new = new; + r.newobj = newobj; } /* Push in reverse order so that the first child is popped from the work stack first, and so will be @@ -1978,7 +1956,7 @@ install_variable (struct varobj *var) error (_("Duplicate variable object name")); /* Add varobj to hash table. */ - newvl = xmalloc (sizeof (struct vlist)); + newvl = XNEW (struct vlist); newvl->next = *(varobj_table + index); newvl->var = var; *(varobj_table + index) = newvl; @@ -2072,7 +2050,10 @@ uninstall_variable (struct varobj *var) } -/* Create and install a child of the parent of the given name. */ +/* Create and install a child of the parent of the given name. + + The created VAROBJ takes ownership of the allocated NAME. */ + static struct varobj * create_child (struct varobj *parent, int index, char *name) { @@ -2133,7 +2114,7 @@ new_variable (void) { struct varobj *var; - var = (struct varobj *) xmalloc (sizeof (struct varobj)); + var = XNEW (struct varobj); var->name = NULL; var->path_expr = NULL; var->obj_name = NULL; @@ -2143,14 +2124,13 @@ new_variable (void) var->num_children = -1; var->parent = NULL; var->children = NULL; - var->format = 0; + var->format = FORMAT_NATURAL; var->root = NULL; var->updated = 0; var->print_value = NULL; var->frozen = 0; var->not_fetched = 0; - var->dynamic - = (struct varobj_dynamic *) xmalloc (sizeof (struct varobj_dynamic)); + var->dynamic = XNEW (struct varobj_dynamic); var->dynamic->children_requested = 0; var->from = -1; var->to = -1; @@ -2168,7 +2148,7 @@ new_root_variable (void) { struct varobj *var = new_variable (); - var->root = (struct varobj_root *) xmalloc (sizeof (struct varobj_root)); + var->root = XNEW (struct varobj_root); var->root->lang_ops = NULL; var->root->exp = NULL; var->root->valid_block = NULL; @@ -2191,12 +2171,12 @@ free_variable (struct varobj *var) Py_XDECREF (var->dynamic->constructor); Py_XDECREF (var->dynamic->pretty_printer); - Py_XDECREF (var->dynamic->child_iter); - Py_XDECREF (var->dynamic->saved_item); do_cleanups (cleanup); } #endif + varobj_iter_delete (var->dynamic->child_iter); + varobj_clear_saved_item (var->dynamic); value_free (var->value); /* Free the expression if this is a root variable. */ @@ -2217,7 +2197,7 @@ free_variable (struct varobj *var) static void do_free_variable_cleanup (void *var) { - free_variable (var); + free_variable ((struct varobj *) var); } static struct cleanup * @@ -2238,7 +2218,7 @@ make_cleanup_free_variable (struct varobj *var) For example, top-level references are always stripped. */ struct type * -varobj_get_value_type (struct varobj *var) +varobj_get_value_type (const struct varobj *var) { struct type *type; @@ -2271,7 +2251,7 @@ cppush (struct cpstack **pstack, char *name) { struct cpstack *s; - s = (struct cpstack *) xmalloc (sizeof (struct cpstack)); + s = XNEW (struct cpstack); s->name = name; s->next = *pstack; *pstack = s; @@ -2307,7 +2287,7 @@ cppop (struct cpstack **pstack) is the number of children that the user will see in the variable display. */ static int -number_of_children (struct varobj *var) +number_of_children (const struct varobj *var) { return (*var->root->lang_ops->number_of_children) (var); } @@ -2315,7 +2295,7 @@ number_of_children (struct varobj *var) /* What is the expression for the root varobj VAR? Returns a malloc'd string. */ static char * -name_of_variable (struct varobj *var) +name_of_variable (const struct varobj *var) { return (*var->root->lang_ops->name_of_variable) (var); } @@ -2332,7 +2312,7 @@ name_of_child (struct varobj *var, int index) to it and return 1. Otherwise, return 0. */ static int -check_scope (struct varobj *var) +check_scope (const struct varobj *var) { struct frame_info *fi; int scope; @@ -2393,14 +2373,17 @@ value_of_root_1 (struct varobj **var_handle) if (within_scope) { - volatile struct gdb_exception except; /* We need to catch errors here, because if evaluate expression fails we want to just return NULL. */ - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { new_val = evaluate_expression (var->root->exp); } + CATCH (except, RETURN_MASK_ERROR) + { + } + END_CATCH } do_cleanups (back_to); @@ -2508,7 +2491,7 @@ value_of_root (struct varobj **var_handle, int *type_changed) /* What is the ``struct value *'' for the INDEX'th child of PARENT? */ static struct value * -value_of_child (struct varobj *parent, int index) +value_of_child (const struct varobj *parent, int index) { struct value *value; @@ -2543,7 +2526,7 @@ varobj_formatted_print_options (struct value_print_options *opts, char * varobj_value_get_print_value (struct value *value, enum varobj_display_formats format, - struct varobj *var) + const struct varobj *var) { struct ui_file *stb; struct cleanup *old_chain; @@ -2628,7 +2611,7 @@ varobj_value_get_print_value (struct value *value, } len = strlen (s); - thevalue = xmemdup (s, len + 1, len + 1); + thevalue = (char *) xmemdup (s, len + 1, len + 1); type = builtin_type (gdbarch)->builtin_char; xfree (s); @@ -2674,7 +2657,7 @@ varobj_value_get_print_value (struct value *value, } int -varobj_editable_p (struct varobj *var) +varobj_editable_p (const struct varobj *var) { struct type *type; @@ -2702,7 +2685,7 @@ varobj_editable_p (struct varobj *var) /* Call VAR's value_is_changeable_p language-specific callback. */ int -varobj_value_is_changeable_p (struct varobj *var) +varobj_value_is_changeable_p (const struct varobj *var) { return var->root->lang_ops->value_is_changeable_p (var); } @@ -2711,7 +2694,7 @@ varobj_value_is_changeable_p (struct varobj *var) selected frame, and not bound to thread/frame. Such variable objects are created using '@' as frame specifier to -var-create. */ int -varobj_floating_p (struct varobj *var) +varobj_floating_p (const struct varobj *var) { return var->root->floating; } @@ -2720,7 +2703,7 @@ varobj_floating_p (struct varobj *var) languages. */ int -varobj_default_value_is_changeable_p (struct varobj *var) +varobj_default_value_is_changeable_p (const struct varobj *var) { int r; struct type *type; @@ -2762,24 +2745,6 @@ all_root_varobjs (void (*func) (struct varobj *var, void *data), void *data) (*func) (var_root->rootvar, data); } } - -extern void _initialize_varobj (void); -void -_initialize_varobj (void) -{ - int sizeof_table = sizeof (struct vlist *) * VAROBJ_TABLE_SIZE; - - varobj_table = xmalloc (sizeof_table); - memset (varobj_table, 0, sizeof_table); - - add_setshow_zuinteger_cmd ("varobj", class_maintenance, - &varobjdebug, - _("Set varobj debugging."), - _("Show varobj debugging."), - _("When non-zero, varobj debugging is enabled."), - NULL, show_varobjdebug, - &setdebuglist, &showdebuglist); -} /* Invalidate varobj VAR if it is tied to locals and re-create it if it is defined on globals. It is a helper for varobj_invalidate. @@ -2822,3 +2787,18 @@ varobj_invalidate (void) { all_root_varobjs (varobj_invalidate_iter, NULL); } + +extern void _initialize_varobj (void); +void +_initialize_varobj (void) +{ + varobj_table = XCNEWVEC (struct vlist *, VAROBJ_TABLE_SIZE); + + add_setshow_zuinteger_cmd ("varobj", class_maintenance, + &varobjdebug, + _("Set varobj debugging."), + _("Show varobj debugging."), + _("When non-zero, varobj debugging is enabled."), + NULL, show_varobjdebug, + &setdebuglist, &showdebuglist); +}