home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 15 / AACD15.ISO / AACD / Programming / Python2 / Python20_source / Tools / freeze / makefreeze.py < prev    next >
Encoding:
Python Source  |  2000-10-25  |  2.4 KB  |  87 lines

  1. import marshal
  2. import string
  3. import bkfile
  4.  
  5.  
  6. # Write a file containing frozen code for the modules in the dictionary.
  7.  
  8. header = """
  9. #include "Python.h"
  10.  
  11. static struct _frozen _PyImport_FrozenModules[] = {
  12. """
  13. trailer = """\
  14.     {0, 0, 0} /* sentinel */
  15. };
  16. """
  17.  
  18. # if __debug__ == 0 (i.e. -O option given), set Py_OptimizeFlag in frozen app.
  19. default_entry_point = """
  20. int
  21. main(argc, argv)
  22.     int argc;
  23.     char **argv;
  24. {
  25.     extern int Py_FrozenMain(int, char **);
  26. """ + ((not __debug__ and """
  27.         Py_OptimizeFlag++;
  28. """) or "")  + """
  29.         PyImport_FrozenModules = _PyImport_FrozenModules;
  30.         return Py_FrozenMain(argc, argv);
  31. }
  32.  
  33. """
  34.  
  35. def makefreeze(base, dict, debug=0, entry_point = None):
  36.     if entry_point is None: entry_point = default_entry_point
  37.     done = []
  38.     files = []
  39.     mods = dict.keys()
  40.     mods.sort()
  41.     for mod in mods:
  42.         m = dict[mod]
  43.         mangled = string.join(string.split(mod, "."), "__")
  44.         if m.__code__:
  45.             file = 'M_' + mangled + '.c'
  46.             outfp = bkfile.open(base + file, 'w')
  47.             files.append(file)
  48.             if debug:
  49.                 print "freezing", mod, "..."
  50.             str = marshal.dumps(m.__code__)
  51.             size = len(str)
  52.             if m.__path__:
  53.                 # Indicate package by negative size
  54.                 size = -size
  55.             done.append((mod, mangled, size))
  56.             writecode(outfp, mangled, str)
  57.             outfp.close()
  58.     if debug:
  59.         print "generating table of frozen modules"
  60.     outfp = bkfile.open(base + 'frozen.c', 'w')
  61.     for mod, mangled, size in done:
  62.         outfp.write('extern unsigned char M_%s[];\n' % mangled)
  63.     outfp.write(header)
  64.     for mod, mangled, size in done:
  65.         outfp.write('\t{"%s", M_%s, %d},\n' % (mod, mangled, size))
  66.     outfp.write(trailer)
  67.     outfp.write(entry_point)
  68.     outfp.close()
  69.     return files
  70.  
  71.  
  72.  
  73. # Write a C initializer for a module containing the frozen python code.
  74. # The array is called M_<mod>.
  75.  
  76. def writecode(outfp, mod, str):
  77.     outfp.write('unsigned char M_%s[] = {' % mod)
  78.     for i in range(0, len(str), 16):
  79.         outfp.write('\n\t')
  80.         for c in str[i:i+16]:
  81.             outfp.write('%d,' % ord(c))
  82.     outfp.write('\n};\n')
  83.  
  84. ## def writecode(outfp, mod, str):
  85. ##     outfp.write('unsigned char M_%s[%d] = "%s";\n' % (mod, len(str),
  86. ##     string.join(map(lambda s: `s`[1:-1], string.split(str, '"')), '\\"')))
  87.