From 83e72230a765d25707c547cc84b540ee22c9be21 Mon Sep 17 00:00:00 2001 From: Brandt Bucher Date: Fri, 2 Sep 2022 11:09:02 -0700 Subject: [PATCH 1/2] Don't goto iterator_exhausted_no_error --- Python/ceval.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/Python/ceval.c b/Python/ceval.c index 76a81185e76da5..abf97d9133d28d 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3810,9 +3810,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int } _PyErr_Clear(tstate); } - iterator_exhausted_no_error: /* iterator ended normally */ - assert(!_PyErr_Occurred(tstate)); Py_DECREF(POP()); JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg); DISPATCH(); @@ -3839,19 +3837,20 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int DEOPT_IF(Py_TYPE(it) != &PyListIter_Type, FOR_ITER); STAT_INC(FOR_ITER, hit); PyListObject *seq = it->it_seq; - if (seq == NULL) { - goto iterator_exhausted_no_error; - } - if (it->it_index < PyList_GET_SIZE(seq)) { - PyObject *next = PyList_GET_ITEM(seq, it->it_index++); - Py_INCREF(next); - PUSH(next); - JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER); - NOTRACE_DISPATCH(); + if (seq) { + if (it->it_index < PyList_GET_SIZE(seq)) { + PyObject *next = PyList_GET_ITEM(seq, it->it_index++); + Py_INCREF(next); + PUSH(next); + JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER); + NOTRACE_DISPATCH(); + } + it->it_seq = NULL; + Py_DECREF(seq); } - it->it_seq = NULL; - Py_DECREF(seq); - goto iterator_exhausted_no_error; + Py_DECREF(POP()); + JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg); + DISPATCH(); } TARGET(FOR_ITER_RANGE) { @@ -3862,7 +3861,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int _Py_CODEUNIT next = next_instr[INLINE_CACHE_ENTRIES_FOR_ITER]; assert(_PyOpcode_Deopt[_Py_OPCODE(next)] == STORE_FAST); if (r->index >= r->len) { - goto iterator_exhausted_no_error; + Py_DECREF(POP()); + JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg); + DISPATCH(); } long value = (long)(r->start + (unsigned long)(r->index++) * r->step); From 49deea42dec358f507b46b52f6fbf5689b6ebff4 Mon Sep 17 00:00:00 2001 From: Brandt Bucher Date: Tue, 6 Sep 2022 18:37:34 -0700 Subject: [PATCH 2/2] Feedback from PR review --- Python/ceval.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Python/ceval.c b/Python/ceval.c index abf97d9133d28d..b420bed4e3ff5f 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3811,7 +3811,8 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int _PyErr_Clear(tstate); } /* iterator ended normally */ - Py_DECREF(POP()); + STACK_SHRINK(1); + Py_DECREF(iter); JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg); DISPATCH(); } @@ -3848,9 +3849,10 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int it->it_seq = NULL; Py_DECREF(seq); } - Py_DECREF(POP()); + STACK_SHRINK(1); + Py_DECREF(it); JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg); - DISPATCH(); + NOTRACE_DISPATCH(); } TARGET(FOR_ITER_RANGE) { @@ -3861,9 +3863,10 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int _Py_CODEUNIT next = next_instr[INLINE_CACHE_ENTRIES_FOR_ITER]; assert(_PyOpcode_Deopt[_Py_OPCODE(next)] == STORE_FAST); if (r->index >= r->len) { - Py_DECREF(POP()); + STACK_SHRINK(1); + Py_DECREF(r); JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg); - DISPATCH(); + NOTRACE_DISPATCH(); } long value = (long)(r->start + (unsigned long)(r->index++) * r->step);