summaryrefslogtreecommitdiff
path: root/py/objgenerator.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-03-30 23:14:55 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-03-30 23:30:16 +0300
commitf39d3b93da4b9205a095430e12472051c6b22ef6 (patch)
treeb2f56443f9646bef8035b4a527f1d1f533e6196e /py/objgenerator.c
parenta30cf9f3aff671ada1c84a1977ecf96d473d7256 (diff)
py: Implement support for generalized generator protocol.
Iterators and ducktype objects can now be arguments of yield from.
Diffstat (limited to 'py/objgenerator.c')
-rw-r--r--py/objgenerator.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/py/objgenerator.c b/py/objgenerator.c
index d1bae30de..c3d7f12d7 100644
--- a/py/objgenerator.c
+++ b/py/objgenerator.c
@@ -135,7 +135,14 @@ STATIC mp_obj_t gen_resume_and_raise(mp_obj_t self_in, mp_obj_t send_value, mp_o
return ret;
case MP_VM_RETURN_EXCEPTION:
- nlr_jump(ret);
+ // TODO: Optimization of returning MP_OBJ_NULL is really part
+ // of mp_iternext() protocol, but this function is called by other methods
+ // too, which may not handled MP_OBJ_NULL.
+ if (mp_obj_is_subclass_fast(mp_obj_get_type(ret), &mp_type_StopIteration)) {
+ return MP_OBJ_NULL;
+ } else {
+ nlr_jump(ret);
+ }
default:
assert(0);