mirror of https://github.com/python/cpython
gh-98831: rewrite CHECK_EG_MATCH opcode in the instruction definition DSL (#101269)
This commit is contained in:
parent
7589d713a1
commit
8c183cddd3
|
@ -1894,44 +1894,24 @@ dummy_func(
|
||||||
b = Py_NewRef((res^oparg) ? Py_True : Py_False);
|
b = Py_NewRef((res^oparg) ? Py_True : Py_False);
|
||||||
}
|
}
|
||||||
|
|
||||||
// stack effect: ( -- )
|
inst(CHECK_EG_MATCH, (exc_value, match_type -- rest, match)) {
|
||||||
inst(CHECK_EG_MATCH) {
|
|
||||||
PyObject *match_type = POP();
|
|
||||||
if (check_except_star_type_valid(tstate, match_type) < 0) {
|
if (check_except_star_type_valid(tstate, match_type) < 0) {
|
||||||
Py_DECREF(match_type);
|
DECREF_INPUTS();
|
||||||
goto error;
|
ERROR_IF(true, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject *exc_value = TOP();
|
match = NULL;
|
||||||
PyObject *match = NULL, *rest = NULL;
|
rest = NULL;
|
||||||
int res = exception_group_match(exc_value, match_type,
|
int res = exception_group_match(exc_value, match_type,
|
||||||
&match, &rest);
|
&match, &rest);
|
||||||
Py_DECREF(match_type);
|
DECREF_INPUTS();
|
||||||
if (res < 0) {
|
ERROR_IF(res < 0, error);
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (match == NULL || rest == NULL) {
|
assert((match == NULL) == (rest == NULL));
|
||||||
assert(match == NULL);
|
ERROR_IF(match == NULL, error);
|
||||||
assert(rest == NULL);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
if (Py_IsNone(match)) {
|
|
||||||
PUSH(match);
|
|
||||||
Py_XDECREF(rest);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* Total or partial match - update the stack from
|
|
||||||
* [val]
|
|
||||||
* to
|
|
||||||
* [rest, match]
|
|
||||||
* (rest can be Py_None)
|
|
||||||
*/
|
|
||||||
|
|
||||||
SET_TOP(rest);
|
if (!Py_IsNone(match)) {
|
||||||
PUSH(match);
|
|
||||||
PyErr_SetExcInfo(NULL, Py_NewRef(match), NULL);
|
PyErr_SetExcInfo(NULL, Py_NewRef(match), NULL);
|
||||||
Py_DECREF(exc_value);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1946,7 +1946,7 @@ exception_group_match(PyObject* exc_value, PyObject *match_type,
|
||||||
}
|
}
|
||||||
/* no match */
|
/* no match */
|
||||||
*match = Py_NewRef(Py_None);
|
*match = Py_NewRef(Py_None);
|
||||||
*rest = Py_NewRef(Py_None);
|
*rest = Py_NewRef(exc_value);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2251,43 +2251,32 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
TARGET(CHECK_EG_MATCH) {
|
TARGET(CHECK_EG_MATCH) {
|
||||||
PyObject *match_type = POP();
|
PyObject *match_type = PEEK(1);
|
||||||
|
PyObject *exc_value = PEEK(2);
|
||||||
|
PyObject *rest;
|
||||||
|
PyObject *match;
|
||||||
if (check_except_star_type_valid(tstate, match_type) < 0) {
|
if (check_except_star_type_valid(tstate, match_type) < 0) {
|
||||||
|
Py_DECREF(exc_value);
|
||||||
Py_DECREF(match_type);
|
Py_DECREF(match_type);
|
||||||
goto error;
|
if (true) goto pop_2_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject *exc_value = TOP();
|
match = NULL;
|
||||||
PyObject *match = NULL, *rest = NULL;
|
rest = NULL;
|
||||||
int res = exception_group_match(exc_value, match_type,
|
int res = exception_group_match(exc_value, match_type,
|
||||||
&match, &rest);
|
&match, &rest);
|
||||||
Py_DECREF(match_type);
|
|
||||||
if (res < 0) {
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (match == NULL || rest == NULL) {
|
|
||||||
assert(match == NULL);
|
|
||||||
assert(rest == NULL);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
if (Py_IsNone(match)) {
|
|
||||||
PUSH(match);
|
|
||||||
Py_XDECREF(rest);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* Total or partial match - update the stack from
|
|
||||||
* [val]
|
|
||||||
* to
|
|
||||||
* [rest, match]
|
|
||||||
* (rest can be Py_None)
|
|
||||||
*/
|
|
||||||
|
|
||||||
SET_TOP(rest);
|
|
||||||
PUSH(match);
|
|
||||||
PyErr_SetExcInfo(NULL, Py_NewRef(match), NULL);
|
|
||||||
Py_DECREF(exc_value);
|
Py_DECREF(exc_value);
|
||||||
|
Py_DECREF(match_type);
|
||||||
|
if (res < 0) goto pop_2_error;
|
||||||
|
|
||||||
|
assert((match == NULL) == (rest == NULL));
|
||||||
|
if (match == NULL) goto pop_2_error;
|
||||||
|
|
||||||
|
if (!Py_IsNone(match)) {
|
||||||
|
PyErr_SetExcInfo(NULL, Py_NewRef(match), NULL);
|
||||||
}
|
}
|
||||||
|
POKE(1, match);
|
||||||
|
POKE(2, rest);
|
||||||
DISPATCH();
|
DISPATCH();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -119,7 +119,7 @@ static const struct {
|
||||||
[COMPARE_AND_BRANCH_STR] = { 2, 0, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC0 },
|
[COMPARE_AND_BRANCH_STR] = { 2, 0, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC0 },
|
||||||
[IS_OP] = { 2, 1, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
|
[IS_OP] = { 2, 1, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
|
||||||
[CONTAINS_OP] = { 2, 1, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
|
[CONTAINS_OP] = { 2, 1, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
|
||||||
[CHECK_EG_MATCH] = { -1, -1, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
|
[CHECK_EG_MATCH] = { 2, 2, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
|
||||||
[CHECK_EXC_MATCH] = { 2, 2, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
|
[CHECK_EXC_MATCH] = { 2, 2, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
|
||||||
[IMPORT_NAME] = { 2, 1, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
|
[IMPORT_NAME] = { 2, 1, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
|
||||||
[IMPORT_FROM] = { 1, 2, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
|
[IMPORT_FROM] = { 1, 2, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },
|
||||||
|
|
Loading…
Reference in New Issue