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:
Guido van Rossum 1997-05-16 14:23:33 +00:00
parent 3f11da0aaf
commit 3cca24570e

View file

@ -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) {
last_name_char = NULL;
return NULL; return NULL;
} PyString_InternInPlace(&kv);
PyString_InternInPlace(&last_name_object); rv = PyDict_GetItem(v, kv);
last_name_char = PyString_AsString(last_name_object); Py_DECREF(kv);
} return rv;
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);
} }