gh-101476: Add _PyType_GetModuleState (GH-101477)

For fast module state access from heap type methods.
This commit is contained in:
Erlend E. Aasland 2023-02-23 22:42:15 +01:00 committed by GitHub
parent d43c2652d4
commit ccd98a3146
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 1 deletions

View File

@ -4,6 +4,8 @@
extern "C" { extern "C" {
#endif #endif
#include "pycore_moduleobject.h"
#ifndef Py_BUILD_CORE #ifndef Py_BUILD_CORE
# error "this header requires Py_BUILD_CORE define" # error "this header requires Py_BUILD_CORE define"
#endif #endif
@ -62,6 +64,20 @@ _PyStaticType_GET_WEAKREFS_LISTPTR(static_builtin_state *state)
return &state->tp_weaklist; return &state->tp_weaklist;
} }
/* Like PyType_GetModuleState, but skips verification
* that type is a heap type with an associated module */
static inline void *
_PyType_GetModuleState(PyTypeObject *type)
{
assert(PyType_Check(type));
assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
PyHeapTypeObject *et = (PyHeapTypeObject *)type;
assert(et->ht_module);
PyModuleObject *mod = (PyModuleObject *)(et->ht_module);
assert(mod != NULL);
return mod->md_state;
}
struct types_state { struct types_state {
struct type_cache type_cache; struct type_cache type_cache;
size_t num_builtins_initialized; size_t num_builtins_initialized;

View File

@ -3,6 +3,7 @@
#include "pycore_call.h" // _PyObject_CallNoArgs() #include "pycore_call.h" // _PyObject_CallNoArgs()
#include "pycore_long.h" // _PyLong_GetZero() #include "pycore_long.h" // _PyLong_GetZero()
#include "pycore_moduleobject.h" // _PyModule_GetState() #include "pycore_moduleobject.h" // _PyModule_GetState()
#include "pycore_typeobject.h" // _PyType_GetModuleState()
#include "pycore_object.h" // _PyObject_GC_TRACK() #include "pycore_object.h" // _PyObject_GC_TRACK()
#include "pycore_tuple.h" // _PyTuple_ITEMS() #include "pycore_tuple.h" // _PyTuple_ITEMS()
#include "structmember.h" // PyMemberDef #include "structmember.h" // PyMemberDef
@ -48,7 +49,7 @@ get_module_state(PyObject *mod)
static inline itertools_state * static inline itertools_state *
get_module_state_by_cls(PyTypeObject *cls) get_module_state_by_cls(PyTypeObject *cls)
{ {
void *state = PyType_GetModuleState(cls); void *state = _PyType_GetModuleState(cls);
assert(state != NULL); assert(state != NULL);
return (itertools_state *)state; return (itertools_state *)state;
} }