objgenerator.throw(): Throwing GeneratorExit is equivalent to .close().
According to PEP380 and caught by CPython test_pep380.py .
This commit is contained in:
parent
6ae237d2bd
commit
9a54a22318
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue