From 53f098cdc6f1416e43090f518eac9a37cdcc818c Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Wed, 18 Mar 2009 21:49:29 +0000 Subject: Merged revisions 70463 via svnmerge from 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 | 8 -------- Misc/NEWS | 3 +++ Objects/frameobject.c | 12 +++++++++++- Python/traceback.c | 22 ++++++++-------------- 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 8034839..0708f81 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -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() diff --git a/Misc/NEWS b/Misc/NEWS index 74a12b8..9cb75b2 100644 --- 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. diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 489e8bb..9a37b62 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -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 * diff --git a/Python/traceback.c b/Python/traceback.c index 5df7694..c2d7e77 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -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 @@ 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 */ }; -- cgit v0.12