diff options
author | Guido van Rossum <guido@python.org> | 1997-05-16 14:23:33 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1997-05-16 14:23:33 (GMT) |
commit | 3cca24570eeaa69e5cf4ce45e8fc92338ab56bc0 (patch) | |
tree | 3987987185e998955eebf71075a5f5d0ec6a640c | |
parent | 3f11da0aafaad640ad6f01a576696fbbcd99597e (diff) | |
download | cpython-3cca24570eeaa69e5cf4ce45e8fc92338ab56bc0.zip cpython-3cca24570eeaa69e5cf4ce45e8fc92338ab56bc0.tar.gz cpython-3cca24570eeaa69e5cf4ce45e8fc92338ab56bc0.tar.bz2 |
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.
-rw-r--r-- | Objects/dictobject.c | 87 |
1 files changed, 34 insertions, 53 deletions
diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 9cf451f..60e2dd2 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -926,10 +926,7 @@ PyTypeObject PyDict_Type = { &dict_as_mapping, /*tp_as_mapping*/ }; -/* For backward compatibility with old dictionary interface */ - -static PyObject *last_name_object; -static char *last_name_char; /* NULL or == getstringvalue(last_name_object) */ +/* These belong in object.c now */ PyObject * PyObject_GetAttr(v, name) @@ -938,14 +935,8 @@ PyObject_GetAttr(v, name) { if (v->ob_type->tp_getattro != NULL) return (*v->ob_type->tp_getattro)(v, name); - - if (name != last_name_object) { - 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); + else + return PyObject_GetAttrString(v, PyString_AsString(name)); } int @@ -959,35 +950,28 @@ PyObject_SetAttr(v, name, value) PyString_InternInPlace(&name); if (v->ob_type->tp_setattro != NULL) err = (*v->ob_type->tp_setattro)(v, name, value); - else { - if (name != last_name_object) { - Py_XDECREF(last_name_object); - Py_INCREF(name); - last_name_object = name; - last_name_char = PyString_AsString(name); - } - err = PyObject_SetAttrString(v, last_name_char, value); - } + else + err = PyObject_SetAttrString( + v, PyString_AsString(name), value); Py_DECREF(name); return err; } +/* For backward compatibility with old dictionary interface */ + PyObject * PyDict_GetItemString(v, key) PyObject *v; char *key; { - if (key != last_name_char) { - Py_XDECREF(last_name_object); - last_name_object = PyString_FromString(key); - if (last_name_object == NULL) { - last_name_char = NULL; - return NULL; - } - PyString_InternInPlace(&last_name_object); - last_name_char = PyString_AsString(last_name_object); - } - return PyDict_GetItem(v, last_name_object); + PyObject *kv, *rv; + kv = PyString_FromString(key); + if (kv == NULL) + return NULL; + PyString_InternInPlace(&kv); + rv = PyDict_GetItem(v, kv); + Py_DECREF(kv); + return rv; } int @@ -996,17 +980,15 @@ PyDict_SetItemString(v, key, item) char *key; PyObject *item; { - if (key != last_name_char) { - Py_XDECREF(last_name_object); - last_name_object = PyString_FromString(key); - if (last_name_object == NULL) { - last_name_char = NULL; - return -1; - } - PyString_InternInPlace(&last_name_object); - last_name_char = PyString_AsString(last_name_object); - } - return PyDict_SetItem(v, last_name_object, item); + PyObject *kv; + int err; + kv = PyString_FromString(key); + if (kv == NULL) + return NULL; + PyString_InternInPlace(&kv); + err = PyDict_SetItem(v, kv, item); + Py_DECREF(kv); + return err; } int @@ -1014,14 +996,13 @@ PyDict_DelItemString(v, key) PyObject *v; char *key; { - if (key != last_name_char) { - Py_XDECREF(last_name_object); - last_name_object = PyString_FromString(key); - if (last_name_object == NULL) { - last_name_char = NULL; - return -1; - } - last_name_char = PyString_AsString(last_name_object); - } - return PyDict_DelItem(v, last_name_object); + PyObject *kv; + int err; + kv = PyString_FromString(key); + if (kv == NULL) + return NULL; + PyString_InternInPlace(&kv); + err = PyDict_DelItem(v, kv); + Py_DECREF(kv); + return err; } |