This is the mail archive of the gdb-patches@sourceware.cygnus.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

RFA: Patch to add "auto-evaluate" variables to varobj package.


Hi, all...

This, patch adds another variable type to the variable object system
used by the mi & gdbtk.  This is a variable type that is ALWAYS
updated in the current scope.  If there is no such variable, update
returns an appropriate error.  If the variable exists but is of a
different type, the children are all killed, and the value
reconstituted.

There are also testsuite changes to handle some output differences
(like update now tells you if the variable is still in scope.)  There
is also, at the very bottom, a change to gdb.lib in the support
routine for the gdbtk testsuite.  This is needed to get the testsuite
to run for the new directory layout.

What do you think?

Jim

Index: varobj.c
===================================================================
RCS file: /cvs/src/src/gdb/varobj.c,v
retrieving revision 1.1.1.1
diff -p -p -r1.1.1.1 varobj.c
*** varobj.c	2000/02/03 04:14:36	1.1.1.1
--- varobj.c	2000/03/10 23:43:27
*************** struct varobj_root
*** 56,61 ****
--- 56,65 ----
      /* The frame for this expression */
      CORE_ADDR frame;
  
+     /* If 1, "update" always recomputes the frame & valid block
+        using the currently selected frame. */
+     int use_selected_frame;
+ 
      /* Language info for this variable and its children */
      struct language_specific *lang;
  
*************** static char *name_of_variable PARAMS ((s
*** 204,210 ****
  
  static char *name_of_child PARAMS ((struct varobj *, int));
  
! static value_ptr value_of_root PARAMS ((struct varobj * var));
  
  static value_ptr value_of_child PARAMS ((struct varobj * parent, int index));
  
--- 208,215 ----
  
  static char *name_of_child PARAMS ((struct varobj *, int));
  
! static value_ptr value_of_root PARAMS ((struct varobj ** var_handle,
! 					int *));
  
  static value_ptr value_of_child PARAMS ((struct varobj * parent, int index));
  
*************** static char *c_name_of_variable PARAMS (
*** 224,230 ****
  
  static char *c_name_of_child PARAMS ((struct varobj * parent, int index));
  
! static value_ptr c_value_of_root PARAMS ((struct varobj * var));
  
  static value_ptr c_value_of_child PARAMS ((struct varobj * parent, int index));
  
--- 229,235 ----
  
  static char *c_name_of_child PARAMS ((struct varobj * parent, int index));
  
! static value_ptr c_value_of_root PARAMS ((struct varobj ** var_handle));
  
  static value_ptr c_value_of_child PARAMS ((struct varobj * parent, int index));
  
*************** static char *cplus_name_of_variable PARA
*** 244,250 ****
  
  static char *cplus_name_of_child PARAMS ((struct varobj * parent, int index));
  
! static value_ptr cplus_value_of_root PARAMS ((struct varobj * var));
  
  static value_ptr cplus_value_of_child PARAMS ((struct varobj * parent, int index));
  
--- 249,255 ----
  
  static char *cplus_name_of_child PARAMS ((struct varobj * parent, int index));
  
! static value_ptr cplus_value_of_root PARAMS ((struct varobj ** var_handle));
  
  static value_ptr cplus_value_of_child PARAMS ((struct varobj * parent, int index));
  
*************** static char *java_name_of_variable PARAM
*** 262,268 ****
  
  static char *java_name_of_child PARAMS ((struct varobj * parent, int index));
  
! static value_ptr java_value_of_root PARAMS ((struct varobj * var));
  
  static value_ptr java_value_of_child PARAMS ((struct varobj * parent, int index));
  
--- 267,273 ----
  
  static char *java_name_of_child PARAMS ((struct varobj * parent, int index));
  
! static value_ptr java_value_of_root PARAMS ((struct varobj ** var_handle));
  
  static value_ptr java_value_of_child PARAMS ((struct varobj * parent, int index));
  
*************** struct language_specific
*** 290,296 ****
      char *(*name_of_child) PARAMS ((struct varobj * parent, int index));
  
      /* The value_ptr of the root variable ROOT. */
!       value_ptr (*value_of_root) PARAMS ((struct varobj * root));
  
      /* The value_ptr of the INDEX'th child of PARENT. */
        value_ptr (*value_of_child) PARAMS ((struct varobj * parent, int index));
--- 295,301 ----
      char *(*name_of_child) PARAMS ((struct varobj * parent, int index));
  
      /* The value_ptr of the root variable ROOT. */
!       value_ptr (*value_of_root) PARAMS ((struct varobj ** root_handle));
  
      /* The value_ptr of the INDEX'th child of PARENT. */
        value_ptr (*value_of_child) PARAMS ((struct varobj * parent, int index));
*************** static struct vlist **varobj_table;
*** 401,407 ****
  
  struct varobj *
  varobj_create (char *objname,
! 	       char *expression, CORE_ADDR frame)
  {
    struct varobj *var;
    struct frame_info *fi, *old_fi;
--- 406,413 ----
  
  struct varobj *
  varobj_create (char *objname,
! 	       char *expression, CORE_ADDR frame,
! 	       enum varobj_type type)
  {
    struct varobj *var;
    struct frame_info *fi, *old_fi;
*************** varobj_create (char *objname,
*** 421,439 ****
           of the variable's data as possible */
  
        /* Allow creator to specify context of variable */
!       if (frame == (CORE_ADDR) -1)
  	fi = selected_frame;
        else
  	fi = find_frame_addr_in_frame_chain (frame);
  
        block = NULL;
        if (fi != NULL)
  	block = get_frame_block (fi);
  
        p = expression;
        innermost_block = NULL;
!       /* Callee may longjump */
!       var->root->exp = parse_exp_1 (&p, block, 0);
  
        /* Don't allow variables to be created for types. */
        if (var->root->exp->elts[0].opcode == OP_TYPE)
--- 427,454 ----
           of the variable's data as possible */
  
        /* Allow creator to specify context of variable */
!       if ((type == USE_CURRENT_FRAME)
! 	  || (type == USE_SELECTED_FRAME))
  	fi = selected_frame;
        else
  	fi = find_frame_addr_in_frame_chain (frame);
  
+       /* frame = -2 means always use selected frame */
+       if (type == USE_SELECTED_FRAME)
+ 	var->root->use_selected_frame = 1;
+ 
        block = NULL;
        if (fi != NULL)
  	block = get_frame_block (fi);
  
        p = expression;
        innermost_block = NULL;
!       /* Wrap the call to parse expression, so we can 
!          return a sensible error. */
!       if (!gdb_parse_exp_1 (&p, block, 0, &var->root->exp))
! 	{
! 	  return NULL;
! 	}
  
        /* Don't allow variables to be created for types. */
        if (var->root->exp->elts[0].opcode == OP_TYPE)
*************** varobj_create (char *objname,
*** 485,492 ****
        if (fi != NULL)
  	select_frame (old_fi, -1);
      }
  
!   if (var != NULL)
      {
        var->obj_name = savestring (objname, strlen (objname));
  
--- 500,510 ----
        if (fi != NULL)
  	select_frame (old_fi, -1);
      }
+ 
+   /* If the variable object name is null, that means this
+      is a temporary variable, so don't install it. */
  
!   if ((var != NULL) && (objname != NULL))
      {
        var->obj_name = savestring (objname, strlen (objname));
  
*************** varobj_list (struct varobj ***varlist)
*** 845,850 ****
--- 863,872 ----
     expression to see if it's changed.  Then go all the way
     through its children, reconstructing them and noting if they've
     changed.
+    Return value:
+     -1 if there was an error updating the varobj
+     -2 if the type changed
+     Otherwise it is the number of children + parent changed
  
     Only root variables can be updated... */
  
*************** int
*** 852,857 ****
--- 874,880 ----
  varobj_update (struct varobj *var, struct varobj ***changelist)
  {
    int changed = 0;
+   int type_changed;
    int i;
    int vleft;
    int error2;
*************** varobj_update (struct varobj *var, struc
*** 878,896 ****
  
    /* Update the root variable. value_of_root can return NULL
       if the variable is no longer around, i.e. we stepped out of
!      the frame in which a local existed. */
!   new = value_of_root (var);
    if (new == NULL)
!     return -1;
  
    /* Initialize a stack for temporary results */
    vpush (&result, NULL);
  
!   if (!my_value_equal (var->value, new, &error2))
      {
        /* Note that it's changed   There a couple of exceptions here,
!          though. We don't want some types to be reported as "changed". */
!       if (type_changeable (var))
  	{
  	  vpush (&result, var);
  	  changed++;
--- 901,927 ----
  
    /* Update the root variable. value_of_root can return NULL
       if the variable is no longer around, i.e. we stepped out of
!      the frame in which a local existed. We are letting the 
!      value_of_root variable dispose of the varobj if the type
!      has changed. */
!   type_changed = 1;
!   new = value_of_root (&var, &type_changed);
    if (new == NULL)
!     {
!       var->error = 1;
!       return -1;
!     }
  
    /* Initialize a stack for temporary results */
    vpush (&result, NULL);
  
!   if (type_changed || !my_value_equal (var->value, new, &error2))
      {
        /* Note that it's changed   There a couple of exceptions here,
!          though. We don't want some types to be reported as 
! 	 "changed". The exception to this is if this is a 
! 	 "use_selected_frame" varobj, and its type has changed. */
!       if (type_changed || type_changeable (var))
  	{
  	  vpush (&result, var);
  	  changed++;
*************** varobj_update (struct varobj *var, struc
*** 984,990 ****
    /* Restore selected frame */
    select_frame (old_fi, -1);
  
!   return changed;
  }
  
  
--- 1015,1024 ----
    /* Restore selected frame */
    select_frame (old_fi, -1);
  
!   if (type_changed)
!     return -2;
!   else
!     return changed;
  }
  
  
*************** delete_variable_1 (resultp, delcountp, v
*** 1039,1047 ****
      return;
  
    /* Otherwise, add it to the list of deleted ones and proceed to do so */
!   if (var->obj_name == NULL)
!     warning ("Assertion failed: NULL var->obj_name unexpectdly found");
!   else
      {
        cppush (resultp, strdup (var->obj_name));
        *delcountp = *delcountp + 1;
--- 1073,1081 ----
      return;
  
    /* Otherwise, add it to the list of deleted ones and proceed to do so */
!   /* If the name is null, this is a temporary variable, that has not
!      yet been installed, don't report it, it belongs to the caller... */
!   if (var->obj_name != NULL)
      {
        cppush (resultp, strdup (var->obj_name));
        *delcountp = *delcountp + 1;
*************** delete_variable_1 (resultp, delcountp, v
*** 1057,1064 ****
      {
        remove_child_from_parent (var->parent, var);
      }
! 
!   uninstall_variable (var);
  
    /* Free memory associated with this variable */
    free_variable (var);
--- 1091,1099 ----
      {
        remove_child_from_parent (var->parent, var);
      }
!   
!   if (var->obj_name != NULL)
!     uninstall_variable (var);
  
    /* Free memory associated with this variable */
    free_variable (var);
*************** new_root_variable (void)
*** 1315,1320 ****
--- 1350,1356 ----
    var->root->exp = NULL;
    var->root->valid_block = NULL;
    var->root->frame = (CORE_ADDR) -1;
+   var->root->use_selected_frame = 0;
    var->root->rootvar = NULL;
  
    return var;
*************** name_of_child (var, index)
*** 1578,1589 ****
    return (*var->root->lang->name_of_child) (var, index);
  }
  
! /* What is the value_ptr of the root variable VAR? */
  static value_ptr
! value_of_root (var)
!      struct varobj *var;
  {
!   return (*var->root->lang->value_of_root) (var);
  }
  
  /* What is the value_ptr for the INDEX'th child of PARENT? */
--- 1614,1687 ----
    return (*var->root->lang->name_of_child) (var, index);
  }
  
! /* What is the value_ptr of the root variable VAR? 
!    TYPE_CHANGED controls what to do if the type of a
!    use_selected_frame = 1 variable changes.  On input,
!    TYPE_CHANGED = 1 means discard the old varobj, and replace
!    it with this one.  TYPE_CHANGED = 0 means leave it around.
!    NB: In both cases, var_handle will point to the new varobj,
!    so if you use TYPE_CHANGED = 0, you will have to stash the
!    old varobj pointer away somewhere before calling this.
!    On return, TYPE_CHANGED will be 1 if the type has changed, and 
!    0 otherwise. */
  static value_ptr
! value_of_root (var_handle, type_changed)
!      struct varobj ** var_handle;
!      int *type_changed;
  {
!   struct varobj *var;
! 
!   if (var_handle == NULL)
!     return NULL;
! 
!   var = *var_handle;
! 
!   /* This should really be an exception, since this should
!      only get called with a root variable. */
! 
!   if (var->root->rootvar != var)
!     return NULL;
! 
!   if (var->root->use_selected_frame)
!     {
!       struct varobj *tmp_var;
!       char *old_type, *new_type;
!       old_type = varobj_get_type (var);
!       tmp_var = varobj_create (NULL, var->name, (CORE_ADDR) 0,
! 			       USE_SELECTED_FRAME);
!       if (tmp_var == NULL)
! 	{
! 	  return NULL;
! 	}
!       new_type = varobj_get_type (tmp_var);
!       if (strcmp(old_type, new_type) == 0)
! 	{
! 	  varobj_delete (tmp_var, NULL, 0);
! 	  *type_changed = 0;
! 	}
!       else
! 	{
! 	  if (*type_changed)
! 	    {
! 	      tmp_var->obj_name = 
! 		savestring (var->obj_name, strlen (var->obj_name));
! 	      uninstall_variable (var);
! 	    }
! 	  else
! 	    {
! 	      tmp_var->obj_name = varobj_gen_name ();  
! 	    }
! 	  install_variable (tmp_var);
! 	  *var_handle = tmp_var;
! 	  *type_changed = 1;
! 	}
!     }
!   else
!     {
!       *type_changed = 0;
!     }
! 
!   return (*var->root->lang->value_of_root) (var_handle);
  }
  
  /* What is the value_ptr for the INDEX'th child of PARENT? */
*************** c_name_of_child (parent, index)
*** 1790,1827 ****
  }
  
  static value_ptr
! c_value_of_root (var)
!      struct varobj *var;
  {
    value_ptr new_val;
    struct frame_info *fi;
    int within_scope;
  
    /* Determine whether the variable is still around. */
    if (var->root->valid_block == NULL)
      within_scope = 1;
    else
      {
        reinit_frame_cache ();
        fi = find_frame_addr_in_frame_chain (var->root->frame);
        within_scope = fi != NULL;
        /* FIXME: select_frame could fail */
        if (within_scope)
  	select_frame (fi, -1);
      }
! 
    if (within_scope)
      {
!       /* We need to catch errors here, because if evaluate expression fails
!          we just want to make val->error = 1 and go on */
        if (gdb_evaluate_expression (var->root->exp, &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... */
  	      if (!gdb_value_fetch_lazy (new_val))
  		var->error = 1;
  	      else
--- 1888,1938 ----
  }
  
  static value_ptr
! c_value_of_root (var_handle)
!      struct varobj **var_handle;
  {
    value_ptr new_val;
+   struct varobj *var = *var_handle;
    struct frame_info *fi;
    int within_scope;
  
+   /*  Only root variables can be updated... */
+   if (var->root->rootvar != var)
+     /* Not a root var */
+     return NULL;
+ 
+   
    /* Determine whether the variable is still around. */
    if (var->root->valid_block == NULL)
      within_scope = 1;
    else
      {
        reinit_frame_cache ();
+       
+       
        fi = find_frame_addr_in_frame_chain (var->root->frame);
+       
        within_scope = fi != NULL;
        /* FIXME: select_frame could fail */
        if (within_scope)
  	select_frame (fi, -1);
      }
!   
    if (within_scope)
      {
!       /* We need to catch errors here, because if evaluate
! 	 expression fails we just want to make val->error = 1 and
! 	 go on */
        if (gdb_evaluate_expression (var->root->exp, &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... */
  	      if (!gdb_value_fetch_lazy (new_val))
  		var->error = 1;
  	      else
*************** c_value_of_root (var)
*** 1830,1836 ****
  	}
        else
  	var->error = 1;
! 
        release_value (new_val);
        return new_val;
      }
--- 1941,1947 ----
  	}
        else
  	var->error = 1;
!       
        release_value (new_val);
        return new_val;
      }
*************** cplus_name_of_child (parent, index)
*** 2194,2203 ****
  }
  
  static value_ptr
! cplus_value_of_root (var)
!      struct varobj *var;
  {
!   return c_value_of_root (var);
  }
  
  static value_ptr
--- 2305,2314 ----
  }
  
  static value_ptr
! cplus_value_of_root (var_handle)
!      struct varobj **var_handle;
  {
!   return c_value_of_root (var_handle);
  }
  
  static value_ptr
*************** java_name_of_child (parent, index)
*** 2367,2376 ****
  }
  
  static value_ptr
! java_value_of_root (var)
!      struct varobj *var;
  {
!   return cplus_value_of_root (var);
  }
  
  static value_ptr
--- 2478,2487 ----
  }
  
  static value_ptr
! java_value_of_root (var_handle)
!      struct varobj **var_handle;
  {
!   return cplus_value_of_root (var_handle);
  }
  
  static value_ptr
Index: varobj.h
===================================================================
RCS file: /cvs/src/src/gdb/varobj.h,v
retrieving revision 1.1.1.1
diff -p -p -r1.1.1.1 varobj.h
*** varobj.h	2000/02/03 04:14:36	1.1.1.1
--- varobj.h	2000/03/10 23:43:27
*************** enum varobj_display_formats
*** 32,37 ****
--- 32,44 ----
      FORMAT_OCTAL		/* Octal display                     */
    };
  
+ enum varobj_type
+   {
+     USE_SPECIFIED_FRAME,        /* Use the frame passed to varobj_create */
+     USE_CURRENT_FRAME,          /* Use the current frame */
+     USE_SELECTED_FRAME          /* Always reevaluate in selected frame */
+   };
+     
  /* String representations of gdb's format codes (defined in varobj.c) */
  extern char *varobj_format_string[];
  
*************** struct varobj;
*** 50,56 ****
  /* API functions */
  
  extern struct varobj *varobj_create (char *objname,
! 				     char *expression, CORE_ADDR frame);
  
  extern char *varobj_gen_name (void);
  
--- 57,64 ----
  /* API functions */
  
  extern struct varobj *varobj_create (char *objname,
! 				     char *expression, CORE_ADDR frame,
! 				     enum varobj_type type);
  
  extern char *varobj_gen_name (void);
  
Index: wrapper.c
===================================================================
RCS file: /cvs/src/src/gdb/wrapper.c,v
retrieving revision 1.1.1.1
diff -p -p -r1.1.1.1 wrapper.c
*** wrapper.c	2000/02/03 04:14:36	1.1.1.1
--- wrapper.c	2000/03/10 23:43:27
*************** struct gdb_wrapper_arguments
*** 33,38 ****
--- 33,42 ----
      char *args[10];
    };
  
+ int gdb_parse_exp_1 PARAMS ((char **, struct block *, 
+ 			     int, struct expression **));
+ int wrap_parse_exp_1 PARAMS ((char *));
+ 
  int gdb_evaluate_expression PARAMS ((struct expression *, value_ptr *));
  int wrap_evaluate_expression PARAMS ((char *));
  
*************** int gdb_value_ind PARAMS ((value_ptr val
*** 46,51 ****
--- 50,91 ----
  int wrap_value_ind PARAMS ((char *opaque_arg));
  
  int
+ gdb_parse_exp_1 (stringptr, block, comma, expression)
+      char **stringptr;
+      struct block *block;
+      int comma;
+      struct expression **expression;
+ {
+   struct gdb_wrapper_arguments args;
+   args.args[0] = (char *) stringptr;
+   args.args[1] = (char *) block;
+   args.args[2] = (char *) comma;
+ 
+   if (!catch_errors ((catch_errors_ftype *) wrap_parse_exp_1, &args,
+ 		     "", RETURN_MASK_ERROR))
+     {
+       /* An error occurred */
+       return 0;
+     }
+ 
+   *expression = (struct expression *) args.result;
+   return 1;
+   
+ }
+ 
+ int
+ wrap_parse_exp_1 (argptr)
+      char *argptr;
+ {
+   struct gdb_wrapper_arguments *args 
+     = (struct gdb_wrapper_arguments *) argptr;
+   args->result = (char *) parse_exp_1((char **) args->args[0],
+ 				      (struct block *) args->args[1],
+ 				      (int) args->args[2]);
+   return 1;
+ }
+ 
+ int
  gdb_evaluate_expression (exp, value)
       struct expression *exp;
       value_ptr *value;
*************** wrap_value_ind (opaque_arg)
*** 163,165 ****
--- 203,206 ----
    (args)->result = (char *) value_ind (val);
    return 1;
  }
+ 
Index: wrapper.h
===================================================================
RCS file: /cvs/src/src/gdb/wrapper.h,v
retrieving revision 1.1.1.1
diff -p -p -r1.1.1.1 wrapper.h
*** wrapper.h	2000/02/03 04:14:36	1.1.1.1
--- wrapper.h	2000/03/10 23:43:27
***************
*** 22,27 ****
--- 22,31 ----
  /* Use this struct used to pass arguments to wrapper routines. */
  struct gdb_wrapper_arguments;
  
+ extern int gdb_parse_exp_1 PARAMS ((char **, struct block *, 
+ 			     int, struct expression **));
+ extern int wrap_parse_exp_1 PARAMS ((char *));
+ 
  extern int gdb_evaluate_expression PARAMS ((struct expression *, value_ptr *));
  extern int wrap_evaluate_expression PARAMS ((char *));
  
Index: gdbtk/generic/gdbtk-varobj.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-varobj.c,v
retrieving revision 1.1.1.1
diff -p -p -r1.1.1.1 gdbtk-varobj.c
*** gdbtk-varobj.c	2000/02/07 00:19:42	1.1.1.1
--- gdbtk-varobj.c	2000/03/10 23:43:27
*************** variable_create (interp, objc, objv)
*** 305,310 ****
--- 305,311 ----
    char *obj_name;
    int index;
    CORE_ADDR frame = (CORE_ADDR) -1;
+   int how_specified = USE_SELECTED_FRAME;
  
    /* REMINDER: This command may be invoked in the following ways:
       gdb_variable create [NAME] [-expr EXPR] [-frame FRAME]
*************** variable_create (interp, objc, objv)
*** 356,361 ****
--- 357,363 ----
  	    char *str;
  	    str = Tcl_GetStringFromObj (objv[1], NULL);
  	    frame = parse_and_eval_address (str);
+ 	    how_specified = USE_SPECIFIED_FRAME;
  	    objc--;
  	    objv++;
  	  }
*************** variable_create (interp, objc, objv)
*** 370,376 ****
      }
  
    /* Create the variable */
!   var = varobj_create (obj_name, name, frame);
  
    if (var != NULL)
      {
--- 372,378 ----
      }
  
    /* Create the variable */
!   var = varobj_create (obj_name, name, frame, how_specified);
  
    if (var != NULL)
      {
Index: mi/mi-cmd-var.c
===================================================================
RCS file: /cvs/src/src/gdb/mi/mi-cmd-var.c,v
retrieving revision 1.2
diff -p -p -r1.2 mi-cmd-var.c
*** mi-cmd-var.c	2000/02/23 06:19:22	1.2
--- mi-cmd-var.c	2000/03/10 23:43:28
***************
*** 34,53 ****
  
  extern int varobjdebug;		/* defined in varobj.c */
  
! static void 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;
    struct varobj *var;
    char *name;
    char *frame;
    char *expr;
    char *type;
    struct cleanup *old_cleanups;
  
    if (argc != 3)
      {
--- 34,54 ----
  
  extern int varobjdebug;		/* defined in varobj.c */
  
! 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 = 0;
    struct varobj *var;
    char *name;
    char *frame;
    char *expr;
    char *type;
    struct cleanup *old_cleanups;
+   enum varobj_type var_type;
  
    if (argc != 3)
      {
*************** mi_cmd_var_create (char *command, char *
*** 77,92 ****
      error ("mi_cmd_var_create: name of object must begin with a letter");
  
    if (strcmp (frame, "*") == 0)
!     frameaddr = -1;
    else
!     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);
  
    if (var == NULL)
      error ("mi_cmd_var_create: unable to create variable object");
--- 78,98 ----
      error ("mi_cmd_var_create: name of object must begin with a letter");
  
    if (strcmp (frame, "*") == 0)
!     var_type = USE_CURRENT_FRAME;
!   else if (strcmp (frame, "@") == 0)
!     var_type = USE_SELECTED_FRAME;  
    else
!     {
!       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_type);
  
    if (var == NULL)
      error ("mi_cmd_var_create: unable to create variable object");
*************** mi_cmd_var_update (char *command, char *
*** 443,454 ****
        varobj_update_one (var);
        ui_out_list_end (uiout);
      }
!   return MI_CMD_DONE;
  }
  
! /* Helper for mi_cmd_var_update() */
  
! static void
  varobj_update_one (struct varobj *var)
  {
    struct varobj **changelist;
--- 449,462 ----
        varobj_update_one (var);
        ui_out_list_end (uiout);
      }
!     return MI_CMD_DONE;
  }
  
! /* 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 int
  varobj_update_one (struct varobj *var)
  {
    struct varobj **changelist;
*************** varobj_update_one (struct varobj *var)
*** 457,472 ****
  
    nc = varobj_update (var, &changelist);
  
!   if (nc <= 0)
!     return;
! 
!   cc = changelist;
!   while (*cc != NULL)
      {
!       ui_out_field_string (uiout, "name", varobj_get_objname (*cc));
!       cc++;
      }
!   free (changelist);
  }
  
  /* Local variables: */
--- 465,505 ----
  
    nc = varobj_update (var, &changelist);
  
!   /* 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(var));
!       ui_out_field_string (uiout, "in_scope", "false");
!       return -1;
!     }
!   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++;
! 	}
!       free (changelist);
!       return 1;
      }
!   return 1;
  }
  
  /* Local variables: */
Index: testsuite/gdb.mi/mi-var-block.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.mi/mi-var-block.exp,v
retrieving revision 1.1
diff -p -p -r1.1 mi-var-block.exp
*** mi-var-block.exp	2000/02/23 00:25:43	1.1
--- mi-var-block.exp	2000/03/10 23:43:28
*************** mi_gdb_test "-var-create cb * cb" \
*** 62,68 ****
  	"create local variable cb"
  
  mi_gdb_test "-var-create foo * foo" \
! 	"&\"No symbol \\\\\"foo\\\\\" in current context.\\\\n\".*\\^error,msg=\"No symbol \\\\\"foo\\\\\" in current context.\"" \
  	"create local variable foo"
  
  # step to "foo = 123;"
--- 62,68 ----
  	"create local variable cb"
  
  mi_gdb_test "-var-create foo * foo" \
! 	"&\"mi_cmd_var_create: unable to create variable object\\\\n\".*\\^error,msg=\"mi_cmd_var_create: unable to create variable object\"" \
  	"create local variable foo"
  
  # step to "foo = 123;"
*************** gdb_expect {
*** 103,109 ****
  # Test: c_variable-3.4
  # Desc: check foo, cb changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"foo\",name=\"cb\"\}" \
  	"update all vars: cb foo changed"
  
  # step to "foo = 321;"
--- 103,109 ----
  # Test: c_variable-3.4
  # Desc: check foo, cb changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"foo\",in_scope=\"true\",type_changed=\"false\",name=\"cb\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars: cb foo changed"
  
  # step to "foo = 321;"
Index: testsuite/gdb.mi/mi-var-child.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.mi/mi-var-child.exp,v
retrieving revision 1.1
diff -p -p -r1.1 mi-var-child.exp
*** mi-var-child.exp	2000/02/23 00:25:43	1.1
--- mi-var-child.exp	2000/03/10 23:43:28
*************** gdb_expect {
*** 784,790 ****
  # Test: c_variable-5.2
  # Desc: check that integer changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"struct_declarations.integer\"\}" \
  	"update all vars struct_declarations.integer"
  
  # Step over:
--- 784,790 ----
  # Test: c_variable-5.2
  # Desc: check that integer changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"struct_declarations.integer\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars struct_declarations.integer"
  
  # Step over:
*************** gdb_expect {
*** 805,811 ****
  # Test: c_variable-5.3
  # Desc: check that char_ptr changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"struct_declarations.char_ptr\"\}" \
  	"update all vars struct_declarations.char_ptr"
  
  # Step over "struct_declarations.int_ptr_ptr = &foo;"
--- 805,811 ----
  # Test: c_variable-5.3
  # Desc: check that char_ptr changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"struct_declarations.char_ptr\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars struct_declarations.char_ptr"
  
  # Step over "struct_declarations.int_ptr_ptr = &foo;"
*************** gdb_expect {
*** 822,828 ****
  # Test: c_variable-5.4
  # Desc: check that int_ptr_ptr and children changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"weird->int_ptr_ptr\",name=\"weird->int_ptr_ptr.\\*weird->int_ptr_ptr\",name=\"weird->int_ptr_ptr.\\*weird->int_ptr_ptr.\\*\\*weird->int_ptr_ptr\",name=\"struct_declarations.int_ptr_ptr\",name=\"struct_declarations.int_ptr_ptr.\\*int_ptr_ptr\",name=\"struct_declarations.int_ptr_ptr.\\*int_ptr_ptr.\\*\\*int_ptr_ptr\"\}" \
  	"update all vars int_ptr_ptr and children changed"
  
  # Step over "weird->long_array[0] = 1234;"
--- 822,828 ----
  # Test: c_variable-5.4
  # Desc: check that int_ptr_ptr and children changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"weird->int_ptr_ptr\",in_scope=\"true\",type_changed=\"false\",name=\"weird->int_ptr_ptr.\\*weird->int_ptr_ptr\",in_scope=\"true\",type_changed=\"false\",name=\"weird->int_ptr_ptr.\\*weird->int_ptr_ptr.\\*\\*weird->int_ptr_ptr\",in_scope=\"true\",type_changed=\"false\",name=\"struct_declarations.int_ptr_ptr\",in_scope=\"true\",type_changed=\"false\",name=\"struct_declarations.int_ptr_ptr.\\*int_ptr_ptr\",in_scope=\"true\",type_changed=\"false\",name=\"struct_declarations.int_ptr_ptr.\\*int_ptr_ptr.\\*\\*int_ptr_ptr\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars int_ptr_ptr and children changed"
  
  # Step over "weird->long_array[0] = 1234;"
*************** gdb_expect {
*** 839,845 ****
  # Test: c_variable-5.5
  # Desc: check that long_array[0] changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"struct_declarations.long_array.0\"\}" \
  	"update all vars struct_declarations.long_array.0 changed"
  
  # Step over "struct_declarations.long_array[1] = 2345;"
--- 839,845 ----
  # Test: c_variable-5.5
  # Desc: check that long_array[0] changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"struct_declarations.long_array.0\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars struct_declarations.long_array.0 changed"
  
  # Step over "struct_declarations.long_array[1] = 2345;"
*************** gdb_expect {
*** 856,862 ****
  # Test: c_variable-5.6
  # Desc: check that long_array[1] changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"struct_declarations.long_array.1\"\}" \
  	"update all vars struct_declarations.long_array.1 changed"
  
  # Step over "weird->long_array[2] = 3456;"
--- 856,862 ----
  # Test: c_variable-5.6
  # Desc: check that long_array[1] changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"struct_declarations.long_array.1\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars struct_declarations.long_array.1 changed"
  
  # Step over "weird->long_array[2] = 3456;"
*************** gdb_expect {
*** 873,879 ****
  # Test: c_variable-5.7
  # Desc: check that long_array[2] changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"struct_declarations.long_array.2\"\}" \
  	"update all vars struct_declarations.long_array.2 changed"
  
  # Step over:
--- 873,879 ----
  # Test: c_variable-5.7
  # Desc: check that long_array[2] changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"struct_declarations.long_array.2\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars struct_declarations.long_array.2 changed"
  
  # Step over:
*************** gdb_expect {
*** 897,903 ****
  # 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.3\",name=\"struct_declarations.long_array.4\",name=\"struct_declarations.long_array.5\",name=\"struct_declarations.long_array.6\",name=\"struct_declarations.long_array.7\",name=\"struct_declarations.long_array.8\",name=\"struct_declarations.long_array.9\"\}" \
  	"update all vars struct_declarations.long_array.3-9 changed"
  
  
--- 897,903 ----
  # 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.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_expect {
*** 915,921 ****
  # Test: c_variable-5.9
  # Desc: check that func_ptr changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"struct_declarations.func_ptr\"\}" \
  	"update all vars struct_declarations.func_ptr changed"
  
  # Delete all variables
--- 915,921 ----
  # Test: c_variable-5.9
  # Desc: check that func_ptr changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"struct_declarations.func_ptr\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars struct_declarations.func_ptr changed"
  
  # Delete all variables
*************** gdb_expect {
*** 1185,1191 ****
  # Test: c_variable-5.47
  # Desc: check that psnp->char_ptr (and [0].char_ptr) changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"psnp->ptrs.0.char_ptr\",name=\"psnp->char_ptr\",name=\"psnp->char_ptr.\\*psnp->char_ptr\",name=\"psnp->char_ptr.\\*psnp->char_ptr.\\*\\*psnp->char_ptr\",name=\"psnp->char_ptr.\\*psnp->char_ptr.\\*\\*psnp->char_ptr.\\*\\*\\*psnp->char_ptr\"\}" \
  	"update all vars psnp->char_ptr (and 0.char_ptr) changed"
  
  #  Step over "snp1.char_ptr = &c3;"
--- 1185,1191 ----
  # Test: c_variable-5.47
  # Desc: check that psnp->char_ptr (and [0].char_ptr) changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"psnp->ptrs.0.char_ptr\",in_scope=\"true\",type_changed=\"false\",name=\"psnp->char_ptr\",in_scope=\"true\",type_changed=\"false\",name=\"psnp->char_ptr.\\*psnp->char_ptr\",in_scope=\"true\",type_changed=\"false\",name=\"psnp->char_ptr.\\*psnp->char_ptr.\\*\\*psnp->char_ptr\",in_scope=\"true\",type_changed=\"false\",name=\"psnp->char_ptr.\\*psnp->char_ptr.\\*\\*psnp->char_ptr.\\*\\*\\*psnp->char_ptr\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars psnp->char_ptr (and 0.char_ptr) changed"
  
  #  Step over "snp1.char_ptr = &c3;"
*************** gdb_expect {
*** 1203,1209 ****
  # Test: c_variable-5.48
  # Desc: check that psnp->next->char_ptr (and [1].char_ptr) changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"psnp->ptrs.0.next.char_ptr\",name=\"psnp->ptrs.0.next.char_ptr.\\*char_ptr\",name=\"psnp->ptrs.0.next.char_ptr.\\*char_ptr.\\*\\*char_ptr\",name=\"psnp->ptrs.0.next.char_ptr.\\*char_ptr.\\*\\*char_ptr.\\*\\*\\*char_ptr\"\}" \
  	"update all vars psnp->next->char_ptr (and 1.char_ptr) changed"
  
  
--- 1203,1209 ----
  # Test: c_variable-5.48
  # Desc: check that psnp->next->char_ptr (and [1].char_ptr) changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"psnp->ptrs.0.next.char_ptr\",in_scope=\"true\",type_changed=\"false\",name=\"psnp->ptrs.0.next.char_ptr.\\*char_ptr\",in_scope=\"true\",type_changed=\"false\",name=\"psnp->ptrs.0.next.char_ptr.\\*char_ptr.\\*\\*char_ptr\",in_scope=\"true\",type_changed=\"false\",name=\"psnp->ptrs.0.next.char_ptr.\\*char_ptr.\\*\\*char_ptr.\\*\\*\\*char_ptr\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars psnp->next->char_ptr (and 1.char_ptr) changed"
  
  
*************** gdb_expect {
*** 1222,1228 ****
  # Test: c_variable-5.49
  # Desc: check that psnp->next->next->char_ptr (and [2].char_ptr) changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"psnp->ptrs.0.next.next.char_ptr\"\}" \
  	"update all vars psnp->next->next->char_ptr (and 2.char_ptr) changed"
  
  
--- 1222,1228 ----
  # Test: c_variable-5.49
  # Desc: check that psnp->next->next->char_ptr (and [2].char_ptr) changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"psnp->ptrs.0.next.next.char_ptr\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars psnp->next->next->char_ptr (and 2.char_ptr) changed"
  
  
*************** gdb_expect {
*** 1240,1246 ****
  # Test: c_variable-5.50
  # Desc: check that psnp->long_ptr (and [0].long_ptr) changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"psnp->ptrs.0.long_ptr\",name=\"psnp->long_ptr\",name=\"psnp->long_ptr.\\*psnp->long_ptr\",name=\"psnp->long_ptr.\\*psnp->long_ptr.\\*\\*psnp->long_ptr\",name=\"psnp->long_ptr.\\*psnp->long_ptr.\\*\\*psnp->long_ptr.\\*\\*\\*psnp->long_ptr\",name=\"psnp->long_ptr.\\*psnp->long_ptr.\\*\\*psnp->long_ptr.\\*\\*\\*psnp->long_ptr.\\*\\*\\*\\*psnp->long_ptr\"\}" \
  	"update all vars psnp->long_ptr (and 0.long_ptr) changed"
  
  
--- 1240,1246 ----
  # Test: c_variable-5.50
  # Desc: check that psnp->long_ptr (and [0].long_ptr) changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"psnp->ptrs.0.long_ptr\",in_scope=\"true\",type_changed=\"false\",name=\"psnp->long_ptr\",in_scope=\"true\",type_changed=\"false\",name=\"psnp->long_ptr.\\*psnp->long_ptr\",in_scope=\"true\",type_changed=\"false\",name=\"psnp->long_ptr.\\*psnp->long_ptr.\\*\\*psnp->long_ptr\",in_scope=\"true\",type_changed=\"false\",name=\"psnp->long_ptr.\\*psnp->long_ptr.\\*\\*psnp->long_ptr.\\*\\*\\*psnp->long_ptr\",in_scope=\"true\",type_changed=\"false\",name=\"psnp->long_ptr.\\*psnp->long_ptr.\\*\\*psnp->long_ptr.\\*\\*\\*psnp->long_ptr.\\*\\*\\*\\*psnp->long_ptr\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars psnp->long_ptr (and 0.long_ptr) changed"
  
  
*************** gdb_expect {
*** 1258,1269 ****
  
  # Test: c_variable-5.51
  # Desc: check that psnp->next->long_ptr (and [1].long_ptr) changed
  mi_gdb_test "-var-update *" \
! 	"FIXME\\^done,changelist=\{name=\"psnp->ptrs.0.next.long_ptr\"\}" \
  	"update all vars psnp->next->long_ptr (and 1.long_ptr) changed"
  
  # This command produces this error message:
! # &"warning: varobj_list: assertion failed - mycount <> 0\n"^M
  #
  
  #  Step over "snp2.long_ptr = &z3;"
--- 1258,1272 ----
  
  # Test: c_variable-5.51
  # Desc: check that psnp->next->long_ptr (and [1].long_ptr) changed
+ # Why does this have a FIXME?
+ setup_xfail *-*-*
  mi_gdb_test "-var-update *" \
! 	"FIXME\\^done,changelist=\{name=\"psnp->ptrs.0.next.long_ptr\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars psnp->next->long_ptr (and 1.long_ptr) changed"
+ clear_xfail *-*-*
  
  # This command produces this error message:
! # &"warning: varobj_list: assertion failed - mycount <> 0\n"
  #
  
  #  Step over "snp2.long_ptr = &z3;"
*************** gdb_expect {
*** 1281,1287 ****
  # Test: c_variable-5.52
  # Desc: check that psnp->next->next->long_ptr (and [2].long_ptr) changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"psnp->ptrs.0.next.next.long_ptr\"\}" \
  	"update all vars psnp->next->next->long_ptr (and 2.long_ptr) changed"
  
  
--- 1284,1290 ----
  # Test: c_variable-5.52
  # Desc: check that psnp->next->next->long_ptr (and [2].long_ptr) changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"psnp->ptrs.0.next.next.long_ptr\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars psnp->next->next->long_ptr (and 2.long_ptr) changed"
  
  
Index: testsuite/gdb.mi/mi-var-cmd.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.mi/mi-var-cmd.exp,v
retrieving revision 1.1
diff -p -p -r1.1 mi-var-cmd.exp
*** mi-var-cmd.exp	2000/02/23 00:25:43	1.1
--- mi-var-cmd.exp	2000/03/10 23:43:28
*************** mi_gdb_test "111-var-create global_simpl
*** 59,72 ****
  # Desc: Create non-existent variable
  
  mi_gdb_test "112-var-create bogus_unknown_variable * bogus_unknown_variable" \
! 	"&\"No symbol \\\\\"bogus_unknown_variable\\\\\" in current context.\\\\n\".*112\\^error,msg=\"No symbol \\\\\"bogus_unknown_variable\\\\\" in current context.\"" \
  	"create non-existent variable"
  
  # Test: c_variable-1.3
  # Desc: Create out of scope variable
  
  mi_gdb_test "113-var-create argc * argc" \
! 	"&\"No symbol \\\\\"argc\\\\\" in current context.\\\\n\".*113\\^error,msg=\"No symbol \\\\\"argc\\\\\" in current context.\"" \
  	"create out of scope variable"
  
  mi_gdb_test "200-break-insert do_locals_tests" \
--- 59,72 ----
  # Desc: Create non-existent variable
  
  mi_gdb_test "112-var-create bogus_unknown_variable * bogus_unknown_variable" \
! 	"&\"mi_cmd_var_create: unable to create variable object\\\\n\".*112\\^error,msg=\"mi_cmd_var_create: unable to create variable object\"" \
  	"create non-existent variable"
  
  # Test: c_variable-1.3
  # Desc: Create out of scope variable
  
  mi_gdb_test "113-var-create argc * argc" \
! 	"&\"mi_cmd_var_create: unable to create variable object\\\\n\".*113\\^error,msg=\"mi_cmd_var_create: unable to create variable object\"" \
  	"create out of scope variable"
  
  mi_gdb_test "200-break-insert do_locals_tests" \
*************** gdb_expect {
*** 192,198 ****
  # Test: c_variable-2.2
  # Desc: check whether only linteger changed values
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"linteger\"\}" \
  	"update all vars: linteger changed"
  
  # Step over "lpinteger = &linteger;"
--- 192,198 ----
  # Test: c_variable-2.2
  # Desc: check whether only linteger changed values
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars: linteger changed"
  
  # Step over "lpinteger = &linteger;"
*************** gdb_expect {
*** 209,215 ****
  # Test: c_variable-2.3
  # Desc: check whether only lpinteger changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"lpinteger\"\}" \
  	"update all vars: lpinteger changed"
  
  # Step over "lcharacter = 'a';"
--- 209,215 ----
  # Test: c_variable-2.3
  # Desc: check whether only lpinteger changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"lpinteger\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars: lpinteger changed"
  
  # Step over "lcharacter = 'a';"
*************** gdb_expect {
*** 226,232 ****
  # Test: c_variable-2.4
  # Desc: check whether only lcharacter changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"lcharacter\"\}" \
  	"update all vars: lcharacter changed"
  
  # Step over "lpcharacter = &lcharacter;"
--- 226,232 ----
  # Test: c_variable-2.4
  # Desc: check whether only lcharacter changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"lcharacter\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars: lcharacter changed"
  
  # Step over "lpcharacter = &lcharacter;"
*************** gdb_expect {
*** 243,249 ****
  # Test: c_variable-2.5
  # Desc: check whether only lpcharacter changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"lpcharacter\"\}" \
  	"update all vars: lpcharacter changed"
  
  
--- 243,249 ----
  # Test: c_variable-2.5
  # Desc: check whether only lpcharacter changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"lpcharacter\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars: lpcharacter changed"
  
  
*************** gdb_expect {
*** 272,278 ****
  # Desc: check whether llong, lplong, lfloat, lpfloat, ldouble, lpdouble, lsimple.integer,
  #       lsimple.unsigned_character lsimple.integer lsimple.character changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"lsimple.integer\",name=\"lsimple->integer\",name=\"lsimple.character\",name=\"lpdouble\",name=\"ldouble\",name=\"lpfloat\",name=\"lfloat\",name=\"lplong\",name=\"llong\"\}" \
  	"update all vars: many changed"
  
  # Step over:
--- 272,278 ----
  # Desc: check whether llong, lplong, lfloat, lpfloat, ldouble, lpdouble, lsimple.integer,
  #       lsimple.unsigned_character lsimple.integer lsimple.character changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"lsimple.integer\",in_scope=\"true\",type_changed=\"false\",name=\"lsimple->integer\",in_scope=\"true\",type_changed=\"false\",name=\"lsimple.character\",in_scope=\"true\",type_changed=\"false\",name=\"lpdouble\",in_scope=\"true\",type_changed=\"false\",name=\"ldouble\",in_scope=\"true\",type_changed=\"false\",name=\"lpfloat\",in_scope=\"true\",type_changed=\"false\",name=\"lfloat\",in_scope=\"true\",type_changed=\"false\",name=\"lplong\",in_scope=\"true\",type_changed=\"false\",name=\"llong\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars: many changed"
  
  # Step over:
*************** gdb_expect {
*** 294,300 ****
  # Test: c_variable-2.7
  # Desc: check whether (lsimple.signed_character, lsimple.char_ptr) lpsimple, func changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"func\",name=\"lpsimple\"\}" \
  	"update all vars: func and lpsimple changed"
  
  # Step over
--- 294,300 ----
  # Test: c_variable-2.7
  # Desc: check whether (lsimple.signed_character, lsimple.char_ptr) lpsimple, func changed
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"func\",in_scope=\"true\",type_changed=\"false\",name=\"lpsimple\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars: func and lpsimple changed"
  
  # Step over
*************** gdb_expect {
*** 323,329 ****
  # Note: this test also checks that lpsimple->integer and lsimple.integer have
  #       changed (they are the same)
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"lsimple.integer\",name=\"lsimple->integer\",name=\"lsimple.character\",name=\"ldouble\",name=\"lfloat\",name=\"llong\",name=\"lcharacter\",name=\"linteger\"\}" \
  	"update all vars: func and lpsimple changed"
  
  
--- 323,329 ----
  # Note: this test also checks that lpsimple->integer and lsimple.integer have
  #       changed (they are the same)
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"lsimple.integer\",in_scope=\"true\",type_changed=\"false\",name=\"lsimple->integer\",in_scope=\"true\",type_changed=\"false\",name=\"lsimple.character\",in_scope=\"true\",type_changed=\"false\",name=\"ldouble\",in_scope=\"true\",type_changed=\"false\",name=\"lfloat\",in_scope=\"true\",type_changed=\"false\",name=\"llong\",in_scope=\"true\",type_changed=\"false\",name=\"lcharacter\",in_scope=\"true\",type_changed=\"false\",name=\"linteger\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars: func and lpsimple changed"
  
  
*************** mi_gdb_test "-var-create l * l" \
*** 454,460 ****
  # Test: c_variable-2.11
  # Desc: create do_locals_tests local in subroutine1
  mi_gdb_test "-var-create linteger * linteger" \
! 	"&\"No symbol \\\\\"linteger\\\\\" in current context.\\\\n\".*\\^error,msg=\"No symbol \\\\\"linteger\\\\\" in current context.\"" \
  	"create linteger"
  
  send_gdb "-exec-step\n"
--- 454,460 ----
  # Test: c_variable-2.11
  # Desc: create do_locals_tests local in subroutine1
  mi_gdb_test "-var-create linteger * linteger" \
! 	"&\"mi_cmd_var_create: unable to create variable object\\\\n\".*\\^error,msg=\"mi_cmd_var_create: unable to create variable object\"" \
  	"create linteger"
  
  send_gdb "-exec-step\n"
*************** gdb_expect {
*** 471,480 ****
  # Desc: change global_simple.integer
  # Note: This also tests whether we are reporting changes in structs properly.
  #       gdb normally would say that global_simple has changed, but we
! #       special case that, since it is not what a human expects to see.
  mi_gdb_test "-var-update *" \
  	"\\^done,changelist=\{FIXME: WHAT IS CORRECT HERE\}" \
  	"update all vars: changed FIXME"
  
  send_gdb "-exec-step\n"
  gdb_expect {
--- 471,484 ----
  # Desc: change global_simple.integer
  # Note: This also tests whether we are reporting changes in structs properly.
  #       gdb normally would say that global_simple has changed, but we
! #       special case that, since it is not what a human expects to
! #       see.
! 
! setup_xfail *-*-*
  mi_gdb_test "-var-update *" \
  	"\\^done,changelist=\{FIXME: WHAT IS CORRECT HERE\}" \
  	"update all vars: changed FIXME"
+ clear_xfail *-*-*
  
  send_gdb "-exec-step\n"
  gdb_expect {
*************** gdb_expect {
*** 487,493 ****
  # Test: c_variable-2.13
  # Desc: change subroutine1 local i
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"i\"\}" \
  	"update all vars: i changed"
  
  send_gdb "-exec-step\n"
--- 491,497 ----
  # Test: c_variable-2.13
  # Desc: change subroutine1 local i
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"i\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars: i changed"
  
  send_gdb "-exec-step\n"
*************** gdb_expect {
*** 501,507 ****
  # Test: c_variable-2.14
  # Desc: change do_locals_tests local llong
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"llong\"\}" \
  	"update all vars: llong changed"
  
  send_gdb "-exec-next\n"
--- 505,511 ----
  # Test: c_variable-2.14
  # Desc: change do_locals_tests local llong
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"llong\",in_scope=\"true\",type_changed=\"false\"\}" \
  	"update all vars: llong changed"
  
  send_gdb "-exec-next\n"
*************** gdb_expect {
*** 515,522 ****
  # Test: c_variable-2.15
  # Desc: check for out of scope subroutine1 locals
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{\}" \
! 	"update all vars: none changed"
  
  # Done with locals/globals tests. Erase all variables
  #delete_all_variables
--- 519,526 ----
  # Test: c_variable-2.15
  # Desc: check for out of scope subroutine1 locals
  mi_gdb_test "-var-update *" \
! 	"\\^done,changelist=\{name=\"l\",in_scope=\"false\",name=\"i\",in_scope=\"false\"\}" \
! 	"update all vars: all now out of scope"
  
  # Done with locals/globals tests. Erase all variables
  #delete_all_variables
Index: testsuite/lib/gdb.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/lib/gdb.exp,v
retrieving revision 1.2
diff -p -p -r1.2 gdb.exp
*** gdb.exp	2000/02/14 19:12:30	1.2
--- gdb.exp	2000/03/10 23:43:28
*************** proc gdbtk_start {test} {
*** 1617,1645 ****
      }
    }
  
    set wd [pwd]
!   cd [file join $srcdir .. gdbtk library]
    set env(GDBTK_LIBRARY) [pwd]
!   cd [file join $srcdir .. .. tcl library]
    set env(TCL_LIBRARY) [pwd]
!   cd [file join $srcdir .. .. tk library]
    set env(TK_LIBRARY) [pwd]
!   cd [file join $srcdir .. .. tix library]
    set env(TIX_LIBRARY) [pwd]
!   cd [file join $srcdir .. .. itcl itcl library]
    set env(ITCL_LIBRARY) [pwd]
!   cd [file join .. $srcdir .. .. libgui library]
    set env(CYGNUS_GUI_LIBRARY) [pwd]
    cd $wd
!   cd [file join $srcdir $subdir]
    set env(DEFS) [file join [pwd] defs]
    cd $wd
    cd [file join $objdir $subdir]
    set env(OBJDIR) [pwd]
-   cd $wd
-   cd $srcdir
-   set env(SRCDIR) [pwd]
    cd $wd
    set env(GDBTK_VERBOSE) 1
    set env(GDBTK_LOGFILE) [file join $objdir gdb.log]
    set env(GDBTK_TEST_RUNNING) 1
--- 1617,1647 ----
      }
    }
  
+   
    set wd [pwd]
!   cd $srcdir
!   set abs_srcdir [pwd]
!   cd [file join $abs_srcdir .. gdbtk library]
    set env(GDBTK_LIBRARY) [pwd]
!   cd [file join $abs_srcdir .. .. tcl library]
    set env(TCL_LIBRARY) [pwd]
!   cd [file join $abs_srcdir .. .. tk library]
    set env(TK_LIBRARY) [pwd]
!   cd [file join $abs_srcdir .. .. tix library]
    set env(TIX_LIBRARY) [pwd]
!   cd [file join $abs_srcdir .. .. itcl itcl library]
    set env(ITCL_LIBRARY) [pwd]
!   cd [file join .. $abs_srcdir .. .. libgui library]
    set env(CYGNUS_GUI_LIBRARY) [pwd]
    cd $wd
!   cd [file join $abs_srcdir $subdir]
    set env(DEFS) [file join [pwd] defs]
    cd $wd
    cd [file join $objdir $subdir]
    set env(OBJDIR) [pwd]
    cd $wd
+ 
+   set env(SRCDIR) $abs_srcdir
    set env(GDBTK_VERBOSE) 1
    set env(GDBTK_LOGFILE) [file join $objdir gdb.log]
    set env(GDBTK_TEST_RUNNING) 1

-- 
++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++
Jim Ingham                                              jingham@cygnus.com
Cygnus Solutions, a Red Hat Company                      

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]