python: Add mechanism to override code compiled into the exectuable
authorNathan Binkert <nate@binkert.org>
Wed, 21 Jul 2010 22:53:52 +0000 (15:53 -0700)
committerNathan Binkert <nate@binkert.org>
Wed, 21 Jul 2010 22:53:52 +0000 (15:53 -0700)
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
src/python/importer.py
src/sim/init.cc
src/sim/init.hh

index 51616701b36234ad131209c321b55cbebadd8b78..5879fbc937dd0145eb90b0fe06a28535254a3fec 100644 (file)
@@ -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, "};"
 
 
index fe099fdb8ef88353aede88dff10b09f6cb9b8e67..4e364873f15d9da796458746b62bcd0742a73048 100644 (file)
@@ -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
index 8057c936985d2b2c9888b7be61b4e7c283a2112f..1ec09369dd9147fb61c5c4fde6613c28c170b487 100644 (file)
@@ -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;
index b0f29bf300cbd7a02c253f6819e544e75d1718a9..76cdcb74ecc243236a0cb9c403429322d2443003 100644 (file)
@@ -37,6 +37,7 @@
 struct EmbeddedPyModule
 {
     const char *filename;
+    const char *abspath;
     const char *modpath;
     const char *code;
     const char *code_end;