]> granicus.if.org Git - python/commitdiff
Bug #1772489: make dir() work on traceback objects again.
authorCollin Winter <collinw@gmail.com>
Tue, 14 Aug 2007 17:53:54 +0000 (17:53 +0000)
committerCollin Winter <collinw@gmail.com>
Tue, 14 Aug 2007 17:53:54 +0000 (17:53 +0000)
Lib/test/test_builtin.py
Python/traceback.c

index b43082212d1da90318f5f4026cb94e59a4f7deae..b3e47338041bbfa738eac9496d429982d8f16117 100644 (file)
@@ -283,6 +283,13 @@ class BuiltinTest(unittest.TestCase):
         f = Foo()
         self.assertRaises(TypeError, dir, f)
 
+        # dir(traceback)
+        try:
+            raise IndexError
+        except:
+            self.assertEqual(len(dir(sys.exc_info()[2])), 4)
+
+
     def test_divmod(self):
         self.assertEqual(divmod(12, 7), (1, 5))
         self.assertEqual(divmod(-12, 7), (-2, 2))
index aa99ab4da4c66fd29f96288fcfe9ee65a2e813d7..5bb8841ff2b9b7b0f31feee482c67ee491d15e68 100644 (file)
 
 #define OFF(x) offsetof(PyTracebackObject, x)
 
+static PyObject *
+tb_dir(PyTracebackObject *self)
+{
+    return Py_BuildValue("[ssss]", "tb_frame", "tb_next",
+                                   "tb_lasti", "tb_lineno");
+}
+
+static PyMethodDef tb_methods[] = {
+   {"__dir__", (PyCFunction)tb_dir, METH_NOARGS},
+   {NULL, NULL, 0, NULL},
+};
+
 static PyMemberDef tb_memberlist[] = {
        {"tb_next",     T_OBJECT,       OFF(tb_next),   READONLY},
        {"tb_frame",    T_OBJECT,       OFF(tb_frame),  READONLY},
@@ -73,7 +85,7 @@ PyTypeObject PyTraceBack_Type = {
        0,                                      /* tp_weaklistoffset */
        0,                                      /* tp_iter */
        0,                                      /* tp_iternext */
-       0,                                      /* tp_methods */
+       tb_methods,     /* tp_methods */
        tb_memberlist,  /* tp_members */
        0,                                      /* tp_getset */
        0,                                      /* tp_base */