gh-106529: Split FOR_ITER_{LIST,TUPLE} into uops (#106696)

Also rename `_ITER_EXHAUSTED_XXX` to `_IS_ITER_EXHAUSTED_XXX` to make it clear this is a test.
This commit is contained in:
Guido van Rossum 2023-07-13 17:27:35 -07:00 committed by GitHub
parent 128a6c1d88
commit 025995fead
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 385 additions and 118 deletions

View file

@ -1738,6 +1738,80 @@
break;
}
case _ITER_CHECK_LIST: {
PyObject *iter = stack_pointer[-1];
DEOPT_IF(Py_TYPE(iter) != &PyListIter_Type, FOR_ITER);
break;
}
case _IS_ITER_EXHAUSTED_LIST: {
PyObject *iter = stack_pointer[-1];
PyObject *exhausted;
_PyListIterObject *it = (_PyListIterObject *)iter;
assert(Py_TYPE(iter) == &PyListIter_Type);
PyListObject *seq = it->it_seq;
if (seq == NULL || it->it_index >= PyList_GET_SIZE(seq)) {
exhausted = Py_True;
}
else {
exhausted = Py_False;
}
STACK_GROW(1);
stack_pointer[-1] = exhausted;
break;
}
case _ITER_NEXT_LIST: {
PyObject *iter = stack_pointer[-1];
PyObject *next;
_PyListIterObject *it = (_PyListIterObject *)iter;
assert(Py_TYPE(iter) == &PyListIter_Type);
PyListObject *seq = it->it_seq;
assert(seq);
assert(it->it_index < PyList_GET_SIZE(seq));
next = Py_NewRef(PyList_GET_ITEM(seq, it->it_index++));
STACK_GROW(1);
stack_pointer[-1] = next;
break;
}
case _ITER_CHECK_TUPLE: {
PyObject *iter = stack_pointer[-1];
DEOPT_IF(Py_TYPE(iter) != &PyTupleIter_Type, FOR_ITER);
break;
}
case _IS_ITER_EXHAUSTED_TUPLE: {
PyObject *iter = stack_pointer[-1];
PyObject *exhausted;
_PyTupleIterObject *it = (_PyTupleIterObject *)iter;
assert(Py_TYPE(iter) == &PyTupleIter_Type);
PyTupleObject *seq = it->it_seq;
if (seq == NULL || it->it_index >= PyTuple_GET_SIZE(seq)) {
exhausted = Py_True;
}
else {
exhausted = Py_False;
}
STACK_GROW(1);
stack_pointer[-1] = exhausted;
break;
}
case _ITER_NEXT_TUPLE: {
PyObject *iter = stack_pointer[-1];
PyObject *next;
_PyTupleIterObject *it = (_PyTupleIterObject *)iter;
assert(Py_TYPE(iter) == &PyTupleIter_Type);
PyTupleObject *seq = it->it_seq;
assert(seq);
assert(it->it_index < PyTuple_GET_SIZE(seq));
next = Py_NewRef(PyTuple_GET_ITEM(seq, it->it_index++));
STACK_GROW(1);
stack_pointer[-1] = next;
break;
}
case _ITER_CHECK_RANGE: {
PyObject *iter = stack_pointer[-1];
_PyRangeIterObject *r = (_PyRangeIterObject *)iter;
@ -1745,7 +1819,7 @@
break;
}
case _ITER_EXHAUSTED_RANGE: {
case _IS_ITER_EXHAUSTED_RANGE: {
PyObject *iter = stack_pointer[-1];
PyObject *exhausted;
_PyRangeIterObject *r = (_PyRangeIterObject *)iter;