* python/py-type.c (typy_fields_items): Call check_typedef.
authorDoug Evans <dje@google.com>
Thu, 10 Nov 2011 19:15:10 +0000 (19:15 +0000)
committerDoug Evans <dje@google.com>
Thu, 10 Nov 2011 19:15:10 +0000 (19:15 +0000)
testsuite/
* gdb.python/py-type.c (TS): New typedef.
(ts): New global.
* gdb.python/py-type.exp: Test field list of typedef.

gdb/ChangeLog
gdb/python/py-type.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-type.c
gdb/testsuite/gdb.python/py-type.exp

index c1770be..cc87748 100644 (file)
@@ -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
index 67696fd..44a2223 100644 (file)
@@ -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;
 }
 
index 8b0abc3..a12be84 100644 (file)
@@ -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.
index b0dcc9d..2d49ff8 100644 (file)
@@ -21,6 +21,9 @@ struct s
   int b;
 };
 
+typedef struct s TS;
+TS ts;
+
 #ifdef __cplusplus
 struct C
 {
index ec86586..3578a7e 100644 (file)
@@ -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