Home | History | Annotate | Download | only in scripts
      1 # This script generates the opcode.h header file.
      2 
      3 import sys
      4 header = """/* Auto-generated by Tools/scripts/generate_opcode_h.py */
      5 #ifndef Py_OPCODE_H
      6 #define Py_OPCODE_H
      7 #ifdef __cplusplus
      8 extern "C" {
      9 #endif
     10 
     11 
     12     /* Instruction opcodes for compiled code */
     13 """
     14 
     15 footer = """
     16 /* EXCEPT_HANDLER is a special, implicit block type which is created when
     17    entering an except handler. It is not an opcode but we define it here
     18    as we want it to be available to both frameobject.c and ceval.c, while
     19    remaining private.*/
     20 #define EXCEPT_HANDLER 257
     21 
     22 
     23 enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE,
     24                 PyCmp_GT=Py_GT, PyCmp_GE=Py_GE, PyCmp_IN, PyCmp_NOT_IN,
     25                 PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD};
     26 
     27 #define HAS_ARG(op) ((op) >= HAVE_ARGUMENT)
     28 
     29 #ifdef __cplusplus
     30 }
     31 #endif
     32 #endif /* !Py_OPCODE_H */
     33 """
     34 
     35 
     36 def main(opcode_py, outfile='Include/opcode.h'):
     37     opcode = {}
     38     exec(open(opcode_py).read(), opcode)
     39     opmap = opcode['opmap']
     40     with open(outfile, 'w') as fobj:
     41         fobj.write(header)
     42         for name in opcode['opname']:
     43             if name in opmap:
     44                 fobj.write("#define %-23s %3s\n" % (name, opmap[name]))
     45             if name == 'POP_EXCEPT': # Special entry for HAVE_ARGUMENT
     46                 fobj.write("#define %-23s %3d\n" %
     47                             ('HAVE_ARGUMENT', opcode['HAVE_ARGUMENT']))
     48         fobj.write(footer)
     49 
     50 
     51 if __name__ == '__main__':
     52     main(sys.argv[1], sys.argv[2])
     53