mirror of https://github.com/python/cpython
52 lines
1.2 KiB
Python
52 lines
1.2 KiB
Python
#!/usr/bin/env python3
|
|
import sys
|
|
import os
|
|
import marshal
|
|
|
|
|
|
DIR = os.path.dirname(sys.argv[0])
|
|
# source code for module to freeze
|
|
FILE = os.path.join(DIR, 'flag.py')
|
|
# C symbol to use for array holding frozen bytes
|
|
SYMBOL = 'M___hello__'
|
|
|
|
|
|
def get_module_code(filename):
|
|
"""Compile 'filename' and return the module code as a marshalled byte
|
|
string.
|
|
"""
|
|
with open(filename, 'r') as fp:
|
|
src = fp.read()
|
|
co = compile(src, 'none', 'exec')
|
|
co_bytes = marshal.dumps(co)
|
|
return co_bytes
|
|
|
|
|
|
def gen_c_code(fp, co_bytes):
|
|
"""Generate C code for the module code in 'co_bytes', write it to 'fp'.
|
|
"""
|
|
def write(*args, **kwargs):
|
|
print(*args, **kwargs, file=fp)
|
|
write('/* Generated with Tools/freeze/regen_frozen.py */')
|
|
write('static unsigned char %s[] = {' % SYMBOL, end='')
|
|
bytes_per_row = 13
|
|
for i, opcode in enumerate(co_bytes):
|
|
if (i % bytes_per_row) == 0:
|
|
# start a new row
|
|
write()
|
|
write(' ', end='')
|
|
write('%d,' % opcode, end='')
|
|
write()
|
|
write('};')
|
|
|
|
|
|
def main():
|
|
out_filename = sys.argv[1]
|
|
co_bytes = get_module_code(FILE)
|
|
with open(out_filename, 'w') as fp:
|
|
gen_c_code(fp, co_bytes)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|