From: Elena Zannoni <ezannoni@redhat.com>
To: "J. Johnston" <jjohnstn@redhat.com>
Cc: gdb-patches@sources.redhat.com
Subject: Re: RFA: revised changes for gdb/mi 792
Date: Tue, 22 Oct 2002 08:46:00 -0000 [thread overview]
Message-ID: <15797.29212.712389.191319@localhost.redhat.com> (raw)
In-Reply-To: <3DAC86CB.5CE60DE5@redhat.com>
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;
next prev parent reply other threads:[~2002-10-22 15:46 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-10-15 14:21 J. Johnston
2002-10-16 8:16 ` Fernando Nasser
2002-10-16 8:39 ` Keith Seitz
2002-10-22 8:46 ` Elena Zannoni [this message]
2002-10-22 9:07 ` J. Johnston
2002-10-22 9:10 ` Elena Zannoni
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=15797.29212.712389.191319@localhost.redhat.com \
--to=ezannoni@redhat.com \
--cc=gdb-patches@sources.redhat.com \
--cc=jjohnstn@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox