diff options
author | Georg Brandl <georg@python.org> | 2008-05-28 11:21:39 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2008-05-28 11:21:39 (GMT) |
commit | 74a1deaab360e118fa5f4621fd30a4ef4cc5a53e (patch) | |
tree | 7624b50a6c6f2b46c4ca7c3a9170f3d7f161ad51 | |
parent | 88eeef35d7795ec427f61e67f427dccaeabc0d11 (diff) | |
download | cpython-74a1deaab360e118fa5f4621fd30a4ef4cc5a53e.zip cpython-74a1deaab360e118fa5f4621fd30a4ef4cc5a53e.tar.gz cpython-74a1deaab360e118fa5f4621fd30a4ef4cc5a53e.tar.bz2 |
#2989: add PyType_Modified().
-rw-r--r-- | Doc/c-api/type.rst | 11 | ||||
-rw-r--r-- | Include/object.h | 1 | ||||
-rw-r--r-- | Misc/NEWS | 4 | ||||
-rw-r--r-- | Objects/typeobject.c | 19 |
4 files changed, 23 insertions, 12 deletions
diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index 762c003..e4e2e38 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -37,7 +37,16 @@ Type Objects .. cfunction:: unsigned int PyType_ClearCache(void) - Clears the internal lookup cache. Return the current version tag. + Clear the internal lookup cache. Return the current version tag. + + .. versionadded:: 2.6 + + +.. cfunction:: void PyType_Modified(PyTypeObject *type) + + Invalidate the internal lookup cache for the type and all of its + subtypes. This function must be called after any manual + modification of the attributes or base classes of the type. .. versionadded:: 2.6 diff --git a/Include/object.h b/Include/object.h index 2bdeb32..e0f5650 100644 --- a/Include/object.h +++ b/Include/object.h @@ -460,6 +460,7 @@ PyAPI_FUNC(PyObject *) PyType_GenericNew(PyTypeObject *, PyObject *, PyObject *); PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *); PyAPI_FUNC(unsigned int) PyType_ClearCache(void); +PyAPI_FUNC(void) PyType_Modified(PyTypeObject *); /* Generic operations on objects */ PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int); @@ -239,7 +239,9 @@ Build C API ----- -- The PyBytes functions have been renamed to PyByteArray +- Add ``PyType_Modified()`` as a public API to clear the type cache. + +- The PyBytes functions have been renamed to PyByteArray. - The PyString functions have been renamed to PyBytes. A batch of defines were added so that the linker still sees the original diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 2ea3d29..151ea69 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -32,7 +32,6 @@ struct method_cache_entry { static struct method_cache_entry method_cache[1 << MCACHE_SIZE_EXP]; static unsigned int next_version_tag = 0; -static void type_modified(PyTypeObject *); unsigned int PyType_ClearCache(void) @@ -47,12 +46,12 @@ PyType_ClearCache(void) } next_version_tag = 0; /* mark all version tags as invalid */ - type_modified(&PyBaseObject_Type); + PyType_Modified(&PyBaseObject_Type); return cur_version_tag; } -static void -type_modified(PyTypeObject *type) +void +PyType_Modified(PyTypeObject *type) { /* Invalidate any cached data for the specified type and all subclasses. This function is called after the base @@ -86,7 +85,7 @@ type_modified(PyTypeObject *type) ref = PyList_GET_ITEM(raw, i); ref = PyWeakref_GET_OBJECT(ref); if (ref != Py_None) { - type_modified((PyTypeObject *)ref); + PyType_Modified((PyTypeObject *)ref); } } } @@ -172,7 +171,7 @@ assign_version_tag(PyTypeObject *type) Py_INCREF(Py_None); } /* mark all version tags as invalid */ - type_modified(&PyBaseObject_Type); + PyType_Modified(&PyBaseObject_Type); return 1; } bases = type->tp_bases; @@ -300,7 +299,7 @@ type_set_module(PyTypeObject *type, PyObject *value, void *context) return -1; } - type_modified(type); + PyType_Modified(type); return PyDict_SetItemString(type->tp_dict, "__module__", value); } @@ -328,7 +327,7 @@ type_set_abstractmethods(PyTypeObject *type, PyObject *value, void *context) int res = PyDict_SetItemString(type->tp_dict, "__abstractmethods__", value); if (res == 0) { - type_modified(type); + PyType_Modified(type); if (value && PyObject_IsTrue(value)) { type->tp_flags |= Py_TPFLAGS_IS_ABSTRACT; } @@ -1621,7 +1620,7 @@ mro_internal(PyTypeObject *type) from the custom MRO */ type_mro_modified(type, type->tp_bases); - type_modified(type); + PyType_Modified(type); return 0; } @@ -6092,7 +6091,7 @@ update_slot(PyTypeObject *type, PyObject *name) update_subclasses() recursion below, but carefully: they each have their own conditions on which to stop recursing into subclasses. */ - type_modified(type); + PyType_Modified(type); init_slotdefs(); pp = ptrs; |