diff options
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/varobj.c | 29 |
2 files changed, 20 insertions, 16 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3a94a1a..f6cc0e6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2007-09-26 Vladimir Prus <vladimir@codesourcery.com> + * varobj.c (install_new_value): Don't + call value_get_print_value when a value is + lazy. Update the print_value member in a + single place. + +2007-09-26 Vladimir Prus <vladimir@codesourcery.com> + * breakpoint.c (create_breakpoint): Set condition on each location, not on the first location of breakpoint. diff --git a/gdb/varobj.c b/gdb/varobj.c index 5ea81fa..d6125c6 100644 --- a/gdb/varobj.c +++ b/gdb/varobj.c @@ -985,6 +985,7 @@ install_new_value (struct varobj *var, struct value *value, int initial) int need_to_fetch; int changed = 0; int intentionally_not_fetched = 0; + char *print_value = NULL; /* We need to know the varobj's type to decide if the value should be fetched or not. C++ fake children (public/protected/private) don't have @@ -1042,12 +1043,17 @@ install_new_value (struct varobj *var, struct value *value, int initial) } } + /* Below, we'll be comparing string rendering of old and new + values. Don't get string rendering if the value is + lazy -- if it is, the code above has decided that the value + should not be fetched. */ + if (value && !value_lazy (value)) + print_value = value_get_print_value (value, var->format); + /* If the type is changeable, compare the old and the new values. If this is the initial assignment, we don't have any old value to compare with. */ - if (initial && changeable) - var->print_value = value_get_print_value (value, var->format); - else if (changeable) + if (!initial && changeable) { /* If the value of the varobj was changed by -var-set-value, then the value in the varobj and in the target is the same. However, that value @@ -1055,8 +1061,6 @@ install_new_value (struct varobj *var, struct value *value, int initial) -var-update. So need to the varobj as changed. */ if (var->updated) { - xfree (var->print_value); - var->print_value = value_get_print_value (value, var->format); changed = 1; } else @@ -1077,26 +1081,16 @@ install_new_value (struct varobj *var, struct value *value, int initial) ; else if (var->value == NULL || value == NULL) { - xfree (var->print_value); - var->print_value = value_get_print_value (value, var->format); changed = 1; } else { - char *print_value; gdb_assert (!value_lazy (var->value)); gdb_assert (!value_lazy (value)); - print_value = value_get_print_value (value, var->format); gdb_assert (var->print_value != NULL && print_value != NULL); if (strcmp (var->print_value, print_value) != 0) - { - xfree (var->print_value); - var->print_value = print_value; - changed = 1; - } - else - xfree (print_value); + changed = 1; } } } @@ -1105,6 +1099,9 @@ install_new_value (struct varobj *var, struct value *value, int initial) if (var->value != NULL && var->value != value) value_free (var->value); var->value = value; + if (var->print_value) + xfree (var->print_value); + var->print_value = print_value; if (value && value_lazy (value) && intentionally_not_fetched) var->not_fetched = 1; else |