GH-98831: Remove all remaining DISPATCH() calls from bytecodes.c (#99271)

Also mark those opcodes that have no stack effect as such.

Co-authored-by: Brandt Bucher <brandtbucher@gmail.com>
This commit is contained in:
Guido van Rossum 2022-11-10 10:50:57 -08:00 committed by GitHub
parent 00ee6d506e
commit 694cdb24a6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 175 additions and 169 deletions

View file

@ -68,7 +68,6 @@ do { \
#define JUMPBY(offset) ((void)0) #define JUMPBY(offset) ((void)0)
#define GO_TO_INSTRUCTION(instname) ((void)0) #define GO_TO_INSTRUCTION(instname) ((void)0)
#define DISPATCH_SAME_OPARG() ((void)0) #define DISPATCH_SAME_OPARG() ((void)0)
#define DISPATCH() ((void)0)
#define inst(name, ...) case name: #define inst(name, ...) case name:
#define super(name) static int SUPER_##name #define super(name) static int SUPER_##name
@ -104,10 +103,6 @@ dummy_func(
{ {
switch (opcode) { switch (opcode) {
/* BEWARE!
It is essential that any operation that fails must goto error
and that all operation that succeed call DISPATCH() ! */
// BEGIN BYTECODES // // BEGIN BYTECODES //
inst(NOP, (--)) { inst(NOP, (--)) {
} }
@ -152,16 +147,14 @@ dummy_func(
super(LOAD_FAST__LOAD_CONST) = LOAD_FAST + LOAD_CONST; super(LOAD_FAST__LOAD_CONST) = LOAD_FAST + LOAD_CONST;
super(STORE_FAST__LOAD_FAST) = STORE_FAST + LOAD_FAST; super(STORE_FAST__LOAD_FAST) = STORE_FAST + LOAD_FAST;
super(STORE_FAST__STORE_FAST) = STORE_FAST + STORE_FAST; super(STORE_FAST__STORE_FAST) = STORE_FAST + STORE_FAST;
super (LOAD_CONST__LOAD_FAST) = LOAD_CONST + LOAD_FAST; super(LOAD_CONST__LOAD_FAST) = LOAD_CONST + LOAD_FAST;
inst(POP_TOP, (value --)) { inst(POP_TOP, (value --)) {
Py_DECREF(value); Py_DECREF(value);
} }
// stack effect: ( -- __0) inst(PUSH_NULL, (-- res)) {
inst(PUSH_NULL) { res = NULL;
/* Use BASIC_PUSH as NULL is not a valid object pointer */
BASIC_PUSH(NULL);
} }
inst(END_FOR, (value1, value2 --)) { inst(END_FOR, (value1, value2 --)) {
@ -816,11 +809,12 @@ dummy_func(
Py_DECREF(receiver); Py_DECREF(receiver);
SET_TOP(retval); SET_TOP(retval);
JUMPBY(oparg); JUMPBY(oparg);
DISPATCH();
} }
assert(gen_status == PYGEN_NEXT); else {
assert(retval != NULL); assert(gen_status == PYGEN_NEXT);
PUSH(retval); assert(retval != NULL);
PUSH(retval);
}
} }
// stack effect: ( -- ) // stack effect: ( -- )
@ -913,7 +907,6 @@ dummy_func(
if (PyErr_GivenExceptionMatches(val, PyExc_StopAsyncIteration)) { if (PyErr_GivenExceptionMatches(val, PyExc_StopAsyncIteration)) {
Py_DECREF(val); Py_DECREF(val);
Py_DECREF(POP()); Py_DECREF(POP());
DISPATCH();
} }
else { else {
PyObject *exc = Py_NewRef(PyExceptionInstance_Class(val)); PyObject *exc = Py_NewRef(PyExceptionInstance_Class(val));
@ -935,12 +928,13 @@ dummy_func(
Py_DECREF(POP()); // The last sent value. Py_DECREF(POP()); // The last sent value.
Py_DECREF(POP()); // The delegated sub-iterator. Py_DECREF(POP()); // The delegated sub-iterator.
PUSH(value); PUSH(value);
DISPATCH();
} }
PyObject *exc_type = Py_NewRef(Py_TYPE(exc_value)); else {
PyObject *exc_traceback = PyException_GetTraceback(exc_value); PyObject *exc_type = Py_NewRef(Py_TYPE(exc_value));
_PyErr_Restore(tstate, exc_type, Py_NewRef(exc_value), exc_traceback); PyObject *exc_traceback = PyException_GetTraceback(exc_value);
goto exception_unwind; _PyErr_Restore(tstate, exc_type, Py_NewRef(exc_value), exc_traceback);
goto exception_unwind;
}
} }
inst(STOPITERATION_ERROR) { inst(STOPITERATION_ERROR) {
@ -982,7 +976,6 @@ dummy_func(
PyException_SetContext(error, exc); PyException_SetContext(error, exc);
Py_DECREF(message); Py_DECREF(message);
} }
DISPATCH();
} }
@ -1040,8 +1033,7 @@ dummy_func(
goto error; goto error;
} }
// stack effect: ( -- ) inst(DELETE_NAME, (--)) {
inst(DELETE_NAME) {
PyObject *name = GETITEM(names, oparg); PyObject *name = GETITEM(names, oparg);
PyObject *ns = LOCALS(); PyObject *ns = LOCALS();
int err; int err;
@ -1051,6 +1043,7 @@ dummy_func(
goto error; goto error;
} }
err = PyObject_DelItem(ns, name); err = PyObject_DelItem(ns, name);
// Can't use ERROR_IF here.
if (err != 0) { if (err != 0) {
format_exc_check_arg(tstate, PyExc_NameError, format_exc_check_arg(tstate, PyExc_NameError,
NAME_ERROR_MSG, NAME_ERROR_MSG,
@ -1190,11 +1183,11 @@ dummy_func(
goto error; goto error;
} }
// stack effect: ( -- ) inst(DELETE_GLOBAL, (--)) {
inst(DELETE_GLOBAL) {
PyObject *name = GETITEM(names, oparg); PyObject *name = GETITEM(names, oparg);
int err; int err;
err = PyDict_DelItem(GLOBALS(), name); err = PyDict_DelItem(GLOBALS(), name);
// Can't use ERROR_IF here.
if (err != 0) { if (err != 0) {
if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
format_exc_check_arg(tstate, PyExc_NameError, format_exc_check_arg(tstate, PyExc_NameError,
@ -1374,18 +1367,13 @@ dummy_func(
SET_TOP(Py_NewRef(res)); SET_TOP(Py_NewRef(res));
} }
// stack effect: ( -- ) inst(DELETE_FAST, (--)) {
inst(DELETE_FAST) {
PyObject *v = GETLOCAL(oparg); PyObject *v = GETLOCAL(oparg);
if (v != NULL) { ERROR_IF(v == NULL, unbound_local_error);
SETLOCAL(oparg, NULL); SETLOCAL(oparg, NULL);
DISPATCH();
}
goto unbound_local_error;
} }
// stack effect: ( -- ) inst(MAKE_CELL, (--)) {
inst(MAKE_CELL) {
// "initial" is probably NULL but not if it's an arg (or set // "initial" is probably NULL but not if it's an arg (or set
// via PyFrame_LocalsToFast() before MAKE_CELL has run). // via PyFrame_LocalsToFast() before MAKE_CELL has run).
PyObject *initial = GETLOCAL(oparg); PyObject *initial = GETLOCAL(oparg);
@ -1396,17 +1384,17 @@ dummy_func(
SETLOCAL(oparg, cell); SETLOCAL(oparg, cell);
} }
// stack effect: ( -- ) inst(DELETE_DEREF, (--)) {
inst(DELETE_DEREF) {
PyObject *cell = GETLOCAL(oparg); PyObject *cell = GETLOCAL(oparg);
PyObject *oldobj = PyCell_GET(cell); PyObject *oldobj = PyCell_GET(cell);
if (oldobj != NULL) { // Can't use ERROR_IF here.
PyCell_SET(cell, NULL); // Fortunately we don't need its superpower.
Py_DECREF(oldobj); if (oldobj == NULL) {
DISPATCH(); format_exc_unbound(tstate, frame->f_code, oparg);
goto error;
} }
format_exc_unbound(tstate, frame->f_code, oparg); PyCell_SET(cell, NULL);
goto error; Py_DECREF(oldobj);
} }
// stack effect: ( -- __0) // stack effect: ( -- __0)
@ -1769,15 +1757,15 @@ dummy_func(
Py_DECREF(owner); Py_DECREF(owner);
PUSH(meth); PUSH(meth);
} }
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
DISPATCH();
} }
PyObject *res = PyObject_GetAttr(owner, name); else {
if (res == NULL) { PyObject *res = PyObject_GetAttr(owner, name);
goto error; if (res == NULL) {
goto error;
}
Py_DECREF(owner);
SET_TOP(res);
} }
Py_DECREF(owner);
SET_TOP(res);
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
} }
@ -2435,21 +2423,23 @@ dummy_func(
if (Py_IsTrue(cond)) { if (Py_IsTrue(cond)) {
STACK_SHRINK(1); STACK_SHRINK(1);
_Py_DECREF_NO_DEALLOC(cond); _Py_DECREF_NO_DEALLOC(cond);
DISPATCH();
} }
if (Py_IsFalse(cond)) { else if (Py_IsFalse(cond)) {
JUMPBY(oparg); JUMPBY(oparg);
DISPATCH();
} }
err = PyObject_IsTrue(cond); else {
if (err > 0) { err = PyObject_IsTrue(cond);
STACK_SHRINK(1); if (err > 0) {
Py_DECREF(cond); STACK_SHRINK(1);
Py_DECREF(cond);
}
else if (err == 0) {
JUMPBY(oparg);
}
else {
goto error;
}
} }
else if (err == 0)
JUMPBY(oparg);
else
goto error;
} }
// error: JUMP_IF_TRUE_OR_POP stack effect depends on jump flag // error: JUMP_IF_TRUE_OR_POP stack effect depends on jump flag
@ -2459,22 +2449,23 @@ dummy_func(
if (Py_IsFalse(cond)) { if (Py_IsFalse(cond)) {
STACK_SHRINK(1); STACK_SHRINK(1);
_Py_DECREF_NO_DEALLOC(cond); _Py_DECREF_NO_DEALLOC(cond);
DISPATCH();
} }
if (Py_IsTrue(cond)) { else if (Py_IsTrue(cond)) {
JUMPBY(oparg);
DISPATCH();
}
err = PyObject_IsTrue(cond);
if (err > 0) {
JUMPBY(oparg); JUMPBY(oparg);
} }
else if (err == 0) { else {
STACK_SHRINK(1); err = PyObject_IsTrue(cond);
Py_DECREF(cond); if (err > 0) {
JUMPBY(oparg);
}
else if (err == 0) {
STACK_SHRINK(1);
Py_DECREF(cond);
}
else {
goto error;
}
} }
else
goto error;
} }
// stack effect: ( -- ) // stack effect: ( -- )
@ -2615,23 +2606,24 @@ dummy_func(
if (next != NULL) { if (next != NULL) {
PUSH(next); PUSH(next);
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER); JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER);
DISPATCH();
} }
if (_PyErr_Occurred(tstate)) { else {
if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) { if (_PyErr_Occurred(tstate)) {
goto error; if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
goto error;
}
else if (tstate->c_tracefunc != NULL) {
call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, frame);
}
_PyErr_Clear(tstate);
} }
else if (tstate->c_tracefunc != NULL) { /* iterator ended normally */
call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, frame); assert(_Py_OPCODE(next_instr[INLINE_CACHE_ENTRIES_FOR_ITER + oparg]) == END_FOR);
} STACK_SHRINK(1);
_PyErr_Clear(tstate); Py_DECREF(iter);
/* Skip END_FOR */
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1);
} }
/* iterator ended normally */
assert(_Py_OPCODE(next_instr[INLINE_CACHE_ENTRIES_FOR_ITER + oparg]) == END_FOR);
STACK_SHRINK(1);
Py_DECREF(iter);
/* Skip END_FOR */
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1);
} }
// stack effect: ( -- __0) // stack effect: ( -- __0)
@ -2646,7 +2638,7 @@ dummy_func(
PyObject *next = PyList_GET_ITEM(seq, it->it_index++); PyObject *next = PyList_GET_ITEM(seq, it->it_index++);
PUSH(Py_NewRef(next)); PUSH(Py_NewRef(next));
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER); JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER);
DISPATCH(); goto end_for_iter_list; // End of this instruction
} }
it->it_seq = NULL; it->it_seq = NULL;
Py_DECREF(seq); Py_DECREF(seq);
@ -2654,6 +2646,7 @@ dummy_func(
STACK_SHRINK(1); STACK_SHRINK(1);
Py_DECREF(it); Py_DECREF(it);
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1); JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1);
end_for_iter_list:
} }
// stack effect: ( -- __0) // stack effect: ( -- __0)
@ -2668,15 +2661,16 @@ dummy_func(
STACK_SHRINK(1); STACK_SHRINK(1);
Py_DECREF(r); Py_DECREF(r);
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1); JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1);
DISPATCH();
} }
long value = (long)(r->start + else {
(unsigned long)(r->index++) * r->step); long value = (long)(r->start +
if (_PyLong_AssignValue(&GETLOCAL(_Py_OPARG(next)), value) < 0) { (unsigned long)(r->index++) * r->step);
goto error; if (_PyLong_AssignValue(&GETLOCAL(_Py_OPARG(next)), value) < 0) {
goto error;
}
// The STORE_FAST is already done.
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + 1);
} }
// The STORE_FAST is already done.
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + 1);
} }
inst(FOR_ITER_GEN) { inst(FOR_ITER_GEN) {

View file

@ -70,8 +70,10 @@
} }
TARGET(PUSH_NULL) { TARGET(PUSH_NULL) {
/* Use BASIC_PUSH as NULL is not a valid object pointer */ PyObject *res;
BASIC_PUSH(NULL); res = NULL;
STACK_GROW(1);
POKE(1, res);
DISPATCH(); DISPATCH();
} }
@ -809,11 +811,12 @@
Py_DECREF(receiver); Py_DECREF(receiver);
SET_TOP(retval); SET_TOP(retval);
JUMPBY(oparg); JUMPBY(oparg);
DISPATCH();
} }
assert(gen_status == PYGEN_NEXT); else {
assert(retval != NULL); assert(gen_status == PYGEN_NEXT);
PUSH(retval); assert(retval != NULL);
PUSH(retval);
}
DISPATCH(); DISPATCH();
} }
@ -904,7 +907,6 @@
if (PyErr_GivenExceptionMatches(val, PyExc_StopAsyncIteration)) { if (PyErr_GivenExceptionMatches(val, PyExc_StopAsyncIteration)) {
Py_DECREF(val); Py_DECREF(val);
Py_DECREF(POP()); Py_DECREF(POP());
DISPATCH();
} }
else { else {
PyObject *exc = Py_NewRef(PyExceptionInstance_Class(val)); PyObject *exc = Py_NewRef(PyExceptionInstance_Class(val));
@ -926,12 +928,14 @@
Py_DECREF(POP()); // The last sent value. Py_DECREF(POP()); // The last sent value.
Py_DECREF(POP()); // The delegated sub-iterator. Py_DECREF(POP()); // The delegated sub-iterator.
PUSH(value); PUSH(value);
DISPATCH();
} }
PyObject *exc_type = Py_NewRef(Py_TYPE(exc_value)); else {
PyObject *exc_traceback = PyException_GetTraceback(exc_value); PyObject *exc_type = Py_NewRef(Py_TYPE(exc_value));
_PyErr_Restore(tstate, exc_type, Py_NewRef(exc_value), exc_traceback); PyObject *exc_traceback = PyException_GetTraceback(exc_value);
goto exception_unwind; _PyErr_Restore(tstate, exc_type, Py_NewRef(exc_value), exc_traceback);
goto exception_unwind;
}
DISPATCH();
} }
TARGET(STOPITERATION_ERROR) { TARGET(STOPITERATION_ERROR) {
@ -1040,6 +1044,7 @@
goto error; goto error;
} }
err = PyObject_DelItem(ns, name); err = PyObject_DelItem(ns, name);
// Can't use ERROR_IF here.
if (err != 0) { if (err != 0) {
format_exc_check_arg(tstate, PyExc_NameError, format_exc_check_arg(tstate, PyExc_NameError,
NAME_ERROR_MSG, NAME_ERROR_MSG,
@ -1186,6 +1191,7 @@
PyObject *name = GETITEM(names, oparg); PyObject *name = GETITEM(names, oparg);
int err; int err;
err = PyDict_DelItem(GLOBALS(), name); err = PyDict_DelItem(GLOBALS(), name);
// Can't use ERROR_IF here.
if (err != 0) { if (err != 0) {
if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
format_exc_check_arg(tstate, PyExc_NameError, format_exc_check_arg(tstate, PyExc_NameError,
@ -1369,11 +1375,9 @@
TARGET(DELETE_FAST) { TARGET(DELETE_FAST) {
PyObject *v = GETLOCAL(oparg); PyObject *v = GETLOCAL(oparg);
if (v != NULL) { if (v == NULL) goto unbound_local_error;
SETLOCAL(oparg, NULL); SETLOCAL(oparg, NULL);
DISPATCH(); DISPATCH();
}
goto unbound_local_error;
} }
TARGET(MAKE_CELL) { TARGET(MAKE_CELL) {
@ -1391,13 +1395,15 @@
TARGET(DELETE_DEREF) { TARGET(DELETE_DEREF) {
PyObject *cell = GETLOCAL(oparg); PyObject *cell = GETLOCAL(oparg);
PyObject *oldobj = PyCell_GET(cell); PyObject *oldobj = PyCell_GET(cell);
if (oldobj != NULL) { // Can't use ERROR_IF here.
PyCell_SET(cell, NULL); // Fortunately we don't need its superpower.
Py_DECREF(oldobj); if (oldobj == NULL) {
DISPATCH(); format_exc_unbound(tstate, frame->f_code, oparg);
goto error;
} }
format_exc_unbound(tstate, frame->f_code, oparg); PyCell_SET(cell, NULL);
goto error; Py_DECREF(oldobj);
DISPATCH();
} }
TARGET(LOAD_CLASSDEREF) { TARGET(LOAD_CLASSDEREF) {
@ -1760,15 +1766,15 @@
Py_DECREF(owner); Py_DECREF(owner);
PUSH(meth); PUSH(meth);
} }
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
DISPATCH();
} }
PyObject *res = PyObject_GetAttr(owner, name); else {
if (res == NULL) { PyObject *res = PyObject_GetAttr(owner, name);
goto error; if (res == NULL) {
goto error;
}
Py_DECREF(owner);
SET_TOP(res);
} }
Py_DECREF(owner);
SET_TOP(res);
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
DISPATCH(); DISPATCH();
} }
@ -2427,21 +2433,23 @@
if (Py_IsTrue(cond)) { if (Py_IsTrue(cond)) {
STACK_SHRINK(1); STACK_SHRINK(1);
_Py_DECREF_NO_DEALLOC(cond); _Py_DECREF_NO_DEALLOC(cond);
DISPATCH();
} }
if (Py_IsFalse(cond)) { else if (Py_IsFalse(cond)) {
JUMPBY(oparg); JUMPBY(oparg);
DISPATCH();
} }
err = PyObject_IsTrue(cond); else {
if (err > 0) { err = PyObject_IsTrue(cond);
STACK_SHRINK(1); if (err > 0) {
Py_DECREF(cond); STACK_SHRINK(1);
Py_DECREF(cond);
}
else if (err == 0) {
JUMPBY(oparg);
}
else {
goto error;
}
} }
else if (err == 0)
JUMPBY(oparg);
else
goto error;
DISPATCH(); DISPATCH();
} }
@ -2451,22 +2459,23 @@
if (Py_IsFalse(cond)) { if (Py_IsFalse(cond)) {
STACK_SHRINK(1); STACK_SHRINK(1);
_Py_DECREF_NO_DEALLOC(cond); _Py_DECREF_NO_DEALLOC(cond);
DISPATCH();
} }
if (Py_IsTrue(cond)) { else if (Py_IsTrue(cond)) {
JUMPBY(oparg);
DISPATCH();
}
err = PyObject_IsTrue(cond);
if (err > 0) {
JUMPBY(oparg); JUMPBY(oparg);
} }
else if (err == 0) { else {
STACK_SHRINK(1); err = PyObject_IsTrue(cond);
Py_DECREF(cond); if (err > 0) {
JUMPBY(oparg);
}
else if (err == 0) {
STACK_SHRINK(1);
Py_DECREF(cond);
}
else {
goto error;
}
} }
else
goto error;
DISPATCH(); DISPATCH();
} }
@ -2608,23 +2617,24 @@
if (next != NULL) { if (next != NULL) {
PUSH(next); PUSH(next);
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER); JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER);
DISPATCH();
} }
if (_PyErr_Occurred(tstate)) { else {
if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) { if (_PyErr_Occurred(tstate)) {
goto error; if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
goto error;
}
else if (tstate->c_tracefunc != NULL) {
call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, frame);
}
_PyErr_Clear(tstate);
} }
else if (tstate->c_tracefunc != NULL) { /* iterator ended normally */
call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, frame); assert(_Py_OPCODE(next_instr[INLINE_CACHE_ENTRIES_FOR_ITER + oparg]) == END_FOR);
} STACK_SHRINK(1);
_PyErr_Clear(tstate); Py_DECREF(iter);
/* Skip END_FOR */
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1);
} }
/* iterator ended normally */
assert(_Py_OPCODE(next_instr[INLINE_CACHE_ENTRIES_FOR_ITER + oparg]) == END_FOR);
STACK_SHRINK(1);
Py_DECREF(iter);
/* Skip END_FOR */
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1);
DISPATCH(); DISPATCH();
} }
@ -2639,7 +2649,7 @@
PyObject *next = PyList_GET_ITEM(seq, it->it_index++); PyObject *next = PyList_GET_ITEM(seq, it->it_index++);
PUSH(Py_NewRef(next)); PUSH(Py_NewRef(next));
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER); JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER);
DISPATCH(); goto end_for_iter_list; // End of this instruction
} }
it->it_seq = NULL; it->it_seq = NULL;
Py_DECREF(seq); Py_DECREF(seq);
@ -2647,6 +2657,7 @@
STACK_SHRINK(1); STACK_SHRINK(1);
Py_DECREF(it); Py_DECREF(it);
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1); JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1);
end_for_iter_list:
DISPATCH(); DISPATCH();
} }
@ -2661,15 +2672,16 @@
STACK_SHRINK(1); STACK_SHRINK(1);
Py_DECREF(r); Py_DECREF(r);
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1); JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1);
DISPATCH();
} }
long value = (long)(r->start + else {
(unsigned long)(r->index++) * r->step); long value = (long)(r->start +
if (_PyLong_AssignValue(&GETLOCAL(_Py_OPARG(next)), value) < 0) { (unsigned long)(r->index++) * r->step);
goto error; if (_PyLong_AssignValue(&GETLOCAL(_Py_OPARG(next)), value) < 0) {
goto error;
}
// The STORE_FAST is already done.
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + 1);
} }
// The STORE_FAST is already done.
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + 1);
DISPATCH(); DISPATCH();
} }