Get rid of __defined__ and tp_defined -- there's no need to
distinguish __dict__ and __defined__ any more.  In the C structure,
tp_cache takes its place -- but this hasn't been implemented yet.
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 8a78e69..901d026 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -44,7 +44,7 @@
 						  (int)(s - type->tp_name));
 	if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE))
 		return PyString_FromString("__builtin__");
-	mod = PyDict_GetItemString(type->tp_defined, "__module__");
+	mod = PyDict_GetItemString(type->tp_dict, "__module__");
 	if (mod != NULL && PyString_Check(mod)) {
 		Py_INCREF(mod);
 		return mod;
@@ -80,21 +80,10 @@
 	return PyDictProxy_New(type->tp_dict);
 }
 
-static PyObject *
-type_defined(PyTypeObject *type, void *context)
-{
-	if (type->tp_defined == NULL) {
-		Py_INCREF(Py_None);
-		return Py_None;
-	}
-	return PyDictProxy_New(type->tp_defined);
-}
-
 PyGetSetDef type_getsets[] = {
 	{"__name__", (getter)type_name, NULL, NULL},
 	{"__module__", (getter)type_module, (setter)type_set_module, NULL},
 	{"__dict__",  (getter)type_dict,  NULL, NULL},
-	{"__defined__",  (getter)type_defined,  NULL, NULL},
 	{0}
 };
 
@@ -838,8 +827,8 @@
 	Py_INCREF(base);
 	type->tp_base = base;
 
-	/* Initialize tp_defined from passed-in dict */
-	type->tp_defined = dict = PyDict_Copy(dict);
+	/* Initialize tp_dict from passed-in dict */
+	type->tp_dict = dict = PyDict_Copy(dict);
 	if (dict == NULL) {
 		Py_DECREF(type);
 		return NULL;
@@ -973,14 +962,14 @@
 	int i, n;
 	PyObject *mro, *res, *dict;
 
-	/* Look in tp_defined of types in MRO */
+	/* Look in tp_dict of types in MRO */
 	mro = type->tp_mro;
 	assert(PyTuple_Check(mro));
 	n = PyTuple_GET_SIZE(mro);
 	for (i = 0; i < n; i++) {
 		type = (PyTypeObject *) PyTuple_GET_ITEM(mro, i);
 		assert(PyType_Check(type));
-		dict = type->tp_defined;
+		dict = type->tp_dict;
 		assert(dict && PyDict_Check(dict));
 		res = PyDict_GetItem(dict, name);
 		if (res != NULL)
@@ -1014,7 +1003,7 @@
 				 (PyObject *)type, (PyObject *)metatype);
 	}
 
-	/* Look in tp_defined of this type and its bases */
+	/* Look in tp_dict of this type and its bases */
 	res = _PyType_Lookup(type, name);
 	if (res != NULL) {
 		f = res->ob_type->tp_descr_get;
@@ -1070,7 +1059,7 @@
 	Py_XDECREF(type->tp_dict);
 	Py_XDECREF(type->tp_bases);
 	Py_XDECREF(type->tp_mro);
-	Py_XDECREF(type->tp_defined);
+	Py_XDECREF(type->tp_cache);
 	Py_XDECREF(type->tp_subclasses);
 	Py_XDECREF(et->name);
 	Py_XDECREF(et->slots);
@@ -1136,7 +1125,7 @@
 	}
 
 	VISIT(type->tp_dict);
-	VISIT(type->tp_defined);
+	VISIT(type->tp_cache);
 	VISIT(type->tp_mro);
 	VISIT(type->tp_bases);
 	VISIT(type->tp_base);
@@ -1167,7 +1156,7 @@
 	}
 
 	CLEAR(type->tp_dict);
-	CLEAR(type->tp_defined);
+	CLEAR(type->tp_cache);
 	CLEAR(type->tp_mro);
 	CLEAR(type->tp_bases);
 	CLEAR(type->tp_base);
@@ -1455,7 +1444,7 @@
 static int
 add_methods(PyTypeObject *type, PyMethodDef *meth)
 {
-	PyObject *dict = type->tp_defined;
+	PyObject *dict = type->tp_dict;
 
 	for (; meth->ml_name != NULL; meth++) {
 		PyObject *descr;
@@ -1474,7 +1463,7 @@
 static int
 add_members(PyTypeObject *type, PyMemberDef *memb)
 {
-	PyObject *dict = type->tp_defined;
+	PyObject *dict = type->tp_dict;
 
 	for (; memb->name != NULL; memb++) {
 		PyObject *descr;
@@ -1493,7 +1482,7 @@
 static int
 add_getset(PyTypeObject *type, PyGetSetDef *gsp)
 {
-	PyObject *dict = type->tp_defined;
+	PyObject *dict = type->tp_dict;
 
 	for (; gsp->name != NULL; gsp++) {
 		PyObject *descr;
@@ -1746,7 +1735,6 @@
 		return 0;
 	}
 	assert((type->tp_flags & Py_TPFLAGS_READYING) == 0);
-	assert(type->tp_dict == NULL);
 
 	type->tp_flags |= Py_TPFLAGS_READYING;
 
@@ -1773,16 +1761,16 @@
 			goto error;
 	}
 
-	/* Initialize tp_defined */
-	dict = type->tp_defined;
+	/* Initialize tp_dict */
+	dict = type->tp_dict;
 	if (dict == NULL) {
 		dict = PyDict_New();
 		if (dict == NULL)
 			goto error;
-		type->tp_defined = dict;
+		type->tp_dict = dict;
 	}
 
-	/* Add type-specific descriptors to tp_defined */
+	/* Add type-specific descriptors to tp_dict */
 	if (add_operators(type) < 0)
 		goto error;
 	if (type->tp_methods != NULL) {
@@ -1798,12 +1786,6 @@
 			goto error;
 	}
 
-	/* Temporarily make tp_dict the same object as tp_defined.
-	   (This is needed to call mro(), and can stay this way for
-	   dynamic types). */
-	Py_INCREF(type->tp_defined);
-	type->tp_dict = type->tp_defined;
-
 	/* Calculate method resolution order */
 	if (mro_internal(type) < 0) {
 		goto error;
@@ -2676,18 +2658,18 @@
 {
 	PyObject *func;
 
-	if (PyDict_GetItemString(type->tp_defined, "__new__") != NULL)
+	if (PyDict_GetItemString(type->tp_dict, "__new__") != NULL)
 		return 0;
 	func = PyCFunction_New(tp_new_methoddef, (PyObject *)type);
 	if (func == NULL)
 		return -1;
-	return PyDict_SetItemString(type->tp_defined, "__new__", func);
+	return PyDict_SetItemString(type->tp_dict, "__new__", func);
 }
 
 static int
 add_wrappers(PyTypeObject *type, struct wrapperbase *wraps, void *wrapped)
 {
-	PyObject *dict = type->tp_defined;
+	PyObject *dict = type->tp_dict;
 
 	for (; wraps->name != NULL; wraps++) {
 		PyObject *descr;
@@ -2706,14 +2688,14 @@
 /* This function is called by PyType_Ready() to populate the type's
    dictionary with method descriptors for function slots.  For each
    function slot (like tp_repr) that's defined in the type, one or
-   more corresponding descriptors are added in the type's tp_defined
+   more corresponding descriptors are added in the type's tp_dict
    dictionary under the appropriate name (like __repr__).  Some
    function slots cause more than one descriptor to be added (for
    example, the nb_add slot adds both __add__ and __radd__
    descriptors) and some function slots compete for the same
    descriptor (for example both sq_item and mp_subscript generate a
    __getitem__ descriptor).  This only adds new descriptors and
-   doesn't overwrite entries in tp_defined that were previously
+   doesn't overwrite entries in tp_dict that were previously
    defined.  The descriptors contain a reference to the C function
    they must call, so that it's safe if they are copied into a
    subtype's __dict__ and the subtype has a different C function in
@@ -3942,7 +3924,7 @@
 				base = (PyTypeObject *)PyTuple_GET_ITEM(mro, i);
 				assert(PyType_Check(base));
 				descr = PyDict_GetItem(
-					base->tp_defined, p->name_strobj);
+					base->tp_dict, p->name_strobj);
 				if (descr != NULL)
 					break;
 			}
@@ -4055,7 +4037,7 @@
 			tmp = PyTuple_GET_ITEM(mro, i);
 			assert(PyType_Check(tmp));
 			res = PyDict_GetItem(
-				((PyTypeObject *)tmp)->tp_defined, name);
+				((PyTypeObject *)tmp)->tp_dict, name);
 			if (res != NULL) {
 				Py_INCREF(res);
 				f = res->ob_type->tp_descr_get;