Skip to content
Snippets Groups Projects
Commit eff85bb1 authored by Paul Sokolovsky's avatar Paul Sokolovsky
Browse files

py/vm: "yield from" didn't handle MP_OBJ_STOP_ITERATION optimization.

E.g. crashed when yielding from already stopped generators.
parent d54290f6
Branches
No related tags found
No related merge requests found
...@@ -99,6 +99,7 @@ mp_vm_return_kind_t mp_obj_gen_resume(mp_obj_t self_in, mp_obj_t send_value, mp_ ...@@ -99,6 +99,7 @@ mp_vm_return_kind_t mp_obj_gen_resume(mp_obj_t self_in, mp_obj_t send_value, mp_
assert(MP_OBJ_IS_TYPE(self_in, &mp_type_gen_instance)); assert(MP_OBJ_IS_TYPE(self_in, &mp_type_gen_instance));
mp_obj_gen_instance_t *self = MP_OBJ_TO_PTR(self_in); mp_obj_gen_instance_t *self = MP_OBJ_TO_PTR(self_in);
if (self->code_state.ip == 0) { if (self->code_state.ip == 0) {
// Trying to resume already stopped generator
*ret_val = MP_OBJ_STOP_ITERATION; *ret_val = MP_OBJ_STOP_ITERATION;
return MP_VM_RETURN_NORMAL; return MP_VM_RETURN_NORMAL;
} }
......
...@@ -1144,7 +1144,8 @@ yield: ...@@ -1144,7 +1144,8 @@ yield:
if (ret_kind == MP_VM_RETURN_NORMAL) { if (ret_kind == MP_VM_RETURN_NORMAL) {
// Pop exhausted gen // Pop exhausted gen
sp--; sp--;
if (ret_value == MP_OBJ_NULL) { // TODO: When ret_value can be MP_OBJ_NULL here??
if (ret_value == MP_OBJ_NULL || ret_value == MP_OBJ_STOP_ITERATION) {
// Optimize StopIteration // Optimize StopIteration
// TODO: get StopIteration's value // TODO: get StopIteration's value
PUSH(mp_const_none); PUSH(mp_const_none);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment