From 35184169179ad873b96bc99e5c9bdc4d3dd5ead6 Mon Sep 17 00:00:00 2001 From: Nathan Binkert Date: Wed, 21 Jul 2010 15:53:52 -0700 Subject: python: Add mechanism to override code compiled into the exectuable If the user sets the environment variable M5_OVERRIDE_PY_SOURCE to True, then imports that would normally find python code compiled into the executable will instead first check in the absolute location where the code was found during the build of the executable. This only works for files in the src (or extras) directories, not automatically generated files. This is a developer feature! --- src/SConscript | 17 +++++++++++------ src/python/importer.py | 12 +++++++++--- src/sim/init.cc | 3 ++- src/sim/init.hh | 1 + 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/SConscript b/src/SConscript index 51616701b..5879fbc93 100644 --- a/src/SConscript +++ b/src/SConscript @@ -929,12 +929,17 @@ def pythonInit(target, source, env): dst = file(str(target[0]), 'w') def dump_mod(sym, endchar=','): + def c_str(string): + if string is None: + return "0" + return '"%s"' % string pysource = PySource.symnames[sym] - print >>dst, ' { "%s",' % pysource.arcname - print >>dst, ' "%s",' % pysource.modpath - print >>dst, ' %s_beg, %s_end,' % (sym, sym) - print >>dst, ' %s_end - %s_beg,' % (sym, sym) - print >>dst, ' *(int *)%s_end }%s' % (sym, endchar) + print >>dst, ' { %s,' % c_str(pysource.arcname) + print >>dst, ' %s,' % c_str(pysource.abspath) + print >>dst, ' %s,' % c_str(pysource.modpath) + print >>dst, ' %s_beg, %s_end,' % (sym, sym) + print >>dst, ' %s_end - %s_beg,' % (sym, sym) + print >>dst, ' *(int *)%s_end }%s' % (sym, endchar) print >>dst, '#include "sim/init.hh"' @@ -953,7 +958,7 @@ def pythonInit(target, source, env): # Skip the importer since we've already exported it continue dump_mod(sym) - print >>dst, " { 0, 0, 0, 0, 0, 0 }" + print >>dst, " { 0, 0, 0, 0, 0, 0, 0 }" print >>dst, "};" diff --git a/src/python/importer.py b/src/python/importer.py index fe099fdb8..4e364873f 100644 --- a/src/python/importer.py +++ b/src/python/importer.py @@ -33,11 +33,11 @@ class CodeImporter(object): def __init__(self): self.modules = {} - def add_module(self, filename, modpath, code): + def add_module(self, filename, abspath, modpath, code): if modpath in self.modules: raise AttributeError, "%s already found in importer" - self.modules[modpath] = (filename, code) + self.modules[modpath] = (filename, abspath, code) def find_module(self, fullname, path): if fullname in self.modules: @@ -59,7 +59,13 @@ class CodeImporter(object): try: mod.__loader__ = self - srcfile,code = self.modules[fullname] + srcfile,abspath,code = self.modules[fullname] + + override = os.environ.get('M5_OVERRIDE_PY_SOURCE', 'false').lower() + if override in ('true', 'yes') and os.path.exists(abspath): + src = file(abspath, 'r').read() + code = compile(src, abspath, 'exec') + if os.path.basename(srcfile) == '__init__.py': mod.__path__ = fullname.split('.') mod.__file__ = srcfile diff --git a/src/sim/init.cc b/src/sim/init.cc index 8057c9369..1ec09369d 100644 --- a/src/sim/init.cc +++ b/src/sim/init.cc @@ -154,7 +154,8 @@ initM5Python() while (pymod->filename) { PyObject *code = getCode(pymod); PyObject *result = PyObject_CallMethod(module, PyCC("add_module"), - PyCC("ssO"), pymod->filename, pymod->modpath, code); + PyCC("sssO"), pymod->filename, pymod->abspath, pymod->modpath, + code); if (!result) { PyErr_Print(); return 1; diff --git a/src/sim/init.hh b/src/sim/init.hh index b0f29bf30..76cdcb74e 100644 --- a/src/sim/init.hh +++ b/src/sim/init.hh @@ -37,6 +37,7 @@ struct EmbeddedPyModule { const char *filename; + const char *abspath; const char *modpath; const char *code; const char *code_end; -- cgit v1.2.3