From: Li Yu <raise.sail@gmail.com>
To: gdb-patches@sourceware.org
Cc: Paul Koning <paulkoning@comcast.net>, Tom Tromey <tromey@redhat.com>
Subject: [PATCH v4] gdb/python: add missing handling for anonymous members of struct and union
Date: Sat, 08 Oct 2011 05:35:00 -0000 [thread overview]
Message-ID: <CA+WLrf-MM2WPr6r8DLKcZP5-A6qmZst8Sxzy4u5OvrxFET5sEQ@mail.gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 1739 bytes --]
gdb.Type.fields() missed handling for anonymous members.
This patch fix it, below are details:
Assume that we have a c source as below:
/////////////////////////////
struct A
{
int a;
union {
int b0;
int b1;
union {
int bb0;
int bb1;
union {
int bbb0;
int bbb1;
};
};
};
int c;
union {
union {
int dd0;
int dd1;
};
int d2;
int d3;
};
};
int main()
{
struct A a;
}
////////////////////////////
And have a python gdb script as below:
##########################
v = gdb.parse_and_eval("a")
t = v.type
fields = t.fields()
for f in fields:
print "[%s]" % f.name, v[f.name]
##########################
Without this patch, above script will print:
[a] -7616
[] {{dd0 = 0, dd1 = 0}, d2 = 0, d3 = 0}
[c] 0
[] {{dd0 = 0, dd1 = 0}, d2 = 0, d3 = 0}
With this patch, above script will print rightly:
[a] -7616
[b0] 32767
[b1] 32767
[bb0] 32767
[bb1] 32767
[bbb0] 32767
[bbb1] 32767
[c] 0
[dd0] 0
[dd1] 0
[d2] 0
[d3] 0
Thanks for Paul and Tom's feedback of this patch.
This version uses recursion implementation, as we discussed, this
patch is passed by "make check" without regression :)
Signed-off-by: Li Yu <raise.sail@gmail.com>
gdb/python/:
2011-10-8 Li Yu <raise.sail@gmail.com>
* py-type.c: Add process for anonymous members of struct and union
py-type.c | 41 ++++++++++++++++++++++++++++++++++-------
1 file changed, 34 insertions(+), 7 deletions(-)
[-- Attachment #2: gdb.python.patch --]
[-- Type: text/x-patch, Size: 2119 bytes --]
diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c
index c7fd25b..b3632ea 100644
--- a/gdb/python/py-type.c
+++ b/gdb/python/py-type.c
@@ -56,8 +56,11 @@ typedef struct pyty_field_object
static PyTypeObject field_object_type;
/* A type iterator object. */
-typedef struct {
+typedef struct iterator_object
+{
PyObject_HEAD
+ /* The iterators for support fields of anonymous field */
+ struct iterator_object *child;
/* The current field index. */
int field;
/* What to return. */
@@ -1200,6 +1203,7 @@ typy_make_iter (PyObject *self, enum gdbpy_iter_kind kind)
if (typy_iter_obj == NULL)
return NULL;
+ typy_iter_obj->child = NULL;
typy_iter_obj->field = 0;
typy_iter_obj->kind = kind;
Py_INCREF (self);
@@ -1257,11 +1261,27 @@ static PyObject *
typy_iterator_iternext (PyObject *self)
{
typy_iterator_object *iter_obj = (typy_iterator_object *) self;
- struct type *type = iter_obj->source->type;
- int i;
- PyObject *result;
-
- if (iter_obj->field < TYPE_NFIELDS (type))
+ typy_iterator_object *child_iter_obj;
+ struct type *type;
+ PyObject *result, *child_pytype;
+ const char *name;
+
+ if (iter_obj->child)
+ {
+ result = typy_iterator_iternext((PyObject*)iter_obj->child);
+ if (result)
+ return result;
+ Py_CLEAR(iter_obj->child);
+ }
+
+ type = iter_obj->source->type;
+
+restart:
+ if (iter_obj->field >= TYPE_NFIELDS (type))
+ return NULL;
+
+ name = TYPE_FIELD_NAME (type, iter_obj->field);
+ if (!name || name[0]) /* array element or regular named member */
{
result = make_fielditem (type, iter_obj->field, iter_obj->kind);
if (result != NULL)
@@ -1269,7 +1289,14 @@ typy_iterator_iternext (PyObject *self)
return result;
}
- return NULL;
+ type = TYPE_FIELD_TYPE(type, iter_obj->field++);
+ child_pytype = type_to_type_object(type);
+ if (!child_pytype)
+ return NULL;
+ child_iter_obj = (typy_iterator_object*)typy_make_iter(child_pytype, iter_obj->kind);
+ iter_obj->child = child_iter_obj;
+ iter_obj = child_iter_obj;
+ goto restart;
}
static void
next reply other threads:[~2011-10-08 5:35 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-08 5:35 Li Yu [this message]
2011-10-18 1:48 ` Li Yu
2011-10-18 2:46 ` Yao Qi
2011-10-18 14:03 ` Phil Muldoon
[not found] ` <09787EF419216C41A903FD14EE5506DD030CB90864@AUSX7MCPC103.AMER.DELL.COM>
2011-10-18 19:31 ` Paul Koning
2011-10-19 8:28 ` Li Yu
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=CA+WLrf-MM2WPr6r8DLKcZP5-A6qmZst8Sxzy4u5OvrxFET5sEQ@mail.gmail.com \
--to=raise.sail@gmail.com \
--cc=gdb-patches@sourceware.org \
--cc=paulkoning@comcast.net \
--cc=tromey@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