summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-03-30 13:13:12 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-03-30 13:21:11 +0300
commit9a54a223188840caf5b98fb618c40ae5056b48c2 (patch)
treead3c24d9dae576527bdaaba341e6091252c403ef
parent6ae237d2bd582a2b974404dc572a1ee0b1b093b3 (diff)
downloadmicropython-9a54a223188840caf5b98fb618c40ae5056b48c2.tar.gz
micropython-9a54a223188840caf5b98fb618c40ae5056b48c2.zip
objgenerator.throw(): Throwing GeneratorExit is equivalent to .close().
According to PEP380 and caught by CPython test_pep380.py .
-rw-r--r--py/objgenerator.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/py/objgenerator.c b/py/objgenerator.c
index ab80828ded..e161720605 100644
--- a/py/objgenerator.c
+++ b/py/objgenerator.c
@@ -159,8 +159,18 @@ STATIC mp_obj_t gen_instance_send(mp_obj_t self_in, mp_obj_t send_value) {
STATIC MP_DEFINE_CONST_FUN_OBJ_2(gen_instance_send_obj, gen_instance_send);
+STATIC mp_obj_t gen_instance_close(mp_obj_t self_in);
STATIC mp_obj_t gen_instance_throw(uint n_args, const mp_obj_t *args) {
- mp_obj_t ret = gen_resume_and_raise(args[0], mp_const_none, n_args == 2 ? args[1] : args[2]);
+ mp_obj_t exc = (n_args == 2) ? args[1] : args[2];
+ if (mp_obj_is_subclass_fast(mp_obj_get_type(exc), &mp_type_GeneratorExit)) {
+ // Throwing GeneratorExit is equivalent of calling close aka
+ // GeneratorExit should be handled specially
+ // TODO: Calling .close() will throw new exception instance, not one
+ // given to throw, which is not ok.
+ return gen_instance_close(args[0]);
+ }
+
+ mp_obj_t ret = gen_resume_and_raise(args[0], mp_const_none, exc);
if (ret == MP_OBJ_NULL) {
nlr_jump(mp_obj_new_exception(&mp_type_StopIteration));
} else {