mirror of
https://github.com/python/cpython.git
synced 2025-11-28 06:06:26 +00:00
Recompute the special getattr/setattr/delattr cache slots after
changing __dict__ *or* __bases__.
This commit is contained in:
parent
b77a68e6b1
commit
7ba30431ec
1 changed files with 13 additions and 7 deletions
|
|
@ -227,21 +227,26 @@ set_slot(slot, v)
|
||||||
Py_XDECREF(temp);
|
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 *
|
static char *
|
||||||
set_dict(c, v)
|
set_dict(c, v)
|
||||||
PyClassObject *c;
|
PyClassObject *c;
|
||||||
PyObject *v;
|
PyObject *v;
|
||||||
{
|
{
|
||||||
PyClassObject *dummy;
|
|
||||||
|
|
||||||
if (v == NULL || !PyDict_Check(v))
|
if (v == NULL || !PyDict_Check(v))
|
||||||
return "__dict__ must be a dictionary object";
|
return "__dict__ must be a dictionary object";
|
||||||
set_slot(&c->cl_dict, v);
|
set_slot(&c->cl_dict, v);
|
||||||
|
set_attr_slots(c);
|
||||||
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));
|
|
||||||
|
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -263,6 +268,7 @@ set_bases(c, v)
|
||||||
return "a __bases__ item causes an inheritance cycle";
|
return "a __bases__ item causes an inheritance cycle";
|
||||||
}
|
}
|
||||||
set_slot(&c->cl_bases, v);
|
set_slot(&c->cl_bases, v);
|
||||||
|
set_attr_slots(c);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue