3
3
import sys
4
4
import tokenize
5
5
6
- header = """
7
- /* Auto-generated by Tools/scripts/generate_opcode_h.py from Lib/opcode.py */
6
+ SCRIPT_NAME = "Tools/scripts/generate_opcode_h.py"
7
+ PYTHON_OPCODE = "Lib/opcode.py"
8
+
9
+ header = f"""
10
+ // Auto-generated by { SCRIPT_NAME } from { PYTHON_OPCODE }
11
+
8
12
#ifndef Py_OPCODE_H
9
13
#define Py_OPCODE_H
10
14
#ifdef __cplusplus
11
- extern "C" {
15
+ extern "C" {{
12
16
#endif
13
17
14
18
28
32
#endif /* !Py_OPCODE_H */
29
33
"""
30
34
35
+ internal_header = f"""
36
+ // Auto-generated by { SCRIPT_NAME } from { PYTHON_OPCODE }
37
+
38
+ #ifndef Py_INTERNAL_OPCODE_H
39
+ #define Py_INTERNAL_OPCODE_H
40
+ #ifdef __cplusplus
41
+ extern "C" {{
42
+ #endif
43
+
44
+ #ifndef Py_BUILD_CORE
45
+ # error "this header requires Py_BUILD_CORE define"
46
+ #endif
47
+
48
+ #include "opcode.h"
49
+ """ .lstrip ()
50
+
51
+ internal_footer = """
52
+ #ifdef __cplusplus
53
+ }
54
+ #endif
55
+ #endif // !Py_INTERNAL_OPCODE_H
56
+ """
57
+
31
58
DEFINE = "#define {:<38} {:>3}\n "
32
59
33
60
UINT32_MASK = (1 << 32 )- 1
@@ -43,7 +70,7 @@ def write_int_array_from_ops(name, ops, out):
43
70
assert bits == 0
44
71
out .write (f"}};\n " )
45
72
46
- def main (opcode_py , outfile = 'Include/opcode.h' ):
73
+ def main (opcode_py , outfile = 'Include/opcode.h' , internaloutfile = 'Include/internal/pycore_opcode.h' ):
47
74
opcode = {}
48
75
if hasattr (tokenize , 'open' ):
49
76
fp = tokenize .open (opcode_py ) # Python 3.2+
@@ -75,8 +102,10 @@ def main(opcode_py, outfile='Include/opcode.h'):
75
102
opname_including_specialized [255 ] = 'DO_TRACING'
76
103
used [255 ] = True
77
104
78
- with open (outfile , 'w' ) as fobj :
105
+ with ( open (outfile , 'w' ) as fobj , open ( internaloutfile , 'w' ) as iobj ) :
79
106
fobj .write (header )
107
+ iobj .write (internal_header )
108
+
80
109
for name in opname :
81
110
if name in opmap :
82
111
fobj .write (DEFINE .format (name , opmap [name ]))
@@ -86,28 +115,29 @@ def main(opcode_py, outfile='Include/opcode.h'):
86
115
for name , op in specialized_opmap .items ():
87
116
fobj .write (DEFINE .format (name , op ))
88
117
89
- fobj .write ("\n extern const uint8_t _PyOpcode_Caches[256];\n " )
90
- fobj .write ("\n extern const uint8_t _PyOpcode_Deopt[256];\n " )
91
- fobj .write ("\n #ifdef NEED_OPCODE_TABLES\n " )
92
- write_int_array_from_ops ("_PyOpcode_RelativeJump" , opcode ['hasjrel' ], fobj )
93
- write_int_array_from_ops ("_PyOpcode_Jump" , opcode ['hasjrel' ] + opcode ['hasjabs' ], fobj )
118
+ iobj .write ("\n extern const uint8_t _PyOpcode_Caches[256];\n " )
119
+ iobj .write ("\n extern const uint8_t _PyOpcode_Deopt[256];\n " )
120
+ iobj .write ("\n #ifdef NEED_OPCODE_TABLES\n " )
121
+ write_int_array_from_ops ("_PyOpcode_RelativeJump" , opcode ['hasjrel' ], iobj )
122
+ write_int_array_from_ops ("_PyOpcode_Jump" , opcode ['hasjrel' ] + opcode ['hasjabs' ], iobj )
94
123
95
- fobj .write ("\n const uint8_t _PyOpcode_Caches[256] = {\n " )
124
+ iobj .write ("\n const uint8_t _PyOpcode_Caches[256] = {\n " )
96
125
for i , entries in enumerate (opcode ["_inline_cache_entries" ]):
97
126
if entries :
98
- fobj .write (f" [{ opname [i ]} ] = { entries } ,\n " )
99
- fobj .write ("};\n " )
127
+ iobj .write (f" [{ opname [i ]} ] = { entries } ,\n " )
128
+ iobj .write ("};\n " )
129
+
100
130
deoptcodes = {}
101
131
for basic in opmap :
102
132
deoptcodes [basic ] = basic
103
133
for basic , family in opcode ["_specializations" ].items ():
104
134
for specialized in family :
105
135
deoptcodes [specialized ] = basic
106
- fobj .write ("\n const uint8_t _PyOpcode_Deopt[256] = {\n " )
136
+ iobj .write ("\n const uint8_t _PyOpcode_Deopt[256] = {\n " )
107
137
for opt , deopt in sorted (deoptcodes .items ()):
108
- fobj .write (f" [{ opt } ] = { deopt } ,\n " )
109
- fobj .write ("};\n " )
110
- fobj .write ("#endif /* OPCODE_TABLES */ \n " )
138
+ iobj .write (f" [{ opt } ] = { deopt } ,\n " )
139
+ iobj .write ("};\n " )
140
+ iobj .write ("#endif // NEED_OPCODE_TABLES \n " )
111
141
112
142
fobj .write ("\n " )
113
143
fobj .write ("#define HAS_CONST(op) (false\\ " )
@@ -119,28 +149,29 @@ def main(opcode_py, outfile='Include/opcode.h'):
119
149
for i , (op , _ ) in enumerate (opcode ["_nb_ops" ]):
120
150
fobj .write (DEFINE .format (op , i ))
121
151
122
- fobj .write ("\n " )
123
- fobj .write ("#ifdef Py_DEBUG\n " )
124
- fobj .write ("static const char *const _PyOpcode_OpName[256] = {\n " )
152
+ iobj .write ("\n " )
153
+ iobj .write ("#ifdef Py_DEBUG\n " )
154
+ iobj .write ("static const char *const _PyOpcode_OpName[256] = {\n " )
125
155
for op , name in enumerate (opname_including_specialized ):
126
156
if name [0 ] != "<" :
127
157
op = name
128
- fobj .write (f''' [{ op } ] = "{ name } ",\n ''' )
129
- fobj .write ("};\n " )
130
- fobj .write ("#endif\n " )
158
+ iobj .write (f''' [{ op } ] = "{ name } ",\n ''' )
159
+ iobj .write ("};\n " )
160
+ iobj .write ("#endif\n " )
131
161
132
- fobj .write ("\n " )
133
- fobj .write ("#define EXTRA_CASES \\ \n " )
162
+ iobj .write ("\n " )
163
+ iobj .write ("#define EXTRA_CASES \\ \n " )
134
164
for i , flag in enumerate (used ):
135
165
if not flag :
136
- fobj .write (f" case { i } : \\ \n " )
137
- fobj .write (" ;\n " )
166
+ iobj .write (f" case { i } : \\ \n " )
167
+ iobj .write (" ;\n " )
138
168
139
169
fobj .write (footer )
170
+ iobj .write (internal_footer )
140
171
141
172
142
173
print (f"{ outfile } regenerated from { opcode_py } " )
143
174
144
175
145
176
if __name__ == '__main__' :
146
- main (sys .argv [1 ], sys .argv [2 ])
177
+ main (sys .argv [1 ], sys .argv [2 ], sys . argv [ 3 ] )
0 commit comments