py/vm: Fix case of throwing GeneratorExit type into yield-from.
mp_make_raise_obj must be used to convert a possible exception type to an instance object, otherwise the VM may raise a non-exception object. An existing test is adjusted to test this case, with the original test already moved to generator_throw.py.
This commit is contained in:
parent
e6078dfed2
commit
0c9d452370
2
py/vm.c
2
py/vm.c
@ -1152,7 +1152,7 @@ yield:
|
|||||||
MARK_EXC_IP_SELECTIVE();
|
MARK_EXC_IP_SELECTIVE();
|
||||||
//#define EXC_MATCH(exc, type) MP_OBJ_IS_TYPE(exc, type)
|
//#define EXC_MATCH(exc, type) MP_OBJ_IS_TYPE(exc, type)
|
||||||
#define EXC_MATCH(exc, type) mp_obj_exception_match(exc, type)
|
#define EXC_MATCH(exc, type) mp_obj_exception_match(exc, type)
|
||||||
#define GENERATOR_EXIT_IF_NEEDED(t) if (t != MP_OBJ_NULL && EXC_MATCH(t, MP_OBJ_FROM_PTR(&mp_type_GeneratorExit))) { RAISE(t); }
|
#define GENERATOR_EXIT_IF_NEEDED(t) if (t != MP_OBJ_NULL && EXC_MATCH(t, MP_OBJ_FROM_PTR(&mp_type_GeneratorExit))) { mp_obj_t raise_t = mp_make_raise_obj(t); RAISE(raise_t); }
|
||||||
mp_vm_return_kind_t ret_kind;
|
mp_vm_return_kind_t ret_kind;
|
||||||
mp_obj_t send_value = POP();
|
mp_obj_t send_value = POP();
|
||||||
mp_obj_t t_exc = MP_OBJ_NULL;
|
mp_obj_t t_exc = MP_OBJ_NULL;
|
||||||
|
@ -1,18 +1,24 @@
|
|||||||
# generator ignores a thrown GeneratorExit (this is allowed)
|
# outer generator ignores a thrown GeneratorExit (this is allowed)
|
||||||
|
|
||||||
def gen():
|
def gen():
|
||||||
try:
|
try:
|
||||||
yield 123
|
yield 123
|
||||||
except GeneratorExit:
|
except GeneratorExit:
|
||||||
print('GeneratorExit')
|
print('GeneratorExit')
|
||||||
yield 456
|
|
||||||
|
def gen2():
|
||||||
|
try:
|
||||||
|
yield from gen()
|
||||||
|
except GeneratorExit:
|
||||||
|
print('GeneratorExit outer')
|
||||||
|
yield 789
|
||||||
|
|
||||||
# thrown a class
|
# thrown a class
|
||||||
g = gen()
|
g = gen2()
|
||||||
print(next(g))
|
print(next(g))
|
||||||
print(g.throw(GeneratorExit))
|
print(g.throw(GeneratorExit))
|
||||||
|
|
||||||
# thrown an instance
|
# thrown an instance
|
||||||
g = gen()
|
g = gen2()
|
||||||
print(next(g))
|
print(next(g))
|
||||||
print(g.throw(GeneratorExit()))
|
print(g.throw(GeneratorExit()))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user