[Python-checkins] r70463 - in python/trunk: Lib/test/test_traceback.py Misc/NEWS Objects/frameobject.c Python/traceback.c

benjamin.peterson python-checkins at python.org
Wed Mar 18 21:52:16 CET 2009


Author: benjamin.peterson
Date: Wed Mar 18 21:52:15 2009
New Revision: 70463

Log:
fix strange errors when setting attributes on tracebacks #4034

Modified:
   python/trunk/Lib/test/test_traceback.py
   python/trunk/Misc/NEWS
   python/trunk/Objects/frameobject.c
   python/trunk/Python/traceback.c

Modified: python/trunk/Lib/test/test_traceback.py
==============================================================================
--- python/trunk/Lib/test/test_traceback.py	(original)
+++ python/trunk/Lib/test/test_traceback.py	Wed Mar 18 21:52:15 2009
@@ -111,14 +111,6 @@
                 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()

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Wed Mar 18 21:52:15 2009
@@ -12,6 +12,9 @@
 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.

Modified: python/trunk/Objects/frameobject.c
==============================================================================
--- python/trunk/Objects/frameobject.c	(original)
+++ python/trunk/Objects/frameobject.c	Wed Mar 18 21:52:15 2009
@@ -604,7 +604,17 @@
 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 *

Modified: python/trunk/Python/traceback.c
==============================================================================
--- python/trunk/Python/traceback.c	(original)
+++ python/trunk/Python/traceback.c	Wed Mar 18 21:52:15 2009
@@ -11,20 +11,14 @@
 
 #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 @@
 	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 @@
 	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 */
 };


More information about the Python-checkins mailing list