From d5e629ad0edf2c2b91f1964eb54c91fd6f6fc9d0 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Mon, 11 May 2015 02:59:25 +0300 Subject: [PATCH] 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. --- py/objgenerator.c | 8 +++++--- 1 file 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); } }