summaryrefslogtreecommitdiffstatshomepage
path: root/py/objgenerator.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2015-05-11 02:59:25 +0300
committerDamien George <damien.p.george@gmail.com>2015-05-11 23:57:42 +0100
commitd5e629ad0edf2c2b91f1964eb54c91fd6f6fc9d0 (patch)
tree077e99d8bc2254c405e5706cd85c4871977f22f9 /py/objgenerator.c
parentaa9dbb1b033a8163e07fcf5763fc20146354cc48 (diff)
downloadmicropython-d5e629ad0edf2c2b91f1964eb54c91fd6f6fc9d0.tar.gz
micropython-d5e629ad0edf2c2b91f1964eb54c91fd6f6fc9d0.zip
objgenerator: Can optimize StopIteration to STOP_ITERATION only if arg is None.
Unfortunately, MP_OBJ_STOP_ITERATION doesn't have means to pass an associated value, so we can't optimize StopIteration exception with (non-None) argument to MP_OBJ_STOP_ITERATION.
Diffstat (limited to 'py/objgenerator.c')
-rw-r--r--py/objgenerator.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/py/objgenerator.c b/py/objgenerator.c
index 0f0f84249b..4ba6bf7683 100644
--- a/py/objgenerator.c
+++ b/py/objgenerator.c
@@ -171,10 +171,12 @@ STATIC mp_obj_t gen_resume_and_raise(mp_obj_t self_in, mp_obj_t send_value, mp_o
// of mp_iternext() protocol, but this function is called by other methods
// too, which may not handled MP_OBJ_STOP_ITERATION.
if (mp_obj_is_subclass_fast(mp_obj_get_type(ret), &mp_type_StopIteration)) {
- return MP_OBJ_STOP_ITERATION;
- } else {
- nlr_raise(ret);
+ mp_obj_t val = mp_obj_exception_get_value(ret);
+ if (val == mp_const_none) {
+ return MP_OBJ_STOP_ITERATION;
+ }
}
+ nlr_raise(ret);
}
}