1 import marshal
2 import tokenize
3 import os.path
4 import sys
5
6 PROGRAM_DIR = os.path.dirname(__file__)
7 SRC_DIR = os.path.dirname(PROGRAM_DIR)
8
9
10 def writecode(fp, mod, data):
11 print('unsigned char M_%s[] = {' % mod, file=fp)
12 indent = ' ' * 4
13 for i in range(0, len(data), 16):
14 print(indent, file=fp, end='')
15 for c in bytes(data[i:i+16]):
16 print('%d,' % c, file=fp, end='')
17 print('', file=fp)
18 print('};', file=fp)
19
20
21 def dump(fp, filename, name):
22 # Strip the directory to get reproducible marshal dump
23 code_filename = os.path.basename(filename)
24
25 with tokenize.open(filename) as source_fp:
26 source = source_fp.read()
27 code = compile(source, code_filename, 'exec')
28
29 data = marshal.dumps(code)
30 writecode(fp, name, data)
31
32
33 def main():
34 if len(sys.argv) < 2:
35 print(f"usage: {sys.argv[0]} filename")
36 sys.exit(1)
37 filename = sys.argv[1]
38
39 with open(filename, "w") as fp:
40 print("// Auto-generated by Programs/freeze_test_frozenmain.py", file=fp)
41 frozenmain = os.path.join(PROGRAM_DIR, 'test_frozenmain.py')
42 dump(fp, frozenmain, 'test_frozenmain')
43
44 print(f"{filename} written")
45
46
47 if __name__ == "__main__":
48 main()