Skip to content

Commit ac92527

Browse files
Fidget-SpinnerJuliaPooblurb-it[bot]
authored
gh-113710: Add types to the interpreter DSL (#113711)
Co-authored-by: Jules <[email protected]> Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
1 parent 7997079 commit ac92527

14 files changed

+227
-138
lines changed

Include/internal/pycore_opcode_metadata.h

+14-10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Include/internal/pycore_uop_ids.h

+4-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Include/internal/pycore_uop_metadata.h

+38-40
Original file line numberDiff line numberDiff line change
@@ -19,36 +19,36 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
1919
[_NOP] = 0,
2020
[_RESUME_CHECK] = HAS_DEOPT_FLAG,
2121
[_LOAD_FAST_CHECK] = HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_ERROR_FLAG,
22-
[_LOAD_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG,
22+
[_LOAD_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_PURE_FLAG,
2323
[_LOAD_FAST_AND_CLEAR] = HAS_ARG_FLAG | HAS_LOCAL_FLAG,
2424
[_LOAD_FAST_LOAD_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG,
25-
[_LOAD_CONST] = HAS_ARG_FLAG | HAS_CONST_FLAG,
25+
[_LOAD_CONST] = HAS_ARG_FLAG | HAS_CONST_FLAG | HAS_PURE_FLAG,
2626
[_STORE_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG,
2727
[_STORE_FAST_LOAD_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG,
2828
[_STORE_FAST_STORE_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG,
29-
[_POP_TOP] = 0,
30-
[_PUSH_NULL] = 0,
31-
[_END_SEND] = 0,
29+
[_POP_TOP] = HAS_PURE_FLAG,
30+
[_PUSH_NULL] = HAS_PURE_FLAG,
31+
[_END_SEND] = HAS_PURE_FLAG,
3232
[_UNARY_NEGATIVE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
33-
[_UNARY_NOT] = 0,
33+
[_UNARY_NOT] = HAS_PURE_FLAG,
3434
[_TO_BOOL] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
35-
[_TO_BOOL_BOOL] = HAS_DEOPT_FLAG,
35+
[_TO_BOOL_BOOL] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
3636
[_TO_BOOL_INT] = HAS_DEOPT_FLAG,
3737
[_TO_BOOL_LIST] = HAS_DEOPT_FLAG,
3838
[_TO_BOOL_NONE] = HAS_DEOPT_FLAG,
3939
[_TO_BOOL_STR] = HAS_DEOPT_FLAG,
4040
[_TO_BOOL_ALWAYS_TRUE] = HAS_DEOPT_FLAG,
4141
[_UNARY_INVERT] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
42-
[_GUARD_BOTH_INT] = HAS_DEOPT_FLAG,
43-
[_BINARY_OP_MULTIPLY_INT] = HAS_ERROR_FLAG,
44-
[_BINARY_OP_ADD_INT] = HAS_ERROR_FLAG,
45-
[_BINARY_OP_SUBTRACT_INT] = HAS_ERROR_FLAG,
46-
[_GUARD_BOTH_FLOAT] = HAS_DEOPT_FLAG,
47-
[_BINARY_OP_MULTIPLY_FLOAT] = 0,
48-
[_BINARY_OP_ADD_FLOAT] = 0,
49-
[_BINARY_OP_SUBTRACT_FLOAT] = 0,
50-
[_GUARD_BOTH_UNICODE] = HAS_DEOPT_FLAG,
51-
[_BINARY_OP_ADD_UNICODE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
42+
[_GUARD_BOTH_INT] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
43+
[_BINARY_OP_MULTIPLY_INT] = HAS_ERROR_FLAG | HAS_PURE_FLAG,
44+
[_BINARY_OP_ADD_INT] = HAS_ERROR_FLAG | HAS_PURE_FLAG,
45+
[_BINARY_OP_SUBTRACT_INT] = HAS_ERROR_FLAG | HAS_PURE_FLAG,
46+
[_GUARD_BOTH_FLOAT] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
47+
[_BINARY_OP_MULTIPLY_FLOAT] = HAS_PURE_FLAG,
48+
[_BINARY_OP_ADD_FLOAT] = HAS_PURE_FLAG,
49+
[_BINARY_OP_SUBTRACT_FLOAT] = HAS_PURE_FLAG,
50+
[_GUARD_BOTH_UNICODE] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
51+
[_BINARY_OP_ADD_UNICODE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_PURE_FLAG,
5252
[_BINARY_SUBSCR] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
5353
[_BINARY_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
5454
[_STORE_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
@@ -112,17 +112,17 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
112112
[_LOAD_SUPER_ATTR_ATTR] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
113113
[_LOAD_SUPER_ATTR_METHOD] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
114114
[_LOAD_ATTR] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
115-
[_GUARD_TYPE_VERSION] = HAS_DEOPT_FLAG,
116-
[_CHECK_MANAGED_OBJECT_HAS_VALUES] = HAS_DEOPT_FLAG,
115+
[_GUARD_TYPE_VERSION] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
116+
[_CHECK_MANAGED_OBJECT_HAS_VALUES] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
117117
[_LOAD_ATTR_INSTANCE_VALUE] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
118-
[_CHECK_ATTR_MODULE] = HAS_DEOPT_FLAG,
118+
[_CHECK_ATTR_MODULE] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
119119
[_LOAD_ATTR_MODULE] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
120-
[_CHECK_ATTR_WITH_HINT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
120+
[_CHECK_ATTR_WITH_HINT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG | HAS_PASSTHROUGH_FLAG,
121121
[_LOAD_ATTR_WITH_HINT] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
122122
[_LOAD_ATTR_SLOT] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
123-
[_CHECK_ATTR_CLASS] = HAS_DEOPT_FLAG,
123+
[_CHECK_ATTR_CLASS] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
124124
[_LOAD_ATTR_CLASS] = HAS_ARG_FLAG,
125-
[_GUARD_DORV_VALUES] = HAS_DEOPT_FLAG,
125+
[_GUARD_DORV_VALUES] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
126126
[_STORE_ATTR_INSTANCE_VALUE] = HAS_ESCAPES_FLAG,
127127
[_STORE_ATTR_SLOT] = HAS_ESCAPES_FLAG,
128128
[_COMPARE_OP] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
@@ -142,33 +142,33 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
142142
[_GET_ITER] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
143143
[_GET_YIELD_FROM_ITER] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
144144
[_FOR_ITER_TIER_TWO] = HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
145-
[_ITER_CHECK_LIST] = HAS_DEOPT_FLAG,
146-
[_GUARD_NOT_EXHAUSTED_LIST] = HAS_DEOPT_FLAG,
145+
[_ITER_CHECK_LIST] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
146+
[_GUARD_NOT_EXHAUSTED_LIST] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
147147
[_ITER_NEXT_LIST] = 0,
148-
[_ITER_CHECK_TUPLE] = HAS_DEOPT_FLAG,
149-
[_GUARD_NOT_EXHAUSTED_TUPLE] = HAS_DEOPT_FLAG,
148+
[_ITER_CHECK_TUPLE] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
149+
[_GUARD_NOT_EXHAUSTED_TUPLE] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
150150
[_ITER_NEXT_TUPLE] = 0,
151-
[_ITER_CHECK_RANGE] = HAS_DEOPT_FLAG,
152-
[_GUARD_NOT_EXHAUSTED_RANGE] = HAS_DEOPT_FLAG,
151+
[_ITER_CHECK_RANGE] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
152+
[_GUARD_NOT_EXHAUSTED_RANGE] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
153153
[_ITER_NEXT_RANGE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
154154
[_BEFORE_ASYNC_WITH] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
155155
[_BEFORE_WITH] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
156156
[_WITH_EXCEPT_START] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
157157
[_PUSH_EXC_INFO] = 0,
158-
[_GUARD_DORV_VALUES_INST_ATTR_FROM_DICT] = HAS_DEOPT_FLAG,
159-
[_GUARD_KEYS_VERSION] = HAS_DEOPT_FLAG,
158+
[_GUARD_DORV_VALUES_INST_ATTR_FROM_DICT] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
159+
[_GUARD_KEYS_VERSION] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
160160
[_LOAD_ATTR_METHOD_WITH_VALUES] = HAS_ARG_FLAG | HAS_ESCAPES_FLAG,
161161
[_LOAD_ATTR_METHOD_NO_DICT] = HAS_ARG_FLAG | HAS_ESCAPES_FLAG,
162162
[_LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = HAS_ARG_FLAG,
163163
[_LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = HAS_ARG_FLAG,
164-
[_CHECK_ATTR_METHOD_LAZY_DICT] = HAS_DEOPT_FLAG,
164+
[_CHECK_ATTR_METHOD_LAZY_DICT] = HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
165165
[_LOAD_ATTR_METHOD_LAZY_DICT] = HAS_ARG_FLAG | HAS_ESCAPES_FLAG,
166-
[_CHECK_CALL_BOUND_METHOD_EXACT_ARGS] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
166+
[_CHECK_CALL_BOUND_METHOD_EXACT_ARGS] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
167167
[_INIT_CALL_BOUND_METHOD_EXACT_ARGS] = HAS_ARG_FLAG,
168168
[_CHECK_PEP_523] = HAS_DEOPT_FLAG,
169-
[_CHECK_FUNCTION_EXACT_ARGS] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
170-
[_CHECK_STACK_SPACE] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
171-
[_INIT_CALL_PY_EXACT_ARGS] = HAS_ARG_FLAG | HAS_ESCAPES_FLAG,
169+
[_CHECK_FUNCTION_EXACT_ARGS] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
170+
[_CHECK_STACK_SPACE] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_PASSTHROUGH_FLAG,
171+
[_INIT_CALL_PY_EXACT_ARGS] = HAS_ARG_FLAG | HAS_ESCAPES_FLAG | HAS_PURE_FLAG,
172172
[_PUSH_FRAME] = 0,
173173
[_CALL_TYPE_1] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
174174
[_CALL_STR_1] = HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
@@ -190,9 +190,9 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
190190
[_CONVERT_VALUE] = HAS_ARG_FLAG | HAS_ERROR_FLAG,
191191
[_FORMAT_SIMPLE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
192192
[_FORMAT_WITH_SPEC] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
193-
[_COPY] = HAS_ARG_FLAG,
193+
[_COPY] = HAS_ARG_FLAG | HAS_PURE_FLAG,
194194
[_BINARY_OP] = HAS_ARG_FLAG | HAS_ERROR_FLAG,
195-
[_SWAP] = HAS_ARG_FLAG,
195+
[_SWAP] = HAS_ARG_FLAG | HAS_PURE_FLAG,
196196
[_GUARD_IS_TRUE_POP] = HAS_DEOPT_FLAG,
197197
[_GUARD_IS_FALSE_POP] = HAS_DEOPT_FLAG,
198198
[_GUARD_IS_NONE_POP] = HAS_DEOPT_FLAG,
@@ -201,7 +201,6 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
201201
[_SET_IP] = HAS_ARG_FLAG | HAS_ESCAPES_FLAG,
202202
[_SAVE_RETURN_OFFSET] = HAS_ARG_FLAG,
203203
[_EXIT_TRACE] = HAS_DEOPT_FLAG,
204-
[_INSERT] = HAS_ARG_FLAG,
205204
[_CHECK_VALIDITY] = HAS_DEOPT_FLAG,
206205
[_LOAD_CONST_INLINE_BORROW] = 0,
207206
[_INTERNAL_INCREMENT_OPT_COUNTER] = 0,
@@ -304,7 +303,6 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
304303
[_GUARD_TYPE_VERSION] = "_GUARD_TYPE_VERSION",
305304
[_INIT_CALL_BOUND_METHOD_EXACT_ARGS] = "_INIT_CALL_BOUND_METHOD_EXACT_ARGS",
306305
[_INIT_CALL_PY_EXACT_ARGS] = "_INIT_CALL_PY_EXACT_ARGS",
307-
[_INSERT] = "_INSERT",
308306
[_INTERNAL_INCREMENT_OPT_COUNTER] = "_INTERNAL_INCREMENT_OPT_COUNTER",
309307
[_IS_NONE] = "_IS_NONE",
310308
[_IS_OP] = "_IS_OP",

Lib/test/test_generated_cases.py

+13-12
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010

1111
def skip_if_different_mount_drives():
12-
if sys.platform != 'win32':
12+
if sys.platform != "win32":
1313
return
1414
ROOT = os.path.dirname(os.path.dirname(__file__))
1515
root_drive = os.path.splitroot(ROOT)[0]
@@ -22,11 +22,13 @@ def skip_if_different_mount_drives():
2222
f"directory have different mount drives "
2323
f"({cwd_drive} and {root_drive})"
2424
)
25+
26+
2527
skip_if_different_mount_drives()
2628

2729

28-
test_tools.skip_if_missing('cases_generator')
29-
with test_tools.imports_under_tool('cases_generator'):
30+
test_tools.skip_if_missing("cases_generator")
31+
with test_tools.imports_under_tool("cases_generator"):
3032
from analyzer import StackItem
3133
import parser
3234
from stack import Stack
@@ -39,13 +41,14 @@ def handle_stderr():
3941
else:
4042
return support.captured_stderr()
4143

44+
4245
class TestEffects(unittest.TestCase):
4346
def test_effect_sizes(self):
4447
stack = Stack()
4548
inputs = [
46-
x:= StackItem("x", None, "", "1"),
47-
y:= StackItem("y", None, "", "oparg"),
48-
z:= StackItem("z", None, "", "oparg*2"),
49+
x := StackItem("x", None, "", "1"),
50+
y := StackItem("y", None, "", "oparg"),
51+
z := StackItem("z", None, "", "oparg*2"),
4952
]
5053
outputs = [
5154
StackItem("x", None, "", "1"),
@@ -96,9 +99,7 @@ def run_cases_test(self, input: str, expected: str):
9699

97100
with handle_stderr():
98101
tier1_generator.generate_tier1_from_files(
99-
[self.temp_input_filename],
100-
self.temp_output_filename,
101-
False
102+
[self.temp_input_filename], self.temp_output_filename, False
102103
)
103104

104105
with open(self.temp_output_filename) as temp_output:
@@ -750,7 +751,7 @@ def test_override_op(self):
750751

751752
def test_annotated_inst(self):
752753
input = """
753-
guard inst(OP, (--)) {
754+
pure inst(OP, (--)) {
754755
ham();
755756
}
756757
"""
@@ -767,7 +768,7 @@ def test_annotated_inst(self):
767768

768769
def test_annotated_op(self):
769770
input = """
770-
guard op(OP, (--)) {
771+
pure op(OP, (--)) {
771772
spam();
772773
}
773774
macro(M) = OP;
@@ -784,7 +785,7 @@ def test_annotated_op(self):
784785
self.run_cases_test(input, output)
785786

786787
input = """
787-
guard register specializing op(OP, (--)) {
788+
pure register specializing op(OP, (--)) {
788789
spam();
789790
}
790791
macro(M) = OP;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add typed stack effects to the interpreter DSL, along with various instruction annotations.

0 commit comments

Comments
 (0)