diff options
Diffstat (limited to 'src/sim/init.cc')
-rw-r--r-- | src/sim/init.cc | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/src/sim/init.cc b/src/sim/init.cc index 0a15c384d..2e1dd629c 100644 --- a/src/sim/init.cc +++ b/src/sim/init.cc @@ -148,8 +148,8 @@ EmbeddedPython::initAll() return 0; } -EmbeddedSwig::EmbeddedSwig(void (*init_func)()) - : initFunc(init_func) +EmbeddedSwig::EmbeddedSwig(void (*init_func)(), const string& _context) + : initFunc(init_func), context(_context) { getList().push_back(this); } @@ -164,12 +164,22 @@ EmbeddedSwig::getList() void EmbeddedSwig::initAll() { - // initialize SWIG modules. initSwig() is autogenerated and calls + char* old_context = _Py_PackageContext; + // initialize SWIG modules. initFunc() is autogenerated and calls // all of the individual swig initialization functions. - list<EmbeddedSwig *>::iterator i = getList().begin(); - list<EmbeddedSwig *>::iterator end = getList().end(); - for (; i != end; ++i) - (*i)->initFunc(); + for (auto i : getList()) { + // to ensure that the loaded modules are placed in the right + // package we have to be a bit unorthodox and directly + // manipulate the package context since swig simply calls + // Py_InitModule with nothing but the module name of the + // wrapper + char* cstr = new char[i->context.size() + 1]; + strcpy(cstr, i->context.c_str()); + _Py_PackageContext = cstr; + i->initFunc(); + delete[] cstr; + } + _Py_PackageContext = old_context; } int |