Browse Source

freezer: add mechanism for overriding modules with custom code

rdb 7 years ago
parent
commit
ef69e8935f
1 changed files with 18 additions and 2 deletions
  1. 18 2
      direct/src/showutil/FreezeTool.py

+ 18 - 2
direct/src/showutil/FreezeTool.py

@@ -84,6 +84,10 @@ else:
     hiddenImports['matplotlib.backends._backend_tk'] = ['Tkinter']
 
 
+# These are overrides for specific modules.
+overrideModules = {
+}
+
 # These are missing modules that we've reported already this session.
 reportedMissing = {}
 
@@ -2245,9 +2249,16 @@ class PandaModuleFinder(modulefinder.ModuleFinder):
             m = self.load_package(fqname, pathname)
             self.msgout(2, "load_module ->", m)
             return m
+
         if type == imp.PY_SOURCE:
-            newline = b'\n' if 'b' in mode else '\n'
-            co = compile(fp.read()+newline, pathname, 'exec')
+            if fqname in overrideModules:
+                # This module has a custom override.
+                code = overrideModules[fqname]
+            else:
+                code = fp.read()
+
+            code += b'\n' if isinstance(code, bytes) else '\n'
+            co = compile(code, pathname, 'exec')
         elif type == imp.PY_COMPILED:
             try:
                 marshal_data = importlib._bootstrap_external._validate_bytecode_header(fp.read())
@@ -2257,6 +2268,7 @@ class PandaModuleFinder(modulefinder.ModuleFinder):
             co = marshal.loads(marshal_data)
         else:
             co = None
+
         m = self.add_module(fqname)
         m.__file__ = pathname
         if co:
@@ -2283,6 +2295,10 @@ class PandaModuleFinder(modulefinder.ModuleFinder):
         if fullname in self.excludes:
             raise ImportError(name)
 
+        # If we have a custom override for this module, we know we have it.
+        if fullname in overrideModules:
+            return (None, '', ('.py', 'r', imp.PY_SOURCE))
+
         # If no search path is given, look for a built-in module.
         if path is None:
             if name in sys.builtin_module_names: