summaryrefslogtreecommitdiff
path: root/src/sim/init.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/sim/init.cc')
-rw-r--r--src/sim/init.cc24
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