mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Got rid of all the last_name_* bogosities. I don't think the
complexity saved much any more. A simple benchmark (grail) showed that there were 3 times as many misses as hits, and the same number of times again the code was bypassed altogether due to the existence of setattro/getattro.
This commit is contained in:
parent
3f11da0aaf
commit
3cca24570e
1 changed files with 34 additions and 53 deletions
|
@ -926,10 +926,7 @@ PyTypeObject PyDict_Type = {
|
||||||
&dict_as_mapping, /*tp_as_mapping*/
|
&dict_as_mapping, /*tp_as_mapping*/
|
||||||
};
|
};
|
||||||
|
|
||||||
/* For backward compatibility with old dictionary interface */
|
/* These belong in object.c now */
|
||||||
|
|
||||||
static PyObject *last_name_object;
|
|
||||||
static char *last_name_char; /* NULL or == getstringvalue(last_name_object) */
|
|
||||||
|
|
||||||
PyObject *
|
PyObject *
|
||||||
PyObject_GetAttr(v, name)
|
PyObject_GetAttr(v, name)
|
||||||
|
@ -938,14 +935,8 @@ PyObject_GetAttr(v, name)
|
||||||
{
|
{
|
||||||
if (v->ob_type->tp_getattro != NULL)
|
if (v->ob_type->tp_getattro != NULL)
|
||||||
return (*v->ob_type->tp_getattro)(v, name);
|
return (*v->ob_type->tp_getattro)(v, name);
|
||||||
|
else
|
||||||
if (name != last_name_object) {
|
return PyObject_GetAttrString(v, PyString_AsString(name));
|
||||||
Py_XDECREF(last_name_object);
|
|
||||||
Py_INCREF(name);
|
|
||||||
last_name_object = name;
|
|
||||||
last_name_char = PyString_AsString(name);
|
|
||||||
}
|
|
||||||
return PyObject_GetAttrString(v, last_name_char);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -959,35 +950,28 @@ PyObject_SetAttr(v, name, value)
|
||||||
PyString_InternInPlace(&name);
|
PyString_InternInPlace(&name);
|
||||||
if (v->ob_type->tp_setattro != NULL)
|
if (v->ob_type->tp_setattro != NULL)
|
||||||
err = (*v->ob_type->tp_setattro)(v, name, value);
|
err = (*v->ob_type->tp_setattro)(v, name, value);
|
||||||
else {
|
else
|
||||||
if (name != last_name_object) {
|
err = PyObject_SetAttrString(
|
||||||
Py_XDECREF(last_name_object);
|
v, PyString_AsString(name), value);
|
||||||
Py_INCREF(name);
|
|
||||||
last_name_object = name;
|
|
||||||
last_name_char = PyString_AsString(name);
|
|
||||||
}
|
|
||||||
err = PyObject_SetAttrString(v, last_name_char, value);
|
|
||||||
}
|
|
||||||
Py_DECREF(name);
|
Py_DECREF(name);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* For backward compatibility with old dictionary interface */
|
||||||
|
|
||||||
PyObject *
|
PyObject *
|
||||||
PyDict_GetItemString(v, key)
|
PyDict_GetItemString(v, key)
|
||||||
PyObject *v;
|
PyObject *v;
|
||||||
char *key;
|
char *key;
|
||||||
{
|
{
|
||||||
if (key != last_name_char) {
|
PyObject *kv, *rv;
|
||||||
Py_XDECREF(last_name_object);
|
kv = PyString_FromString(key);
|
||||||
last_name_object = PyString_FromString(key);
|
if (kv == NULL)
|
||||||
if (last_name_object == NULL) {
|
return NULL;
|
||||||
last_name_char = NULL;
|
PyString_InternInPlace(&kv);
|
||||||
return NULL;
|
rv = PyDict_GetItem(v, kv);
|
||||||
}
|
Py_DECREF(kv);
|
||||||
PyString_InternInPlace(&last_name_object);
|
return rv;
|
||||||
last_name_char = PyString_AsString(last_name_object);
|
|
||||||
}
|
|
||||||
return PyDict_GetItem(v, last_name_object);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -996,17 +980,15 @@ PyDict_SetItemString(v, key, item)
|
||||||
char *key;
|
char *key;
|
||||||
PyObject *item;
|
PyObject *item;
|
||||||
{
|
{
|
||||||
if (key != last_name_char) {
|
PyObject *kv;
|
||||||
Py_XDECREF(last_name_object);
|
int err;
|
||||||
last_name_object = PyString_FromString(key);
|
kv = PyString_FromString(key);
|
||||||
if (last_name_object == NULL) {
|
if (kv == NULL)
|
||||||
last_name_char = NULL;
|
return NULL;
|
||||||
return -1;
|
PyString_InternInPlace(&kv);
|
||||||
}
|
err = PyDict_SetItem(v, kv, item);
|
||||||
PyString_InternInPlace(&last_name_object);
|
Py_DECREF(kv);
|
||||||
last_name_char = PyString_AsString(last_name_object);
|
return err;
|
||||||
}
|
|
||||||
return PyDict_SetItem(v, last_name_object, item);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -1014,14 +996,13 @@ PyDict_DelItemString(v, key)
|
||||||
PyObject *v;
|
PyObject *v;
|
||||||
char *key;
|
char *key;
|
||||||
{
|
{
|
||||||
if (key != last_name_char) {
|
PyObject *kv;
|
||||||
Py_XDECREF(last_name_object);
|
int err;
|
||||||
last_name_object = PyString_FromString(key);
|
kv = PyString_FromString(key);
|
||||||
if (last_name_object == NULL) {
|
if (kv == NULL)
|
||||||
last_name_char = NULL;
|
return NULL;
|
||||||
return -1;
|
PyString_InternInPlace(&kv);
|
||||||
}
|
err = PyDict_DelItem(v, kv);
|
||||||
last_name_char = PyString_AsString(last_name_object);
|
Py_DECREF(kv);
|
||||||
}
|
return err;
|
||||||
return PyDict_DelItem(v, last_name_object);
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue