aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2011-11-10 19:15:10 +0000
committerDoug Evans <dje@google.com>2011-11-10 19:15:10 +0000
commitf6b47be484b30121c0d162eafd6c4a64dbd8d59f (patch)
tree57edd4b9d22beaeba5f4403846ed67b513904b02
parentbd119cf1520d4fc5b6733f7d035461dd277c951e (diff)
downloadgdb-f6b47be484b30121c0d162eafd6c4a64dbd8d59f.zip
gdb-f6b47be484b30121c0d162eafd6c4a64dbd8d59f.tar.gz
gdb-f6b47be484b30121c0d162eafd6c4a64dbd8d59f.tar.bz2
* python/py-type.c (typy_fields_items): Call check_typedef.
testsuite/ * gdb.python/py-type.c (TS): New typedef. (ts): New global. * gdb.python/py-type.exp: Test field list of typedef.
-rw-r--r--gdb/ChangeLog4
-rw-r--r--gdb/python/py-type.c33
-rw-r--r--gdb/testsuite/ChangeLog6
-rw-r--r--gdb/testsuite/gdb.python/py-type.c3
-rw-r--r--gdb/testsuite/gdb.python/py-type.exp4
5 files changed, 43 insertions, 7 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index c1770be..cc87748 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,7 @@
+2011-11-10 Doug Evans <dje@google.com>
+
+ * python/py-type.c (typy_fields_items): Call check_typedef.
+
2011-11-10 Joel Brobecker <brobecker@adacore.com>
* findvar.c (read_frame_register_value): Read the correct bytes
diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c
index 67696fd..44a2223 100644
--- a/gdb/python/py-type.c
+++ b/gdb/python/py-type.c
@@ -294,14 +294,33 @@ make_fielditem (struct type *type, int i, enum gdbpy_iter_kind kind)
static PyObject *
typy_fields_items (PyObject *self, enum gdbpy_iter_kind kind)
{
+ PyObject *py_type = self;
PyObject *result = NULL, *iter = NULL;
-
- iter = typy_make_iter (self, kind);
- if (iter == NULL)
- return NULL;
-
- result = PySequence_List (iter);
- Py_DECREF (iter);
+ volatile struct gdb_exception except;
+ struct type *type = ((type_object *) py_type)->type;
+ struct type *checked_type = type;
+
+ TRY_CATCH (except, RETURN_MASK_ALL)
+ {
+ CHECK_TYPEDEF (checked_type);
+ }
+ GDB_PY_HANDLE_EXCEPTION (except);
+
+ if (checked_type != type)
+ py_type = type_to_type_object (checked_type);
+ iter = typy_make_iter (py_type, kind);
+ if (checked_type != type)
+ {
+ /* Need to wrap this in braces because Py_DECREF isn't wrapped
+ in a do{}while(0). */
+ Py_DECREF (py_type);
+ }
+ if (iter != NULL)
+ {
+ result = PySequence_List (iter);
+ Py_DECREF (iter);
+ }
+
return result;
}
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 8b0abc3..a12be84 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2011-11-10 Doug Evans <dje@google.com>
+
+ * gdb.python/py-type.c (TS): New typedef.
+ (ts): New global.
+ * gdb.python/py-type.exp: Test field list of typedef.
+
2011-11-10 Joel Brobecker <brobecker@adacore.com>
* gdb.ada/small_reg_param: New testcase.
diff --git a/gdb/testsuite/gdb.python/py-type.c b/gdb/testsuite/gdb.python/py-type.c
index b0dcc9d..2d49ff8 100644
--- a/gdb/testsuite/gdb.python/py-type.c
+++ b/gdb/testsuite/gdb.python/py-type.c
@@ -21,6 +21,9 @@ struct s
int b;
};
+typedef struct s TS;
+TS ts;
+
#ifdef __cplusplus
struct C
{
diff --git a/gdb/testsuite/gdb.python/py-type.exp b/gdb/testsuite/gdb.python/py-type.exp
index ec86586..3578a7e 100644
--- a/gdb/testsuite/gdb.python/py-type.exp
+++ b/gdb/testsuite/gdb.python/py-type.exp
@@ -64,6 +64,10 @@ proc runto_bp {bp} {
proc test_fields {lang} {
global gdb_prompt
+ # .fields() of a typedef should still return the underlying field list
+ gdb_test "python print len(gdb.parse_and_eval('ts').type.fields())" "2" \
+ "$lang typedef field list"
+
if {$lang == "c++"} {
# Test usage with a class
gdb_py_test_silent_cmd "print c" "print value" 1