blob: 948b56f9007e93a55a3296d7d584abcef4bd6b9a [file] [log] [blame]
Kushal Das02d23a22014-04-15 23:50:06 +05301# This script generates the opcode.h header file.
2
3import sys
Kushal Das02d23a22014-04-15 23:50:06 +05304header = """/* Auto-generated by Tools/scripts/generate_opcode_h.py */
5#ifndef Py_OPCODE_H
6#define Py_OPCODE_H
7#ifdef __cplusplus
8extern "C" {
9#endif
10
11
12 /* Instruction opcodes for compiled code */
13"""
14
15footer = """
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
23enum 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
Thomas Wouters67d8dc12014-04-17 01:13:29 +020036def main(opcode_py, outfile='Include/opcode.h'):
37 opcode = {}
38 exec(open(opcode_py).read(), opcode)
39 opmap = opcode['opmap']
Kushal Das02d23a22014-04-15 23:50:06 +053040 with open(outfile, 'w') as fobj:
41 fobj.write(header)
Thomas Wouters67d8dc12014-04-17 01:13:29 +020042 for name in opcode['opname']:
43 if name in opmap:
Serhiy Storchaka3028c952015-05-27 21:31:33 +030044 fobj.write("#define %-23s %3s\n" % (name, opmap[name]))
Kushal Das02d23a22014-04-15 23:50:06 +053045 if name == 'POP_EXCEPT': # Special entry for HAVE_ARGUMENT
Serhiy Storchaka3028c952015-05-27 21:31:33 +030046 fobj.write("#define %-23s %3d\n" %
Thomas Wouters67d8dc12014-04-17 01:13:29 +020047 ('HAVE_ARGUMENT', opcode['HAVE_ARGUMENT']))
Kushal Das02d23a22014-04-15 23:50:06 +053048 fobj.write(footer)
49
50
51if __name__ == '__main__':
Thomas Wouters67d8dc12014-04-17 01:13:29 +020052 main(sys.argv[1], sys.argv[2])