]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Merged revisions 70463 via svnmerge from
authorBenjamin Peterson <benjamin@python.org>
Wed, 18 Mar 2009 21:49:29 +0000 (21:49 +0000)
committerBenjamin Peterson <benjamin@python.org>
Wed, 18 Mar 2009 21:49:29 +0000 (21:49 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r70463 | benjamin.peterson | 2009-03-18 15:52:15 -0500 (Wed, 18 Mar 2009) | 1 line

  fix strange errors when setting attributes on tracebacks #4034
........

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 74a12b8d799526cb7850dcdf3e8d1c0e0fdaf11b..9cb75b2f2608f6ae93cfe359eed0d7b9216f1c94 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -14,6 +14,9 @@ Core and Builtins
 
 - xrange() is now registered as a Sequence.
 
+- Issue #4034: Fix weird attribute error messages of the traceback object. (As a
+  result traceback.__members__ no longer exists.)
+
 - Issue #5247: Improve error message when unknown format codes are
   used when using str.format() with str, unicode, long, int, and
   float arguments.
index 489e8bbe1f14ccb2bd78600b0a65f17e32ac7d3b..9a37b62a1d86e29374e3727200c3ab2cdd203aef 100644 (file)
@@ -572,7 +572,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 */
 };