Fix -Werror -Wuninitialized warnings.
[deliverable/binutils-gdb.git] / gdb / mi / mi-cmd-var.c
index cf94496212cc407d7bb674007485b649e6543f9d..dfdc4a63176d86752a4873b8b411951241805d87 100644 (file)
@@ -1,6 +1,6 @@
 /* MI Command Set - varobj commands.
-   Copyright (C) 2000, Free Software Foundation, Inc.
-   Contributed by Cygnus Solutions.
+   Copyright 2000 Free Software Foundation, Inc.
+   Contributed by Cygnus Solutions (a Red Hat company).
 
    This file is part of GDB.
 
 
 extern int varobjdebug;                /* defined in varobj.c */
 
-static void varobj_update_one (struct varobj *var);
+static int varobj_update_one (struct varobj *var);
 
 /* VAROBJ operations */
 
 enum mi_cmd_result
 mi_cmd_var_create (char *command, char **argv, int argc)
 {
-  CORE_ADDR frameaddr;
+  CORE_ADDR frameaddr = 0;
   struct varobj *var;
   char *name;
   char *frame;
   char *expr;
   char *type;
   struct cleanup *old_cleanups;
+  enum varobj_type var_type;
 
   if (argc != 3)
     {
-      /*      asprintf (&mi_error_message,
+      /*      xasprintf (&mi_error_message,
          "mi_cmd_var_create: Usage: .");
          return MI_CMD_ERROR; */
       error ("mi_cmd_var_create: Usage: NAME FRAME EXPRESSION.");
@@ -60,33 +61,37 @@ mi_cmd_var_create (char *command, char **argv, int argc)
   name = xstrdup (argv[0]);
   /* Add cleanup for name. Must be free_current_contents as
      name can be reallocated */
-  old_cleanups = make_cleanup ((make_cleanup_func) free_current_contents,
-                              &name);
+  old_cleanups = make_cleanup (free_current_contents, &name);
 
   frame = xstrdup (argv[1]);
-  old_cleanups = make_cleanup (free, frame);
+  old_cleanups = make_cleanup (xfree, frame);
 
   expr = xstrdup (argv[2]);
 
   if (strcmp (name, "-") == 0)
     {
-      free (name);
+      xfree (name);
       name = varobj_gen_name ();
     }
   else if (!isalpha (*name))
     error ("mi_cmd_var_create: name of object must begin with a letter");
 
   if (strcmp (frame, "*") == 0)
-    frameaddr = -1;
+    var_type = USE_CURRENT_FRAME;
+  else if (strcmp (frame, "@") == 0)
+    var_type = USE_SELECTED_FRAME;  
   else
-    frameaddr = parse_and_eval_address (frame);
+    {
+      var_type = USE_SPECIFIED_FRAME;
+      frameaddr = parse_and_eval_address (frame);
+    }
 
   if (varobjdebug)
     fprintf_unfiltered (gdb_stdlog,
                    "Name=\"%s\", Frame=\"%s\" (0x%s), Expression=\"%s\"\n",
                        name, frame, paddr (frameaddr), expr);
 
-  var = varobj_create (name, expr, frameaddr);
+  var = varobj_create (name, expr, frameaddr, var_type);
 
   if (var == NULL)
     error ("mi_cmd_var_create: unable to create variable object");
@@ -99,7 +104,7 @@ mi_cmd_var_create (char *command, char **argv, int argc)
   else
     {
       ui_out_field_string (uiout, "type", type);
-      free (type);
+      xfree (type);
     }
 
   do_cleanups (old_cleanups);
@@ -122,8 +127,7 @@ mi_cmd_var_delete (char *command, char **argv, int argc)
   name = xstrdup (argv[0]);
   /* Add cleanup for name. Must be free_current_contents as
      name can be reallocated */
-  old_cleanups = make_cleanup ((make_cleanup_func) free_current_contents,
-                              &name);
+  old_cleanups = make_cleanup (free_current_contents, &name);
 
   /* If we have one single argument it cannot be '-c' or any string
      starting with '-'. */
@@ -143,9 +147,9 @@ mi_cmd_var_delete (char *command, char **argv, int argc)
       if (strcmp (name, "-c") != 0)
        error ("mi_cmd_var_delete: Invalid option.");
       children_only_p = 1;
-      free (name);
+      xfree (name);
       name = xstrdup (expr);
-      free (expr);
+      xfree (expr);
     }
 
   /* If we didn't error out, now NAME contains the name of the
@@ -285,7 +289,7 @@ mi_cmd_var_list_children (char *command, char **argv, int argc)
       cc++;
     }
   ui_out_list_end (uiout);
-  free (childlist);
+  xfree (childlist);
   return MI_CMD_DONE;
 }
 
@@ -429,7 +433,7 @@ mi_cmd_var_update (char *command, char **argv, int argc)
          varobj_update_one (*cr);
          cr++;
        }
-      free (rootlist);
+      xfree (rootlist);
       ui_out_list_end (uiout);
     }
   else
@@ -443,12 +447,14 @@ mi_cmd_var_update (char *command, char **argv, int argc)
       varobj_update_one (var);
       ui_out_list_end (uiout);
     }
-  return MI_CMD_DONE;
+    return MI_CMD_DONE;
 }
 
-/* Helper for mi_cmd_var_update() */
+/* Helper for mi_cmd_var_update() Returns 0 if the update for
+   the variable fails (usually because the variable is out of
+   scope), and 1 if it succeeds. */
 
-static void
+static int
 varobj_update_one (struct varobj *var)
 {
   struct varobj **changelist;
@@ -457,18 +463,39 @@ varobj_update_one (struct varobj *var)
 
   nc = varobj_update (var, &changelist);
 
-  if (nc <= 0)
-    return;
-
-  cc = changelist;
-  while (*cc != NULL)
+  /* nc == 0 means that nothing has changed.
+     nc == -1 means that an error occured in updating the variable.
+     nc == -2 means the variable has changed type. */
+  
+  if (nc == 0)
+    return 1;
+  else if (nc == -1)
     {
-      ui_out_field_string (uiout, "name", varobj_get_objname (*cc));
-      cc++;
+      ui_out_field_string (uiout, "name", varobj_get_objname(var));
+      ui_out_field_string (uiout, "in_scope", "false");
+      return -1;
     }
-  free (changelist);
+  else if (nc == -2)
+    {
+      ui_out_field_string (uiout, "name", varobj_get_objname (var));
+      ui_out_field_string (uiout, "in_scope", "true");
+      ui_out_field_string (uiout, "new_type", varobj_get_type(var));
+      ui_out_field_int (uiout, "new_num_children", 
+                          varobj_get_num_children(var));
+    }
+  else
+    {
+      
+      cc = changelist;
+      while (*cc != NULL)
+       {
+         ui_out_field_string (uiout, "name", varobj_get_objname (*cc));
+         ui_out_field_string (uiout, "in_scope", "true");
+         ui_out_field_string (uiout, "type_changed", "false");
+         cc++;
+       }
+      xfree (changelist);
+      return 1;
+    }
+  return 1;
 }
-
-/* Local variables: */
-/* change-log-default-name: "ChangeLog-mi" */
-/* End: */
This page took 0.02906 seconds and 4 git commands to generate.