From 7ba30431ec821ba00c833d451abe047a9ae60aba Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 8 Jul 1998 13:34:48 +0000 Subject: [PATCH] Recompute the special getattr/setattr/delattr cache slots after changing __dict__ *or* __bases__. --- Objects/classobject.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/Objects/classobject.c b/Objects/classobject.c index f6fc5d8f31b..21542994777 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -227,21 +227,26 @@ set_slot(slot, v) Py_XDECREF(temp); } +static void +set_attr_slots(c) + PyClassObject *c; +{ + PyClassObject *dummy; + + set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy)); + set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy)); + set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy)); +} + static char * set_dict(c, v) PyClassObject *c; PyObject *v; { - PyClassObject *dummy; - if (v == NULL || !PyDict_Check(v)) return "__dict__ must be a dictionary object"; set_slot(&c->cl_dict, v); - - set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy)); - set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy)); - set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy)); - + set_attr_slots(c); return ""; } @@ -263,6 +268,7 @@ set_bases(c, v) return "a __bases__ item causes an inheritance cycle"; } set_slot(&c->cl_bases, v); + set_attr_slots(c); return ""; }