|
38 | 38 | #include "supervisor/shared/translate/translate.h"
|
39 | 39 |
|
40 | 40 | // Instance of GeneratorExit exception - needed by generator.close()
|
41 |
| -const mp_obj_exception_t mp_const_GeneratorExit_obj = {{&mp_type_GeneratorExit}, (mp_obj_tuple_t *)&mp_const_empty_tuple_obj, (mp_obj_traceback_t *)&mp_const_empty_traceback_obj}; |
| 41 | +#if MICROPY_CONST_GENERATOREXIT_OBJ |
| 42 | +const |
| 43 | +#else |
| 44 | +static |
| 45 | +#endif |
| 46 | +mp_obj_exception_t mp_static_GeneratorExit_obj = {{&mp_type_GeneratorExit}, (mp_obj_tuple_t *)&mp_const_empty_tuple_obj, (mp_obj_traceback_t *)&mp_const_empty_traceback_obj}; |
42 | 47 |
|
43 | 48 | /******************************************************************************/
|
44 | 49 | /* generator wrapper */
|
@@ -362,9 +367,19 @@ STATIC mp_obj_t gen_instance_throw(size_t n_args, const mp_obj_t *args) {
|
362 | 367 | }
|
363 | 368 | STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(gen_instance_throw_obj, 2, 4, gen_instance_throw);
|
364 | 369 |
|
| 370 | +static mp_obj_t generatorexit(void) { |
| 371 | + #if MICROPY_CPYTHON_EXCEPTION_CHAIN |
| 372 | + MP_STATIC_ASSERT(!MICROPY_CONST_GENERATOREXIT_OBJ); |
| 373 | + mp_static_GeneratorExit_obj.context = NULL; |
| 374 | + mp_static_GeneratorExit_obj.cause = NULL; |
| 375 | + mp_static_GeneratorExit_obj.suppress_context = false; |
| 376 | + #endif |
| 377 | + return MP_OBJ_FROM_PTR(&mp_static_GeneratorExit_obj); |
| 378 | +} |
| 379 | + |
365 | 380 | STATIC mp_obj_t gen_instance_close(mp_obj_t self_in) {
|
366 | 381 | mp_obj_t ret;
|
367 |
| - switch (mp_obj_gen_resume(self_in, mp_const_none, MP_OBJ_FROM_PTR(&mp_const_GeneratorExit_obj), &ret)) { |
| 382 | + switch (mp_obj_gen_resume(self_in, mp_const_none, generatorexit(), &ret)) { |
368 | 383 | case MP_VM_RETURN_YIELD:
|
369 | 384 | mp_raise_msg(&mp_type_RuntimeError, MP_ERROR_TEXT("generator ignored GeneratorExit"));
|
370 | 385 |
|
|
0 commit comments