mirror of
https://github.com/python/cpython.git
synced 2025-07-09 20:35:26 +00:00
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:
parent
128a6c1d88
commit
025995fead
6 changed files with 385 additions and 118 deletions
76
Python/executor_cases.c.h
generated
76
Python/executor_cases.c.h
generated
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue