From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26992 invoked by alias); 16 Oct 2002 15:16:40 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 26918 invoked from network); 16 Oct 2002 15:16:31 -0000 Received: from unknown (HELO touchme.toronto.redhat.com) (216.138.202.10) by sources.redhat.com with SMTP; 16 Oct 2002 15:16:31 -0000 Received: from redhat.com (totem.toronto.redhat.com [172.16.14.242]) by touchme.toronto.redhat.com (Postfix) with ESMTP id 3567480022D; Wed, 16 Oct 2002 11:16:31 -0400 (EDT) Message-ID: <3DAD82CF.2030609@redhat.com> Date: Wed, 16 Oct 2002 08:16:00 -0000 From: Fernando Nasser Organization: Red Hat , Inc. - Toronto User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1) Gecko/20020827 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "J. Johnston" Cc: gdb-patches@sources.redhat.com Subject: Re: RFA: revised changes for gdb/mi 792 References: <3DAC86CB.5CE60DE5@redhat.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2002-10/txt/msg00280.txt.bz2 Have you guys tested the effect of this on Insight? _If_ Insight variable and watch windows are still working after this change, then please check it in. And thanks for the improvements. Fernando J. Johnston wrote:> 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. > > > gdb/ChangeLog: > > 2002-10-15 Jeff Johnston > Keith Seitz > > * 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; -- Fernando Nasser Red Hat - Toronto E-Mail: fnasser@redhat.com 2323 Yonge Street, Suite #300 Toronto, Ontario M4P 2C9