PR python/12070:
authorTom Tromey <tromey@redhat.com>
Fri, 17 Feb 2012 19:24:27 +0000 (19:24 +0000)
committerTom Tromey <tromey@redhat.com>
Fri, 17 Feb 2012 19:24:27 +0000 (19:24 +0000)
* python/py-event.c (event_object_getset): New global.
(event_object_type): Reference it.
* python/py-type.c (field_object_getset): New global.
(field_object_type): Reference it.
* python/python-internal.h (gdb_py_generic_dict): Declare.
* python/py-utils.c (gdb_py_generic_dict): New function.
testsuite/gdb
* gdb.python/py-events.py (exit_handler): Add test for 'dir'.
* gdb.python/py-events.exp: Check 'dir' output.
* gdb.python/py-type.exp (test_fields): Add test for 'dir'.

gdb/ChangeLog
gdb/python/py-event.c
gdb/python/py-type.c
gdb/python/py-utils.c
gdb/python/python-internal.h
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-events.exp
gdb/testsuite/gdb.python/py-events.py
gdb/testsuite/gdb.python/py-type.exp

index f4ca0c77234b6766b503926333a86d0d9ca9c2f3..4cb1be1aa7a7fc5b1e5e1bc563442c1112034f99 100644 (file)
@@ -1,3 +1,13 @@
+2012-02-17  Tom Tromey  <tromey@redhat.com>
+
+       PR python/12070:
+       * python/py-event.c (event_object_getset): New global.
+       (event_object_type): Reference it.
+       * python/py-type.c (field_object_getset): New global.
+       (field_object_type): Reference it.
+       * python/python-internal.h (gdb_py_generic_dict): Declare.
+       * python/py-utils.c (gdb_py_generic_dict): New function.
+
 2012-02-17  Tristan Gingold  <gingold@adacore.com>
  
        * solib-darwin.c (darwin_current_sos): Check magic and filetype
index 7d4ff14457668643b10d6fd6db2870df363ceb9c..4789761f2d6337c7eeb2148fb0345b8ca5ed8786 100644 (file)
@@ -132,6 +132,13 @@ evpy_emit_event (PyObject *event,
   return -1;
 }
 
+static PyGetSetDef event_object_getset[] =
+{
+  { "__dict__", gdb_py_generic_dict, NULL,
+    "The __dict__ for this event.", &event_object_type },
+  { NULL }
+};
+
 PyTypeObject event_object_type =
 {
   PyObject_HEAD_INIT (NULL)
@@ -164,7 +171,7 @@ PyTypeObject event_object_type =
   0,                                          /* tp_iternext */
   0,                                          /* tp_methods */
   0,                                          /* tp_members */
-  0,                                          /* tp_getset */
+  event_object_getset,                       /* tp_getset */
   0,                                          /* tp_base */
   0,                                          /* tp_dict */
   0,                                          /* tp_descr_get */
index 70ed5d6e381f334716c818e1a42d4a1d318aab23..d47d4c8be8624c563e5e8b8d4005d34d36177093 100644 (file)
@@ -1681,6 +1681,13 @@ static PyTypeObject type_object_type =
   0,                             /* tp_new */
 };
 
+static PyGetSetDef field_object_getset[] =
+{
+  { "__dict__", gdb_py_generic_dict, NULL,
+    "The __dict__ for this field.", &field_object_type },
+  { NULL }
+};
+
 static PyTypeObject field_object_type =
 {
   PyObject_HEAD_INIT (NULL)
@@ -1713,7 +1720,7 @@ static PyTypeObject field_object_type =
   0,                             /* tp_iternext */
   0,                             /* tp_methods */
   0,                             /* tp_members */
-  0,                             /* tp_getset */
+  field_object_getset,           /* tp_getset */
   0,                             /* tp_base */
   0,                             /* tp_dict */
   0,                             /* tp_descr_get */
index 3579720674d6ab10fa9eb524247920baa4f84cd7..bf50e37d5b052000b2b672c19c8d06cb6b964182 100644 (file)
@@ -373,3 +373,23 @@ gdb_py_int_as_long (PyObject *obj, long *result)
   *result = PyInt_AsLong (obj);
   return ! (*result == -1 && PyErr_Occurred ());
 }
+
+\f
+
+/* Generic implementation of the __dict__ attribute for objects that
+   have a dictionary.  The CLOSURE argument should be the type object.
+   This only handles positive values for tp_dictoffset.  */
+
+PyObject *
+gdb_py_generic_dict (PyObject *self, void *closure)
+{
+  PyObject *result;
+  PyTypeObject *type_obj = closure;
+  char *raw_ptr;
+
+  raw_ptr = (char *) self + type_obj->tp_dictoffset;
+  result = * (PyObject **) raw_ptr;
+
+  Py_INCREF (result);
+  return result;
+}
index 1d6247d067114be750e2e361bd7b396ff4d843e7..bae61c28da821c7541d9ccbab9d977719c320bdd 100644 (file)
@@ -342,4 +342,6 @@ PyObject *gdb_py_object_from_longest (LONGEST l);
 PyObject *gdb_py_object_from_ulongest (ULONGEST l);
 int gdb_py_int_as_long (PyObject *, long *);
 
+PyObject *gdb_py_generic_dict (PyObject *self, void *closure);
+
 #endif /* GDB_PYTHON_INTERNAL_H */
index 0de5fe45b98a58e003e4f8b475c2c50bcde233a6..71ec65be40a6a1ef2e4c64399a548ba88e18b965 100644 (file)
@@ -1,3 +1,9 @@
+2012-02-17  Tom Tromey  <tromey@redhat.com>
+
+       * gdb.python/py-events.py (exit_handler): Add test for 'dir'.
+       * gdb.python/py-events.exp: Check 'dir' output.
+       * gdb.python/py-type.exp (test_fields): Add test for 'dir'.
+
 2012-02-17  Yao Qi  <yao@codesourcery.com>
 
        * gdb.trace/strace.exp (strace_info_marker): Test `info threads'.
index 18d3380efb6b06af46ec47b876a74a3cd21ea50b..d872daf0e14bcd39deab08c8b380b46743917e2f 100644 (file)
@@ -85,10 +85,12 @@ delete_breakpoints
 gdb_test "continue" ".*event type: continue.*
 .*event type: exit.*
 .*exit code: 12.*
-.*exit inf: 1.*" "Inferior 1 terminated."
+.*exit inf: 1.*
+dir ok: True.*" "Inferior 1 terminated."
 
 gdb_test "inferior 2" ".*Switching to inferior 2.*"
 gdb_test "continue" ".*event type: continue.*
 .*event type: exit.*
 .*exit code: 12.*
-.*exit inf: 2.*" "Inferior 2 terminated."
+.*exit inf: 2.*
+dir ok: True.*" "Inferior 2 terminated."
index 122def0caf84f883f48beefbebdcbcdd88662fcd..f7e45f56bcf1ebaabd83ef5a1555aa3c56d16f71 100644 (file)
@@ -44,6 +44,7 @@ def exit_handler (event):
         print "event type: exit"
     print "exit code: %d" % (event.exit_code)
     print "exit inf: %d" % (event.inferior.num)
+    print "dir ok: %s" % str('exit_code' in dir(event))
 
 def continue_handler (event):
     if (isinstance (event, gdb.ContinueEvent)):
index e4729ad13425d07f7b08446152adb481cd5c831b..feb76ba5e71ef14c4746e1a05dcc793abd8f55e2 100644 (file)
@@ -86,6 +86,11 @@ proc test_fields {lang} {
   gdb_test "python print fields\[0\].name" "a" "Check structure field a name"
   gdb_test "python print fields\[1\].name" "b" "Check structure field b name"
 
+  # Regression test for
+  # http://sourceware.org/bugzilla/show_bug.cgi?id=12070.
+  gdb_test "python print 'type' in dir(fields\[0\])" "True" \
+    "Check that dir includes name"
+
   # Test Python mapping behavior of gdb.Type for structs/classes
   gdb_test "python print len(st.type)" "2" "Check number of fields"
   gdb_test "python print st.type\['a'\].name" "a" "Check fields lookup by name"