diff options
author | Andreas Sandberg <andreas.sandberg@arm.com> | 2019-01-28 16:14:41 +0000 |
---|---|---|
committer | Andreas Sandberg <andreas.sandberg@arm.com> | 2019-02-12 09:38:12 +0000 |
commit | 6ba4545b1f9553e68e992305c92cf46246a79dae (patch) | |
tree | e109a5ad3a32447725657200ce58e4f159c66750 /src/sim | |
parent | 15e497d3f11504f957406feee9797cbf6449fffd (diff) | |
download | gem5-6ba4545b1f9553e68e992305c92cf46246a79dae.tar.xz |
python: Fix native module initialisation on Python 3
The approach we currently use to register our native modules doesn't
work on Python 3. Convert the code to use the Python inittab instead
of the old ad-hoc method.
Change-Id: I961f8a33993c621473732faeaab955a882769a4b
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/15979
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Reviewed-by: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/sim')
-rw-r--r-- | src/sim/init.cc | 24 | ||||
-rw-r--r-- | src/sim/init.hh | 8 | ||||
-rw-r--r-- | src/sim/main.cc | 6 |
3 files changed, 24 insertions, 14 deletions
diff --git a/src/sim/init.cc b/src/sim/init.cc index 66ec40895..5a49f360a 100644 --- a/src/sim/init.cc +++ b/src/sim/init.cc @@ -191,7 +191,11 @@ EmbeddedPyBind::getMap() return objs; } +#if PY_MAJOR_VERSION >= 3 +PyObject * +#else void +#endif EmbeddedPyBind::initAll() { std::list<EmbeddedPyBind *> pending; @@ -226,13 +230,18 @@ EmbeddedPyBind::initAll() } } } + +#if PY_MAJOR_VERSION >= 3 + return m_m5.ptr(); +#endif } -int -initM5Python() +void +registerNativeModules() { - EmbeddedPyBind::initAll(); - return EmbeddedPython::initAll(); + auto result = PyImport_AppendInittab("_m5", EmbeddedPyBind::initAll); + if (result == -1) + panic("Failed to add _m5 to Python's inittab\n"); } /* @@ -307,10 +316,3 @@ m5Main(int argc, char **_argv) return 0; } - -PyMODINIT_FUNC -initm5(void) -{ - initM5Python(); - PyImport_ImportModule(PyCC("m5")); -} diff --git a/src/sim/init.hh b/src/sim/init.hh index de6b44de4..40ff9aea0 100644 --- a/src/sim/init.hh +++ b/src/sim/init.hh @@ -90,7 +90,11 @@ class EmbeddedPyBind EmbeddedPyBind(const char *_name, void (*init_func)(pybind11::module &)); +#if PY_MAJOR_VERSION >= 3 + static PyObject *initAll(); +#else static void initAll(); +#endif private: void (*initFunc)(pybind11::module &); @@ -105,8 +109,8 @@ class EmbeddedPyBind static std::map<std::string, EmbeddedPyBind *> &getMap(); }; -int initM5Python(); +void registerNativeModules(); + int m5Main(int argc, char **argv); -PyMODINIT_FUNC initm5(void); #endif // __SIM_INIT_HH__ diff --git a/src/sim/main.cc b/src/sim/main.cc index a77c5f578..168e4390f 100644 --- a/src/sim/main.cc +++ b/src/sim/main.cc @@ -54,11 +54,15 @@ main(int argc, char **argv) Py_SetProgramName(argv[0]); #endif + // Register native modules with Python's init system before + // initializing the interpreter. + registerNativeModules(); + // initialize embedded Python interpreter Py_Initialize(); // Initialize the embedded m5 python library - ret = initM5Python(); + ret = EmbeddedPython::initAll(); if (ret == 0) { // start m5 |