summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas.sandberg@arm.com>2019-01-25 11:13:38 +0000
committerAndreas Sandberg <andreas.sandberg@arm.com>2019-01-31 17:31:54 +0000
commit244a984a006288bfe718451d0e44aed199cd8ae2 (patch)
tree087e5d91ea6925a2945aab8a7dd3979295a94d6f /src
parent2d1723acd31e1c935341e5d27307804039ede56d (diff)
downloadgem5-244a984a006288bfe718451d0e44aed199cd8ae2.tar.xz
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 <andreas.sandberg@arm.com> Reviewed-on: https://gem5-review.googlesource.com/c/15977 Reviewed-by: Gabe Black <gabeblack@google.com> Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Diffstat (limited to 'src')
-rw-r--r--src/sim/init.cc20
-rw-r--r--src/sim/main.cc7
2 files changed, 26 insertions, 1 deletions
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 <iostream>
#include <list>
#include <string>
+#include <vector>
#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<wchar_t[], decltype(&PyMem_RawFree)> WArgUPtr;
+ std::vector<WArgUPtr> v_argv;
+ std::vector<wchar_t *> 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<wchar_t[], decltype(&PyMem_RawFree)> program(
+ Py_DecodeLocale(argv[0], NULL),
+ &PyMem_RawFree);
+ Py_SetProgramName(program.get());
+#else
Py_SetProgramName(argv[0]);
+#endif
// initialize embedded Python interpreter
Py_Initialize();