]> granicus.if.org Git - python/commitdiff
fix strange errors when setting attributes on tracebacks #4034
authorBenjamin Peterson <benjamin@python.org>
Wed, 18 Mar 2009 20:52:15 +0000 (20:52 +0000)
committerBenjamin Peterson <benjamin@python.org>
Wed, 18 Mar 2009 20:52:15 +0000 (20:52 +0000)
Lib/test/test_traceback.py
Misc/NEWS
Objects/frameobject.c
Python/traceback.c

index 8034839499a3114177aaac100270d9815fafba0e..0708f8163ef23e312c18c813c64f8ae1348a9e10 100644 (file)
@@ -111,14 +111,6 @@ def test():
                 os.unlink(os.path.join(testdir, f))
             os.rmdir(testdir)
 
-    def test_members(self):
-        # Covers Python/structmember.c::listmembers()
-        try:
-            1/0
-        except:
-            import sys
-            sys.exc_traceback.__members__
-
     def test_base_exception(self):
         # Test that exceptions derived from BaseException are formatted right
         e = KeyboardInterrupt()
index 9ac44f968fca2997af45ad5f16c85011ce3132c1..d3abb41904ae060aa46881ceb9958c66615867e7 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 2.7 alpha 1
 Core and Builtins
 -----------------
 
+- Issue #4034: Fix weird attribute error messages of the traceback object. (As a
+  result traceback.__members__ no longer exists.)
+
 - Issue #4474: PyUnicode_FromWideChar now converts characters outside
   the BMP to surrogate pairs, on systems with sizeof(wchar_t) == 4
   and sizeof(Py_UNICODE) == 2.
index 1ea586feea1c58a9b6e2bc3f6f30832071d61d2b..c8cf71b34c0b554efd96d5bc9f07b9825c2aebeb 100644 (file)
@@ -604,7 +604,17 @@ static PyObject *builtin_object;
 int _PyFrame_Init()
 {
        builtin_object = PyString_InternFromString("__builtins__");
-       return (builtin_object != NULL);
+       if (builtin_object == NULL)
+               return 0;
+       /* 
+          Traceback objects are not created the normal way (through calling the
+          type), so PyType_Ready has to be called here.
+       */
+       if (PyType_Ready(&PyTraceBack_Type)) {
+               Py_DECREF(builtin_object);
+               return 0;
+       }
+       return 1;
 }
 
 PyFrameObject *
index 5df7694e66a43ae6d1e745cd366f1446aa7434d8..c2d7e77a3e563f6659cae565f5d4653b06cd3d2c 100644 (file)
 
 #define OFF(x) offsetof(PyTracebackObject, x)
 
-static struct memberlist tb_memberlist[] = {
-       {"tb_next",     T_OBJECT,       OFF(tb_next)},
-       {"tb_frame",    T_OBJECT,       OFF(tb_frame)},
-       {"tb_lasti",    T_INT,          OFF(tb_lasti)},
-       {"tb_lineno",   T_INT,          OFF(tb_lineno)},
+static PyMemberDef tb_memberlist[] = {
+       {"tb_next",     T_OBJECT,       OFF(tb_next), READONLY},
+       {"tb_frame",    T_OBJECT,       OFF(tb_frame), READONLY},
+       {"tb_lasti",    T_INT,          OFF(tb_lasti), READONLY},
+       {"tb_lineno",   T_INT,          OFF(tb_lineno), READONLY},
        {NULL}  /* Sentinel */
 };
 
-static PyObject *
-tb_getattr(PyTracebackObject *tb, char *name)
-{
-       return PyMember_Get((char *)tb, tb_memberlist, name);
-}
-
 static void
 tb_dealloc(PyTracebackObject *tb)
 {
@@ -58,7 +52,7 @@ PyTypeObject PyTraceBack_Type = {
        0,
        (destructor)tb_dealloc, /*tp_dealloc*/
        0,              /*tp_print*/
-       (getattrfunc)tb_getattr, /*tp_getattr*/
+       0,              /*tp_getattr*/
        0,              /*tp_setattr*/
        0,              /*tp_compare*/
        0,              /*tp_repr*/
@@ -80,8 +74,8 @@ PyTypeObject PyTraceBack_Type = {
        0,                                      /* tp_iter */
        0,                                      /* tp_iternext */
        0,                                      /* tp_methods */
-       0,                      /* tp_members */
-       0,                      /* tp_getset */
+       tb_memberlist,                          /* tp_members */
+       0,                                      /* tp_getset */
        0,                                      /* tp_base */
        0,                                      /* tp_dict */
 };