Skip to content

Commit eff85bb

Browse files
committed
py/vm: "yield from" didn't handle MP_OBJ_STOP_ITERATION optimization.
E.g. crashed when yielding from already stopped generators.
1 parent d54290f commit eff85bb

2 files changed

Lines changed: 3 additions & 1 deletion

File tree

py/objgenerator.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ mp_vm_return_kind_t mp_obj_gen_resume(mp_obj_t self_in, mp_obj_t send_value, mp_
9999
assert(MP_OBJ_IS_TYPE(self_in, &mp_type_gen_instance));
100100
mp_obj_gen_instance_t *self = MP_OBJ_TO_PTR(self_in);
101101
if (self->code_state.ip == 0) {
102+
// Trying to resume already stopped generator
102103
*ret_val = MP_OBJ_STOP_ITERATION;
103104
return MP_VM_RETURN_NORMAL;
104105
}

py/vm.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1144,7 +1144,8 @@ unwind_jump:;
11441144
if (ret_kind == MP_VM_RETURN_NORMAL) {
11451145
// Pop exhausted gen
11461146
sp--;
1147-
if (ret_value == MP_OBJ_NULL) {
1147+
// TODO: When ret_value can be MP_OBJ_NULL here??
1148+
if (ret_value == MP_OBJ_NULL || ret_value == MP_OBJ_STOP_ITERATION) {
11481149
// Optimize StopIteration
11491150
// TODO: get StopIteration's value
11501151
PUSH(mp_const_none);

0 commit comments

Comments
 (0)