--- gdb/testsuite/gdb.mi/mi-var-child.exp (revision 2956) +++ gdb/testsuite/gdb.mi/mi-var-child.exp (local) @@ -835,7 +835,7 @@ mi_execute_to "exec-step 7" "end-steppin # Test: c_variable-5.8 # Desc: check that long_array[3-9] changed mi_gdb_test "-var-update *" \ - "\\^done,changelist=\\\[\{name=\"struct_declarations.long_array.9\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.8\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.7\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.6\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.5\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.4\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.3\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \ + "\\^done,changelist=\\\[\{name=\"struct_declarations.long_array.3\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.4\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.5\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.6\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.7\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.8\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.9\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \ "update all vars struct_declarations.long_array.3-9 changed" --- gdb/testsuite/gdb.mi/mi2-var-child.exp (revision 2956) +++ gdb/testsuite/gdb.mi/mi2-var-child.exp (local) @@ -831,7 +831,7 @@ mi_execute_to "exec-step 7" "end-steppin # Test: c_variable-5.8 # Desc: check that long_array[3-9] changed mi_gdb_test "-var-update *" \ - "\\^done,changelist=\\\[\{name=\"struct_declarations.long_array.9\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.8\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.7\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.6\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.5\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.4\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.3\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \ + "\\^done,changelist=\\\[\{name=\"struct_declarations.long_array.3\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.4\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.5\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.6\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.7\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.8\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"struct_declarations.long_array.9\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \ "update all vars struct_declarations.long_array.3-9 changed" --- gdb/varobj.c (revision 2956) +++ gdb/varobj.c (local) @@ -33,7 +33,6 @@ #include "varobj.h" #include "vec.h" - /* Non-zero if we want to see trace of varobj level stuff. */ int varobjdebug = 0; @@ -684,9 +683,7 @@ varobj_list_children (struct varobj *var *childlist = NULL; if (var->num_children == -1) - { - var->num_children = number_of_children (var); - } + var->num_children = number_of_children (var); /* If we're called when the list of children is not yet initialized, allocated enough elements in it. */ @@ -698,21 +695,24 @@ varobj_list_children (struct varobj *var for (i = 0; i < var->num_children; i++) { + varobj_p existing; + /* Mark as the end in case we bail out */ *((*childlist) + i) = NULL; - varobj_p *existing = VEC_address (varobj_p, var->children) + i; + existing = VEC_index (varobj_p, var->children, i); - if (*existing == NULL) + if (existing == NULL) { /* Either it's the first call to varobj_list_children for this variable object, and the child was never created, or it was explicitly deleted by the client. */ name = name_of_child (var, i); - *existing = create_child (var, i, name); + existing = create_child (var, i, name); + VEC_replace (varobj_p, var->children, i, existing); } - *((*childlist) + i) = *existing; + *((*childlist) + i) = existing; } /* End of list is marked by a NULL pointer */ @@ -1059,9 +1059,7 @@ varobj_update (struct varobj **varp, str /* If this is a "use_selected_frame" varobj, and its type has changed, them note that it's changed. */ if (type_changed) - { - VEC_safe_push (varobj_p, result, *varp); - } + VEC_safe_push (varobj_p, result, *varp); if (install_new_value ((*varp), new, type_changed)) { @@ -1071,32 +1069,36 @@ varobj_update (struct varobj **varp, str VEC_safe_push (varobj_p, result, *varp); } - /* Push the root's children */ - for (i = 0; i < VEC_length (varobj_p, (*varp)->children); ++i) - { - VEC_safe_push (varobj_p, stack, - VEC_index (varobj_p, (*varp)->children, i)); - } + VEC_safe_push (varobj_p, stack, *varp); /* Walk through the children, reconstructing them all. */ while (!VEC_empty (varobj_p, stack)) { v = VEC_pop (varobj_p, stack); - /* Push any children */ - for (i = 0; i < VEC_length (varobj_p, v->children); ++i) - { - VEC_safe_push (varobj_p, stack, - VEC_index (varobj_p, v->children, i)); - } - - /* Update this variable */ - new = value_of_child (v->parent, v->index); - if (install_new_value (v, new, 0 /* type not changed */)) - { - /* Note that it's changed */ - VEC_safe_push (varobj_p, result, v); - v->updated = 0; + /* Push any children. Use reverse order so that first + child is popped from the work stack first, and so + will be added to result first. This does not + affect correctness, just "nicer". */ + for (i = VEC_length (varobj_p, v->children)-1; i >= 0; --i) + { + varobj_p c = VEC_index (varobj_p, v->children, i); + /* Child may be NULL is explicitly deleted by -var-delete. */ + if (c != NULL) + VEC_safe_push (varobj_p, stack, c); + } + + /* Update this variable, unless it's root, which is already + updated. */ + if (v != *varp) + { + new = value_of_child (v->parent, v->index); + if (install_new_value (v, new, 0 /* type not changed */)) + { + /* Note that it's changed */ + VEC_safe_push (varobj_p, result, v); + v->updated = 0; + } } }