From 4ed7b7f751b161420e6979927fd0756467a10cb7 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sun, 10 May 2015 00:41:34 +0300 Subject: [PATCH] py: iternext() may not return MP_OBJ_NULL, only MP_OBJ_STOP_ITERATION. Testing for incorrect value led to premature termination of generator containing yield from for such iterator (e.g. "yield from [1, 2]"). --- py/runtime.c | 2 +- tests/basics/gen_yield_from_iter.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/py/runtime.c b/py/runtime.c index 2b5b5bc371..68728642bf 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -1081,7 +1081,7 @@ mp_vm_return_kind_t mp_resume(mp_obj_t self_in, mp_obj_t send_value, mp_obj_t th if (type->iternext != NULL && send_value == mp_const_none) { mp_obj_t ret = type->iternext(self_in); - if (ret != MP_OBJ_NULL) { + if (ret != MP_OBJ_STOP_ITERATION) { *ret_val = ret; return MP_VM_RETURN_YIELD; } else { diff --git a/tests/basics/gen_yield_from_iter.py b/tests/basics/gen_yield_from_iter.py index 2d06328fbb..be76572bf9 100644 --- a/tests/basics/gen_yield_from_iter.py +++ b/tests/basics/gen_yield_from_iter.py @@ -4,5 +4,10 @@ def gen(): def gen2(): yield from gen() +def gen3(): + yield from (4, 5) + yield 6 + print(list(gen())) print(list(gen2())) +print(list(gen3()))