#ifndef Py_INTERNAL_MODULEOBJECT_H #define Py_INTERNAL_MODULEOBJECT_H #include #ifdef __cplusplus extern "C" { #endif #ifndef Py_BUILD_CORE # error "this header requires Py_BUILD_CORE define" #endif extern void _PyModule_Clear(PyObject *); extern void _PyModule_ClearDict(PyObject *); extern int _PyModuleSpec_IsInitializing(PyObject *); extern int _PyModuleSpec_GetFileOrigin(PyObject *, PyObject **); extern int _PyModule_IsPossiblyShadowing(PyObject *); extern int _PyModule_IsExtension(PyObject *obj); typedef int (*_Py_modexecfunc)(PyObject *); typedef struct { PyObject_HEAD PyObject *md_dict; void *md_state; PyObject *md_weaklist; // for logging purposes after md_dict is cleared PyObject *md_name; bool md_token_is_def; /* if true, `md_token` is the PyModuleDef */ #ifdef Py_GIL_DISABLED bool md_requires_gil; #endif Py_ssize_t md_state_size; traverseproc md_state_traverse; inquiry md_state_clear; freefunc md_state_free; void *md_token; _Py_modexecfunc md_exec; /* only set if md_token_is_def is true */ } PyModuleObject; #define _PyModule_CAST(op) \ (assert(PyModule_Check(op)), _Py_CAST(PyModuleObject*, (op))) static inline PyModuleDef *_PyModule_GetDefOrNull(PyObject *arg) { PyModuleObject *mod = _PyModule_CAST(arg); if (mod->md_token_is_def) { return (PyModuleDef *)mod->md_token; } return NULL; } static inline PyModuleDef *_PyModule_GetToken(PyObject *arg) { PyModuleObject *mod = _PyModule_CAST(arg); return (PyModuleDef *)mod->md_token; } static inline void* _PyModule_GetState(PyObject* mod) { return _PyModule_CAST(mod)->md_state; } static inline PyObject* _PyModule_GetDict(PyObject *mod) { PyObject *dict = _PyModule_CAST(mod)->md_dict; // _PyModule_GetDict(mod) must not be used after calling module_clear(mod) assert(dict != NULL); return dict; // borrowed reference } extern PyObject * _PyModule_GetFilenameObject(PyObject *); extern Py_ssize_t _PyModule_GetFilenameUTF8( PyObject *module, char *buffer, Py_ssize_t maxlen); PyObject* _Py_module_getattro_impl(PyModuleObject *m, PyObject *name, int suppress); PyObject* _Py_module_getattro(PyObject *m, PyObject *name); #ifdef __cplusplus } #endif #endif /* !Py_INTERNAL_MODULEOBJECT_H */