cpython/Tools/freeze/regen_frozen.py

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()