gh-116088: Insert bottom checks after all sym_set_...() calls (#116089)

This changes the `sym_set_...()` functions to return a `bool` which is `false`
when the symbol is `bottom` after the operation.

All calls to such functions now check this result and go to `hit_bottom`,
a special error label that prints a different message and then reports
that it wasn't able to optimize the trace. No executor will be produced
in this case.
This commit is contained in:
Guido van Rossum 2024-02-29 10:55:29 -08:00 committed by GitHub
parent 3b6f4cadf1
commit 0656509033
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 106 additions and 47 deletions

View file

@ -85,8 +85,12 @@ dummy_func(void) {
sym_matches_type(right, &PyLong_Type)) {
REPLACE_OP(this_instr, _NOP, 0, 0);
}
sym_set_type(left, &PyLong_Type);
sym_set_type(right, &PyLong_Type);
if (!sym_set_type(left, &PyLong_Type)) {
goto hit_bottom;
}
if (!sym_set_type(right, &PyLong_Type)) {
goto hit_bottom;
}
}
op(_GUARD_BOTH_FLOAT, (left, right -- left, right)) {
@ -94,8 +98,12 @@ dummy_func(void) {
sym_matches_type(right, &PyFloat_Type)) {
REPLACE_OP(this_instr, _NOP, 0 ,0);
}
sym_set_type(left, &PyFloat_Type);
sym_set_type(right, &PyFloat_Type);
if (!sym_set_type(left, &PyFloat_Type)) {
goto hit_bottom;
}
if (!sym_set_type(right, &PyFloat_Type)) {
goto hit_bottom;
}
}
op(_GUARD_BOTH_UNICODE, (left, right -- left, right)) {
@ -103,8 +111,12 @@ dummy_func(void) {
sym_matches_type(right, &PyUnicode_Type)) {
REPLACE_OP(this_instr, _NOP, 0 ,0);
}
sym_set_type(left, &PyUnicode_Type);
sym_set_type(right, &PyUnicode_Type);
if (!sym_set_type(left, &PyUnicode_Type)) {
goto hit_bottom;
}
if (!sym_set_type(right, &PyUnicode_Type)) {
goto hit_bottom;
}
}
op(_BINARY_OP_ADD_INT, (left, right -- res)) {
@ -365,14 +377,20 @@ dummy_func(void) {
op(_CHECK_FUNCTION_EXACT_ARGS, (func_version/2, callable, self_or_null, unused[oparg] -- callable, self_or_null, unused[oparg])) {
sym_set_type(callable, &PyFunction_Type);
if (!sym_set_type(callable, &PyFunction_Type)) {
goto hit_bottom;
}
(void)self_or_null;
(void)func_version;
}
op(_CHECK_CALL_BOUND_METHOD_EXACT_ARGS, (callable, null, unused[oparg] -- callable, null, unused[oparg])) {
sym_set_null(null);
sym_set_type(callable, &PyMethod_Type);
if (!sym_set_null(null)) {
goto hit_bottom;
}
if (!sym_set_type(callable, &PyMethod_Type)) {
goto hit_bottom;
}
}
op(_INIT_CALL_PY_EXACT_ARGS, (callable, self_or_null, args[oparg] -- new_frame: _Py_UOpsAbstractFrame *)) {