mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	
		
			
	
	
		
			54 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			54 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | """Generate targets for computed goto dispatch
 | ||
|  | Reads the instruction definitions from bytecodes.c. | ||
|  | Writes the table to opcode_targets.h by default. | ||
|  | """
 | ||
|  | 
 | ||
|  | import argparse | ||
|  | 
 | ||
|  | from analyzer import ( | ||
|  |     Analysis, | ||
|  |     analyze_files, | ||
|  | ) | ||
|  | from generators_common import ( | ||
|  |     DEFAULT_INPUT, | ||
|  |     ROOT, | ||
|  | ) | ||
|  | from cwriter import CWriter | ||
|  | 
 | ||
|  | 
 | ||
|  | DEFAULT_OUTPUT = ROOT / "Python/opcode_targets.h" | ||
|  | 
 | ||
|  | 
 | ||
|  | def write_opcode_targets(analysis: Analysis, out: CWriter) -> None: | ||
|  |     """Write header file that defines the jump target table""" | ||
|  |     targets = ["&&_unknown_opcode,\n"] * 256 | ||
|  |     for name, op in analysis.opmap.items(): | ||
|  |         if op < 256: | ||
|  |             targets[op] = f"&&TARGET_{name},\n" | ||
|  |     out.emit("static void *opcode_targets[256] = {\n") | ||
|  |     for target in targets: | ||
|  |         out.emit(target) | ||
|  |     out.emit("};\n") | ||
|  | 
 | ||
|  | arg_parser = argparse.ArgumentParser( | ||
|  |     description="Generate the file with dispatch targets.", | ||
|  |     formatter_class=argparse.ArgumentDefaultsHelpFormatter, | ||
|  | ) | ||
|  | 
 | ||
|  | arg_parser.add_argument( | ||
|  |     "-o", "--output", type=str, help="Generated code", default=DEFAULT_OUTPUT | ||
|  | ) | ||
|  | 
 | ||
|  | arg_parser.add_argument( | ||
|  |     "input", nargs=argparse.REMAINDER, help="Instruction definition file(s)" | ||
|  | ) | ||
|  | 
 | ||
|  | if __name__ == "__main__": | ||
|  |     args = arg_parser.parse_args() | ||
|  |     if len(args.input) == 0: | ||
|  |         args.input.append(DEFAULT_INPUT) | ||
|  |     data = analyze_files(args.input) | ||
|  |     with open(args.output, "w") as outfile: | ||
|  |         out = CWriter(outfile, 0, False) | ||
|  |         write_opcode_targets(data, out) |