diff --git a/Python/traceback.c b/Python/traceback.c
index b96ca47..1c26ba2 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -12,6 +12,8 @@
 #define OFF(x) offsetof(PyTracebackObject, x)
 
 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 */
@@ -43,81 +45,6 @@
 	Py_CLEAR(tb->tb_frame);
 }
 
-static PyObject *
-tb_get_next(PyTracebackObject *tb) {
-	if (tb->tb_next) {
-		Py_INCREF(tb->tb_next);
-		return (PyObject *)tb->tb_next;
-	}
-	Py_RETURN_NONE;
-}
-
-static int
-tb_set_next(PyTracebackObject *tb, PyObject *new, void *context) {
-	if (!new) {
-		PyErr_SetString(PyExc_TypeError, "can't delete tb_next");
-		return -1;
-	}
-	else if (new == Py_None) {
-		new = NULL;
-	}
-	else if (PyTraceBack_Check(new)) {
-		/* Check for cycles in the traceback. */
-		PyTracebackObject *current = (PyTracebackObject *)new;
-		do {
-			if (tb == current) {
-				PyErr_SetString(PyExc_ValueError, "cycle in traceback");
-				return -1;
-			}
-		} while ((current = current->tb_next));
-		Py_INCREF(new);
-	}
-	else {
-		PyErr_SetString(PyExc_TypeError,
-				"tb_next must be an traceback object");
-		return -1;
-	}
-	Py_XDECREF(tb->tb_next);
-	tb->tb_next = (PyTracebackObject *)new;
-	return 0;
-}
-
-static PyObject *
-tb_get_frame(PyTracebackObject *tb) {
-	if (tb->tb_frame) {
-		Py_INCREF(tb->tb_frame);
-		return (PyObject *)tb->tb_frame;
-	}
-	Py_RETURN_NONE;
-}
-
-static int
-tb_set_frame(PyTracebackObject *tb, PyObject *new, void *context) {
-	if (!new) {
-		PyErr_SetString(PyExc_TypeError,
-				"can't delete tb_frame attribute");
-		return -1;
-	}
-	else if (new == Py_None) {
-		new = NULL;
-	}
-	else if (PyFrame_Check(new)) {
-		Py_INCREF(new);
-	}
-	else {
-		PyErr_SetString(PyExc_TypeError,
-				"tb_frame must be a frame object");
-		return -1;
-	}
-	tb->tb_frame = (PyFrameObject *)new;
-	return 0;
-}
-
-static PyGetSetDef tb_getset[] = {
-	{"tb_next", (getter)tb_get_next, (setter)tb_set_next, NULL},
-	{"tb_frame", (getter)tb_get_frame, (setter)tb_set_frame, NULL},
-};
-
 PyTypeObject PyTraceBack_Type = {
 	PyVarObject_HEAD_INIT(&PyType_Type, 0)
 	"traceback",
@@ -148,7 +75,7 @@
 	0,					/* tp_iternext */
 	0,					/* tp_methods */
 	tb_memberlist,			        /* tp_members */
-	tb_getset,			        /* tp_getset */
+	0,			                /* tp_getset */
 	0,					/* tp_base */
 	0,					/* tp_dict */
 };
@@ -318,16 +245,11 @@
 	}
 	while (tb != NULL && err == 0) {
 		if (depth <= limit) {
-			PyFrameObject *frame = tb->tb_frame;
-			char *filename, *name;
-			if (frame) {
-				filename = PyString_AS_STRING(frame->f_code->co_filename);
-				name = PyString_AS_STRING(frame->f_code->co_name);
-			}
-			else {
-				filename = name = "unkown (no frame on traceback)";
-			}
-			err = tb_displayline(f, filename, tb->tb_lineno, name);
+			err = tb_displayline(f,
+			    PyString_AsString(
+				    tb->tb_frame->f_code->co_filename),
+			    tb->tb_lineno,
+			    PyString_AsString(tb->tb_frame->f_code->co_name));
 		}
 		depth--;
 		tb = tb->tb_next;
