mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 18:28:49 +00:00 
			
		
		
		
	 ffa55d21b4
			
		
	
	
		ffa55d21b4
		
			
		
	
	
	
	
		
			
			Add the "regen-frozen" makefile target that regenerates the code for the frozen __hello__ module.
		
			
				
	
	
		
			51 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			51 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()
 |