This is the mail archive of the gdb-patches@sources.redhat.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]
Other format: [Raw text]

Re: RFA: revised changes for gdb/mi 792


J. Johnston writes:
 > Keith has pointed out some scenarios my original patch did not address and supplied
 > an alternate solution such that I have modified my patch.  This replaces the former 
 > patch that was posted.
 >  
 > 

Has this been committed?
In any event, could the STREQ that you touched be replaced by strcmp()?

Thanks
Elena




 > gdb/ChangeLog:
 > 
 > 2002-10-15  Jeff Johnston  <jjohnstn@redhat.com>
 > 	    Keith Seitz  <keiths@redhat.com>
 > 
 > 	* varobj.c (cplus_name_of_child): Change code to handle the fact that
 > 	fields are not necessarily contiguous with regards to their access control.
 > 	This is a fix for PR gdb/792.
 > 
 > Ok to commit?
 > 
 > -- Jeff J.--- varobj.0.c	Fri Oct 11 15:46:03 2002
 > +++ varobj.c	Tue Oct 15 17:00:14 2002
 > @@ -2176,7 +2176,6 @@
 >  {
 >    char *name;
 >    struct type *type;
 > -  int children[3];
 >  
 >    if (CPLUS_FAKE_CHILD (parent))
 >      {
 > @@ -2191,55 +2190,97 @@
 >      {
 >      case TYPE_CODE_STRUCT:
 >      case TYPE_CODE_UNION:
 > -      cplus_class_num_children (type, children);
 > -
 >        if (CPLUS_FAKE_CHILD (parent))
 >  	{
 > -	  int i;
 > -
 > -	  /* Skip over vptr, if it exists. */
 > -	  if (TYPE_VPTR_BASETYPE (type) == type
 > -	      && index >= TYPE_VPTR_FIELDNO (type))
 > -	    index++;
 > -
 > -	  /* FIXME: This assumes that type orders
 > -	     inherited, public, private, protected */
 > -	  i = index + TYPE_N_BASECLASSES (type);
 > -	  if (STREQ (parent->name, "private")
 > -	      || STREQ (parent->name, "protected"))
 > -	    i += children[v_public];
 > -	  if (STREQ (parent->name, "protected"))
 > -	    i += children[v_private];
 > +	  /* The fields of the class type are ordered as they
 > +	     appear in the class.  We are given an index for a
 > +	     particular access control type ("public","protected",
 > +	     or "private").  We must skip over fields that don't
 > +	     have the access control we are looking for to properly
 > +	     find the indexed field. */
 > +	  int type_index = TYPE_N_BASECLASSES (type);
 > +	  if (STREQ (parent->name, "private"))
 > +	    {
 > +	      while (index >= 0)
 > +		{
 > +	  	  if (TYPE_VPTR_BASETYPE (type) == type
 > +	      	      && type_index == TYPE_VPTR_FIELDNO (type))
 > +		    ; /* ignore vptr */
 > +		  else if (TYPE_FIELD_PRIVATE (type, type_index))
 > +		    --index;
 > +		  ++type_index;
 > +		}
 > +	      --type_index;
 > +	    }
 > +	  else if (STREQ (parent->name, "protected"))
 > +	    {
 > +	      while (index >= 0)
 > +		{
 > +	  	  if (TYPE_VPTR_BASETYPE (type) == type
 > +	      	      && type_index == TYPE_VPTR_FIELDNO (type))
 > +		    ; /* ignore vptr */
 > +		  else if (TYPE_FIELD_PROTECTED (type, type_index))
 > +		    --index;
 > +		  ++type_index;
 > +		}
 > +	      --type_index;
 > +	    }
 > +	  else
 > +	    {
 > +	      while (index >= 0)
 > +		{
 > +	  	  if (TYPE_VPTR_BASETYPE (type) == type
 > +	      	      && type_index == TYPE_VPTR_FIELDNO (type))
 > +		    ; /* ignore vptr */
 > +		  else if (!TYPE_FIELD_PRIVATE (type, type_index) &&
 > +		      !TYPE_FIELD_PROTECTED (type, type_index))
 > +		    --index;
 > +		  ++type_index;
 > +		}
 > +	      --type_index;
 > +	    }
 >  
 > -	  name = TYPE_FIELD_NAME (type, i);
 > +	  name = TYPE_FIELD_NAME (type, type_index);
 >  	}
 >        else if (index < TYPE_N_BASECLASSES (type))
 > +	/* We are looking up the name of a base class */
 >  	name = TYPE_FIELD_NAME (type, index);
 >        else
 >  	{
 > +	  int children[3];
 > +	  cplus_class_num_children(type, children);
 > +
 >  	  /* Everything beyond the baseclasses can
 > -	     only be "public", "private", or "protected" */
 > +	     only be "public", "private", or "protected"
 > +
 > +	     The special "fake" children are always output by varobj in
 > +	     this order. So if INDEX == 2, it MUST be "protected". */
 >  	  index -= TYPE_N_BASECLASSES (type);
 >  	  switch (index)
 >  	    {
 >  	    case 0:
 > -	      if (children[v_public] != 0)
 > -		{
 > -		  name = "public";
 > -		  break;
 > -		}
 > +	      if (children[v_public] > 0)
 > +	 	name = "public";
 > +	      else if (children[v_private] > 0)
 > +	 	name = "private";
 > +	      else 
 > +	 	name = "protected";
 > +	      break;
 >  	    case 1:
 > -	      if (children[v_private] != 0)
 > +	      if (children[v_public] > 0)
 >  		{
 > -		  name = "private";
 > -		  break;
 > +		  if (children[v_private] > 0)
 > +		    name = "private";
 > +		  else
 > +		    name = "protected";
 >  		}
 > +	      else if (children[v_private] > 0)
 > +	 	name = "protected";
 > +	      break;
 >  	    case 2:
 > -	      if (children[v_protected] != 0)
 > -		{
 > -		  name = "protected";
 > -		  break;
 > -		}
 > +	      /* Must be protected */
 > +	      name = "protected";
 > +	      break;
 >  	    default:
 >  	      /* error! */
 >  	      break;


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