* varobj.c (install_new_value): Don't
authorVladimir Prus <vladimir@codesourcery.com>
Thu, 27 Sep 2007 18:04:12 +0000 (18:04 +0000)
committerVladimir Prus <vladimir@codesourcery.com>
Thu, 27 Sep 2007 18:04:12 +0000 (18:04 +0000)
call value_get_print_value when a value is
lazy.  Update the print_value member in a
single place.

gdb/ChangeLog
gdb/varobj.c

index 3a94a1a61b46209cbaf47926fe4787a326fafc03..f6cc0e6f23cd61624a840a45bbdc1f40e9ca546c 100644 (file)
@@ -1,3 +1,10 @@
+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
index 5ea81fa3ef66bb7830a0ad6428864de5198cdfea..d6125c6e448fe896378e0e44801d1133c3c2b586 100644 (file)
@@ -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