* Patch for gdb/mi 792
@ 2002-10-11 15:42 J. Johnston
2002-10-21 20:06 ` Elena Zannoni
0 siblings, 1 reply; 13+ messages in thread
From: J. Johnston @ 2002-10-11 15:42 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 770 bytes --]
The following is a proposed patch for gdb/mi 792. The problem occurs because
the code is trying to reference public, private, and protected via indexes.
The order of the fields in the type are in the order they are entered so the
index cannot be used computationally. The new code takes the index and
does a loop through the fields verifying that the field has the desired
access control. It decrements the index until the desired indexed value
with the specified access is found.
gdb/ChangeLog:
2002-10-11 Jeff Johnston <jjohnstn@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.
May this code be committed?
-- Jeff J.
[-- Attachment #2: 792.patch --]
[-- Type: text/plain, Size: 1483 bytes --]
--- varobj.0.c Fri Oct 11 15:46:03 2002
+++ varobj.c Fri Oct 11 18:28:06 2002
@@ -2195,23 +2195,49 @@
if (CPLUS_FAKE_CHILD (parent))
{
- int i;
+ int i = index;
/* 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];
+ index = TYPE_N_BASECLASSES (type);
+ if (STREQ (parent->name, "private"))
+ {
+ while (i >= 0)
+ {
+ if (TYPE_FIELD_PRIVATE (type, index))
+ --i;
+ ++index;
+ }
+ --index;
+ }
+ else if (STREQ (parent->name, "protected"))
+ {
+ while (i >= 0)
+ {
+ if (TYPE_FIELD_PROTECTED (type, index))
+ --i;
+ ++index;
+ }
+ --index;
+ }
+ else if (STREQ (parent->name, "public"))
+ {
+ while (i >= 0)
+ {
+ if (!TYPE_FIELD_PRIVATE (type, index) &&
+ !TYPE_FIELD_PROTECTED (type, index))
+ --i;
+ ++index;
+ }
+ --index;
+ }
+ else
+ index += i;
- name = TYPE_FIELD_NAME (type, i);
+ name = TYPE_FIELD_NAME (type, index);
}
else if (index < TYPE_N_BASECLASSES (type))
name = TYPE_FIELD_NAME (type, index);
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: Patch for gdb/mi 792
2002-10-11 15:42 Patch for gdb/mi 792 J. Johnston
@ 2002-10-21 20:06 ` Elena Zannoni
2002-10-22 14:59 ` David Carlton
0 siblings, 1 reply; 13+ messages in thread
From: Elena Zannoni @ 2002-10-21 20:06 UTC (permalink / raw)
To: J. Johnston; +Cc: gdb-patches
J. Johnston writes:
> The following is a proposed patch for gdb/mi 792. The problem occurs because
> the code is trying to reference public, private, and protected via indexes.
> The order of the fields in the type are in the order they are entered so the
> index cannot be used computationally. The new code takes the index and
> does a loop through the fields verifying that the field has the desired
> access control. It decrements the index until the desired indexed value
> with the specified access is found.
>
> gdb/ChangeLog:
>
> 2002-10-11 Jeff Johnston <jjohnstn@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.
>
> May this code be committed?
>
> -- Jeff J.--- varobj.0.c Fri Oct 11 15:46:03 2002
> +++ varobj.c Fri Oct 11 18:28:06 2002
> @@ -2195,23 +2195,49 @@
>
> if (CPLUS_FAKE_CHILD (parent))
> {
> - int i;
> + int i = index;
>
> /* 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];
> + index = TYPE_N_BASECLASSES (type);
> + if (STREQ (parent->name, "private"))
Argh!! STREQ! Run away! We are trying to kill STREQ from gdb, you
should just use strcmp().
[BTW, you know about the ARI? very useful, http://sources.redhat.com/gdb/ari/]
> + {
> + while (i >= 0)
> + {
> + if (TYPE_FIELD_PRIVATE (type, index))
> + --i;
> + ++index;
> + }
> + --index;
> + }
> +
How are the fields organized within the structure? I am a bit confused by the
decreasing 'i'.
Elena
else if (STREQ (parent->name, "protected"))
> + {
> + while (i >= 0)
> + {
> + if (TYPE_FIELD_PROTECTED (type, index))
> + --i;
> + ++index;
> + }
> + --index;
> + }
> + else if (STREQ (parent->name, "public"))
> + {
> + while (i >= 0)
> + {
> + if (!TYPE_FIELD_PRIVATE (type, index) &&
> + !TYPE_FIELD_PROTECTED (type, index))
> + --i;
> + ++index;
> + }
> + --index;
> + }
> + else
> + index += i;
>
> - name = TYPE_FIELD_NAME (type, i);
> + name = TYPE_FIELD_NAME (type, index);
> }
> else if (index < TYPE_N_BASECLASSES (type))
> name = TYPE_FIELD_NAME (type, index);
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: Patch for gdb/mi 792
2002-10-21 20:06 ` Elena Zannoni
@ 2002-10-22 14:59 ` David Carlton
2002-10-22 15:11 ` Elena Zannoni
2002-10-22 15:12 ` Andrew Cagney
0 siblings, 2 replies; 13+ messages in thread
From: David Carlton @ 2002-10-22 14:59 UTC (permalink / raw)
To: Elena Zannoni; +Cc: gdb-patches
On Mon, 21 Oct 2002 23:03:53 -0400, Elena Zannoni <ezannoni@redhat.com> said:
> [BTW, you know about the ARI? very useful,
> http://sources.redhat.com/gdb/ari/]
I'd been wondering what this ARI beastie was that Andrew had been
referring to. Neat; something to look at if I'm frustrated by other
stuff.
What does the "AR" part stand for?
David Carlton
carlton@math.stanford.edu
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Patch for gdb/mi 792
2002-10-22 14:59 ` David Carlton
@ 2002-10-22 15:11 ` Elena Zannoni
2002-10-22 15:19 ` David Carlton
2002-10-22 15:12 ` Andrew Cagney
1 sibling, 1 reply; 13+ messages in thread
From: Elena Zannoni @ 2002-10-22 15:11 UTC (permalink / raw)
To: David Carlton; +Cc: Elena Zannoni, gdb-patches
David Carlton writes:
> On Mon, 21 Oct 2002 23:03:53 -0400, Elena Zannoni <ezannoni@redhat.com> said:
>
> > [BTW, you know about the ARI? very useful,
> > http://sources.redhat.com/gdb/ari/]
>
> I'd been wondering what this ARI beastie was that Andrew had been
> referring to. Neat; something to look at if I'm frustrated by other
> stuff.
>
> What does the "AR" part stand for?
>
Something you cannot say on a public list :-) Well, not sure, but it
would be blocked by parental checking/blocking software. It is
usually a personality type, characterized by being very (overly)
careful to details.
Elena
> David Carlton
> carlton@math.stanford.edu
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Patch for gdb/mi 792
2002-10-22 15:11 ` Elena Zannoni
@ 2002-10-22 15:19 ` David Carlton
0 siblings, 0 replies; 13+ messages in thread
From: David Carlton @ 2002-10-22 15:19 UTC (permalink / raw)
To: Elena Zannoni; +Cc: gdb-patches
On Tue, 22 Oct 2002 18:08:34 -0400, Elena Zannoni <ezannoni@redhat.com> said:
> David Carlton writes:
>> What does the "AR" part stand for?
> Something you cannot say on a public list :-) Well, not sure, but it
> would be blocked by parental checking/blocking software. It is
> usually a personality type, characterized by being very (overly)
> careful to details.
Gotcha, thanks.
David Carlton
carlton@math.stanford.edu
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Patch for gdb/mi 792
2002-10-22 14:59 ` David Carlton
2002-10-22 15:11 ` Elena Zannoni
@ 2002-10-22 15:12 ` Andrew Cagney
2002-10-22 15:26 ` David Carlton
1 sibling, 1 reply; 13+ messages in thread
From: Andrew Cagney @ 2002-10-22 15:12 UTC (permalink / raw)
To: David Carlton; +Cc: Elena Zannoni, gdb-patches
Awk Regression Index? It's written in awk.
Oh, and I suspect you've been hit. It's detected some more C++
testsuite filename problems.
Andrew
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Patch for gdb/mi 792
2002-10-22 15:12 ` Andrew Cagney
@ 2002-10-22 15:26 ` David Carlton
2002-10-22 18:05 ` Andrew Cagney
0 siblings, 1 reply; 13+ messages in thread
From: David Carlton @ 2002-10-22 15:26 UTC (permalink / raw)
To: Andrew Cagney; +Cc: gdb-patches
On Tue, 22 Oct 2002 18:12:10 -0400, Andrew Cagney <ac131313@redhat.com> said:
> Oh, and I suspect you've been hit. It's detected some more C++
> testsuite filename problems.
No, it's the same one that I already fixed a while ago. I'm not sure
why the ARI isn't noticing that; maybe there's a bug in the script?
It seems to me that there is the correct info in fnchange.lst.
David Carlton
carlton@math.stanford.edu
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Patch for gdb/mi 792
2002-10-22 15:26 ` David Carlton
@ 2002-10-22 18:05 ` Andrew Cagney
2002-10-22 22:57 ` Eli Zaretskii
0 siblings, 1 reply; 13+ messages in thread
From: Andrew Cagney @ 2002-10-22 18:05 UTC (permalink / raw)
To: David Carlton, Eli Zaretskii; +Cc: gdb-patches
> On Tue, 22 Oct 2002 18:12:10 -0400, Andrew Cagney <ac131313@redhat.com> said:
>
>
>> Oh, and I suspect you've been hit. It's detected some more C++
>> testsuite filename problems.
>
>
> No, it's the same one that I already fixed a while ago. I'm not sure
> why the ARI isn't noticing that; maybe there's a bug in the script?
> It seems to me that there is the correct info in fnchange.lst.
The ARI script looks like:
echo "`date`: Checking for doschk" 1>&2
rm -f "${wwwdir}"/ari.doschk.*
fnchange_lst="${srcdir}"/gdb/config/djgpp/fnchange.lst
fnchange_sed="${wwwdir}"/ari.doschk.sed
# Create fnchange.sed
sed -e 's;@[^@]*@[/]*\([^ ]*\) @[^@]*@[/]*\([^ ]*\);s,\1,\2,;' \
< "${fnchange_lst}" > "${fnchange_sed}"
# Do the raw analysis
( cd "${srcdir}" && find * \
-name '*.info-[0-9]*' -prune \
-o -name tcl -prune \
-o -name itcl -prune \
-o -name tk -prune \
-o -name libgui -prune \
-o -name tix -prune \
-o -name dejagnu -prune \
-o -name expect -prune \
-o -type f -print ) | sed -f ${fnchange_sed} \
| doschk > ${wwwdir}/ari.doschk.out
# Magic to map ari.doschk.out to ari.doschk.bug goes here
A quick poke shows it's trying to apply the two transformations:
s,gdb/testsuite/gdb.c++,gdb/testsuite/gdb.cxx,
...
s,gdb/testsuite/gdb.c++/m-static.cc,gdb/testsuite/gdb.cxx/m-static.cc,
s,gdb/testsuite/gdb.c++/m-static1.cc,gdb/testsuite/gdb.cxx/m-stat1.cc,
s,gdb/testsuite/gdb.c++/m-static.exp,gdb/testsuite/gdb.cxx/m-static.exp,
s,gdb/testsuite/gdb.c++/m-static.h,gdb/testsuite/gdb.cxx/m-static.h,
but the actual renames never match since the first s/// resulted in:
gdb/testsuite/gdb.cxx/m-static.cc
gdb/testsuite/gdb.cxx/m-static.exp
gdb/testsuite/gdb.cxx/m-static.h
gdb/testsuite/gdb.cxx/m-static1.cc
being passed to doschk (see src/contrib).
I'm not sure how well this compares to the behavior of the actual DJGPP
command.
Andrew
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: Patch for gdb/mi 792
2002-10-22 18:05 ` Andrew Cagney
@ 2002-10-22 22:57 ` Eli Zaretskii
2002-10-24 11:53 ` Andrew Cagney
0 siblings, 1 reply; 13+ messages in thread
From: Eli Zaretskii @ 2002-10-22 22:57 UTC (permalink / raw)
To: Andrew Cagney; +Cc: David Carlton, gdb-patches
On Tue, 22 Oct 2002, Andrew Cagney wrote:
> s,gdb/testsuite/gdb.c++,gdb/testsuite/gdb.cxx,
> ...
> s,gdb/testsuite/gdb.c++/m-static.cc,gdb/testsuite/gdb.cxx/m-static.cc,
> s,gdb/testsuite/gdb.c++/m-static1.cc,gdb/testsuite/gdb.cxx/m-stat1.cc,
> s,gdb/testsuite/gdb.c++/m-static.exp,gdb/testsuite/gdb.cxx/m-static.exp,
> s,gdb/testsuite/gdb.c++/m-static.h,gdb/testsuite/gdb.cxx/m-static.h,
>
> but the actual renames never match since the first s/// resulted in:
>
> gdb/testsuite/gdb.cxx/m-static.cc
> gdb/testsuite/gdb.cxx/m-static.exp
> gdb/testsuite/gdb.cxx/m-static.h
> gdb/testsuite/gdb.cxx/m-static1.cc
>
> being passed to doschk (see src/contrib).
>
> I'm not sure how well this compares to the behavior of the actual DJGPP
> command.
The program used to rename the files on the fly (called DJTAR) needs that
both the directory and each one of the files in that directory be
mentioned on the rename list.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Patch for gdb/mi 792
2002-10-22 22:57 ` Eli Zaretskii
@ 2002-10-24 11:53 ` Andrew Cagney
2002-10-24 12:06 ` Eli Zaretskii
0 siblings, 1 reply; 13+ messages in thread
From: Andrew Cagney @ 2002-10-24 11:53 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: David Carlton, gdb-patches
> On Tue, 22 Oct 2002, Andrew Cagney wrote:
>
>
>> s,gdb/testsuite/gdb.c++,gdb/testsuite/gdb.cxx,
>> ...
>> s,gdb/testsuite/gdb.c++/m-static.cc,gdb/testsuite/gdb.cxx/m-static.cc,
>> s,gdb/testsuite/gdb.c++/m-static1.cc,gdb/testsuite/gdb.cxx/m-stat1.cc,
>> s,gdb/testsuite/gdb.c++/m-static.exp,gdb/testsuite/gdb.cxx/m-static.exp,
>> s,gdb/testsuite/gdb.c++/m-static.h,gdb/testsuite/gdb.cxx/m-static.h,
>>
>> but the actual renames never match since the first s/// resulted in:
>>
>> gdb/testsuite/gdb.cxx/m-static.cc
>> gdb/testsuite/gdb.cxx/m-static.exp
>> gdb/testsuite/gdb.cxx/m-static.h
>> gdb/testsuite/gdb.cxx/m-static1.cc
>>
>> being passed to doschk (see src/contrib).
>>
>> I'm not sure how well this compares to the behavior of the actual DJGPP
>> command.
>
>
> The program used to rename the files on the fly (called DJTAR) needs that
> both the directory and each one of the files in that directory be
> mentioned on the rename list.
Ok, I think I've fixed it (David was right about the ari script bug).
I'm now wondering if the check is missing anything else. Eli, are there
any characters that shouldn't appear in the renamed file list. ``+''
for instance.
Andrew
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Patch for gdb/mi 792
2002-10-24 11:53 ` Andrew Cagney
@ 2002-10-24 12:06 ` Eli Zaretskii
2002-10-24 14:29 ` Andrew Cagney
0 siblings, 1 reply; 13+ messages in thread
From: Eli Zaretskii @ 2002-10-24 12:06 UTC (permalink / raw)
To: ac131313; +Cc: carlton, gdb-patches
> Date: Thu, 24 Oct 2002 14:53:41 -0400
> From: Andrew Cagney <ac131313@redhat.com>
>
> I'm now wondering if the check is missing anything else. Eli, are there
> any characters that shouldn't appear in the renamed file list. ``+''
> for instance.
The following characters should not appear in translated file names:
+ , ; = [ ] | < > \ " : ? *
Blanks and leading dots are also not allowed.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Patch for gdb/mi 792
2002-10-24 12:06 ` Eli Zaretskii
@ 2002-10-24 14:29 ` Andrew Cagney
0 siblings, 0 replies; 13+ messages in thread
From: Andrew Cagney @ 2002-10-24 14:29 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: carlton, gdb-patches
> Date: Thu, 24 Oct 2002 14:53:41 -0400
>> From: Andrew Cagney <ac131313@redhat.com>
>>
>> I'm now wondering if the check is missing anything else. Eli, are there
>> any characters that shouldn't appear in the renamed file list. ``+''
>> for instance.
>
>
> The following characters should not appear in translated file names:
>
> + , ; = [ ] | < > \ " : ? *
>
> Blanks and leading dots are also not allowed.
(fortunatly blanks break the build so don't appear :-)
It will take a few days but I'll see about getting a test added. That
way both 5.3 branch and the trunk can be checked for this.
thanks,
Andrew
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Patch for gdb/mi 792
@ 2002-11-07 13:31 J. Johnston
0 siblings, 0 replies; 13+ messages in thread
From: J. Johnston @ 2002-11-07 13:31 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 75 bytes --]
Forgot to cc: gdb-patches. Patches checked in. Details below.
-- Jeff J.
[-- Attachment #2: Type: message/rfc822, Size: 12538 bytes --]
[-- Attachment #2.1.1: Type: text/plain, Size: 1555 bytes --]
Elena Zannoni wrote:
>
> Keith Seitz writes:
> > [off list]
> >
> > On Mon, 21 Oct 2002, Elena Zannoni wrote:
> >
> > > How are the fields organized within the structure? I am a bit confused by the
> > > decreasing 'i'.
> >
> > They are organized in the order they are output in the debug info.
> > Originally, the code presumed that the debug info was ordered. I also have
> > a version of this patch (which I sent to Jeff) which removes this
> > bad assumption entirely.
> >
> > It runs through the code and computes the childrens' indices on the fly.
> > It's not as efficient as this, but it does get rid of the bad assumption
> > entirely.
> >
> > Keith
> >
>
> Yeah, I saw the rewrite of the patch after I sent this mail out, so
> disregard. I think Fernando approved the new version, and I am only
> bitching about the streq's.
> :-)
>
> Elena
I have changed the STREQs over and also added a test case to the gdb.mi
testsuite. The code is checked in. I have included the patches.
gdb/ChangeLog:
2002-11-05 Jeff Johnston <jjohnstn@redhat.com>
* varobj.c (child_exists, cplus_number_of_children): Change
STREQ macro references to strcmp.
(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.
gdb/testsuite/gdb.mi/ChangeLog:
2002-11-05 Jeff Johnston <jjohnstn@redhat.com>
* gdb792.cc: New file to test patch for PR gdb/792.
* gdb792.exp: Ditto.
[-- Attachment #2.1.2: 792.patch --]
[-- Type: text/plain, Size: 4546 bytes --]
Index: varobj.c
===================================================================
RCS file: /cvs/src/src/gdb/varobj.c,v
retrieving revision 1.33
diff -u -r1.33 varobj.c
--- varobj.c 23 Oct 2002 23:54:33 -0000 1.33
+++ varobj.c 5 Nov 2002 22:24:43 -0000
@@ -1203,7 +1203,7 @@
for (vc = var->children; vc != NULL; vc = vc->next)
{
- if (STREQ (vc->child->name, name))
+ if (strcmp (vc->child->name, name) == 0)
return vc->child;
}
@@ -2123,9 +2123,9 @@
type = get_type_deref (var->parent);
cplus_class_num_children (type, kids);
- if (STREQ (var->name, "public"))
+ if (strcmp (var->name, "public") == 0)
children = kids[v_public];
- else if (STREQ (var->name, "private"))
+ else if (strcmp (var->name, "private") == 0)
children = kids[v_private];
else
children = kids[v_protected];
@@ -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 (strcmp (parent->name, "private") == 0)
+ {
+ 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 (strcmp (parent->name, "protected") == 0)
+ {
+ 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;
[-- Attachment #2.1.3: 792.test.patch --]
[-- Type: text/plain, Size: 5146 bytes --]
Index: gdb792.exp
===================================================================
RCS file: gdb792.exp
diff -N gdb792.exp
--- gdb792.exp 1 Jan 1970 00:00:00 -0000
+++ gdb792.exp 5 Nov 2002 22:23:43 -0000
@@ -0,0 +1,90 @@
+# Copyright 2002 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# Please email any bugs, comments, and/or additions to this file to:
+# bug-gdb@prep.ai.mit.edu
+
+#
+# test gdb/792
+#
+
+load_lib mi-support.exp
+set MIFLAGS "-i=mi"
+
+gdb_exit
+if [mi_gdb_start] {
+ continue
+}
+
+set testfile gdb792
+set srcfile "$testfile.cc"
+set binfile $objdir/$subdir/$testfile
+
+if [get_compiler_info ${binfile} "c++"] {
+ return -1;
+}
+
+if {[gdb_compile $srcdir/$subdir/$srcfile $binfile executable {debug c++}] != ""} {
+ gdb_suppress_entire_file "Testcase compile failed, so all test in this file will automatically fail."
+}
+
+# Test that children of classes are properly reported
+
+# Run to main
+mi_run_to_main
+
+mi_gdb_test "-var-create - * a" \
+ "(&\".*\"\r\n)*\\^done,name=\"var1\",numchild=\"3\",type=\"A\"" \
+ "create var for class A"
+
+mi_gdb_test "-var-list-children var1" \
+ "(&\".*\"\r\n)*\\^done,numchild=\"3\",children=\{child=\{name=\"var1\.public\",exp=\"public\",numchild=\"2\"\},child=\{name=\"var1\.private\",exp=\"private\",numchild=\"2\"\},child=\{name=\"var1\.protected\",exp=\"protected\",numchild=\"2\"\}\}" \
+ "list children of class A"
+
+mi_gdb_test "-var-list-children var1.public" \
+ "(&\".*\"\r\n)*\\^done,numchild=\"2\",children=\{child=\{name=\"var1\.public\.x\",exp=\"x\",numchild=\"0\",type=\"int\"\},child=\{name=\"var1\.public\.buffer\",exp=\"buffer\",numchild=\"10\",type=\"char \\\[10\\\]\"\}\}" \
+ "list children of A.public"
+
+mi_gdb_test "-var-list-children var1.private" \
+ "(&\".*\"\r\n)*\\^done,numchild=\"2\",children=\{child=\{name=\"var1\.private\.u\",exp=\"u\",numchild=\"0\",type=\"int\"\},child=\{name=\"var1\.private\.z\",exp=\"z\",numchild=\"0\",type=\"float\"\}\}" \
+ "list children of A.private"
+
+mi_gdb_test "-var-list-children var1.protected" \
+ "(&\".*\"\r\n)*\\^done,numchild=\"2\",children=\{child=\{name=\"var1\.protected\.y\",exp=\"y\",numchild=\"0\",type=\"int\"\},child=\{name=\"var1\.protected\.b\",exp=\"b\",numchild=\"2\",type=\"B\"\}\}" \
+ "list children of A.protected"
+
+mi_gdb_test "-var-list-children var1.protected.b" \
+ "(&\".*\"\r\n)*\\^done,numchild=\"2\",children=\{child=\{name=\"var1\.protected\.b\.public\",exp=\"public\",numchild=\"2\"\},child=\{name=\"var1\.protected\.b\.private\",exp=\"private\",numchild=\"1\"\}\}" \
+ "list children of A.protected.b"
+
+mi_gdb_test "-var-list-children var1.protected.b.public" \
+ "(&\".*\"\r\n)*\\^done,numchild=\"2\",children=\{child=\{name=\"var1\.protected\.b\.public\.bx\",exp=\"bx\",numchild=\"0\",type=\"int\"\},child=\{name=\"var1\.protected\.b\.public\.by\",exp=\"by\",numchild=\"0\",type=\"int\"\}\}" \
+ "list children of A.protected.b.public"
+
+mi_gdb_test "-var-list-children var1.protected.b.private" \
+ "(&\".*\"\r\n)*\\^done,numchild=\"1\",children=\{child=\{name=\"var1\.protected\.b\.private\.k\",exp=\"k\",numchild=\"0\",type=\"int\"\}\}" \
+ "list children of A.protected.b.private"
+
+mi_gdb_test "-var-create - * c" \
+ "(&\".*\"\r\n)*\\^done,name=\"var2\",numchild=\"3\",type=\"C\"" \
+ "create var for class C which has baseclass A"
+
+mi_gdb_test "-var-list-children var2" \
+ "(&\".*\"\r\n)*\\^done,numchild=\"3\",children=\{child=\{name=\"var2\.A\",exp=\"A\",numchild=\"3\",type=\"A\"\},child=\{name=\"var2\.public\",exp=\"public\",numchild=\"1\"\},child=\{name=\"var2\.private\",exp=\"private\",numchild=\"1\"\}\}" \
+ "list children of class C"
+
+mi_gdb_exit
+return 0
Index: gdb792.cc
===================================================================
RCS file: gdb792.cc
diff -N gdb792.cc
--- gdb792.cc 1 Jan 1970 00:00:00 -0000
+++ gdb792.cc 5 Nov 2002 22:23:43 -0000
@@ -0,0 +1,59 @@
+#include <string.h>
+#include <stdio.h>
+
+class Q
+{
+ int v;
+ protected:
+ int qx;
+ int qy;
+ int w;
+};
+
+class B
+{
+ int k;
+ public:
+ int bx;
+ int by;
+};
+
+class A
+{
+ int u;
+
+ public:
+ A()
+ {
+ };
+ int x;
+ char buffer[10];
+
+ protected:
+ int y;
+ B b;
+
+ private:
+ float z;
+};
+
+class C : public A
+{
+ public:
+ C()
+ {
+ };
+ int zzzz;
+ private:
+ int ssss;
+};
+
+int main()
+{
+ A a;
+ C c;
+ Q q;
+ strcpy( a.buffer, "test" );
+ printf ( "%.10s\n", a.buffer );
+ return 0;
+}
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2002-11-07 21:31 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-10-11 15:42 Patch for gdb/mi 792 J. Johnston
2002-10-21 20:06 ` Elena Zannoni
2002-10-22 14:59 ` David Carlton
2002-10-22 15:11 ` Elena Zannoni
2002-10-22 15:19 ` David Carlton
2002-10-22 15:12 ` Andrew Cagney
2002-10-22 15:26 ` David Carlton
2002-10-22 18:05 ` Andrew Cagney
2002-10-22 22:57 ` Eli Zaretskii
2002-10-24 11:53 ` Andrew Cagney
2002-10-24 12:06 ` Eli Zaretskii
2002-10-24 14:29 ` Andrew Cagney
2002-11-07 13:31 J. Johnston
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox