Index: Lib/test/test_builtin.py =================================================================== --- Lib/test/test_builtin.py (revision 56936) +++ Lib/test/test_builtin.py (working copy) @@ -287,6 +287,13 @@ 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: Python/traceback.c =================================================================== --- Python/traceback.c (revision 56936) +++ Python/traceback.c (working copy) @@ -11,6 +11,18 @@ #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}, @@ -89,7 +101,7 @@ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - 0, /* tp_methods */ + tb_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */