From 244a984a006288bfe718451d0e44aed199cd8ae2 Mon Sep 17 00:00:00 2001 From: Andreas Sandberg Date: Fri, 25 Jan 2019 11:13:38 +0000 Subject: sim: Prepare C++ side for Python 3 Python 3 uses wide strings instead of ordinary strings for many APIs. Add the necessary conversions to comply with the new API. Change-Id: I6f45c9c532537d50d54b542f34eb8fd8cb375874 Signed-off-by: Andreas Sandberg Reviewed-on: https://gem5-review.googlesource.com/c/15977 Reviewed-by: Gabe Black Reviewed-by: Nikos Nikoleris --- src/sim/init.cc | 20 +++++++++++++++++++- src/sim/main.cc | 7 +++++++ 2 files changed, 26 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/sim/init.cc b/src/sim/init.cc index 50612895b..66ec40895 100644 --- a/src/sim/init.cc +++ b/src/sim/init.cc @@ -51,6 +51,7 @@ #include #include #include +#include #include "base/cprintf.hh" #include "base/logging.hh" @@ -249,7 +250,7 @@ const char * __attribute__((weak)) m5MainCommands[] = { * main function. */ int -m5Main(int argc, char **argv) +m5Main(int argc, char **_argv) { #if HAVE_PROTOBUF // Verify that the version of the protobuf library that we linked @@ -258,6 +259,23 @@ m5Main(int argc, char **argv) GOOGLE_PROTOBUF_VERIFY_VERSION; #endif + +#if PY_MAJOR_VERSION >= 3 + typedef std::unique_ptr WArgUPtr; + std::vector v_argv; + std::vector vp_argv; + v_argv.reserve(argc); + vp_argv.reserve(argc); + for (int i = 0; i < argc; i++) { + v_argv.emplace_back(Py_DecodeLocale(_argv[i], NULL), &PyMem_RawFree); + vp_argv.emplace_back(v_argv.back().get()); + } + + wchar_t **argv = vp_argv.data(); +#else + char **argv = _argv; +#endif + PySys_SetArgv(argc, argv); // We have to set things up in the special __main__ module diff --git a/src/sim/main.cc b/src/sim/main.cc index 48b159263..a77c5f578 100644 --- a/src/sim/main.cc +++ b/src/sim/main.cc @@ -45,7 +45,14 @@ main(int argc, char **argv) // Initialize m5 special signal handling. initSignals(); +#if PY_MAJOR_VERSION >= 3 + std::unique_ptr program( + Py_DecodeLocale(argv[0], NULL), + &PyMem_RawFree); + Py_SetProgramName(program.get()); +#else Py_SetProgramName(argv[0]); +#endif // initialize embedded Python interpreter Py_Initialize(); -- cgit v1.2.3