mirror of https://github.com/python/cpython
bpo-40137: Add pycore_moduleobject.h internal header (GH-25507)
Add pycore_moduleobject.h internal header file with static inline functions to access module members: * _PyModule_GetDict() * _PyModule_GetDef() * _PyModule_GetState() These functions don't check at runtime if their argument has a valid type and can be inlined even if Python is not built with LTO. _PyType_GetModuleByDef() uses _PyModule_GetDef(). Replace PyModule_GetState() with _PyModule_GetState() in the extension modules, considered as performance sensitive: * _abc * _functools * _operator * _pickle * _queue * _random * _sre * _struct * _thread * _winapi * array * posix The following extensions are now built with the Py_BUILD_CORE_MODULE macro defined, to be able to use the internal pycore_moduleobject.h header: _abc, array, _operator, _queue, _sre, _struct.
This commit is contained in:
parent
a32f8fe713
commit
cdad2724e6
|
@ -0,0 +1,42 @@
|
||||||
|
#ifndef Py_INTERNAL_MODULEOBJECT_H
|
||||||
|
#define Py_INTERNAL_MODULEOBJECT_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef Py_BUILD_CORE
|
||||||
|
# error "this header requires Py_BUILD_CORE define"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
PyObject_HEAD
|
||||||
|
PyObject *md_dict;
|
||||||
|
struct PyModuleDef *md_def;
|
||||||
|
void *md_state;
|
||||||
|
PyObject *md_weaklist;
|
||||||
|
// for logging purposes after md_dict is cleared
|
||||||
|
PyObject *md_name;
|
||||||
|
} PyModuleObject;
|
||||||
|
|
||||||
|
static inline PyModuleDef* _PyModule_GetDef(PyObject *mod) {
|
||||||
|
assert(PyModule_Check(mod));
|
||||||
|
return ((PyModuleObject *)mod)->md_def;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void* _PyModule_GetState(PyObject* mod) {
|
||||||
|
assert(PyModule_Check(mod));
|
||||||
|
return ((PyModuleObject *)mod)->md_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline PyObject* _PyModule_GetDict(PyObject *mod) {
|
||||||
|
assert(PyModule_Check(mod));
|
||||||
|
PyObject *dict = ((PyModuleObject *)mod) -> md_dict;
|
||||||
|
// _PyModule_GetDict(mod) must not be used after calling module_clear(mod)
|
||||||
|
assert(dict != NULL);
|
||||||
|
return dict;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_INTERNAL_MODULEOBJECT_H */
|
|
@ -1161,6 +1161,7 @@ PYTHON_HEADERS= \
|
||||||
$(srcdir)/Include/internal/pycore_interp.h \
|
$(srcdir)/Include/internal/pycore_interp.h \
|
||||||
$(srcdir)/Include/internal/pycore_list.h \
|
$(srcdir)/Include/internal/pycore_list.h \
|
||||||
$(srcdir)/Include/internal/pycore_long.h \
|
$(srcdir)/Include/internal/pycore_long.h \
|
||||||
|
$(srcdir)/Include/internal/pycore_moduleobject.h \
|
||||||
$(srcdir)/Include/internal/pycore_object.h \
|
$(srcdir)/Include/internal/pycore_object.h \
|
||||||
$(srcdir)/Include/internal/pycore_pathconfig.h \
|
$(srcdir)/Include/internal/pycore_pathconfig.h \
|
||||||
$(srcdir)/Include/internal/pycore_pyarena.h \
|
$(srcdir)/Include/internal/pycore_pyarena.h \
|
||||||
|
|
|
@ -105,13 +105,13 @@ posix -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal posixmodule.c # posix
|
||||||
errno errnomodule.c # posix (UNIX) errno values
|
errno errnomodule.c # posix (UNIX) errno values
|
||||||
pwd pwdmodule.c # this is needed to find out the user's home dir
|
pwd pwdmodule.c # this is needed to find out the user's home dir
|
||||||
# if $HOME is not set
|
# if $HOME is not set
|
||||||
_sre _sre.c # Fredrik Lundh's new regular expressions
|
_sre -DPy_BUILD_CORE_BUILTIN _sre.c # Fredrik Lundh's new regular expressions
|
||||||
_codecs _codecsmodule.c # access to the builtin codecs and codec registry
|
_codecs _codecsmodule.c # access to the builtin codecs and codec registry
|
||||||
_weakref _weakref.c # weak references
|
_weakref _weakref.c # weak references
|
||||||
_functools -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal _functoolsmodule.c # Tools for working with functions and callable objects
|
_functools -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal _functoolsmodule.c # Tools for working with functions and callable objects
|
||||||
_operator _operator.c # operator.add() and similar goodies
|
_operator -DPy_BUILD_CORE_BUILTIN _operator.c # operator.add() and similar goodies
|
||||||
_collections _collectionsmodule.c # Container types
|
_collections _collectionsmodule.c # Container types
|
||||||
_abc _abc.c # Abstract base classes
|
_abc -DPy_BUILD_CORE_BUILTIN _abc.c # Abstract base classes
|
||||||
itertools itertoolsmodule.c # Functions creating iterators for efficient looping
|
itertools itertoolsmodule.c # Functions creating iterators for efficient looping
|
||||||
atexit atexitmodule.c # Register functions to be run at interpreter-shutdown
|
atexit atexitmodule.c # Register functions to be run at interpreter-shutdown
|
||||||
_signal -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal signalmodule.c
|
_signal -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal signalmodule.c
|
||||||
|
@ -166,17 +166,17 @@ _symtable symtablemodule.c
|
||||||
|
|
||||||
# Modules that should always be present (non UNIX dependent):
|
# Modules that should always be present (non UNIX dependent):
|
||||||
|
|
||||||
#array arraymodule.c # array objects
|
#array -DPy_BUILD_CORE_MODULE arraymodule.c # array objects
|
||||||
#cmath cmathmodule.c _math.c -DPy_BUILD_CORE_MODULE # -lm # complex math library functions
|
#cmath cmathmodule.c _math.c -DPy_BUILD_CORE_MODULE # -lm # complex math library functions
|
||||||
#math mathmodule.c _math.c -DPy_BUILD_CORE_MODULE # -lm # math library functions, e.g. sin()
|
#math mathmodule.c _math.c -DPy_BUILD_CORE_MODULE # -lm # math library functions, e.g. sin()
|
||||||
#_contextvars _contextvarsmodule.c # Context Variables
|
#_contextvars _contextvarsmodule.c # Context Variables
|
||||||
#_struct _struct.c # binary structure packing/unpacking
|
#_struct -DPy_BUILD_CORE_MODULE _struct.c # binary structure packing/unpacking
|
||||||
#_weakref _weakref.c # basic weak reference support
|
#_weakref _weakref.c # basic weak reference support
|
||||||
#_testcapi _testcapimodule.c # Python C API test module
|
#_testcapi _testcapimodule.c # Python C API test module
|
||||||
#_testinternalcapi _testinternalcapi.c -I$(srcdir)/Include/internal -DPy_BUILD_CORE_MODULE # Python internal C API test module
|
#_testinternalcapi _testinternalcapi.c -I$(srcdir)/Include/internal -DPy_BUILD_CORE_MODULE # Python internal C API test module
|
||||||
#_random _randommodule.c -DPy_BUILD_CORE_MODULE # Random number generator
|
#_random _randommodule.c -DPy_BUILD_CORE_MODULE # Random number generator
|
||||||
#_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI _elementtree.c # elementtree accelerator
|
#_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI _elementtree.c # elementtree accelerator
|
||||||
#_pickle _pickle.c # pickle accelerator
|
#_pickle -DPy_BUILD_CORE_MODULE _pickle.c # pickle accelerator
|
||||||
#_datetime _datetimemodule.c # datetime accelerator
|
#_datetime _datetimemodule.c # datetime accelerator
|
||||||
#_zoneinfo _zoneinfo.c -DPy_BUILD_CORE_MODULE # zoneinfo accelerator
|
#_zoneinfo _zoneinfo.c -DPy_BUILD_CORE_MODULE # zoneinfo accelerator
|
||||||
#_bisect _bisectmodule.c # Bisection algorithms
|
#_bisect _bisectmodule.c # Bisection algorithms
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
/* ABCMeta implementation */
|
/* ABCMeta implementation */
|
||||||
|
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
|
#include "pycore_moduleobject.h" // _PyModule_GetState()
|
||||||
#include "clinic/_abc.c.h"
|
#include "clinic/_abc.c.h"
|
||||||
|
|
||||||
/*[clinic input]
|
/*[clinic input]
|
||||||
|
@ -27,7 +28,7 @@ typedef struct {
|
||||||
static inline _abcmodule_state*
|
static inline _abcmodule_state*
|
||||||
get_abc_state(PyObject *module)
|
get_abc_state(PyObject *module)
|
||||||
{
|
{
|
||||||
void *state = PyModule_GetState(module);
|
void *state = _PyModule_GetState(module);
|
||||||
assert(state != NULL);
|
assert(state != NULL);
|
||||||
return (_abcmodule_state *)state;
|
return (_abcmodule_state *)state;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
#include "pycore_long.h" // _PyLong_GetZero()
|
#include "pycore_long.h" // _PyLong_GetZero()
|
||||||
|
#include "pycore_moduleobject.h" // _PyModule_GetState()
|
||||||
#include "pycore_object.h" // _PyObject_GC_TRACK
|
#include "pycore_object.h" // _PyObject_GC_TRACK
|
||||||
#include "pycore_pystate.h" // _PyThreadState_GET()
|
#include "pycore_pystate.h" // _PyThreadState_GET()
|
||||||
#include "pycore_tuple.h" // _PyTuple_ITEMS()
|
#include "pycore_tuple.h" // _PyTuple_ITEMS()
|
||||||
|
@ -23,7 +24,7 @@ typedef struct _functools_state {
|
||||||
static inline _functools_state *
|
static inline _functools_state *
|
||||||
get_functools_state(PyObject *module)
|
get_functools_state(PyObject *module)
|
||||||
{
|
{
|
||||||
void *state = PyModule_GetState(module);
|
void *state = _PyModule_GetState(module);
|
||||||
assert(state != NULL);
|
assert(state != NULL);
|
||||||
return (_functools_state *)state;
|
return (_functools_state *)state;
|
||||||
}
|
}
|
||||||
|
@ -53,8 +54,7 @@ get_functools_state_by_type(PyTypeObject *type)
|
||||||
if (module == NULL) {
|
if (module == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
_functools_state *state = get_functools_state(module);
|
return get_functools_state(module);
|
||||||
return state;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
|
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
|
#include "pycore_moduleobject.h" // _PyModule_GetState()
|
||||||
#include "clinic/_operator.c.h"
|
#include "clinic/_operator.c.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -12,7 +11,7 @@ typedef struct {
|
||||||
static inline _operator_state*
|
static inline _operator_state*
|
||||||
get_operator_state(PyObject *module)
|
get_operator_state(PyObject *module)
|
||||||
{
|
{
|
||||||
void *state = PyModule_GetState(module);
|
void *state = _PyModule_GetState(module);
|
||||||
assert(state != NULL);
|
assert(state != NULL);
|
||||||
return (_operator_state *)state;
|
return (_operator_state *)state;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
|
#include "pycore_moduleobject.h" // _PyModule_GetState()
|
||||||
#include "structmember.h" // PyMemberDef
|
#include "structmember.h" // PyMemberDef
|
||||||
|
|
||||||
PyDoc_STRVAR(pickle_module_doc,
|
PyDoc_STRVAR(pickle_module_doc,
|
||||||
|
@ -182,7 +183,7 @@ static struct PyModuleDef _picklemodule;
|
||||||
static PickleState *
|
static PickleState *
|
||||||
_Pickle_GetState(PyObject *module)
|
_Pickle_GetState(PyObject *module)
|
||||||
{
|
{
|
||||||
return (PickleState *)PyModule_GetState(module);
|
return (PickleState *)_PyModule_GetState(module);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find the module instance imported in the currently running sub-interpreter
|
/* Find the module instance imported in the currently running sub-interpreter
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
|
#include "pycore_moduleobject.h" // _PyModule_GetState()
|
||||||
#include "structmember.h" // PyMemberDef
|
#include "structmember.h" // PyMemberDef
|
||||||
#include <stddef.h> // offsetof()
|
#include <stddef.h> // offsetof()
|
||||||
|
|
||||||
|
@ -10,7 +11,7 @@ typedef struct {
|
||||||
static simplequeue_state *
|
static simplequeue_state *
|
||||||
simplequeue_get_state(PyObject *module)
|
simplequeue_get_state(PyObject *module)
|
||||||
{
|
{
|
||||||
simplequeue_state *state = PyModule_GetState(module);
|
simplequeue_state *state = _PyModule_GetState(module);
|
||||||
assert(state);
|
assert(state);
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,7 @@
|
||||||
/* ---------------------------------------------------------------*/
|
/* ---------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
|
#include "pycore_moduleobject.h" // _PyModule_GetState()
|
||||||
#ifdef HAVE_PROCESS_H
|
#ifdef HAVE_PROCESS_H
|
||||||
# include <process.h> // getpid()
|
# include <process.h> // getpid()
|
||||||
#endif
|
#endif
|
||||||
|
@ -86,7 +87,7 @@ typedef struct {
|
||||||
static inline _randomstate*
|
static inline _randomstate*
|
||||||
get_random_state(PyObject *module)
|
get_random_state(PyObject *module)
|
||||||
{
|
{
|
||||||
void *state = PyModule_GetState(module);
|
void *state = _PyModule_GetState(module);
|
||||||
assert(state != NULL);
|
assert(state != NULL);
|
||||||
return (_randomstate *)state;
|
return (_randomstate *)state;
|
||||||
}
|
}
|
||||||
|
@ -538,7 +539,7 @@ random_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
|
|
||||||
if (PyTuple_GET_SIZE(args) == 1)
|
if (PyTuple_GET_SIZE(args) == 1)
|
||||||
arg = PyTuple_GET_ITEM(args, 0);
|
arg = PyTuple_GET_ITEM(args, 0);
|
||||||
|
|
||||||
tmp = random_seed(self, arg);
|
tmp = random_seed(self, arg);
|
||||||
if (tmp == NULL) {
|
if (tmp == NULL) {
|
||||||
Py_DECREF(self);
|
Py_DECREF(self);
|
||||||
|
|
|
@ -42,6 +42,7 @@ static const char copyright[] =
|
||||||
|
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
#include "pycore_long.h" // _PyLong_GetZero()
|
#include "pycore_long.h" // _PyLong_GetZero()
|
||||||
|
#include "pycore_moduleobject.h" // _PyModule_GetState()
|
||||||
#include "structmember.h" // PyMemberDef
|
#include "structmember.h" // PyMemberDef
|
||||||
|
|
||||||
#include "sre.h"
|
#include "sre.h"
|
||||||
|
@ -258,7 +259,7 @@ typedef struct {
|
||||||
static _sremodulestate *
|
static _sremodulestate *
|
||||||
get_sre_module_state(PyObject *m)
|
get_sre_module_state(PyObject *m)
|
||||||
{
|
{
|
||||||
_sremodulestate *state = (_sremodulestate *)PyModule_GetState(m);
|
_sremodulestate *state = (_sremodulestate *)_PyModule_GetState(m);
|
||||||
assert(state);
|
assert(state);
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#define PY_SSIZE_T_CLEAN
|
#define PY_SSIZE_T_CLEAN
|
||||||
|
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
|
#include "pycore_moduleobject.h" // _PyModule_GetState()
|
||||||
#include "structmember.h" // PyMemberDef
|
#include "structmember.h" // PyMemberDef
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
|
@ -24,7 +25,7 @@ typedef struct {
|
||||||
static inline _structmodulestate*
|
static inline _structmodulestate*
|
||||||
get_struct_state(PyObject *module)
|
get_struct_state(PyObject *module)
|
||||||
{
|
{
|
||||||
void *state = PyModule_GetState(module);
|
void *state = _PyModule_GetState(module);
|
||||||
assert(state != NULL);
|
assert(state != NULL);
|
||||||
return (_structmodulestate *)state;
|
return (_structmodulestate *)state;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,9 @@
|
||||||
/* Interface to Sjoerd's portable C thread library */
|
/* Interface to Sjoerd's portable C thread library */
|
||||||
|
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
#include "pycore_pylifecycle.h"
|
|
||||||
#include "pycore_interp.h" // _PyInterpreterState.num_threads
|
#include "pycore_interp.h" // _PyInterpreterState.num_threads
|
||||||
|
#include "pycore_moduleobject.h" // _PyModule_GetState()
|
||||||
|
#include "pycore_pylifecycle.h"
|
||||||
#include "pycore_pystate.h" // _PyThreadState_Init()
|
#include "pycore_pystate.h" // _PyThreadState_Init()
|
||||||
#include <stddef.h> // offsetof()
|
#include <stddef.h> // offsetof()
|
||||||
#include "structmember.h" // PyMemberDef
|
#include "structmember.h" // PyMemberDef
|
||||||
|
@ -35,7 +36,7 @@ typedef struct {
|
||||||
static inline thread_module_state*
|
static inline thread_module_state*
|
||||||
get_thread_state(PyObject *module)
|
get_thread_state(PyObject *module)
|
||||||
{
|
{
|
||||||
void *state = PyModule_GetState(module);
|
void *state = _PyModule_GetState(module);
|
||||||
assert(state != NULL);
|
assert(state != NULL);
|
||||||
return (thread_module_state *)state;
|
return (thread_module_state *)state;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
/* See http://www.python.org/2.4/license for licensing details. */
|
/* See http://www.python.org/2.4/license for licensing details. */
|
||||||
|
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
#include "moduleobject.h" // PyModuleDef_Slot
|
#include "pycore_moduleobject.h" // _PyModule_GetState()
|
||||||
#include "structmember.h" // PyMemberDef
|
#include "structmember.h" // PyMemberDef
|
||||||
|
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ typedef struct {
|
||||||
static inline WinApiState*
|
static inline WinApiState*
|
||||||
winapi_get_state(PyObject *module)
|
winapi_get_state(PyObject *module)
|
||||||
{
|
{
|
||||||
void *state = PyModule_GetState(module);
|
void *state = _PyModule_GetState(module);
|
||||||
assert(state != NULL);
|
assert(state != NULL);
|
||||||
return (WinApiState *)state;
|
return (WinApiState *)state;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#define PY_SSIZE_T_CLEAN
|
#define PY_SSIZE_T_CLEAN
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
|
#include "pycore_moduleobject.h" // _PyModule_GetState()
|
||||||
#include "structmember.h" // PyMemberDef
|
#include "structmember.h" // PyMemberDef
|
||||||
#include <stddef.h> // offsetof()
|
#include <stddef.h> // offsetof()
|
||||||
|
|
||||||
|
@ -63,7 +64,7 @@ typedef struct {
|
||||||
static array_state *
|
static array_state *
|
||||||
get_array_state(PyObject *module)
|
get_array_state(PyObject *module)
|
||||||
{
|
{
|
||||||
return (array_state *)PyModule_GetState(module);
|
return (array_state *)_PyModule_GetState(module);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define find_array_state_by_type(tp) \
|
#define find_array_state_by_type(tp) \
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
#include "pycore_fileutils.h"
|
#include "pycore_fileutils.h"
|
||||||
|
#include "pycore_moduleobject.h" // _PyModule_GetState()
|
||||||
#ifdef MS_WINDOWS
|
#ifdef MS_WINDOWS
|
||||||
/* include <windows.h> early to avoid conflict with pycore_condvar.h:
|
/* include <windows.h> early to avoid conflict with pycore_condvar.h:
|
||||||
|
|
||||||
|
@ -994,7 +995,7 @@ typedef struct {
|
||||||
static inline _posixstate*
|
static inline _posixstate*
|
||||||
get_posix_state(PyObject *module)
|
get_posix_state(PyObject *module)
|
||||||
{
|
{
|
||||||
void *state = PyModule_GetState(module);
|
void *state = _PyModule_GetState(module);
|
||||||
assert(state != NULL);
|
assert(state != NULL);
|
||||||
return (_posixstate *)state;
|
return (_posixstate *)state;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
#include "pycore_ceval.h" // _PyEval_BuiltinsFromGlobals()
|
#include "pycore_ceval.h" // _PyEval_BuiltinsFromGlobals()
|
||||||
|
#include "pycore_moduleobject.h" // _PyModule_GetDict()
|
||||||
#include "pycore_object.h" // _PyObject_GC_UNTRACK()
|
#include "pycore_object.h" // _PyObject_GC_UNTRACK()
|
||||||
|
|
||||||
#include "frameobject.h" // PyFrameObject
|
#include "frameobject.h" // PyFrameObject
|
||||||
|
@ -1176,7 +1177,7 @@ _PyEval_BuiltinsFromGlobals(PyThreadState *tstate, PyObject *globals)
|
||||||
PyObject *builtins = _PyDict_GetItemIdWithError(globals, &PyId___builtins__);
|
PyObject *builtins = _PyDict_GetItemIdWithError(globals, &PyId___builtins__);
|
||||||
if (builtins) {
|
if (builtins) {
|
||||||
if (PyModule_Check(builtins)) {
|
if (PyModule_Check(builtins)) {
|
||||||
builtins = PyModule_GetDict(builtins);
|
builtins = _PyModule_GetDict(builtins);
|
||||||
assert(builtins != NULL);
|
assert(builtins != NULL);
|
||||||
}
|
}
|
||||||
return builtins;
|
return builtins;
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
#include "pycore_interp.h" // PyInterpreterState.importlib
|
#include "pycore_interp.h" // PyInterpreterState.importlib
|
||||||
#include "pycore_pystate.h" // _PyInterpreterState_GET()
|
#include "pycore_pystate.h" // _PyInterpreterState_GET()
|
||||||
|
#include "pycore_moduleobject.h" // _PyModule_GetDef()
|
||||||
#include "structmember.h" // PyMemberDef
|
#include "structmember.h" // PyMemberDef
|
||||||
|
|
||||||
static Py_ssize_t max_module_number;
|
static Py_ssize_t max_module_number;
|
||||||
|
@ -12,15 +13,6 @@ _Py_IDENTIFIER(__doc__);
|
||||||
_Py_IDENTIFIER(__name__);
|
_Py_IDENTIFIER(__name__);
|
||||||
_Py_IDENTIFIER(__spec__);
|
_Py_IDENTIFIER(__spec__);
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
PyObject_HEAD
|
|
||||||
PyObject *md_dict;
|
|
||||||
struct PyModuleDef *md_def;
|
|
||||||
void *md_state;
|
|
||||||
PyObject *md_weaklist;
|
|
||||||
PyObject *md_name; /* for logging purposes after md_dict is cleared */
|
|
||||||
} PyModuleObject;
|
|
||||||
|
|
||||||
static PyMemberDef module_members[] = {
|
static PyMemberDef module_members[] = {
|
||||||
{"__dict__", T_OBJECT, offsetof(PyModuleObject, md_dict), READONLY},
|
{"__dict__", T_OBJECT, offsetof(PyModuleObject, md_dict), READONLY},
|
||||||
{0}
|
{0}
|
||||||
|
@ -469,14 +461,11 @@ PyModule_SetDocString(PyObject *m, const char *doc)
|
||||||
PyObject *
|
PyObject *
|
||||||
PyModule_GetDict(PyObject *m)
|
PyModule_GetDict(PyObject *m)
|
||||||
{
|
{
|
||||||
PyObject *d;
|
|
||||||
if (!PyModule_Check(m)) {
|
if (!PyModule_Check(m)) {
|
||||||
PyErr_BadInternalCall();
|
PyErr_BadInternalCall();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
d = ((PyModuleObject *)m) -> md_dict;
|
return _PyModule_GetDict(m);
|
||||||
assert(d != NULL);
|
|
||||||
return d;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject*
|
PyObject*
|
||||||
|
@ -556,7 +545,7 @@ PyModule_GetDef(PyObject* m)
|
||||||
PyErr_BadArgument();
|
PyErr_BadArgument();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return ((PyModuleObject *)m)->md_def;
|
return _PyModule_GetDef(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
void*
|
void*
|
||||||
|
@ -566,7 +555,7 @@ PyModule_GetState(PyObject* m)
|
||||||
PyErr_BadArgument();
|
PyErr_BadArgument();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return ((PyModuleObject *)m)->md_state;
|
return _PyModule_GetState(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "pycore_call.h"
|
#include "pycore_call.h"
|
||||||
#include "pycore_compile.h" // _Py_Mangle()
|
#include "pycore_compile.h" // _Py_Mangle()
|
||||||
#include "pycore_initconfig.h"
|
#include "pycore_initconfig.h"
|
||||||
|
#include "pycore_moduleobject.h" // _PyModule_GetDef()
|
||||||
#include "pycore_object.h"
|
#include "pycore_object.h"
|
||||||
#include "pycore_pyerrors.h"
|
#include "pycore_pyerrors.h"
|
||||||
#include "pycore_pystate.h" // _PyThreadState_GET()
|
#include "pycore_pystate.h" // _PyThreadState_GET()
|
||||||
|
@ -3582,7 +3583,7 @@ PyType_GetModuleState(PyTypeObject *type)
|
||||||
if (m == NULL) {
|
if (m == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return PyModule_GetState(m);
|
return _PyModule_GetState(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3617,7 +3618,7 @@ _PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def)
|
||||||
|
|
||||||
PyHeapTypeObject *ht = (PyHeapTypeObject*)super;
|
PyHeapTypeObject *ht = (PyHeapTypeObject*)super;
|
||||||
PyObject *module = ht->ht_module;
|
PyObject *module = ht->ht_module;
|
||||||
if (module && PyModule_GetDef(module) == def) {
|
if (module && _PyModule_GetDef(module) == def) {
|
||||||
return module;
|
return module;
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
|
|
|
@ -199,6 +199,7 @@
|
||||||
<ClInclude Include="..\Include\internal\pycore_interp.h" />
|
<ClInclude Include="..\Include\internal\pycore_interp.h" />
|
||||||
<ClInclude Include="..\Include\internal\pycore_list.h" />
|
<ClInclude Include="..\Include\internal\pycore_list.h" />
|
||||||
<ClInclude Include="..\Include\internal\pycore_long.h" />
|
<ClInclude Include="..\Include\internal\pycore_long.h" />
|
||||||
|
<ClInclude Include="..\Include\internal\pycore_moduleobject.h" />
|
||||||
<ClInclude Include="..\Include\internal\pycore_object.h" />
|
<ClInclude Include="..\Include\internal\pycore_object.h" />
|
||||||
<ClInclude Include="..\Include\internal\pycore_pathconfig.h" />
|
<ClInclude Include="..\Include\internal\pycore_pathconfig.h" />
|
||||||
<ClInclude Include="..\Include\internal\pycore_pyarena.h" />
|
<ClInclude Include="..\Include\internal\pycore_pyarena.h" />
|
||||||
|
|
|
@ -558,6 +558,9 @@
|
||||||
<ClInclude Include="..\Include\internal\pycore_long.h">
|
<ClInclude Include="..\Include\internal\pycore_long.h">
|
||||||
<Filter>Include\internal</Filter>
|
<Filter>Include\internal</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\Include\internal\pycore_moduleobject.h">
|
||||||
|
<Filter>Include\internal</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\Include\internal\pycore_object.h">
|
<ClInclude Include="..\Include\internal\pycore_object.h">
|
||||||
<Filter>Include\internal</Filter>
|
<Filter>Include\internal</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
|
12
setup.py
12
setup.py
|
@ -869,7 +869,8 @@ class PyBuildExt(build_ext):
|
||||||
#
|
#
|
||||||
|
|
||||||
# array objects
|
# array objects
|
||||||
self.add(Extension('array', ['arraymodule.c']))
|
self.add(Extension('array', ['arraymodule.c'],
|
||||||
|
extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
|
||||||
|
|
||||||
# Context Variables
|
# Context Variables
|
||||||
self.add(Extension('_contextvars', ['_contextvarsmodule.c']))
|
self.add(Extension('_contextvars', ['_contextvarsmodule.c']))
|
||||||
|
@ -934,9 +935,11 @@ class PyBuildExt(build_ext):
|
||||||
self.add(Extension("_asyncio", ["_asynciomodule.c"],
|
self.add(Extension("_asyncio", ["_asynciomodule.c"],
|
||||||
extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
|
extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
|
||||||
# _abc speedups
|
# _abc speedups
|
||||||
self.add(Extension("_abc", ["_abc.c"]))
|
self.add(Extension("_abc", ["_abc.c"],
|
||||||
|
extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
|
||||||
# _queue module
|
# _queue module
|
||||||
self.add(Extension("_queue", ["_queuemodule.c"]))
|
self.add(Extension("_queue", ["_queuemodule.c"],
|
||||||
|
extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
|
||||||
# _statistics module
|
# _statistics module
|
||||||
self.add(Extension("_statistics", ["_statisticsmodule.c"]))
|
self.add(Extension("_statistics", ["_statisticsmodule.c"]))
|
||||||
|
|
||||||
|
@ -2696,7 +2699,8 @@ def main():
|
||||||
'install_lib': PyBuildInstallLib},
|
'install_lib': PyBuildInstallLib},
|
||||||
# The struct module is defined here, because build_ext won't be
|
# The struct module is defined here, because build_ext won't be
|
||||||
# called unless there's at least one extension module defined.
|
# called unless there's at least one extension module defined.
|
||||||
ext_modules=[Extension('_struct', ['_struct.c'])],
|
ext_modules=[Extension('_struct', ['_struct.c'],
|
||||||
|
extra_compile_args=['-DPy_BUILD_CORE_MODULE'])],
|
||||||
|
|
||||||
# If you change the scripts installed here, you also need to
|
# If you change the scripts installed here, you also need to
|
||||||
# check the PyBuildScripts command above, and change the links
|
# check the PyBuildScripts command above, and change the links
|
||||||
|
|
Loading…
Reference in New Issue