2011-11-10 Doug Evans * 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. Index: python/py-type.c =================================================================== RCS file: /cvs/src/src/gdb/python/py-type.c,v retrieving revision 1.28 diff -u -p -r1.28 py-type.c --- python/py-type.c 4 Nov 2011 11:57:04 -0000 1.28 +++ python/py-type.c 10 Nov 2011 18:43:42 -0000 @@ -294,14 +294,33 @@ make_fielditem (struct type *type, int i 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; } Index: testsuite/gdb.python/py-type.c =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.python/py-type.c,v retrieving revision 1.5 diff -u -p -r1.5 py-type.c --- testsuite/gdb.python/py-type.c 28 Sep 2011 20:06:01 -0000 1.5 +++ testsuite/gdb.python/py-type.c 10 Nov 2011 18:48:52 -0000 @@ -21,6 +21,9 @@ struct s int b; }; +typedef struct s TS; +TS ts; + #ifdef __cplusplus struct C { Index: testsuite/gdb.python/py-type.exp =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.python/py-type.exp,v retrieving revision 1.14 diff -u -p -r1.14 py-type.exp --- testsuite/gdb.python/py-type.exp 28 Sep 2011 20:06:01 -0000 1.14 +++ testsuite/gdb.python/py-type.exp 10 Nov 2011 18:48:52 -0000 @@ -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