diff Python/traceback.c @ 42537:74a3c6826683

Remove support for __members__ and __methods__. There still might be some cleanup to do on this. Particularly in Python/traceback.c with getting rid of the getattr if possible and Demo/*metaclasses/Enum.py.
author Neal Norwitz <nnorwitz@gmail.com>
date Sat, 11 Aug 2007 06:39:53 +0000
parents e70cdce0e8b2
children 9b02128521e2
line wrap: on
line diff
--- a/Python/traceback.c	Sat Aug 11 06:13:20 2007 +0000
+++ b/Python/traceback.c	Sat Aug 11 06:39:53 2007 +0000
@@ -11,18 +11,28 @@
 
 #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 */
 };
 
+/* XXX(nnorwitz): can we get rid of tb_getattr and use tp_members? */
 static PyObject *
 tb_getattr(PyTracebackObject *tb, char *name)
 {
-	return PyMember_Get((char *)tb, tb_memberlist, name);
+	int i;
+	for (i = 0; tb_memberlist[i].name != NULL; i++) {
+		if (strcmp(name, tb_memberlist[i].name) == 0)
+			return PyMember_GetOne((const char *)tb,
+					       tb_memberlist + i);
+	}
+	PyErr_Format(PyExc_AttributeError,
+		     "'%.50s' object has no attribute '%.400s'",
+		     Py_Type(tb)->tp_name, name);
+	return NULL;
 }
 
 static void
@@ -80,8 +90,8 @@
 	0,					/* tp_iter */
 	0,					/* tp_iternext */
 	0,					/* tp_methods */
-	0,			/* tp_members */
-	0,			/* tp_getset */
+	0,					/* tp_members */
+	0,					/* tp_getset */
 	0,					/* tp_base */
 	0,					/* tp_dict */
 };