summaryrefslogtreecommitdiffstats
path: root/Python/executor_cases.c.h
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2023-07-14 00:27:35 (GMT)
committerGitHub <noreply@github.com>2023-07-14 00:27:35 (GMT)
commit025995feadaeebeef5d808f2564f0fd65b704ea5 (patch)
tree209a28f3409c87d40a1af03a8dac92571e151078 /Python/executor_cases.c.h
parent128a6c1d889639012c83c122b82c9cdf0b62d587 (diff)
downloadcpython-025995feadaeebeef5d808f2564f0fd65b704ea5.zip
cpython-025995feadaeebeef5d808f2564f0fd65b704ea5.tar.gz
cpython-025995feadaeebeef5d808f2564f0fd65b704ea5.tar.bz2
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.
Diffstat (limited to 'Python/executor_cases.c.h')
-rw-r--r--Python/executor_cases.c.h76
1 files changed, 75 insertions, 1 deletions
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index ce54755..626baec 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -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;