diff --git a/py/vm.c b/py/vm.c index 38e15eef33..dc228bf0ff 100644 --- a/py/vm.c +++ b/py/vm.c @@ -1240,13 +1240,17 @@ exception_handler: code_state->ip -= 1; #endif - // check if it's a StopIteration within a for block - if (*code_state->ip == MP_BC_FOR_ITER && mp_obj_is_subclass_fast(mp_obj_get_type(nlr.ret_val), &mp_type_StopIteration)) { - const byte *ip = code_state->ip + 1; - DECODE_ULABEL; // the jump offset if iteration finishes; for labels are always forward - code_state->ip = ip + ulab; // jump to after for-block - code_state->sp -= 1; // pop the exhausted iterator - goto outer_dispatch_loop; // continue with dispatch loop + if (mp_obj_is_subclass_fast(mp_obj_get_type(nlr.ret_val), &mp_type_StopIteration)) { + if (code_state->ip) { + // check if it's a StopIteration within a for block + if (*code_state->ip == MP_BC_FOR_ITER) { + const byte *ip = code_state->ip + 1; + DECODE_ULABEL; // the jump offset if iteration finishes; for labels are always forward + code_state->ip = ip + ulab; // jump to after for-block + code_state->sp -= 1; // pop the exhausted iterator + goto outer_dispatch_loop; // continue with dispatch loop + } + } } #if MICROPY_STACKLESS