blob: 88265b0b5d84fbf5c7eb87b91e3da8f83460b8b6 [file] [log] [blame]
Guido van Rossum00ff4331994-10-03 16:33:08 +00001import marshal
Guido van Rossum75dc4961998-03-05 03:42:00 +00002import string
Guido van Rossum00ff4331994-10-03 16:33:08 +00003
4
5# Write a file containing frozen code for the modules in the dictionary.
6
7header = """
Guido van Rossumf75f80e1996-06-17 17:48:30 +00008#include "Python.h"
9
10static struct _frozen _PyImport_FrozenModules[] = {
Guido van Rossum00ff4331994-10-03 16:33:08 +000011"""
12trailer = """\
Guido van Rossum912a14c1998-03-05 04:56:37 +000013 {0, 0, 0} /* sentinel */
Guido van Rossum00ff4331994-10-03 16:33:08 +000014};
Guido van Rossumf75f80e1996-06-17 17:48:30 +000015
Guido van Rossumb3afce51997-07-19 21:58:30 +000016int
17main(argc, argv)
Guido van Rossum912a14c1998-03-05 04:56:37 +000018 int argc;
19 char **argv;
Guido van Rossumb3afce51997-07-19 21:58:30 +000020{
Guido van Rossum912a14c1998-03-05 04:56:37 +000021 PyImport_FrozenModules = _PyImport_FrozenModules;
22 return Py_FrozenMain(argc, argv);
Guido van Rossumb3afce51997-07-19 21:58:30 +000023}
24
Guido van Rossum00ff4331994-10-03 16:33:08 +000025"""
26
Guido van Rossum75dc4961998-03-05 03:42:00 +000027def makefreeze(outfp, dict, debug=0):
Guido van Rossum912a14c1998-03-05 04:56:37 +000028 done = []
29 mods = dict.keys()
30 mods.sort()
31 for mod in mods:
32 m = dict[mod]
33 mangled = string.join(string.split(mod, "."), "__")
34 if m.__code__:
35 if debug:
36 print "freezing", mod, "..."
37 str = marshal.dumps(m.__code__)
38 size = len(str)
39 if m.__path__:
40 # Indicate package by negative size
41 size = -size
42 done.append((mod, mangled, size))
43 writecode(outfp, mangled, str)
44 if debug:
45 print "generating table of frozen modules"
46 outfp.write(header)
47 for mod, mangled, size in done:
48 outfp.write('\t{"%s", M_%s, %d},\n' % (mod, mangled, size))
49 outfp.write(trailer)
Guido van Rossum00ff4331994-10-03 16:33:08 +000050
51
Guido van Rossum00ff4331994-10-03 16:33:08 +000052# Write a C initializer for a module containing the frozen python code.
53# The array is called M_<mod>.
54
55def writecode(outfp, mod, str):
Guido van Rossum912a14c1998-03-05 04:56:37 +000056 outfp.write('static unsigned char M_%s[] = {' % mod)
57 for i in range(0, len(str), 16):
58 outfp.write('\n\t')
59 for c in str[i:i+16]:
60 outfp.write('%d,' % ord(c))
61 outfp.write('\n};\n')
62
63# Local Variables:
64# indent-tabs-mode: nil
65# End: