blob: 6622a3c8155bcb37fe7c14af48956c2abbfa21cf [file] [log] [blame]
Kushal Das02d23a22014-04-15 23:50:06 +05301# This script generates the opcode.h header file.
2
3import sys
Victor Stinner213cc382016-11-28 18:13:52 +01004import tokenize
5
Kushal Das02d23a22014-04-15 23:50:06 +05306header = """/* Auto-generated by Tools/scripts/generate_opcode_h.py */
7#ifndef Py_OPCODE_H
8#define Py_OPCODE_H
9#ifdef __cplusplus
10extern "C" {
11#endif
12
13
14 /* Instruction opcodes for compiled code */
15"""
16
17footer = """
18/* EXCEPT_HANDLER is a special, implicit block type which is created when
19 entering an except handler. It is not an opcode but we define it here
20 as we want it to be available to both frameobject.c and ceval.c, while
21 remaining private.*/
22#define EXCEPT_HANDLER 257
23
24
25enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE,
26 PyCmp_GT=Py_GT, PyCmp_GE=Py_GE, PyCmp_IN, PyCmp_NOT_IN,
27 PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD};
28
29#define HAS_ARG(op) ((op) >= HAVE_ARGUMENT)
30
31#ifdef __cplusplus
32}
33#endif
34#endif /* !Py_OPCODE_H */
35"""
36
37
Thomas Wouters67d8dc12014-04-17 01:13:29 +020038def main(opcode_py, outfile='Include/opcode.h'):
39 opcode = {}
Victor Stinner213cc382016-11-28 18:13:52 +010040 if hasattr(tokenize, 'open'):
41 fp = tokenize.open(opcode_py) # Python 3.2+
42 else:
43 fp = open(opcode_py) # Python 2.7
44 with fp:
Victor Stinner6193ecd2016-11-25 11:59:52 +010045 code = fp.read()
46 exec(code, opcode)
Thomas Wouters67d8dc12014-04-17 01:13:29 +020047 opmap = opcode['opmap']
Kushal Das02d23a22014-04-15 23:50:06 +053048 with open(outfile, 'w') as fobj:
49 fobj.write(header)
Thomas Wouters67d8dc12014-04-17 01:13:29 +020050 for name in opcode['opname']:
51 if name in opmap:
Serhiy Storchaka3028c952015-05-27 21:31:33 +030052 fobj.write("#define %-23s %3s\n" % (name, opmap[name]))
Kushal Das02d23a22014-04-15 23:50:06 +053053 if name == 'POP_EXCEPT': # Special entry for HAVE_ARGUMENT
Serhiy Storchaka3028c952015-05-27 21:31:33 +030054 fobj.write("#define %-23s %3d\n" %
Thomas Wouters67d8dc12014-04-17 01:13:29 +020055 ('HAVE_ARGUMENT', opcode['HAVE_ARGUMENT']))
Kushal Das02d23a22014-04-15 23:50:06 +053056 fobj.write(footer)
57
Victor Stinner213cc382016-11-28 18:13:52 +010058 print("%s regenerated from %s" % (outfile, opcode_py))
59
Kushal Das02d23a22014-04-15 23:50:06 +053060
61if __name__ == '__main__':
Thomas Wouters67d8dc12014-04-17 01:13:29 +020062 main(sys.argv[1], sys.argv[2])