blob: 97315b339128ca643ebc888afb997037a46e3270 [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 = """\
13 {0, 0, 0} /* sentinel */
14};
Guido van Rossumf75f80e1996-06-17 17:48:30 +000015
Guido van Rossumb3afce51997-07-19 21:58:30 +000016int
17main(argc, argv)
18 int argc;
19 char **argv;
20{
21 PyImport_FrozenModules = _PyImport_FrozenModules;
22 return Py_FrozenMain(argc, argv);
23}
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 Rossum00ff4331994-10-03 16:33:08 +000028 done = []
29 mods = dict.keys()
30 mods.sort()
31 for mod in mods:
Guido van Rossum75dc4961998-03-05 03:42:00 +000032 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"
Guido van Rossum00ff4331994-10-03 16:33:08 +000046 outfp.write(header)
Guido van Rossum75dc4961998-03-05 03:42:00 +000047 for mod, mangled, size in done:
48 outfp.write('\t{"%s", M_%s, %d},\n' % (mod, mangled, size))
Guido van Rossum00ff4331994-10-03 16:33:08 +000049 outfp.write(trailer)
50
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):
56 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')