diff options
author | Georg Brandl <georg@python.org> | 2008-05-28 15:41:36 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2008-05-28 15:41:36 (GMT) |
commit | 5ec330cb2f1b041ebba6dedb6a02cd27a7e9f3da (patch) | |
tree | d999590ad5aaf1da9896c092d42c85c836bbfb8a | |
parent | dee01d8af800b0bb4aac1a9006873b81aace1c5c (diff) | |
download | cpython-5ec330cb2f1b041ebba6dedb6a02cd27a7e9f3da.zip cpython-5ec330cb2f1b041ebba6dedb6a02cd27a7e9f3da.tar.gz cpython-5ec330cb2f1b041ebba6dedb6a02cd27a7e9f3da.tar.bz2 |
#2990: prevent inconsistent state while updating method cache.
-rw-r--r-- | Objects/typeobject.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 151ea69..70fd1f2 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -147,7 +147,7 @@ assign_version_tag(PyTypeObject *type) cannot be done, 1 if Py_TPFLAGS_VALID_VERSION_TAG. */ Py_ssize_t i, n; - PyObject *bases; + PyObject *bases, *tmp; if (PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) return 1; @@ -166,9 +166,10 @@ assign_version_tag(PyTypeObject *type) are borrowed reference */ for (i = 0; i < (1 << MCACHE_SIZE_EXP); i++) { method_cache[i].value = NULL; - Py_XDECREF(method_cache[i].name); - method_cache[i].name = Py_None; + tmp = method_cache[i].name; Py_INCREF(Py_None); + method_cache[i].name = Py_None; + Py_XDECREF(tmp); } /* mark all version tags as invalid */ PyType_Modified(&PyBaseObject_Type); @@ -2413,7 +2414,7 @@ PyObject * _PyType_Lookup(PyTypeObject *type, PyObject *name) { Py_ssize_t i, n; - PyObject *mro, *res, *base, *dict; + PyObject *mro, *res, *base, *dict, *tmp; unsigned int h; if (MCACHE_CACHEABLE_NAME(name) && @@ -2455,9 +2456,10 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name) h = MCACHE_HASH_METHOD(type, name); method_cache[h].version = type->tp_version_tag; method_cache[h].value = res; /* borrowed */ + tmp = method_cache[h].name; Py_INCREF(name); - Py_DECREF(method_cache[h].name); method_cache[h].name = name; + Py_DECREF(tmp); } return res; } |