4242typedef struct _mp_obj_gen_wrap_t {
4343 mp_obj_base_t base ;
4444 mp_obj_t * fun ;
45+ bool coroutine_generator ;
4546} mp_obj_gen_wrap_t ;
4647
4748typedef struct _mp_obj_gen_instance_t {
4849 mp_obj_base_t base ;
4950 mp_obj_dict_t * globals ;
51+ bool coroutine_generator ;
5052 mp_code_state_t code_state ;
5153} mp_obj_gen_instance_t ;
5254
@@ -64,6 +66,7 @@ STATIC mp_obj_t gen_wrap_call(mp_obj_t self_in, size_t n_args, size_t n_kw, cons
6466 n_state * sizeof (mp_obj_t ) + n_exc_stack * sizeof (mp_exc_stack_t ));
6567 o -> base .type = & mp_type_gen_instance ;
6668
69+ o -> coroutine_generator = self -> coroutine_generator ;
6770 o -> globals = self_fun -> globals ;
6871 o -> code_state .fun_bc = self_fun ;
6972 o -> code_state .ip = 0 ;
@@ -78,10 +81,11 @@ const mp_obj_type_t mp_type_gen_wrap = {
7881 .unary_op = mp_generic_unary_op ,
7982};
8083
81- mp_obj_t mp_obj_new_gen_wrap (mp_obj_t fun ) {
84+ mp_obj_t mp_obj_new_gen_wrap (mp_obj_t fun , bool is_coroutine ) {
8285 mp_obj_gen_wrap_t * o = m_new_obj (mp_obj_gen_wrap_t );
8386 o -> base .type = & mp_type_gen_wrap ;
8487 o -> fun = MP_OBJ_TO_PTR (fun );
88+ o -> coroutine_generator = is_coroutine ;
8589 return MP_OBJ_FROM_PTR (o );
8690}
8791
@@ -91,7 +95,11 @@ mp_obj_t mp_obj_new_gen_wrap(mp_obj_t fun) {
9195STATIC void gen_instance_print (const mp_print_t * print , mp_obj_t self_in , mp_print_kind_t kind ) {
9296 (void )kind ;
9397 mp_obj_gen_instance_t * self = MP_OBJ_TO_PTR (self_in );
94- mp_printf (print , "<generator object '%q' at %p>" , mp_obj_fun_get_name (MP_OBJ_FROM_PTR (self -> code_state .fun_bc )), self );
98+ if (self -> coroutine_generator ) {
99+ mp_printf (print , "<coroutine object '%q' at %p>" , mp_obj_fun_get_name (MP_OBJ_FROM_PTR (self -> code_state .fun_bc )), self );
100+ } else {
101+ mp_printf (print , "<generator object '%q' at %p>" , mp_obj_fun_get_name (MP_OBJ_FROM_PTR (self -> code_state .fun_bc )), self );
102+ }
95103}
96104
97105mp_vm_return_kind_t mp_obj_gen_resume (mp_obj_t self_in , mp_obj_t send_value , mp_obj_t throw_value , mp_obj_t * ret_val ) {
@@ -194,6 +202,10 @@ STATIC mp_obj_t gen_resume_and_raise(mp_obj_t self_in, mp_obj_t send_value, mp_o
194202}
195203
196204STATIC mp_obj_t gen_instance_iternext (mp_obj_t self_in ) {
205+ mp_obj_gen_instance_t * self = MP_OBJ_TO_PTR (self_in );
206+ if (self -> coroutine_generator ) {
207+ mp_raise_TypeError (translate ("'coroutine' object is not an iterator" ));
208+ }
197209 return gen_resume_and_raise (self_in , mp_const_none , MP_OBJ_NULL );
198210}
199211
0 commit comments