* linux-low.c (fetch_register, usr_store_inferior_registers): Handle
[deliverable/binutils-gdb.git] / gdb / varobj.c
index d58c8bdbe7477eb331a02260e4af2e670d975c9f..31d8fd2c13ac8090988f9c31f7b4e3e4efc73a0e 100644 (file)
    Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
+#include "exceptions.h"
 #include "value.h"
 #include "expression.h"
 #include "frame.h"
 #include "language.h"
 #include "wrapper.h"
 #include "gdbcmd.h"
+
+#include "gdb_assert.h"
 #include "gdb_string.h"
-#include <math.h>
 
 #include "varobj.h"
 
 /* Non-zero if we want to see trace of varobj level stuff.  */
 
 int varobjdebug = 0;
+static void
+show_varobjdebug (struct ui_file *file, int from_tty,
+                 struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("Varobj debugging is %s.\n"), value);
+}
 
 /* String representations of gdb's format codes */
 char *varobj_format_string[] =
@@ -500,7 +508,7 @@ varobj_create (char *objname,
        {
          /* no error */
          release_value (var->value);
-         if (VALUE_LAZY (var->value))
+         if (value_lazy (var->value))
            gdb_value_fetch_lazy (var->value);
        }
       else
@@ -576,7 +584,7 @@ varobj_get_handle (char *objname)
     cv = cv->next;
 
   if (cv == NULL)
-    error ("Variable object not found");
+    error (_("Variable object not found"));
 
   return cv->var;
 }
@@ -635,7 +643,7 @@ varobj_delete (struct varobj *var, char ***dellist, int only_children)
        }
 
       if (mycount || (*cp != NULL))
-       warning ("varobj_delete: assertion failed - mycount(=%d) <> 0",
+       warning (_("varobj_delete: assertion failed - mycount(=%d) <> 0"),
                 mycount);
     }
 
@@ -784,8 +792,8 @@ int
 varobj_set_value (struct varobj *var, char *expression)
 {
   struct value *val;
-  int error;
   int offset = 0;
+  int error = 0;
 
   /* The argument "expression" contains the variable's new value.
      We need to first construct a legal expression for this -- ugh! */
@@ -875,10 +883,10 @@ int
 varobj_update (struct varobj **varp, struct varobj ***changelist)
 {
   int changed = 0;
+  int error = 0;
   int type_changed;
   int i;
   int vleft;
-  int error2;
   struct varobj *v;
   struct varobj **cv;
   struct varobj **templist = NULL;
@@ -928,14 +936,13 @@ varobj_update (struct varobj **varp, struct varobj ***changelist)
      There a couple of exceptions here, though.
      We don't want some types to be reported as "changed". */
   else if (type_changeable (*varp) &&
-          ((*varp)->updated || !my_value_equal ((*varp)->value, new, &error2)))
+          ((*varp)->updated || !my_value_equal ((*varp)->value, new, &error)))
     {
       vpush (&result, *varp);
       (*varp)->updated = 0;
       changed++;
-      /* error2 replaces var->error since this new value
-         WILL replace the old one. */
-      (*varp)->error = error2;
+      /* Its value is going to be updated to NEW.  */
+      (*varp)->error = error;
     }
 
   /* We must always keep around the new value for this root
@@ -969,16 +976,15 @@ varobj_update (struct varobj **varp, struct varobj ***changelist)
       /* Update this variable */
       new = value_of_child (v->parent, v->index);
       if (type_changeable (v) && 
-          (v->updated || !my_value_equal (v->value, new, &error2)))
+          (v->updated || !my_value_equal (v->value, new, &error)))
        {
          /* Note that it's changed */
          vpush (&result, v);
          v->updated = 0;
          changed++;
        }
-      /* error2 replaces v->error since this new value
-         WILL replace the old one. */
-      v->error = error2;
+      /* Its value is going to be updated to NEW.  */
+      v->error = error;
 
       /* We must always keep new values, since children depend on it. */
       if (v->value != NULL)
@@ -1011,7 +1017,7 @@ varobj_update (struct varobj **varp, struct varobj ***changelist)
       *cv = vpop (&result);
     }
   if (vleft)
-    warning ("varobj_update: assertion failed - vleft <> 0");
+    warning (_("varobj_update: assertion failed - vleft <> 0"));
 
   if (changed > 1)
     {
@@ -1123,7 +1129,7 @@ install_variable (struct varobj *var)
     cv = cv->next;
 
   if (cv != NULL)
-    error ("Duplicate variable object name");
+    error (_("Duplicate variable object name"));
 
   /* Add varobj to hash table */
   newvl = xmalloc (sizeof (struct vlist));
@@ -1438,60 +1444,40 @@ variable_default_display (struct varobj *var)
   return FORMAT_NATURAL;
 }
 
-/* This function is similar to gdb's value_equal, except that this
-   one is "safe" -- it NEVER longjmps. It determines if the VAR's
-   value is the same as VAL2. */
+/* This function is similar to GDB's value_contents_equal, except that
+   this one is "safe"; it never longjmps.  It determines if the VAL1's
+   value is the same as VAL2.  If for some reason the value of VAR2
+   can't be established, *ERROR2 is set to non-zero.  */
+
 static int
-my_value_equal (struct value *val1, struct value *val2, int *error2)
+my_value_equal (struct value *val1, struct value *volatile val2, int *error2)
 {
-  int r, err1, err2;
+  volatile struct gdb_exception except;
 
-  *error2 = 0;
-  /* Special case: NULL values. If both are null, say
-     they're equal. */
+  /* As a special case, if both are null, we say they're equal.  */
   if (val1 == NULL && val2 == NULL)
     return 1;
   else if (val1 == NULL || val2 == NULL)
     return 0;
 
-  /* This is bogus, but unfortunately necessary. We must know
-     exactly what caused an error -- reading val1 or val2 --  so
-     that we can really determine if we think that something has changed. */
-  err1 = 0;
-  err2 = 0;
-  /* We do need to catch errors here because the whole purpose
-     is to test if value_equal() has errored */
-  if (!gdb_value_equal (val1, val1, &r))
-    err1 = 1;
-
-  if (!gdb_value_equal (val2, val2, &r))
-    *error2 = err2 = 1;
+  /* The contents of VAL1 are supposed to be known.  */
+  gdb_assert (!value_lazy (val1));
 
-  if (err1 != err2)
-    return 0;
-
-  if (!gdb_value_equal (val1, val2, &r))
+  /* Make sure we also know the contents of VAL2.  */
+  val2 = coerce_array (val2);
+  TRY_CATCH (except, RETURN_MASK_ERROR)
     {
-      /* An error occurred, this could have happened if
-         either val1 or val2 errored. ERR1 and ERR2 tell
-         us which of these it is. If both errored, then
-         we assume nothing has changed. If one of them is
-         valid, though, then something has changed. */
-      if (err1 == err2)
-       {
-         /* both the old and new values caused errors, so
-            we say the value did not change */
-         /* This is indeterminate, though. Perhaps we should
-            be safe and say, yes, it changed anyway?? */
-         return 1;
-       }
-      else
-       {
-         return 0;
-       }
+      if (value_lazy (val2))
+       value_fetch_lazy (val2);
     }
+  if (except.reason < 0)
+    {
+      *error2 = 1;
+      return 0;
+    }
+  gdb_assert (!value_lazy (val2));
 
-  return r;
+  return value_contents_equal (val1, val2);
 }
 
 /* FIXME: The following should be generic for any pointer */
@@ -1686,7 +1672,7 @@ value_of_child (struct varobj *parent, int index)
   value = (*parent->root->lang->value_of_child) (parent, index);
 
   /* If we're being lazy, fetch the real value of the variable. */
-  if (value != NULL && VALUE_LAZY (value))
+  if (value != NULL && value_lazy (value))
     {
       /* If we fail to fetch the value of the child, return
          NULL so that callers notice that we're leaving an
@@ -1904,14 +1890,14 @@ c_value_of_root (struct varobj **var_handle)
          go on */
       if (gdb_evaluate_expression (var->root->exp, &new_val))
        {
-         if (VALUE_LAZY (new_val))
+         if (value_lazy (new_val))
            {
              /* We need to catch errors because if
                 value_fetch_lazy fails we still want to continue
                 (after making val->error = 1) */
-             /* FIXME: Shouldn't be using VALUE_CONTENTS?  The
-                comment on value_fetch_lazy() says it is only
-                called from the macro... */
+             /* FIXME: Shouldn't be using value_contents()?  The
+                comment on value_fetch_lazy() says it is only called
+                from the macro... */
              if (!gdb_value_fetch_lazy (new_val))
                var->error = 1;
              else
@@ -2025,7 +2011,7 @@ c_type_of_child (struct varobj *parent, int index)
 
     default:
       /* This should not happen as only the above types have children */
-      warning ("Child of parent whose type does not allow children");
+      warning (_("Child of parent whose type does not allow children"));
       /* FIXME: Can we still go on? */
       type = NULL;
       break;
@@ -2092,12 +2078,10 @@ c_value_of_variable (struct varobj *var)
            struct cleanup *old_chain = make_cleanup_ui_file_delete (stb);
            char *thevalue;
 
-           if (VALUE_LAZY (var->value))
+           if (value_lazy (var->value))
              gdb_value_fetch_lazy (var->value);
-           val_print (value_type (var->value),
-                      value_contents_raw (var->value), 0,
-                      VALUE_ADDRESS (var->value), stb,
-                      format_code[(int) var->format], 1, 0, 0);
+           common_val_print (var->value, stb,
+                             format_code[(int) var->format], 1, 0, 0);
            thevalue = ui_file_xstrdup (stb, &dummy);
            do_cleanups (old_chain);
        return thevalue;
@@ -2559,7 +2543,12 @@ _initialize_varobj (void)
   varobj_table = xmalloc (sizeof_table);
   memset (varobj_table, 0, sizeof_table);
 
-  deprecated_add_show_from_set (add_set_cmd ("debugvarobj", class_maintenance, var_zinteger, (char *) &varobjdebug, "Set varobj debugging.\n\
-When non-zero, varobj debugging is enabled.", &setlist),
-                    &showlist);
+  add_setshow_zinteger_cmd ("debugvarobj", class_maintenance,
+                           &varobjdebug, _("\
+Set varobj debugging."), _("\
+Show varobj debugging."), _("\
+When non-zero, varobj debugging is enabled."),
+                           NULL,
+                           show_varobjdebug,
+                           &setlist, &showlist);
 }
This page took 0.029438 seconds and 4 git commands to generate.